본문 바로가기
IT_Developers/JAVA

JAVA - String, StringBuffer, StringBuilder 차이점은?

by 고코더 2020. 3. 11.

string을 다루는 3가지 클래스의 차이점


안녕하세요.
고코더 입니다.


이번 시간에는 자바에서 문자열을 저장하는 클래스인 String, StringBuffer, StringBuilder의 차이점을 알아보려고 합니다. 이 클래스들은 string 값을 저장하고 관리하는 기능을 한다는 건 모두 알고 계십니다. 그런데 대체 무슨 차이가 있을까요? 그 차이점을 알아봅니다.



String 클래스의 큰 특이점 : 불변성


 1. String pool에 저장
가장 대표적인 차이는 역시 string은 리터럴을 통해 생성해 인스터스 메모리 공간을 차지합니다. 즉 변하지 않는 값이 됩니다. 다시 한번 설명합니다. string class를 사용해 문자를 생성합니다. 그럼 "String pool"이라는 공간에 생성됩니다. 이 메모리는 변하지 않는다는 말이죠.

 2. 새로운 문자열을 만들면?
1
2
3
String str1 = "Go"
String str2 = "Coder";
str1 = str1+str2; 
cs

예시 코드처럼 str1에 새로운 문자열을 만들면 기존 str1이라는 변수가 변하는게 아니라 새로운 String 클래스 객체가 만들어져 문자열을 저장합니다. 그러면 메모리에 남아 있는 걸 가비지 콜렉터가 삭제하게 됩니다. 그런데 이 메모리 누수는 언제까지 이어질지 모르니 성능이 떨어지게 됩니다.

 3. 언제 사용하기 좋은가?
String 문자열 사용이 적은 경우에 사용하면 좋습니다. 조회 연산에서는 제일 속도가 빠르다는 장점이 있기 때문입니다. 그리고 멀티쓰레드 동기화 환경을 신경쓸 필요가 없습니다.


StringBuffer, StringBuilder 특이점 : 변경 가능



 1. 변경이 용이한 특징
먼저 이 클래스들은 문자열 연산이 자주 있을때 사용하면 성능이 좋습니다. 다양한 문자열을 연산할때 눈으로 보이는 성능 차이가 엄청납니다. mutable(변경이 가능)한 특징이 있습니다. 한번 생성된 클래스의 메모리 값을 사용해 연산을 합니다.

 2. StringBuffer 특징
멀티쓰레드 환경에서 동기화가 가능한 특징이 있습니다. 덕분에 멀티쓰레드 환경에서 사용하기 용이 합니다.

 3. StringBuilder특징
동기화를 지원하지 않는 싱글 쓰레드 환경에서 사용할때 연산처리가 빠른 장점이 있습니다. 


마무리


JDK 1.5 이상 부터는 String에서 연산시에 StringBuilder를 사용하여 컴파일 합니다. 하지만 객체 생성은 동일합니다. 그러므로 문자열 연산이 많을때는 사용하지 않는걸 추천 합니다.




댓글