String
문자열을 저장하기위해 사용되는 클래스입니다.
immutable(불변) 클래스라고 불리지만, 문자열 끼리의 연산이 가능합니다.
무슨 말이냐?
String str = "Hello";
String str2 = new String("world");
str += str2;
System.out.println(str);
문자열 리터럴
첫 번째 줄의 값이 바로 리터럴로 적용됩니다. 이러한 문자열 리터럴의 경우 컴파일 시 클래스 파일에 저장됩니다.
이때 저장되는 공간이 따로 존재하며 이를 Constant Pool이라고 합니다.
Constant Pool에는 중복되는 문자열이 존재하지 않는다.
String str = "Hello";
String comp = "Hello";
System.out.println(str == comp);
System.out.println(str.equals(comp));
순서
- str는 컴파일 시에 Hello가 Constant pool에 저장된다.
- comp는 Hello가 이미 Constant Pool에 저장되어있기 때문에 Constant Poolt에서 가져온다.
- 따라서 str과 comp가 가지고 있는 주소값은 같으며
- 두 값 또한 같은 것을 볼 수 있다.
String Instance 생성
리터럴과 달리 인스턴스 생성의 경우 다른 결과가 나옵니다.
String str = new String("Hello");
String comp = new String("Hello");
System.out.println(str == comp);
System.out.println(str.equals(comp));
String 참조변수에 대해서 인스턴스 변수를 생성하게 되면 Hello라는값을 가지지만 전혀 다른 주소에 저장이 된다.
따라서 str과 comp의 경우 다른 참조 값을 가지는 것을 볼 수 있지만 값은 같다.
이렇게 String 클래스는 인스턴스던 리터럴이든 한 번 정해지면 새로운 값을 만들거나 가져오게 되면 Constatn Pool에 값을 저장하여 가지고 오는 방식입니다.
String 클래스의 참조 변수는 Constant Pool에서 새로운 값을 등록하고 가져오던지, 새로운 인스턴스를 할당 받을 뿐 변하지는 않습니다.