ㅅㅇ

String 리터럴 생성 방식 VS String 객체 생성 방식 본문

SW_STUDY/Java

String 리터럴 생성 방식 VS String 객체 생성 방식

SO__OS 2023. 6. 26. 15:50

String 데이터의 경우, 두 가지 방법으로 생성 가능하다.

두 방법은 메모리 저장 방식의 차이가 있다.

 

1. String 객체 생성 방식

String a = new String(“10”)
String b = new String(“10”)

// 주소값 비교 -> 값 비교 불가
print(a == b) // False

// 값 비교.
print(s.equals(b)) // True

 

  • 생성 시, 메모리 저장 방식
    new 키워드로 새로운 객체를 생성하는 것으로, Heap 메모리 영역에 저장

 

  • 비교 연산자 == 사용 불가.
    같은 문자열로 이뤄져 있어도, 참조값이 다르기에 사용 불가하다.

 

2. String 리터럴 생성 방식

String a = “10”;
String b = “10”;

// 주소값 비교 -> 데이터 값 비교 가능.
print(a == b) // True

 

  • 생성 시, 메모리 저장 방식
    Heap 안 String Constant Pool 영역에 저장
  1. 먼저, JVM은 해당 문자열이 String Constant Pool에 존재하는 지 확인
  2. String Constant Pool에 해당 문자열이 존재하지 않다면, 해당 문자열을 String Constant Pool에 저장한다. 존재하면 저장하지 않는다.

 

여기서 중요한 포인트는 해당 문자열이 있다면 저장하지 않는다는 것


str1 = "HI" 를 먼저 선언하고,
str2 = "HI" 를 선언한다면, HI 라는 문자열은 이미 String Constant Pool에 존재하기 때문에 저장을 하지 않고,

str2 또한, str1의 참조값으로 참조하게 됨.

 

즉, str1 과 str2 는 동일한 참조값을 가지게 된다.
이러한 이유로 데이터의 비교 연산 == 이 가능하게 된다.

 

== 비교 연산자는 참조 타입에 대해서는 주소값을 비교한다.

리터럴로 생성된 String 데이터의 경우,
같은 문자열을 갖는다면, 같은 상수를 참조하며 참조값이 같다는 것이기에

 

결국 참조값이 같다는 것은 데이터의 값이 같다는 것이 된다.