Java/문자열

[Java]문자열 연결하는 방법

DevStory 2022. 8. 13.

문자열 연결하는 방법

이번 포스팅은 Java에서 String을 연결하는 두 가지 방법에 대해 설명합니다.

1. + 연산자

2. String 클래스의 concat() 메서드

 

두 가지 방법 이외에도 StringBuffer, StringBuilder 클래스를 활용하는 방법이 있지만, 이번 포스팅은 String 클래스에서 문자열을 합치는 방법을 설명합니다.


+ 연산자

+ 연산자를 사용하여 둘 이상의 문자열을 합칠 수 있습니다. + 연산자를 사용하여 둘 이상의 문자열이 합쳐진 결과는 힙(Heap) 영역에 생성됩니다.

 

둘 이상의 문자열을 + 연산자를 사용하여 합치는 경우 힙 영역에 수많은 쓰레기 데이터가 생성되는 걸로 소개되고 있는데, 이 내용은 Java 1.5 이전 이야기입니다.


Java 1.5부터 + 연산자를 사용하여 둘 이상의 문자열을 합치는 경우 합쳐진 최종 결과만 힙 영역에 존재합니다.

 

다음 예제는 + 연산자를 사용하여 문자열을 연결합니다.

public static void main(String args[]) {
  String strValue1 = "ABC";
  String strValue2 = "DEF";

  String strConcatResult = strValue1 + strValue2;

  System.out.println(strConcatResult);
}

 [실행 결과]

ABCDEF

 

+ 연산자를 사용하면 String 타입이 아닌 값을 문자열로 연결할 수 있습니다.

public static void main(String args[]) {
  String strValue = "ABC";

  String strConcatResult = strValue + 10 + 20;

  System.out.println(strConcatResult);
}

[실행 결과]

ABC1020

10 + 20의 결과는 30이지만, String 타입의 변수 strValue가 10 + 20보다 앞에 있으므로 10 + 20은 문자열로 처리됩니다.

 

하지만, 다음 소스 코드처럼 숫자가 문자열보다 앞에 있는 경우에는 다르게 동작합니다.

public static void main(String args[]) {
  String strValue = "ABC";

  String strConcatResult = 10 + 20 + strValue + 10 + 20;

  System.out.println(strConcatResult);
}

[실행 결과]

30ABC1020

정수가 문자열보다 앞에 있는 경우 연산된 결과를 문자열과 연결합니다.


concat 메서드

String 클래스에서 제공하는 concat() 메서드를 사용하여 두 개의 문자열을 연결할 수 있습니다.

 

만약, 여러 개의 문자열을 연결해야 하는 경우 concat() 메서드를 메서드 체이닝 기법으로 호출합니다.

 

concat() 메서드는 힙 영역에 합쳐진 문자열을 생성합니다.

 

따라서, concat() 메서드를 메서드 체이닝 기법으로 여러 번 호출하는 경우 상당히 많은 데이터가 힙 영역에 생성되므로 성능이나 속도 면에서 좋지 않습니다.

public static void main(String args[]) {
  String strValue = "ABC";

  String strConcatResult = strValue.concat("DE").concat("FG");

  System.out.println(strConcatResult);
}

[실행 결과]

ABCDEFG

+ 연산자와 concat 메서드 차이점

위에서 설명했듯이 + 연산자와 concat() 메서드의 가장 큰 차이점은 힙 영역에 데이터 생성 과정입니다.

 

다음과 같이 + 연산자를 여러 번 호출하더라도 최종 결과만 힙 영역에 생성됩니다.

public static void main(String args[]) {
  String strValue = "ABC";

  // + 연산자를 여러 번 연결해서 호출하더라도 단 하나의 결과만 힙 영역에 생성된다. 
  // 힙 영역에 생성되는 데이터: "ABCDEFG"
  String strConcatResult = strValue + "D" + "E" + "F" + "G";
}

하지만, concat() 메서드를 여러 번 호출하는 경우 호출한 횟수만큼 힙 영역에 데이터가 생성됩니다.

public static void main(String args[]) {
  String strValue = "ABC";

  // concat() 메서드를 4번 호출했으므로 힙 영역에는 4개의 데이터가 생성된다.
  // 힙 영역에 생성되는 4개의 데이터: "ABCD", "ABCDE", "ABCDEF", "ABCDEFG"
  String strConcatResult = strValue.concat("D").concat("E").concat("F").concat("G");
}

따라서, 세 개 이상의 문자열을 연결하는 경우 + 연산자를 사용하는 것이 좋습니다.

 

그리고 + 연산자와 concat() 메서드는 null을 처리하는 방법도 다릅니다.

 

+ 연산자는 null을 문자열 "null"로 처리합니다.

public static void main(String args[]) {
  String strValue = "ABC";

  String strConcatResult = null + strValue + null;

  System.out.println(strConcatResult);
}

[실행 결과]

nullABCnull

concat() 메서드의 매개변수로 null이 전달되는 경우 NullPointerException이 발생합니다.

public static void main(String args[]) {
  String strValue = "ABC";

  String strConcatResult = strValue.concat(null);

  System.out.println(strConcatResult);
}

[에러 내용]

반응형

댓글