본문 바로가기
개발언어/JAVA

[JAVA] 문자열 붙이는 방법 총정리(concat, StringBuilder, StringBuffer, + )

by 코딩 시그널 2020. 10. 15.
반응형

자바에서 문자열을 붙이는 4가지 방법에 대해 정리해 보고, 또 각각의 차이점은 무엇인가에 대해서 알아보겠습니다.

Concat 

concat은 String 클래스에서 제공하는 기본 메서드이며 동작 방법은 합친 문자열을 String으로 생성한다. concat() 메서드를 이용해서 문자열을 추가할 때마다, 새로운 인스턴스를 생성하기 때문에 성능이나 속도 면에서 좋지 않다.

 

String str1 = "첫번째 텍스트입니다 "; 
String str2 = "두번째 텍스트입니다"; 
System.out.println("결과: " + str1.concat(str2)); 

//결과 : 첫번째 텍스트입니다 두번째 텍스트입니다

'+' 연산자

문자열을 붙일 때 가장 직관적으로 떠올릴 수 있는 방법이다. jdk 1.5 이전에는 concat() 메서드처럼 문자열을 추가할 때마다 새로운 인스턴스를 생성했지만 이후에 StringBuilder로 변환해서 처리하는 것으로 변경되었다. 문자열을 먼저 StringBuilder로 변환시킨 뒤, Append로 문자열을 더하고 다시 toString함수로 문자열로 반환해주는 방식이다. 그래서 일반적으로 간단한 문자열 추가의 경우에는 '+' 연산자를 사용하는 것이 좋다.

 

String str1 = "첫번째 텍스트입니다 "; 
String str2 = "두번째 텍스트입니다"; 
System.out.println("결과: " + str1 + str2); 

//결과 : 첫번째 텍스트입니다 두번째 텍스트입니다

StringBuilder

StringBuilder를 선언하고 append함수를 통해 문자열을 덧붙일 수 있다. StringBuilder가 String과 가장 다른 점은 '수정 가능'하다는 것이다. String는 immutable 한 객체이기 때문에 값을 수정하려면 다른 값을 가진 String을 다시 대입하는 식으로 처리해야 한다. StringBuilder는 새로운 String 객체를 생성하여, 메모리에 할당하는 과정 없이도 수정 가능하다는 장점이 있다. StringBuilder의 경우에는 복잡하거나 반복적인 문자열 수정 시 사용하는 것이 좋다. 예를 들면, for 문이나 while 문 같은 반복문 안에서 문자열을 계속 추가해야 하는 경우에는 '+' 연산자보다는 StringBuilder를 사용하는 것이 좋다.

 

StringBuilder sb = new StringBuilder();
sb.append("str1");
sb.append("str2");
String concat = sb.toString();

StringBuffer

StringBuffer는 StringBuilder와 호환 가능하기 때문에 사용법은 동일하다. StringBuffer와 StringBuilder의 차이점은  StringBuffer은 thread-safethread-safe 하다는 점이다. StringBuilder는 동기화를 보장하지 않는다. StringBuffer 클래스는 동시에 이 객체에 접근했을 때, 동시성을 제어해주는 기능이 존재하고, StringBuilder 클래스는 동시성 제어 기능을 제외하여 상대적으로 동작속도가 빠르다. 결국 쓰임 세는 동일하나, 멀티스레드를 이용하여 하나의 문자열을 수정할 필요가 있다면 StringBuffer 클래스를 사용하는 것이 바람직할 것이고, 그렇지 않다면 StringBuilder 클래스를 사용하여 동작속도를 빠르게 하는 것이 좋을 것이다.

 

StringBuffer sbf = new StringBuffer();
sbf.append("str1");
sbf.append("str2");
String concat = sbf.toString();

 

tip!

StringBuffer나 StringBuilder는 초기에 생성할 때 Buffer Size를 주도록 구성되며 이에 의한 생성, 확장 오버로드가 발생하기 때문에 의외로 Buffer Size를 잘못 지정할 경우 성능이 떨어질 가능성도 있다. 하지만 String 클래스의 경우 new에 의한 생성이 아닐 때 초기 컴파일러 분석 단계에서 literal 처리에 의해 최적화가 될 수 있기 때문에 오히려 빠른 결과를 보여줄 때가 있다. 

 

댓글