[JAVA] 문자열 연결 방법 비교
JAVA 문자열 연결 방법
- concat메소드
- StringBulider 객체
- StringBuffer 객체
- "+" 연산자
String.concat()
String 클래스에는 문자열을 이어주는 concat 메소드가 있습니다.
String abc = "A".concat("B").concat("C"); // ABC
Java 에서 String 은 불변(immutalble) 한 특성을 가집니다. 따라서 새로운 문자열을 더할 때마다 새로운 인스턴스를 생성하기 때문에 성능 상이나 속도 면에서 비효율적입니다. 예제처럼 간단한 경우라면 모를까 보고서를 생성하는 등 문자열 처리가 많은 작업을 할수록 이슈가 될 수 있습니다.
StringBuilder
String sb = new StringBuilder()
.append("A")
.append("B")
.append("C").toString();
내부적으로 문자열을 가지고 문자열을 변경하는 메소드를 제공합니다. Java 에서 String 은 불변(immutalble) 하기 때문에 수정 시에 새로운 인스턴스를 만들게 됩니다. 하지만 StringBuilder 를 사용하면 문자열을 계속해서 앞뒤로 덧붙이거나 중간에 문자열을 삽입 삭제하는 등 다양한 연산이 가능합니다.
+ 연산자
"+" 연산자로도 문자열을 붙일 수가 있습니다. + 연산자의 경우 Java 1.5 이전에는 concat 메소드와 동일하게 새로운 String 인스턴스를 생성했지만, Java 1.5 부터는 내부적으로 StringBuilder 로 변환해서 처리하기 때문에 StringBuilder 와 동일하다고 보시면 됩니다. 간단한 경우에 StringBuilder 보다 훨씬 가독성이 좋으니 + 연산자를 사용하는게 좋습니다.
// StringBuilder 와 동일
String abc = "A" + "B" + "C"; // ABC
+ 연산자 그리고 StringBuilder
그렇다면 StringBuilder 를 쓸 이유가 없을까요? 아닙니다.
간단한 문자열 조합은 + 연산으로 충분하지만 만들 때마다 StringBuilder 인스턴스를 생성합니다. 따라서 반복문에서 문자열을 조합하는 것처럼 StringBuilder 인스턴스를 생성해서 여러 작업을 하는 경우에는 StringBuilder 를 쓰는게 좋습니다.
List<String> list = Arrays.asList("foo", "bar", "baz", "qux");
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
}
System.out.println(sb);
다음과 같이 반복문 상에서 문자열 조합에 대한 성능을 비교해볼 수 있습니다.
StringBuilder 그리고 StringBuffer
두 클래스의 차이는 multithreaded 환경에서 동기화 보장이 되어있느냐의 차이입니다. multithreaded 환경에서는 StringBuffer 를 사용하셔야 합니다.
결론
- 기본적으로 + 연산자를 쓰자.
- multithreaded 환경에서는 StringBuffer
- 반복문에서의 작업이나 다양한 문자열 작업 처리는 StringBuilder 또는 StringBuffer
참고
https://futurecreator.github.io/2018/06/02/java-string-concatenation/