특별한 일상

[java] String, StringBuffer, StringBuilder 차이점과 장단점 본문

IT•개발 끄적/Java

[java] String, StringBuffer, StringBuilder 차이점과 장단점

소다맛사탕 2021. 4. 10. 21:40
반응형

안녕하세요. 소다맛사탕 입니다.

 

문자열을 저장하고 관리하는 클래스인

String, StringBuffer, StringBuilder의 차이점과 장단점을 설명하려 합니다.

※ 잘못된 부분이 있으면 지적해주시고 도와주세요.

 

 

Stringimmutable(불변),

StringBuffer/StringBuildermutable(변함) 의 속성을 갖는다.


String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않음.

새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장. 그 객체를 참조합니다.

 

즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성된다는 것.

Heap 메모리 영역 : 사용자가 직접 관리할 수 있고 해야만하는 영역.

한번 생성된 객체의 내부 내용을 변화시킬수 없음.

기존 객체가 제거되면 java의 가비지 컬렉션이 회수되고,

또한 문자열이 많을 경우 성능이 좋지 않습니다.

 

하지만, 불변한 객체는 간단하게 사용가능,

동기화에 신경쓰지 않아도 된다. 멑티스레드 환경에서 안전(Thread-safe)

그리고 내부 데이터를 자유로이 공유가 가능합니다.

// 메모리 상에서 'hello' 문자열 생성
String str = "hello";

// 메모리 상에서 'hello world' 문자열 생성.
// 기존 'hello'는 가비지컬렉션 대상
// 즉, 문자열의 잦은 변경시 많은 가비지(쓰레기)가 생성.
str += " world";

 

StringBuffer, StringBuilder는 문자열 연산 등으로

기존 객체의 공간이 부족할시 기존의 버퍼 크기를 늘리며 유연하게 동작합니다.

 

StringBuffer의 경우 각 method별로 Synchronized keyword(동기화된 키) 존재.

멀티스레드 환경에서도 동기화를 지원.

멀티스레드 환경에서 안전(Thead-safe)

 

// 메모리 상에서 'hello' 문자열 생성
StringBuffer strbuf = new StringBUffer("hello");

// 메모리 상에서 'hello' 문자열에 ' world' 문자열을 추가
strbuf.append(" world");

 

반면,

StringBuilder동기화를 보장하지 않습니다. (단일 스레드 환경)

 

JDK 1.5 이후 버전에서는 String 클래스를 활용해도

StringBuilder와 성능상으로 차이가 없어졌음.

하지만, 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가하는 사실에는 변함이 없음.

 

단순히 성능만 놓고 본다면 연산이 많을경우

StringBuilder > StringBuffer >>> String

 

String class, StringBuffer 클래스 성능 차이
// String class
String str1 = "abc";
String str2 = "def";

// 시간을 체크한다.
long t1 = System.currentTimeMillis();
for(int i = 0; i<10000; i++){
	str1 += str2;
}
System.out.println(str1);
System.out.println("String 시간 == " + (System.currentTimeMillis()-t1));

// StringBuffer class
StringBuffer strbuf1 = new StringBuffer("abc");

// 시간을 체크한다.
long t2 = System.currentTimeMillis();
for(int i = 0; i < 10000; i++){
	strbuf1.append("def");
}
System.out.println(strbuf1);
System.out.println("StringBuffer 시간 == " + (System.currentTimeMillis()-t2));

 

출처 - 강북쌍용교육센터 교육중..

 

 

 

현업으로 일하면서 오랜만에 기초 지식같은 얘기를 꺼내보자니,

새롭고, 공부가 되는것 같습니다.

Comments