Java에서 문자열을 이어붙이는 방법은 여러 가지가 있지만, 가장 흔히 쓰이는 방식은 다음 두 가지가 있다.
1. StringBuilder.append() 사용
2. 문자열 덧셈 연산자 + 사용

두 방식 모두 동일한 결과를 만들어내지만, 성능과 내부 처리 방식에서는 큰 차이가 있다. 차이점과 어떤 상황에서 어떤 방식이 더 효율적인지 정리해보려 한다.

문자열은 불변(Immutable)이다

Java의 String 클래스는 불변(immutable)이다.
즉, 한 번 생성된 문자열은 수정될 수 없고, 문자열을 더할 경우 항상 새로운 String 객체가 생성된다.

String str = "Hello";
str = str + " World"; // 새로운 String 객체가 생성됨

변수에 문자열을 덧붙이면 기존 문자열은 버려지고 새로운 객체가 만들어지기 때문에,
반복적으로 수행하면 성능 저하와 메모리 낭비가 발생됨

하지만, 컴파일 타임 상수일 경우는 예외
String str = "Hello" + " World"; // 컴파일 타임에 "Hello World"로 합쳐짐

컴파일러는 리터럴 상수끼리의 문자열 덧셈은 컴파일 시점에 미리 계산하여 단일 문자열 리터럴로 처리함.
이 경우에는 불필요한 객체 생성이 발생하지 않음

StringBuilder.append() 방식은 객체 새로 만들지 않음
StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("world!");
sb.append(" Have a nice day!");

내부적으로 가변 배열을 사용하여 객체를 새로 만들지 않고 문자열을 추가.

문자열 덧셈 vs StringBuilder.append() 비교표
코드 간결성✅ 매우 간단하고 직관적임❌ 다소 길고 복잡함
가독성✅ 좋음❌ 비교적 낮음
컴파일 타임 최적화✅ 상수끼리는 최적화됨❌ 해당 없음
성능 (반복문 내부)❌ 느림 (객체 계속 생성됨)✅ 빠름 (하나의 객체 사용)
메모리 효율❌ 낮음 (불필요한 객체 생성)✅ 높음 (재사용 가능)
불변성(Immutable)✅ String은 불변이라 안전함❌ StringBuilder는 가변 객체
멀티스레드 안전성✅ 불변이므로 안전함❌ thread-safe 아님 (필요시 StringBuffer)
주 사용 용도간단한 문자열 조합ok대량 문자열 처리, 반복문

+ Recent posts