Java String - 불변 객체
먼저 불변 객체란 생성 이후에 내부 문자열 값을 변경 할 수 없는 객체이다.
String 불변 객체
자바의 String 클래스 내부를 살펴보면 다음과 같이 타입 앞에 final 키워드가 있다.
public final class String implements ... {
@Stable
private final byte[] value;
}
String 불변 객체로 변경 이후로는 문자 값을 변경 할 수 없는 것이다.
불변 객체 실습
public class StringImmutable {
public static void main(String[] args)
{
String str = "hello";
str.concat(" world");
System.out.println("str = " + str);
}
}
출력 결과
str = hello
concat 으로 합쳤으나 str 변수는 world
가 합쳐지지 않았다.
내부에서는 final byte[] value = "hello" 형태로 할당할 것이고, final 불변 객체임으로 변경되지 않는다.
새로운 str2 변수를 새롭게 할당 해주도록 한다.
불변 객체 실습
public class StringImmutable {
public static void main(String[] args)
{
String str = "hello";
String str2 = str.concat(" world");
System.out.println("str = " + str);
System.out.println("str2 = " + str2);
}
}
출력 결과
str = hello
str2 = hello world
자바 내부는 새로운 final byte[] value = "hello world" 객체를 생성될 것이다.(new 연산자로 일어남)
새로운 str2 객체와 기존 str 객체가 유지하게 된다.
String 불변인 이유
문자열 풀에 있는 String 인스턴스 값이 변경되면 이 문자열을 참고하는 다른 변수의 값이 변화가 일어난다.
String str3 = str;
String str4 = str;
str3, str4 신규로 만들고 변수 str 를 참고하고 있는 경우, 변수 str의 문자열 "hello" 에서 "nice" 문자열로 변경하면 str, str3, str4 모두 변화가 일어난다.
str 변경했을 뿐인데 str3, str4변화가 일어나게 되면 원치 않는 결과가 발생되고 사이드이펙트 문제가 발생한다.
String 문자열을 불변으로 설계하여 이러한 사이드 이펙트 문제를 방지한다.