String, StringBuffer, StringBuilder

자바(Java)에서 문자열을 다루는 대표적인 클래스(Class)로 String, StringBuffer, StringBuilder가 있습니다. 이 클래스들은 모두 CharSequence 인터페이스의 구현체 클래스입니다. CharSequence 인터페이스를 상속 받았다는 것은 이 클래스들 모두 내부적으로 문자열을 char[]로 다루고 있다고 보면 됩니다.
연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 문제가 발생할 가능성은 거의 없습니다. 그러나 연산횟수가 많아지거나 멀티쓰레드, Race Condition 등의 상황이 자주 발생 한다면, 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 합니다.
String
String은 불변(Immutable)의 속성을 지니고있습니다. 즉, String 타입으로 인스턴스가 한번 생성되면 변경이 안된다는 의미입니다.
위 코드의 실행 결과는 아래와 같을 것입니다.
위의 예제를 분석할 때 "피카츄"라는 값을 가지고 있는 String 타입 참조변수 str이 가리키는 곳에 저장된 "피카츄"에 "라이츄" 문자열을 더해 "피카츄 라이츄"로 변경한 것으로 우리는 오해할 수 있습니다. 하지만, 기존에 "피카츄" 값이 들어가있던 참조변수 str이 "피카츄 라이츄"라는 값을 가지고 있는 새로운 메모리 영역을 가리키도록 변경되고 처음 선언했던 "피카츄"로 값이 할당되어 있던 메모리 영역은 가비지(Garbage)로 남았다가 GC(Garbage Collector)에 의해 소멸되는 것 입니다. String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된 것입니다.

String 인스턴스
위와 같이 String은 불변성을 지니고있기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용하면, 좋은 성능을 기대할 수 있습니다. 그러나 문자열 추가, 수정, 삭제 등의 연산이 자주 발생되는 로직에 String 클래스를 사용하면 힙 메모리(Heap Memory)에 많은 가비지(Garbage)가 생성되어 어플리케이션 성능에 악영향을 줍니다.
StringBuffer, StringBuilder
위의 String 클래스의 문제점을 해결하기 위해 Java는 가변적(Mutable)인 속성을 지닌 StringBuffer, StringBuilder 클래스를 제공하고 있습니다. String과 달리 StringBuffer와 StringBuilder는 가변적인 속성을 가지고 있기 때문에 .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능합니다. 따라서 문자열의 추가, 수정, 삭제가 자주 발생하는 경우라면 String 클래스가 아닌 StringBuffer와 StringBuilder 클래스를 사용하면 됩니다.
// StringBuffer 클래스
StringBuffer strBf = new StringBuffer("피카츄");
strBf.append(" 라이츄");
System.out.println(strBf);
// StringBuilder 클래스
StringBuilder strBd = new StringBuilder("피카츄");
strBd.append(" 라이츄");
System.out.println(strBd);
위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.
피카츄 라이츄
피카츄 라이츄
StringBuffer, StringBuilder
StringBuffer와 StringBuilder의 차이점
동일한 API를 가지고 있는 StringBuffer와 StringBuilder의 차이점은 동기화 유무입니다. StringBuffer는 동기화 키워들를 지원하여 멀티쓰레드 환경에서 안전합니다(thread-safe). 참고로 String도 불변성을 가지기 때문에 마찬가지로 멀티쓰레드 환경에서 안전합니다.
반대로 StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일 쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.
정리
|
String
|
StringBuffer
|
StringBuilder
|
저장소
|
String pool
|
Heap
|
Heap
|
변경
|
NO
|
YES
|
YES
|
멀티쓰레드
|
안전
|
안전
|
불안전
|
동기화
|
YES
|
YES
|
NO
|
성능
|
빠름
|
느림
|
빠름
|
'Kotlin > String' 카테고리의 다른 글
CharSequence (0) | 2022.09.13 |
---|---|
StringBuilder (0) | 2022.09.13 |
String (0) | 2022.09.12 |