String클래스의 intern메서드와 constant pool (상수풀)
Java에서 쓰이는 모든 String 객체는 상수풀에서 관리됩니다. 상수풀은 클래스와 같은 Heap의 Permanent area(고정 영역)에 생성되어 Java 프로세스의 종료까지 그 생을 함께 합니다.
String을 new로 생성하지 않고 "" 리터럴을 사용하여 생성할경우, 내부적으로 new String() 메소드 호출 이후에 String.intern()이라는 메소드가 호출되어 고유의 인스턴스를 공유하도록 interned됩니다. 이것은 생성한 String을 Constant pool에 등록하는(만약 이전에 같은 char sequence의 문자열이 이미 상수풀에 있다면 문자열을 힙에서 해제하고 그 상수풀의 레퍼런스를 반환) 작업을 수행하지요.
즉, 같은 패키지의 같은 클래스 내에서는 정수(literal) 스트링들은 동일한 String
객체를 참조한다.
예)
String a = "JAVA";
String b = "JAVA";
의 경우 a == b 는 true
String a = new String( "JAVA" );
String b = "JAVA"
의 경우 a == b 는 false
String a = new String( "JAVA" );
a = a.intern();
String b = "JAVA";
의 경우 a == b 는 true
일반적으로 문자열들을 비교하기 위해서 equals메서드를 사용하지만, equals메서드로 문자열의 내용을 비교하는 것보다는 등가비교연산자(==)를 이용해서 주소(4 byte)를 비교하는 것이 더 빠르다.
명시적인 new String() 생성자를 호출했기 때문에 각각의 문자열이 상수풀에 intern되는 과정 없이 제각각의 heap 주소에 생성된 것입니다.
1) String클래스의 valueOf메서드
2) 덧셈연산자(+)를 사용
'backend > Java' 카테고리의 다른 글
[Effective Java] 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. (4) | 2009.09.24 |
---|---|
[Effective Java] 5. 불필요한 객체 생성을 피하자 (4) | 2009.09.23 |
[Effective Java] 4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자 (0) | 2009.09.17 |
Eclipse Galileo에 어떤 프로젝트가 있을까? (2) | 2009.08.26 |
[Effective Java] 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. (3) | 2009.08.26 |
[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. (3) | 2009.07.31 |
[Java] 자바 코딩하다가 실수하는 부분들 (8) | 2008.03.03 |
[java] java.util.Properties 클래스 (4) | 2007.05.10 |