String은 Java 에서 제공하는 특별한 자료형이다.
Java에서 String 객체를 생성하는 방법은 2가지가 있는데
첫번째는 String literal (큰 따옴표""를 사용하는 것),
두번째는 new 연산자를 사용하는 것이다. 두 방법에는 어떤 차이가 있을까?
public class Main {
public static void main(String[] args) {
String s1 = "example";
String s2 = "example";
String ss1 = new String("example");
String ss2 = new String("example");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(ss1 == ss2);
System.out.println(ss1.equals(ss2));
}
}
[결과]
true
true,
false,
true
String literal로 생성한 객체는 내용이 같다면 같은 객체, 즉 동일한 메모리 주소를 가리키고 있다. 하지만 new 연산자로 생성한 String 객체는 내용이 같더라도 개별적인 객체임을 알 수 있다.
Java String Pool
String literal로 생성하면 해당 String 값은 Heap 영역 내 "String Constant Pool"에 저장되어 재사용되지만, new 연산자로 생성하면 같은 내용이라도 여러 개의 객체가 각각 Heap 영역을 차지한다는 차이가 있다.
String literal로 생성한 객체는 String Pool에 들어간다.
String literal로 생성한 객체의 값 s1이 이미 String Pool에 존재한다면 해당 객체는 String Pool의 레퍼런스를 참조한다.
그래서 참조형 변수라고 하며,
s1 공간에 "example" 가 저장되는게 아니라 s1은 "example"가 저장되어 있는 메모리 주소를 가지게 된다.
그림에서 s1과 s2가 같은 곳을 가리키고 있는 것이 이 때문이다.
new로 생성한 String 객체는 같은 값이 String Pool에 이미 존재하더라도 Heap 영역 내 별도의 객체를 가리킨다.
참고 : https://starkying.tistory.com/entry/what-is-java-string-pool
'☕️자바 𝗝𝗔𝗩𝗔' 카테고리의 다른 글
[java] 피라미드 별찍기 예제 (0) | 2022.11.09 |
---|---|
[java] 자바 별찍기 모래시계 찍기 (0) | 2022.11.08 |
[java] 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 (0) | 2022.11.02 |
[Java] 가변인자(varargs, 쩜쩜쩜) 사용법 (매개변수 동적 사용) (0) | 2022.10.25 |
[JAVA] Optional 클래스 (0) | 2022.10.06 |
댓글