Java에서 String, StringBuilder, StringBuffer는 문자열을 다루기 위한 클래스들로, 각각의 특성과 사용 목적이 다르다.
이 클래스들의 차이점은 주로 불변성, 성능, 그리고 동기화 여부에 있다.
아래에서 각 클래스의 특징과 차이점을 상세히 설명하겠다.
String
주요 특징
불변성 (Immutability)
String 객체는 한 번 생성되면 수정할 수 없다
문자열을 변경하는 모든 작업은 새로운 String 객체를 생성한다
불변성의 장점
불변성 덕분에 String 객체는 스레드 안전(thread-safe)하며, 해시 코드가 캐시되기 때문에 효율적으로 사용할 수 있다
성능
문자열 결합과 같은 작업에서 많은 새로운 객체를 생성하게 되어 성능이 떨어질 수 있다
예제
public class StringExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = str1 + " World";
System.out.println(str2); // "Hello World"
}
}
StringBuilder
주요 특징
가변성 (Mutability)
StringBuilder 객체는 생성 후에도 내용을 수정할 수 있다.
즉, 문자열 변경 작업이 가능하며, 새로운 객체를 생성하지 않고도 문자열을 수정할 수 있다.
비동기적 (Not synchronized)
StringBuilder는 동기화되지 않아서 멀티스레드 환경에서 안전하지 않지만, 단일 스레드에서 사용 시 성능이 우수하다.
성능
문자열 결합이나 수정 작업에서 성능이 우수하다
예제
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString()); // "Hello World"
}
}
StringBuffer
주요 특징
가변성 (Mutability)
StringBuffer 객체도 생성 후 내용을 수정할 수 있다
동기화 (Synchronized)
StringBuffer는 모든 메서드가 동기화되어 있어서 멀티스레드 환경에서 안전하게 사용할 수 있다
성능
StringBuilder보다 성능이 떨어질 수 있지만, 멀티스레드 환경에서는 안전하다
예제
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb.toString()); // "Hello World"
}
}
비교 요약
특징 String StringBuilder StringBuffer
불변성 | 불변 (Immutable) | 가변 (Mutable) | 가변 (Mutable) |
동기화 | 동기화되지 않음 | 동기화되지 않음 | 동기화됨 (Synchronized) |
스레드 안전성 | 안전 (Thread-safe) | 안전하지 않음 (Not thread-safe) | 안전 (Thread-safe) |
성능 | 문자열 변경 시 성능 저하 | 단일 스레드에서 가장 우수 | 멀티스레드 환경에서 안전 |
사용 예 | 변경되지 않는 문자열 | 단일 스레드에서 문자열 변경 | 멀티스레드에서 문자열 변경 |
사용 권장 사항
String 문자열이 변경되지 않는 경우 사용. 불변성이 필요한 경우나 문자열 리터럴을 사용할 때 적합.
StringBuilder 단일 스레드 환경에서 문자열을 자주 변경해야 하는 경우 사용. 성능이 중요한 경우.
StringBuffer 멀티스레드 환경에서 문자열을 자주 변경해야 하는 경우 사용. 스레드 안전성이 필요한 경우.
이처럼 각 클래스는 사용 목적과 상황에 따라 선택적으로 사용되어야 하며, 성능과 스레드 안전성 요구 사항에 따라 적절한 클래스를 사용하는 것이 중요하다
'Job Interview Prep' 카테고리의 다른 글
Hibernate-Spatial 관련 개념 정리 (0) | 2024.08.01 |
---|---|
ktlint 자동적용 안 되는 경우 해결법 (0) | 2024.06.02 |
제네릭(Generic)이란 (0) | 2024.05.31 |
Java volatile / synchronized (0) | 2024.05.31 |
JavaBean (1) | 2024.05.31 |