개발개발자

문자열 상수풀(String constant pool)과 intern 메소드 본문

자바(Java)

문자열 상수풀(String constant pool)과 intern 메소드

맛두부 2017. 3. 18. 16:35

문자열을 공부하며 고민됐던 부분이다.


String str1 = "aaa";

String str2 = "aaa"; 

String str3 = new String("aaa");


str1 == str2 : true

str1 == str3 : false


str1과 str3의 참조값이 같을 것으로 생각했는데 같지 않아서 이유를 찾아보았고 아래와 같이 정리하였다.




* 문자열 상수풀 (String constant pool)

- 모든 string 객체를 관리하는 pool로, 상수풀(contant pool)은 클래스와 같은 Heap의 고정영역(Permanent Area)에 생성되어 java 프로세스의 종료까지 유지 된다. 이 개념을 바탕으로 문자열 생성 방식에 따라 참조값 동일 여부가 결정 된다.


1. String 클래스 리터럴 형태 생성 (String str1 = "aaa";)

- String 클래스는 리터럴 형태로 생성시 상수풀에 그 값을 저장하고 추후에 다른 리터럴 형태의 문자열 생성시 그 문자열과 동일한 문자열이 상수풀에 있으면, 그 물자열(String 타입의 참조변수)에게 동일한 주소값을 가르키도록 한다.



2.객체 생성을 통한 문자열 생성 (String str3 = new String("aaa");)

- 만약 리터럴 형태가 아니라 객체를 생성해서 만든 값은, 기존 상수풀에 값은 값이 있어도 등가비교 연선자를 이용했을 땐 다른 값으로 인식하지만 equal 매소드를 사용했을 때는 문자열을 비교하기 때문에 같은 값으로 인식한다.


리터럴 형태로 생성한 "aaa"와 메모리 생성(new String("aaa"))는 등가비교 연산가로는 false를 반환하지만, equals 매소드로는 true를 반환한다. 참조값이 다르기 때문이다.


3. 새 매모리에 생성된 문자열을 intern() 매소드 사용

- 상수풀에 동일한 값의 문자열이 있을 경우 상수풀에 존재하는 물자열의 주소를 반환받고 아닌경우 새로 생성된 주소를 반환 받는다.


str1 == str3.intern() : true






Comments