[Java] "" vs new String("")
String
Java에는 문자열을 쉽게 다룰 수 있는 String Class가 존재한다.
아마 객체 중에서 제일 많이 사용한 것이 무엇일까 생각해보면 거의 당연히 String 일거라 생각한다.
이렇게 많이 사용하는 만큼 사용법도 잘 알고 사용하면 금상첨화가 될 것이다.
먼저, String은 다음과 같은 방식들로 선언할 수 있다.
public class Main {
public static void main(String[] args) {
String s1 = "";
String s2 = new String("");
}
}
분명 딱 봐도 선언하는 방식이 다르다. 그런데 둘에게 차이가 없을까? 분명 어떠한 차이라도 있지 않을까?
그럼 이제부터 그 차이를 한 번 살펴보자
"" vs new String("")
위 코드를 보고 어떤 생각이 떠올랐는가?
아마 대표적으로 참조 타입이 생각났을 것이다.
우리가 보통 객체를 생성하면 각각의 객체들은 모두 다 다르다는 것을 알고 있다. 그런데 String도 원시 타입(primitive type)이 아닌 참조 타입(reference type)이다.
그럼 두 객체를 == 연산자를 통해 비교하면 false가 떠야하는 것이 맞다. 한 번 확인해보자.
public class Main {
public static void main(String[] args) {
String s1 = "";
String s2 = new String("");
System.out.println(s1 == s2);
}
}
false
당연히 우리가 예상한대로 false가 뜨는 것을 확인할 수 있다.
그런데, 다음과 같이 작성하면 true가 뜨게할 수 있다.
public class Main {
public static void main(String[] args) {
String s1 = "";
String s2 = new String("").intern();
System.out.println(s1 == s2);
}
}
true
우리가 나오는대로 동작했지만 세부적으로 자세히 알진 못한다. 그럼 이런 결과가 나오게된 이유를 자세히 알아보자.
JVM
그 이유를 알기 전 먼저 간단하게 JVM에 대해 살펴보자.
JVM은 자바 가상 머신(Java Virtual Machine)으로 자바가 실행될 수 있도록 실행환경을 만들어주는 소프트웨어이다. 즉, 자바 바이트코드를 실행할 수 있는 주체이다.
JVM은 다음과 같이 구성되어 있다.
여기서 우리는 Heap Area(힙 영역)을 자세하게 살펴볼 것이다.
힙 영역은 new 명령어로 생성된 인스턴스와 객체가 저장되는 구역이다. 이 부분은 모든 Thread가 공유하며 GC(Garbage Collection)이슈는 이 영역에서 일어난다.
String도 객체이기 때문에 이 힙 영역에서 관리된다.
String Constant Pool
JVM의 힙 영역에는 String Constant Pool 이라는 것이 존재한다.
이는 말 그대로 String을 상수처럼 사용하도록 만든 Pool이다. 즉, 이미 전에 생성된 String이 있다면 해당 객체를 재사용하여 String 객체가 생성되어 차지하게 되는 메모리를 줄여주어 효율적으로 사용할 수 있도록 해준다.
이는 디자인 패턴에 Flyweight Pattern(플라이웨이트 패턴)을 참고하면 이해가 더 쉬울 것이다.
하지만 new String()를 통해 String을 생성하게 되면 String Constant Pool이 아닌 외부의 힙 영역에 객체가 생성된다. 이 때문에 참조 값이 달라 false가 뜨는 것이다.
여기서 위 코드에서 본 것과 같이 intern() 메서드를 쓰게 되면 new String()으로 생성된 문자열이 String Constant Pool에 등록되어 true 결과를 도출할 수 있던 것이다.
'Language > Java' 카테고리의 다른 글
[Java] 바이트코드 조작 (0) | 2023.03.22 |
---|---|
[Java] JVM (0) | 2023.03.20 |
[Java] 아무 생각 없이 생성했는데 동일한 객체? (0) | 2023.03.09 |
[Java] abstract class vs interface (0) | 2023.01.20 |
[Java] stream vs for (1) | 2023.01.17 |
댓글
이 글 공유하기
다른 글
-
[Java] 바이트코드 조작
[Java] 바이트코드 조작
2023.03.22 -
[Java] JVM
[Java] JVM
2023.03.20 -
[Java] 아무 생각 없이 생성했는데 동일한 객체?
[Java] 아무 생각 없이 생성했는데 동일한 객체?
2023.03.09 -
[Java] abstract class vs interface
[Java] abstract class vs interface
2023.01.20