Java에서 문자열인 String을 생성하는 방법은
String a = "hello world"와
String b = new String("hello world") 가 있는데 두 방법은 객체가 생성되는 위치에 차이가 있다.
우선 위의 방법은 String pool이라는 곳에 문자열 객체를 생성해서 참조하도록 하는 방법이다.
아래 방법은 Heap 영역에 새로운 문자열 객체를 만들고 참조하도록 하는 방법이다.
a==b의 결과값을 출력해보면 false가 뜬다.
서로 다른 위치에 있기 때문이다.
예를 추가해
String a = "hello";
String b = "hello";
String c = new String("hello");
String d = new String("hello");
라고 한다면 어떻게 될까?
a==b : true
b==c : false
c==d : false 가 될 것이다.
a와 b는 string pool에 생성된 동일한 객체를 참조하기 때문에 true가 나오고, 나머지는 모두 위치가 다른 곳에 생성된 객체들이기 때문에 false이다.
그래서 String pool의 위치는 어디일까?
Java6까지 String pool의 위치는 Heap의 Permanent 영역이었다. Perm 영역은 Garbage Collection을 공부할 때 나온 영역인데, Heap 영역을 총 세 개로 Young, Old, Perm 영역으로 나눴을 때의 마지막 영역이다. 주로 Meta 데이터가 저장되는 위치인데, 이 곳에 String pool을 생성한다. 그러나 이곳에 string 객체를 생성할경우 OutofMemoryerror가 발생하기 쉽기 때문에 Java7에서는 Heap영역으로 옮겨졌다. String pool에서 생성되는 객체도 GC의 대상이 된다는 것이 큰 차이점이다.
(Perm 영역은 Java8을 기점으로 완전히 사라졌다고 한다.)
'프로그래밍 > Java' 카테고리의 다른 글
[Java] Garbage Collection (0) | 2020.08.21 |
---|---|
[Java] 자바 가상머신의 메모리 모델 (0) | 2020.05.20 |
[Java] 클래스 변수와 클래스 메소드 (Static) (0) | 2020.05.19 |
[Java] 자바 프로그램의 이해와 실행의 원리 (0) | 2020.05.14 |
[Java] 쓰레드(Thread) (0) | 2020.02.12 |