String 생성 방식의 종류
String 타입의 생성 방식에는 두 가지가 있다.
- literal을 이용한 방식
- new 연산자를 이용한 방식
String str1 = "YOUTH"; // literal을 이용한 방식
String str2 = "YOUTH"; // literal을 이용한 방식
String str3 = new String("YOUTH"); // new 연산자를 이용한 방식
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
String 타입은 참조형 변수로서 == 비교를 하면 주소값 비교(Call by Reference)를 한다.
주소값에 들어있는 값을 비교하기 위해서는 equals() 메서드를 사용해야 한다.
서로 다른 String 객체끼리 == 비교할 때 true가 나올 수 있다?
위 코드에서 str1과 str2의 경우를 보자.
str1와 str2는 값이 "YOUTH"로 같더라도 각각 개별적으로 선언되었기 때문에 각각의 주소를 가지므로 == 비교 시에 false가 나올 것으로 예상했다.
하지만 결과는 true 였다.
발견
내가 간과했던 부분은 String 객체의 생성 방식에 따라 메모리 할당 방식에 차이가 있다는 것이었다.
String 객체 생성 시 literal을 사용하면 string constant pool에 생성되고, new 연산자를 사용하면 Heap 영역에 생성이 되는데,
이때 literal로 생성 시 이미 같은 literal이 pool 내에 존재한다면 해당 주소값을 반환하고, 존재하지 않는다면 새로운 주소값을 할당한다.
다시 말해서, 같은 literal로 선언된 String 객체는 같은 주소를 가진다. 즉, == 비교 시 true를 반환한다.
'발견' 카테고리의 다른 글
[Error / Spring] @PathVariable 변수명 인식 실패 이슈 (0) | 2024.05.07 |
---|---|
[Error] RedHat Linux(ootpa)의 패키지 관리자 (0) | 2024.04.02 |
[Docker] 도커 연결 시 Host 포트와 Container 포트 (0) | 2023.06.08 |
[오늘의 발견] 원형 자료구조에서의 인덱스 (0) | 2023.06.08 |
@Builder의 선언위치에 따른 차이 (0) | 2023.05.26 |