본문 바로가기

Java

[Java] 문자열 합치기 총정리(+ 연산자, concat, StringBuilder, StringBuffer)

자바에서 문자열을 합칠 수 있는 방법은 +연산자, concat, StringBuilder, StringBuffer가 있다.

우선 문자열을 합쳐보자.

public class Main {
	public static void main(String[] args) {
	    
		String str1 = "Hello";
		String str2 = "Java";

		String result1 = str1 + str2;
		String result2 = str1.concat(str2);
		StringBuilder result3 = new StringBuilder();
		result3.append(str1);
		result3.append(str2);

		System.out.println(result1);
		System.out.println(result2);
		System.out.println(result3);
	        
	}
}

// 결과
HelloJava
HelloJava
HelloJava

위 코드의 출력값은 모두 같다.

동일한 출력값을 가지지만 과정에 차이가 존재한다.

그렇다면 문자열의 합치는 방법에는 어떤 차이가 있을까?

 

 


'+' 연산자

String str1 = "Hello";
String str2 = "Java";
String result = str1 + str2
System.out.println(result);

// 결과
HelloJava

+ 연산자를 사용하는 것은 문자열을 합칠 때 직관적으로 떠올릴 수 있는 방법이다.

자바 버전에 따라 + 연산자의 작동방법이 다른데

jdk 1.5 이전 버전은 concat() 메서드를 이용하는 방식으로 문자열을 추가할 때마다 새로운 인스턴스를 생성하고,

jdk 1.5 이후 버전은 StringBuilder를 이용하는 방식으로 문자열을 StringBuilder로 변환시킨 뒤, append로 문자열을 더해서 toString함수로 문자열로 반환해준다. 

 

concat()

잘못된 코드

String str = null;
String result = str.concat("Good");
System.out.println(result);

// 결과
java.lang.NullPointerException

concat 초기값이 null이면 NullPointerException 에러가 뜨기 때문에 초기값이 null이면 안된다.

 

올바른 코드

String str = "Hello";
String result = str.concat("Java");
System.out.println(result);

// 결과
HelloJava

concat() 명령어는 더하려는 값을 new String()으로 새로 만든다.

따라서 문자열을 계속해서 붙일 때마다 주소값을 새로 할당받기 때문에 메모리가 낭비될 수 있다.

 

StringBuilder

StringBuilder result = new StringBuilder();
result.append("Hello");
result.append("Java");

System.out.println(result);

// 결과
HelloJava

StringBuilder는 문자열을 합쳐도 주소가 변하지 않는다. 즉, 위 코드에서는 Hello와 HelloJava의 주소가 같다.

append를 통해서 문자열을 합쳐준다. 이것이 concat() 메소드와의 차이점이다.

 

 

그렇다면 StringBuilder를 통해 null과 문자열을 더하면 결과가 어떻게 나올까?

String str1 = null;
String str2 = "Java";

StringBuilder result = new StringBuilder();
result.append(str1);
result.append(str2);

System.out.println(result);

// 결과
nullJava

concat() 메소드와 달리 오류가 나지 않고 nullJava라는 문자열이 출력된다.

 

StringBuffer

StringBuffer와 StringBuilder는 동일한 방식으로 작동되는데, 두 메서드의 차이점은 동기화 여부이다.

StringBuffer는 각 메서드별로 Synchronized Keyword가 존재해 멀티스레드 환경에서도 동기화를 보장하지만

StringBuilder는 동기화를 보장하지 않는다.

따라서 멀티스레드 환경에서는 동기화 보장을 위해 StringBuffer를 사용, 단일스레드 환경에서는 StringBuilder를 사용하는 것이 좋다.

 

'Java' 카테고리의 다른 글

[Java] ""(큰따옴표)와 ''(작은따옴표)의 차이  (0) 2023.11.27
instance 변수와 local 변수  (0) 2023.06.26
객체화, 생성자  (0) 2023.06.25