자바에서 문자열을 다루는 자료형 클래스로 String, StringBuffer, StringBuilder가 있다.
String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가진다.
String
자바에서 String 객체의 값은 변경할 수 없다.
public final class String implements java.io.Serializable, Comparable {
private final byte[] value;
}
String의 내부 구성 요소는 위와 같은데, 상수(final)형으로 선언되어 있어 변경할 수 없다.
String str = "hello";
str = str + " world";
System.out.println(str); // hello world
위의 코드를 보면 변수 str가 참조하는 메모리의 "hello"라는 값에 "world"라는 문자열을 더해서 String 객체 자체의 값을 업데이트시킨 것으로 보일 수 있다. 하지만, 실제로는 메모리에 새로 "hello world" 값을 저장한 영역을 따로 만들고 변수 str를 다시 참조하는 식으로 작동한다.
StringBuffer, StringBuilder
StringBuffer와 StringBuilder는 String과 같이 문자열 데이터를 다루지만 공간이 부족해지는 경우 버퍼의 크기를 유연하게 늘려주어 가변적이다. 두 클래스 내부에 Buffer(데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있다.
따라서, 값이 변경될 때마다 새롭게 객체를 만드는 String보다 훨씬 빠르기 때문에 문자열의 추가, 수정, 삭제가 빈번하게 발생하는 경우라면 String 클래스가 아닌 StringBuffer나 StringBuilder를 사용하는 것이 이상적이다.
StringBuffer와 StringBuilder의 차이점은 멀티 스레드 환경에서 안전하나 아니냐이다.
StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서 안전하게 동작할 수 있지만, StringBuilder는 동기화를 지원하지 않아 멀티 스레드 환경에서 안전하지 않다.
String을 불변으로 설정한 이유
1. 캐싱
String을 불변으로 함으로써, String pool에 각 리터럴 문자열의 하나만 저장하며 다시 사용하거나 캐싱에 이용하여 힙 공간을 절약할 수 있다는 장점이 있다.
2. 보안
중요한 데이터를 문자열로 다루는 경우, 강제로 해당 참조에 대한 문자열 값을 바꾸는 것이 불가능하기 때문에 보안에 유리하다.
3. 동기화
불변함으로써 동시에 실행되는 여러 스레드에서 안정적으로 공유가 가능하다.
'CS > Java' 카테고리의 다른 글
로깅 시 System.out.println()을 사용하지 않는 이유 (0) | 2023.08.13 |
---|---|
new String()과 리터럴("") (1) | 2023.08.12 |
equals()와 hashCode() (0) | 2023.08.11 |
Java 컴파일 과정 (0) | 2023.05.18 |
직렬화(Serialization) (1) | 2022.09.26 |