Immutable String in Java

Haiseong Jeong·2022년 10월 5일
4

A String is an unavoidable type of variable while writing any application program. String references are used to store various attributes like username, password, etc. In Java, String objects are immutable. Immutable simply means unmodifiable or unchangeable.
출처 : javatpoint

못바꿔유

자바에서 문자열은 바꿀 수 없다.

String은 사실 Class

어쩐지 앞글자가 대문자인게 수상하더라. String 타입은 사실 클래스다. 엥? 그러면 지금까지 new 키워드 없이 잘 쓰고 있었는데 이게 어떻게 된 일인가.

문자열을 만드는 방법 두가지

String str1 = "hello world";				// "" : String literal
String str2 = new String("hello world");	// new 연산자 : String Object

지금까지는 위의 방법으로 문자열을 만들었다. 이제 String이 클래스라는 사실을 알았으니 아래 방법으로 만들 수 있다. str1과 str2에 "hello world"가 저장되었다. (정확히는 str1과 str2가 "hello world"를 가리키고 있다.) 이제 다음 코드의 결과를 생각해보자.

System.out.println(str1);			// hello world
System.out.println(str2);			// hello world
System.out.println(str1 == str2);	// false

false가 출력된다. 위의 두 결과는 같은데 왜 false가 뜨는것일까?

저장되는 곳이 다르다.

결론부터 말하면 저장되는 곳이 다르다. String literal 즉 쌍따옴표를 사용해서 만드는 방식은 정말 독특하다. str2가 가리키는 문자열이 저장된 위치를 알아보자.
저번 포스팅에서 다루었지만 인스턴스는 메모리에 동적할당된다. 이 메모리 영역을 힙 영역이라고 한다. str2가 가리키고 있는 문자열도 new키워드를 통해 동적할당 되었다. 따라서 힙영역에 저장되어 있다. str1는 어디에 저장되어 있을까. str1은 힙영역의 String Pool에 저장되어 있다.

String Pool

String Pool은 힙영역 안에 있는 공간이다. String Constant Pool이라고도 하는데 이 공간은 String literal로 만들어진 문자열들이 저장된다. 이때 문자열의 내용이 같다면 저장소를 공유한다. 다음 코드를 보자.

String str1 = "hello world";	// "" : String literal
String str2 = "hello world";	// "" : String literal
System.out.println(str1 == str2);	// true

따로따로 만든 문자열이 == 연산의 결과를 true로 반환한다.

이 그림처럼 str1과 str2는 각각 저장된 문자열을 가리키는게 아니라 String Pool의 문자열 하나를 가리킨다. 여기서 다음코드를 실행시킨다.

String str2 += "!!!";


여기서 중요한 점은 String 클래스는 기존의 "Hello world" 객체를 바꾸는 게 아니다. 새로운 "Hello world!!!" 객체를 만든다는 것이다. 객체가 한 번 생성되면 할당된 메모리 공간이 변하지 않고 연산할 때마다 새로운 문자열로 저장하고 그 객체를 참조한다.

'==' vs equals()

System.out.println(str1 == str2); // false 의 결과값이 false인 이유는 '=='가 값을 비교하는게 아닌 주소를 비교하기 때문이다. 반대로 equals()값자체를 비교한다. 따라서 C언어의 strcmp()가 필요할때 equals() 를 쓰자.

profile
나는 개발자다. 5000만큼 코딩한다.

0개의 댓글