Java에서 String 클래스는 문자열을 나타내는 불변(Immutable) 클래스입니다.
String 객체를 생성하면 그 값을 변경할 수 없습니다. 예를 들어, 문자열을 한 번 생성하면 해당 문자열 내용을 변경할 수 없고, 새로운 문자열을 생성해야 합니다.
Java에서는 문자열을 리터럴로 표현할 수 있습니다. 이 리터럴은 상수 풀(Constant Pool)에 저장되어 같은 값의 문자열은 동일한 주소를 가리킵니다. 따라서 동일한 문자열 리터럴을 사용하면 같은 내용을 가진 객체를 재사용합니다.
String str1 = "Hello";
String str2 = "Hello";
// str1과 str2는 동일한 문자열을 가리킴
System.out.println(str1 == str2); // true
String 클래스는 문자열을 연결하거나 변환하는 다양한 메서드를 제공합니다. + 연산자를 사용하여 문자열을 연결할 때, 실제로는 새로운 String 객체가 생성됩니다.
String은 내부적으로 문자열을 저장하기 위해 char 배열을 사용합니다. 이 char 배열은 불변하며, 문자열의 내용을 변경할 수 없도록 설계되어 있습니다.
String 클래스는 문자열에 대한 다양한 작업을 수행하는 메서드들을 제공합니다. 이 메서드들을 사용하여 문자열의 길이, 부분 문자열 추출, 검색, 대소문자 변환 등을 할 수 있습니다.
불변성은 문자열이 보안적으로 안전하고 멀티스레드 환경에서 안정적으로 사용될 수 있게 해주며, 문자열의 값이 바뀌지 않는다는 것은 예측 가능한 동작을 보장합니다. 따라서 Java에서 문자열을 다룰 때 String 클래스의 불변성에 유의해야 합니다.
Java에서 String이 불변 객체인 이유는 여러 가지 중 가장 중요한 이유는 Java에서 문자열이 한 번 생성되면 그 값을 변경할 수 없게 설계되어 있기 때문입니다. 여기에 몇 가지 이유가 있습니다.
문자열이 불변하면, 한 번 생성된 문자열의 값은 변경될 수 없어 해킹이나 보안 위협으로부터 안전합니다.
불변 객체인 문자열은 여러 스레드에서 안전하게 공유될 수 있습니다. 동시에 여러 곳에서 문자열을 사용해도 값을 변경하지 않기 때문에 스레드 안전성이 보장됩니다.
문자열의 불변성은 문자열 리터럴의 값들이 캐시될 수 있다는 것을 의미합니다. 이는 동일한 문자열 리터럴을 재사용하여 메모리를 절약할 수 있게 해줍니다.
불변 객체로서 문자열을 사용하면 객체 풀링을 구현할 수 있습니다. 같은 값을 가진 문자열이 자주 사용될 때, 객체를 새로 생성하는 대신 이미 존재하는 문자열 객체를 재사용함으로써 메모리 사용을 최적화할 수 있습니다.
이러한 이유들로 Java에서 String은 불변 객체로 설계되었습니다. 문자열 값이 변경되지 않게 하여 안정성과 성능을 높이고, 예상치 못한 문제를 방지하는 데 도움이 됩니다.