Java 문자열 연결 방법 비교

⏱ 2 분

StringBuilder / StringBuffer / + 연산자 / concat 메소드

Java 에서 문자열을 연결해 붙일 때 비슷한 역할을 하는 StringBuffer, StringBuilder, + 연산자, concat 메소드가 어떤 점이 다른지 비교해보겠습니다.

String.concat()

Spring 클래스에는 문자열을 이어주는 concat 메소드가 있습니다.

1
String abc = "A".concat("B").concat("C"); // ABC

Java 에서 String 은 불변(immutalble) 한 특성을 가집니다. 따라서 새로운 문자열을 더할 때마다 새로운 인스턴스를 생성하기 때문에 성능 상이나 속도 면에서 비효율적입니다. 예제처럼 간단한 경우라면 모를까 보고서를 생성하는 등 문자열 처리가 많은 작업을 할수록 이슈가 될 수 있습니다.

StringBuilder

1
2
3
4
String abc = new StringBuilder()
.append("A")
.append("B")
.append("C").toString();

내부적으로 문자열을 가지고 문자열을 변경하는 메소드를 제공합니다. Java 에서 String 은 불변(immutalble) 하기 때문에 수정 시에 새로운 인스턴스를 만들게 됩니다. 하지만 StringBuilder 를 사용하면 문자열을 계속해서 앞뒤로 덧붙이거나 중간에 문자열을 삽입 삭제하는 등 다양한 연산이 가능합니다.

+ 연산자

+ 연산자로도 문자열을 붙일 수가 있습니다. + 연산자의 경우 Java 1.5 이전에는 concat 메소드와 동일하게 새로운 String 인스턴스를 생성했지만, Java 1.5 부터는 내부적으로 StringBuilder 로 변환해서 처리하기 때문에 StringBuilder 와 동일하다고 보시면 됩니다. 간단한 경우에 StringBuilder 보다 훨씬 가독성이 좋으니 + 연산자를 사용하는게 좋습니다.

1
2
// StringBuilder 와 동일
String abc = "A" + "B" + "C"; // ABC

+ 연산자 그리고 StringBuilder

그렇다면 StringBuilder 를 쓸 이유가 없을까요? 아닙니다.
간단한 문자열 조합은 + 연산으로 충분하지만 만들 때마다 StringBuilder 인스턴스를 생성합니다. 따라서 반복문에서 문자열을 조합하는 것처럼 StringBuilder 인스턴스를 생성해서 여러 작업을 하는 경우에는 StringBuilder 를 쓰는게 좋습니다.

1
2
3
4
5
6
7
List<String> list = Arrays.asList("foo", "bar", "baz", "qux");

StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
}
System.out.println(sb);

다음과 같이 반복문 상에서 문자열 조합에 대한 성능을 비교해볼 수 있습니다.

http://www.pellegrino.link/2015/08/22/string-concatenation-with-java-8.html

StringBuilder 그리고 StringBuffer

두 클래스의 차이는 multithreaded 환경에서 동기화 보장이 되어있느냐의 차이입니다. multithreaded 환경에서는 StringBuffer 를 사용하셔야 합니다.

결론

  1. 기본적으로 + 연산자를 쓰자.
  2. multithreaded 환경에서는 StringBuffer
  3. 반복문에서의 작업이나 다양한 문자열 작업 처리는 StringBuilder 또는 StringBuffer