반응형
Java에서는 문자열을 다루기 위한 클래스로 String
, StringBuilder
, StringBuffer
가 있다.
각각 특성에 따라 상황에 맞게 선택하여 사용해야한다.
String
예시
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + " " + str2; // 새로운 문자열 객체가 생성됨
특징
- 불변성
String
객체는 불변(imuutable) 특징을 갖고 있다. 즉, 한번 생성된String
객체의 값은 변경할 수 없다.
만약 새로운 문자열을 만들려면 기존 문자열을 기반으로 새로운객체를 생성해야 한다. - 리터럴 풀
문자열 리터럴은 JVM의 문자열 풀에 저장되어 메모리 효율성을 높인다.
이는 동일한 값을 가지는 문자열 리터럴은 동일한 객체를 참조하게끔 한다.
장단점
- 장점
- 불변성이므로 멀티스레드 환경에서 안전하다.
- 문자열 리터럴 풀을 통해 메모리 사용량을 줄일 수 있다.
- 단점
- 문자열을 자주 변경해야 하는 경우, 만들때마다 새로운 객체를 생성하기 때문에 성능이 저하된다.
적절한 사용 시기
- 문자열이 자주 변경되지 않는 경우.
- 문자열 상수를 사용할 때.
- 멀티스레드 환경에서 문자열을 사용할 때.
StringBuilder
예시
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.reverse();
String result = sb.toString();
특징
- 가변성
StringBuilder
는 가변(mutable) 문자열을 제공한다.
내부 버퍼를 사용하여 문자열을 변경할 수 있다. - 비동기성
StringBuilder
는 동기화 되지 않는다. 때문에 멀티스레드 환경에서는 적절치 않다
장단점
- 장점
- 문자열을 자주 변경해야 하는 경우 성능이 뛰어나다.
- 동기화를 지원하지 않기 때문에 싱글 스레드 환경에서 더 빠르다.
- 단점
- 동기화를 지원하지 않기 때문에 멀티스레드 환경에서는 안전하지 않다.
적절한 사용 시기
- 단일 스레드 환경에서 문자열을 자주 변경해야 할 때
- 문자열 결합이나 수정 작업이 빈번히 일어날 때
StringBuffer
예시
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.reverse();
String result = sb.toString();
예시와 같이 StringBuilder
와 같은 메서드를 사용할 수 있다.
특징
- 가변성
StringBuffer
도 가변(mutable) 문자열을 제공한다.
내부 버퍼를 사용하여 문자열을 변경할 수 있다. - 동기성
StringBuffer
는 모든 메서드가 동기화 되어있다. 따라서 멀티스레드 환경에서 안전하다.
장단점
- 장점
- 문자열을 자주 변경해야 하는 경우 성능이 뛰어나다.
- 동기화를 지원하기 때문에
StringBuilder
와 달리 멀티스레드 환경에서는 안전하다.
- 단점
- 동기화로 인해 단일 스레드 환경에서는
StringBuilder
보다 느리다.
- 동기화로 인해 단일 스레드 환경에서는
적절한 사용 시기
- 단일 스레드 환경에서 문자열을 자주 변경해야 할 때
- 문자열 결합이나 수정 작업이 빈번히 일어날 때
한번에 비교하기
특징 | String | StringBuilder | StringBuffer |
가변성 | 불변(immutable) | 가변(mutable) | 가변(mutable) |
동기화 | 비동기적 | 비동기적 | 동기적 |
멀티스레드 안전성 | 안전 | 안전하지 않음 | 안전 |
성능 | 문자열 변경이 적은 경우 효율적 | 단일 스레드 환경에서 가장 빠름 | 멀티스레드 환경에서 비교적 빠름 |
주요 사용 시기 | 문자열 상수, 변경이 적은 경우, 멀티스레드 | 단일 스레드 환경에서 빈번한 문자열 변경 | 멀티스레드 환경에서 빈번한 문자열 변경 |
728x90
반응형
'Language > Java' 카테고리의 다른 글
Promotion(자동형변환)과 Casting(명시적형변환), Upcasting vs Downcasting (0) | 2024.12.05 |
---|---|
String Interning (0) | 2024.12.04 |
Stream API (0) | 2024.12.02 |
Java는 Call by Reference가 존재하지 않는다. (0) | 2024.12.01 |
JVM(Java Virtual Machine)과 Java 컴파일 과정 (0) | 2024.11.29 |