Programming Languages/Java

[JAVA] 문자열 String | StringBuffer | StringBuilder 각 차이점 - 성능의 차이!

Hannana. 2023. 5. 20. 20:50
728x90
반응형

자바에서 문자열을 사용할 때 여러가지 방법이 존재한다.

char 형태를 이어붙여 문자열을 만들어야하는 C/C++와는 달리,

자바에서는 기본으로 문자열이 제공되어 상대적으로 매우 편리하다.

 

우리가 가장 많이 알고 있는 기본 형태인 String 과 더불어 

자바에서 문자열을 표현하는 방법은 다음과 같다.

 

1) String

2) StringBuffer

3) StringBuilder 

 

 

먼저 세 가지 방법으로 작성한 다음 코드를 보자.

 

<input>

public class Main {
	public static void main(String[] args) {
		String str = new String("App");
		StringBuffer strbuffer = new StringBuffer("App");
		StringBuilder strbuilder = new StringBuilder("App");
		
		str = str.concat("le");
		strbuffer.append(" le");
		strbuilder.append("le");
		
		System.out.println(str);
		System.out.println(strbuffer);
		System.out.println(strbuilder);
	}
}

<output>

Apple
Apple
Apple

 

차이점이 느껴지는가? 

겉으로 봐서는 잘 구분이 안간다면 정상이다.

 

차이점과 특징은 확실하다.

 

 

 

1) String

먼저, String 형은 '불변적' 인 특징을 갖는다. 

무슨 말이냐면, 한번 정의를 하면 변하지 않는다는 것이다.

 

"우리가 알고 있는 String 형 변수는 얼마든지 새로 초기화하고, 정의가 가능한데요?"
=> 내부적으로 보면, 힙에 저장된 원본은 변하지 않는다.


새로 객체가 만들어지는 것 뿐이다. 그리고 가리키는 주솟값이 바뀌게 되는 것이다.

때문에 고유한 주솟값을 가진 객체가 계속해서 생성된다면 메모리에 영향을 줄 수가 있다.

특히나 문자열이 더해지는 "App" + "le" 형태의 연산은 더더욱 그렇다.

 

 

이러한 메모리의 낭비를 막기 위한 클래스가 바로 

StringBufferStringBuilder이다.

 

.add() 메소드를 통해 문자열 값을 가변적으로 추가가 가능하며,

delete()  메소드를 통해 특정 위치에 있는 문자열을 제거할 수도 있다.

 

 

2) StringBuffer

StringBuffer는 자바의 동기화를 지원한다. 때문에 멀티 스레드에서도 사용하는 게 가능하다.

메소드를 오가는 복잡한 연산 시에 사용이 권장된다.

 

 

3) StringBuilder 

StringBuilder는 자바의 동기화를 지원하지 않는다. 즉, 데이터의 안전이 보장되지 않으므로 단일 스레드에서 사용하는 것이 좋고 메소드 내의 연산이 이루어질 경우 사용해도 문제가 없다. 메소드 내부에 생성 된 스택에 지역 변수로 데이터가 저장되기 때문에 해당 범위 내에서 한정되어 값의 공유가 가능하다.

 

 

 

결국, 성능의 향상을 위해서는

번거롭더라도 StringBufferStringBuilder를 사용하는 것이 좋은 것이다.

사용법을 익혀둬서 나쁠 것은 없어보인다.

 

 

 

 

 

반응형