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 | String abc = new StringBuilder() |
내부적으로 문자열을 가지고 문자열을 변경하는 메소드를 제공합니다. Java 에서 String 은 불변(immutalble) 하기 때문에 수정 시에 새로운 인스턴스를 만들게 됩니다. 하지만 StringBuilder 를 사용하면 문자열을 계속해서 앞뒤로 덧붙이거나 중간에 문자열을 삽입 삭제하는 등 다양한 연산이 가능합니다.
+ 연산자
+
연산자로도 문자열을 붙일 수가 있습니다. +
연산자의 경우 Java 1.5 이전에는 concat 메소드와 동일하게 새로운 String 인스턴스를 생성했지만, Java 1.5 부터는 내부적으로 StringBuilder 로 변환해서 처리하기 때문에 StringBuilder 와 동일하다고 보시면 됩니다. 간단한 경우에 StringBuilder 보다 훨씬 가독성이 좋으니 + 연산자를 사용하는게 좋습니다.
1 | // StringBuilder 와 동일 |
+ 연산자 그리고 StringBuilder
그렇다면 StringBuilder 를 쓸 이유가 없을까요? 아닙니다.
간단한 문자열 조합은 +
연산으로 충분하지만 만들 때마다 StringBuilder 인스턴스를 생성합니다. 따라서 반복문에서 문자열을 조합하는 것처럼 StringBuilder 인스턴스를 생성해서 여러 작업을 하는 경우에는 StringBuilder 를 쓰는게 좋습니다.
1 | List<String> list = Arrays.asList("foo", "bar", "baz", "qux"); |
다음과 같이 반복문 상에서 문자열 조합에 대한 성능을 비교해볼 수 있습니다.
StringBuilder 그리고 StringBuffer
두 클래스의 차이는 multithreaded 환경에서 동기화 보장이 되어있느냐의 차이입니다. multithreaded 환경에서는 StringBuffer 를 사용하셔야 합니다.
결론
- 기본적으로 + 연산자를 쓰자.
- multithreaded 환경에서는 StringBuffer
- 반복문에서의 작업이나 다양한 문자열 작업 처리는 StringBuilder 또는 StringBuffer