자바 공부하다가 String이 불변 객체(immutable)라는 걸 알게 됐는데, 처음엔 좀 당황스러웠어요. 분명히 문자열을 바꾸는 것처럼 코드를 짰는데 원본이 안 바뀌더라고요.


String s = "abc";
s.concat("def");
System.out.println(s); // 여전히 "abc"


concat을 호출하면 당연히 s가 "abcdef"가 될 줄 알았는데 그대로 "abc"였습니다. 알고 보니 concat이 새 문자열을 만들어서 반환할 뿐이고 원본은 절대 안 건드린다더군요. (s = s.concat("def")로 받아야 바뀌고요.)


그런데 궁금한 건, 자바 설계자들이 왜 굳이 String을 이렇게 불변으로 만들었냐는 거예요. 값을 바로 못 바꾸니까 불편할 때도 있는데 분명 그럴 만한 이유가 있을 것 같거든요. 문자열 풀(String Pool)이니 해시값 캐싱이니 스레드 안전성, 보안 같은 키워드들을 봤는데 이게 다 불변이랑 어떻게 연결되는 건지 제대로 이해하고 싶습니다.