문자열 상수 풀
문자열 리터럴을 사용할 때, JVM은 문자열 상수 풀에 문자열을 저장한다. 문자열 상수 풀은 동일한 문자열 값을 공유하여 메모리 사용을 효율적으로 관리할 수 있다. 즉, 문자열 상수 풀은 동일한 문자열이 이미 존재할 경우, 새로 문자열 객체를 생성하지 않고 기존의 객체를 재사용한다. 이로 인해 메모리 공간을 절약하고, 불필요한 객체 생성을 방지할 수 있다.
String a = "hello";
String b = "hello";
위 코드에서 a와 b는 동일한 문자열 리터럴 "hello"를 참조한다. 따라서 두 변수는 같은 메모리 주소를 가리키게 되며, a == b는 true를 반환한다.
new 키워드
반면, new 키워드를 사용하여 문자열을 생성하면, 문자열 리터럴과는 달리 새로운 객체가 메모리에서 할당된다. 이 경우, 문자열 상수 풀에서 기존 문자열을 참조하지 않고 새로운 메모리 공간에 문자열 객체가 생성된다.
String c = new String("hello");
위 코드에서 c는 새로운 문자열 객체를 생성하므로, 문자열 상수 풀에 있는 "hello" 객체와는 다른 메모리 주소를 가진다. 따라서 a==c 또는 b==c는 false를 반환한다.
정리
public static void main(String[] args) {
//문자열 리터럴을 사용하여 문자열 생성, 문자열 상수 풀에 저장
String a="hello";
String b="hello";
//new 키워드를 사용하여 새로운 문자열 객체 생성
String c=new String("hello");
//문자열 리터럴은 동일한 메모리 주소를 참조
System.out.println(a==b); //true
// new 키워드를 사용하여 생성된 객체는 다른 메모리 주소를 참조
System.out.println(a==c); //false
System.out.println(b==c); //false
}
'Language > JAVA' 카테고리의 다른 글
[JAVA]정적 메소드에서 this를 사용할 수 없는 이유 (2) | 2024.11.03 |
---|---|
[JAVA]Runnable 인터페이스를 구현해서 스레드를 만드는 이유 (0) | 2024.09.28 |
[JAVA]예외(Exception) vs 에러(Error) (0) | 2024.09.21 |
[JAVA]currentThread() (0) | 2024.09.21 |
[JAVA]equals() vs == (0) | 2024.09.08 |