String 객체는 + 연산을 이용해 문자열을 연결할 수 있다. 당연히 '더하기'의 의미가 아니라 '연결하기'의 의미다. String 객체의 +연산은 크게 2가지의 형태가 있다. 첫 번재는 '문자열 + 문자열'의 형태인데, 이때는 그대로 문자열을 연결한 결과가 리턴된다. 두 번째는 '문자열 + 기본 자료형' 또는 '기본 자료형 + 문자열'일 때인데 이때는 기본 자료형이 먼저 문자열로 변환되고 이후 '문자열 + 문자열'의 형태로 값이 리턴된다.
유형 1. 문자열 + 문자열 연산
String str1 = "안녕" + "하세요" + "!";
System.out.prinltn(str1); // 안녕하세요!
String str2 = "반갑";
str2 += "습니다";
str2 += "!";
System.out.prinltn(str2); // 반갑습니다!
System.out.println();
"안녕" + "하세요" + "!"의 결과가 모두 연결된 "안녕하세요!"가 나오는 것을 예측하는 일은 어렵지 않다. 하지만 메모리에서 이 짧은 명령의 영향으로 아래 그림과 같이 객체가 5개나 만들어진다는 것을 눈치채야 한다.
우리는 이미 String 객체의 내용을 변경할 수 없다는 것을 배웠다. 따라서 메모리에는 각각의 문자열 리터럴 객체가 만들어질 것이다. 처음 "안녕"+ "하세요"가 수행될 때 객체 하나가 새롭게 만들어지며, "안녕하세요" + "!"가 수행될 때 또 객체가 만들어질 것이다. 최종적으로 참조 변수에는 마지막 객체의 위칫값이 저장될 것이다.
유형 2. '문자열 + 기본 자료형' 또는 '기본 자료형 + 문자열' 연산
모든 연산은 동일한 자료형끼리만 가능하다. 따라서 기본 자료형과 문자열을 연산하려면 먼저 기본 자료형을 문자열로 바꾸고 이어서 '문자열 + 문자열' 연산을 수행한다. 다음 예제를 살펴보자.
System.out.println(1 + "안녕"); // 1안녕
System.out.println(1 + "안녕" + 2); // 1안녕2
System.out.println("안녕" + 1 + 2); // 안녕12
System.out.println(1 + 2 + "안녕"); // 3안녕
여기서 주의를 기울여야하는 부분이 있다. 예를 들어 1 + "안녕"을 수행하면 1 -> "1"이 먼저 수행돼 "1" + "안녕" -> "1안녕"이 나온다. 하지만 1 + 2 + "안녕"은 "3안녕"이 나온다. + 연산은 앞에서부터 연산을 수행하기 때문이다. 1 + 2는 '정수 + 정수'이므로 문자열로 변환되지 않는다. 말 그대로 더하기가 실행되며, 그렇게 나온 결과와 "안녕"을 연결하면 3 + "안녕" -> "3안녕"이 나오는 것이다.
반면 "안녕" + 1 + 2는 어떨까? 이때 "안녕" + 1이 먼저 실행되므로 "안녕1"의 결과가 먼저 나오고 이후 "안녕1" + 2가 실행되므로 "안녕12"의 결과가 나온다. 즉, +연산은 앞에서부터 순차적으로 수행되므로 기본 자료형과 문자열을 여러 개 섞어 연산하면 자료형을 생각하며 차근차근 연산해야 한다.
// 문자열 + 문자열
String str1 = "안녕" + "하세요" +"!";
System.out.println(str1);
String str2 = "반갑";
str2 += "습니다";
str2 += "!";
System.out.println(str2);
System.out.println();
// 문자열 + 기본 자료형 또는 기본 자료형 + 문자열
String str3 = "안녕" + 1;
String str4 = "안녕" + String.valueOf(1); // 문자열로 변환 (생략해도 자동 변환 수행 )
String str5 = "안녕" + "1";
System.out.println(str3);
System.out.println(str4);
System.out.println(str5);
// 문자열과 기본 자료형 혼용 - 앞에서부터 차례대로 + 연산 수행
System.out.println(1 +"안녕");
System.out.println(1 + "안녕" + 2);
System.out.println("안녕" + 1 + 2 );
System.out.println(1 + 2 + "안녕");