문자열 연결 연산자(+)는 여러 문자열을 하나로 결합해주는 편리한 도구입니다.
주로 한 줄로 된 출력값이나 고정 크기의 객체의 문자열 표현을 만들 때 사용하기에 유용합니다.
- ex) `String fullName = this.firstName + this.lastName;`
하지만 문자열 연결 연산자로 문자열 N개를 잇는 시간 복잡도는 O(N^2)이기 때문에 본격적으로 많은 문자열을 합치기 시작하면 성능 저하를 피하기 어렵습니다.
- 문자열은 불변이기 때문에 두 문자열을 연결하는 경우 양쪽의 내용을 복사하여 연결한 다음 새로운 String 객체를 생성해야하기 때문
- 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하는 것을 권장
- 자바 6번 이후 문자열 연결 성능을 다방면으로 개선했지만, 두 메서드의 성능 차이는 여전히 큼
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Example { | |
public static void main(String[] args) { | |
long start = System.currentTimeMillis(); | |
String result = ""; | |
for (int i = 0; i < 10000; i++) { | |
result += String.valueOf(i); | |
} | |
System.out.println(result); | |
long end = System.currentTimeMillis(); | |
System.out.println(String.format("+ 연산자를 통해 문자열 합치는 실행시간: %d", (end - start))); | |
start = System.currentTimeMillis(); | |
StringBuilder sb = new StringBuilder(); | |
for (int i = 0; i < 10000; i++) { | |
sb.append(String.valueOf(i)); | |
} | |
System.out.println(sb.toString()); | |
end = System.currentTimeMillis(); | |
System.out.println(String.format("StringBuilder를 통해 문자열 합치는 실행시간: %d", (end - start))); | |
} | |
} |

String vs StringBuffer vs StringBuilder
1. String
- 불변(Immutable) 클래스이기 때문에 한 번 생성된 문자열은 변경할 수 없음
- 문자열에 대한 연산이 수행될 때마다 새로운 문자열 객체가 생성됨
- 멀티쓰레드 환경에서 thread-safe
- 주로 문자열에 대한 변화가 없는 경우나, 변경된 문자열을 새로 생성하는 것이 아닐 때 사용
- String의 concat 연산은 + 기호를 사용
2. StringBuffer
- 가변(Mutable) 클래스이며 문자열 변경 가능
- 문자열의 추가, 삽입, 삭제 등의 연산을 수행할 때 유용
- 멀티 쓰레드 환경에서 동기화되어 있어 thread-safe
- append 메서드에 synchronized 키워드가 적용되어 있기 때문에 한 쓰레드가 작업 진행 시 락 걸림
- 이 때문에 단일 쓰레드 환경에서는 StringBuilder보다 조금 느릴 수 있음

3. StringBuilder
- StringBuffer와 유사하지만, thread-safe하지 않음
- 단일 쓰레드 환경에서 StringBuffer보다 더 빠르게 동작
- 동기화에 대한 오버헤드가 없으므로 StringBuffer보다 메모리 사용이 적음
- 단일 쓰레드 환경에서 문자열을 동적으로 조작할 때 주로 사용
- 하지만 각 StringBuilder 인스턴스를 하나의 쓰레드만 수정할 수 있다는 것을 보장하는 경우 StringBuilder를 사용하는 것이 더 효율적 (https://stackoverflow.com/questions/26860173/what-does-stringbuilders-are-not-thread-safe-mean )
- 대부분 문자열을 여러 개의 스레드를 공유하지 않고 StringBuilder/StringBuffer를 로컬 변수로 사용하여 순차적으로 구성하기 때문에 StringBuffer보다는 StringBuilder 사용을 권장
참고
이펙티브 자바
반응형
'JAVA > Effective Java' 카테고리의 다른 글
[아이템 65] 리플렉션보다는 인터페이스를 사용하라 (0) | 2024.03.19 |
---|---|
[아이템 64] 객체는 인터페이스를 사용해 참조하라 (0) | 2024.03.18 |
[아이템 62] 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2024.03.17 |
[아이템 61] 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2024.03.17 |
[아이템 60] 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2024.03.17 |