Java에서 문자열 덧붙이는 3가지 방법

Tina Jeong·2020년 9월 29일
3

Java에서 String Concatenation 연산을 할 수 있는 방법은 세 가지이다. str1.concat(str2)로도 가능하지만 multiple concat에 적절한 방법들을 정리하였다.

  1. +연산자를 통한 concat
  2. StringBuilder를 이용한 concat
  3. StringBuffer를 이용한 concat

1. +연산자를 통한 concat

String concat = "str1"+"str2";

직관적으로 떠올릴 수 있는 방법이다. concat 연산량이 적을 때 편리하게 사용할 수 있다.

String a = "a"
String b = "b"
String a += b;

그러나, 위의 "a","b","ab"는 모두 독립적인 String 객체로서 새롭게 메모리에 할당되어 올라가므로 연산량이 많은 경우에는 연산자를 통한 concat 연산을 추천하지 않는다.

Tip! 💡

당연하지만 String이 initialized되지 않은 상태(null)에서는 +연산자를 통해 문자열 덧붙이기는 불가하다.
String 변수를 하나만 사용한다면 new String(),""등으로 init을 해준 후 사용하고, String 배열일 경우에는 Arrays.fill메소드를 이용해 초기값을 세팅해준 후 사용한다.

String[] strArr = new String[n];
Arrays.fill(strArr, "");
...
strArr[0]+="str";

2. StringBuilder를 이용한 concat

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

StringBuilder를 선언하고 append함수를 통해 문자열을 덧붙일 수 있다.
StringBuilder가 String과 가장 다른 점은 '수정가능'하다는 것이다. String은 상수, 즉 immutable한 객체이기 때문에 값을 수정하려면 다른 값을 가진 String을 다시 대입하는 식으로 처리해야 한다. StringBuilder는 새로운 String 객체를 생성하여, 메모리에 할당하는 과정없이도 수정가능하다는 장점이 있다.

3. StringBuffer를 이용한 concat

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

StringBuffer는 StringBuilder와 호환가능하다. 즉, append와 insert 함수를 동일한 usage로 사용가능하다.
그러나 StringBuffer는 thread-safe하다는 점에서 StringBuilder와 다르다. StringBuilder는 동기화를 보장하지 않는다.
single thread 환경에서는 StringBuilder를 사용하고, multi thread 환경에서는 StringBuffer를 사용한다.

+ concat == (StringBuffer.append || StringBuilder.append || StringConcatFactory)

Java 1.6 버전부터는 +연산자를 통한 concat은 내부적으로 StringBuffer또는 StringBuilder의 append나 StringConcatFactory로 구현되어 있다.

The implementation of the string concatenation operator is left to the discretion of a Java compiler, as long as the compiler ultimately conforms to The Java Language Specification. For example, the javac compiler may implement the operator with StringBuffer, StringBuilder, or java.lang.invoke.StringConcatFactory depending on the JDK version. The implementation of string conversion is typically through the method toString, defined by Object and inherited by all classes in Java.

참고
https://docs.oracle.com/javase/6/docs/api/java/lang/String.html
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/String.html

profile
Keep exploring, 계속 탐색하세요.

1개의 댓글

comment-user-thumbnail
2020년 9월 29일

mutable, immutable, thread-safe 이런 단어들만 보면 바싹 집중하게 된다. 코딩할 때 주의를 기울여야할 테마라는 생각 때문인지..

답글 달기