String
먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer와 StringBuilder는 mutable(변함)에 있다.
String str = "hello"; // String str = new String("hello");
str = str + " world"; // [ hello world ]
위의 예제에서 "hello" 값을 가지고 있던 String 클래스의 참조변수 str이 가리키는 곳에 저장된 "hello"에 "world" 문자열을 더해 "hello world"로 변경한 것으로 생각 할 수 있다.
하지만 실제로는 기존에 "hello" 값이 들어가있던 String 클래스의 참조변수 str이 "hello world"라는 값을 가지고 있는 새로운 메모리영역을 가리키게 변경되고 처음 선언했던 "hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 사라지게 되는 것이다.
String 객체는 이러한 이유로 문자열 연산이 많은 경우, 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 된다. 하지만, Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe), 내부 데이터를 자유롭게 공유 가능하다는 장점이 있다.
StringBuffer/StringBuilder
String 과는 반대로 StringBuffer/StringBuilder 는 가변성 가지기 때문에 .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능하다. 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
그렇다면 StringBuffer와 StringBuilder의 차이는 무엇일까? 이는 동기화 여부에 있다.
StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다.
반면, StringBuilder는 동기화를 보장하지 않는다.
그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.
요약
String은 문자열 연산이 적고 멀티쓰레드 환경일 경우 사용한다.
StringBuffer는 문자열 연산이 많고 스레드에 안전한 프로그램이 필요할 때, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다.
StringBuilder는 문자열 연산이 많고 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.
출처
'Computer Science > Java' 카테고리의 다른 글
제네릭 (0) | 2023.04.10 |
---|---|
어노테이션 (0) | 2023.04.10 |
동일성과 동등성 (0) | 2023.04.10 |
원시 타입과 참조 타입 (1) | 2023.04.10 |
기타 제어자 - static, final, abstract (0) | 2023.04.10 |