String은 기본적으로 참조형이며 String 객체를 참조한다.
String은 불변성을 가지며 새로운 값을 할당하기 위해서 새로운 객체를 생성해야한다.
불변성을 갖는 String은 a = a + "test2"
와 같은 연산을 수행할 때 새로운 객체를 생성해 값을 복사해 그 레퍼런스를 반환한다.
→ String 간 이로 인해 연산은 비용이 크게 발생하며 그 때문에 StringBuilder, StringBuffer를 사용한다.
String a = "test"
와 같이 스트링 리터럴을 통해 생성된 객체는 String Constant Pool에 저장된다String a = "test";
String b = "test";
system.out.println(a == b);
//true, 참조하는 SCP 가 같다.
String a = new String("test");
String b = "test";
//비교하기
System.out.println(a == b );
//false
String 객체는 프로그램 동작 상에서 자주 사용하게 된다. 그중 자주 사용하는 String은 계속하여 사용되는 경우가 있는데, 그럴 때마다 객체를 생성해 주기보다는 scp에 저장하여 같은 문자열이라면 같은 주소를 참조하게 해서 힙 영역을 절약할 수 있다.
외부에서 DB 내의 username, password 등의 중요정보를 제어할 수 없도록 Immutable 하게 관리한다. 또한 다중쓰레드 환경에서 값의 변경가능성을 지워 동기화 이슈를 고려하지 않을 수 있다.
객체의 hashcode를 통해 키로 사용할 때 String은 매번 계산하지 않고 생성 단계에서 캐싱을 한다. 이렇게 해시코드를 캐싱할 수 있는 이유는 각 String은 불변하기 때문이다.
public class StringTest {
public static void main(String[] args) {
String str = "hello ! ";
Object o1 = new Object();
String str2 = str + o1;
System.out.println(str2);
//출력값 : hello ! java.lang.Object@2a139a55
}
}
무야호