String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); //새로운 String 인스턴스 생성
String str4 = new String("abc"); //새로운 String 인스턴스 생성
str1,st2가 문자열 Literal을 지정하는 방법으로 초기화 하였고, str3,str4가 String 클래스의 생성자를 사용하는 방법으로 초기화 되었다.
위 그림처럼, str1과 str2는 같은 객체를 참조하고 있지만, str3와 str4는 다른 객체를 참조하고 있다.
str1과 str2가 참조하는 객체가 String Constant Pool에 선언되어 있다.
문자열 Literal
자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.(바이트 코드)
이때 같은 내용의 문자열 리터럴은 한번만 저장된다.
문자열 리터럴도 String 인스턴스로 생성된다.
String Constant Pool이란?
Heap 영역에서 String 객체를 별도로 관리하는 장소이다.
먼저 문자열 리터럴 방식으로 String을 초기화 할 경우, String Constant Pool에 해당 문자열이 존재하는지 여부를 체크하고 있는경우 해당 리터럴의 주소를 할당하고 없는경우엔 해당 문자열을 값을 가지는 객체를 String Constant Pool에 생성한다.
위의 과정을 수행하는 메서드가 String 클래스 내의 intern()이다. 해당 메서드는 String 인스턴스의 주소값을 반환한다.
String 생성자를 사용해서 인스턴스를 만들어서 초기화 할 경우, String Constant Pool 바깥 영역에 객체를 생성한다.(Heap 영역 내이지만)
아래의 코드를 보면 intern() 의 동작 방식을 이해 할 수 있다.
public class Intern {
public static void main(String[] args) {
String literal = "brido";
String object = new String("brido");
String intern = object.intern();
System.out.println(literal == object); // false
System.out.println(literal.equals(object)); // true
System.out.println(literal == intern); // true
/*
아래 라인에서 true가 리턴되는 이유는 intern()은 "brido"를
String Constant Pool에서 검색하고, 존재하는 리터럴이기 때문에
해당 주솟값을 리턴하기 때문이다.
*/
System.out.println(literal.equals(intern)); // true
}
}
You might also like...
7월
25
모던 자바 인 액션 - Chapter 7 <병렬 데이터 처리와 성능>
자바 7이 등장하기 전까지는 데이터 컬렉션을 병렬로 처리하기 어려웠습니다.이번 장에서는 자바7에 포함된 포크 조인 프레임워크와 병렬 스트림이 어떻게 처리되는지
10 min read
6월
11
모던 자바 인 액션 - Chapter 6 <스트림으로 데이터 수집> 2
분할분할은 분할 함수라 불리는 프리디케이트를 분류 함수로 사용하는 특수한 그룹화 기능입니다.분할 함수는 불리언 값을 반환하기 때문에 그룹화된 Map의 Key의
10 min read
6월
10
모던 자바 인 액션 - Chapter 6 <스트림으로 데이터 수집> 1
지금까지 배운것으로 스트림을 한 마디로 요약하면 데이터 집합을 효율적이고 Lazy하게 처리하는 반복자라고 알 수 있습니다.또한 스트림의 연산들은 filter 또는
12 min read
5월
29
모던 자바 인 액션 - Chapter 5 <스트림 활용>
이번 장에서는 본격적으로 Streamd을 활용하는 방법에 대해 배워보겠습니다. 필터링스트림 객체는 filter() 메서드를 지원합니다.filter 메서드는 Predicate를 인자로 받아 해당 Predicate와
11 min read
5월
27
모던 자바 인 액션 - Chapter 4 <스트림 소개>
스트림이란 무엇인가?스트림은 자바8에서 새롭게 추가된 기능입니다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있습니다.또한 이를 활용하면 멀티스레드 코드를