본문 바로가기
Jave & Kotlin

JAVA - String / StringBuffer / StringBuilder 정리

by devLog by Ronnie's 2021. 10. 4.

JAVA - String / StringBuffer / StringBuilder  정리

 

다음 3가지 클래스는 자바에서 대표적으로 문자열을 다루는 클래스들이다. 어떠한 차이점들이 있는지 정리해본다.

 

String

 

StringStringBuffer/StringBuilder에 가장 큰 차이점은 String은 불변(Immutable)의 속성을 갖는다. 여기서 불변이란 객체가 생성된 후 내부의 상태가 변하지 않고 계속 유지되는 객체를 말한다. 이 말은 즉, 변수에 객체가 할당이 되면 해당 객체의 참조를 변경할 수도, 내부의 상태를 수정할 수도 없는 것이다.

 

String str = "hi"; 를 선언한 후에 str = str + "hello"; 를 하게 되면 hi를 저장하고 있던 참조변수 str에 hello가 들어갔다고 생각할 수도 있지만 위에서도 말했듯이 String은 불변 객체이기 때문에 hello가 붙여진 str은 새로운 메모리 영역을 할당받게 된다. 그렇다면 처음에 hi만을 가지고 있던 str은 Garbage로 남아있다가 Garbage Collection에 의해 사라지게 된다. 이러한 불변성이 주는 이점도 있지만 문자열에 특성상 추가 및 수정, 삭제 등의 연산들이 빈번하게 일어난다. 이렇게 되면 힙 메모리에 많은 임시 Garbage들이 쌓이게 되어 성능에 영향을 미칠수 있다.

 

이러한 점을 해결하기 위해 나온 것이 가변성을 가지는 StringBuffer StringBuilder이다. 가변성을 가지므로 동일 객체 내에서 문자열을 변경하는 것이 가능하다. 문자열 객체를 빈번하게 수정 등을 하게 된다면 String보다는 StringBuffer나 StringBuilder 클래스를 이용하는 것이 좋다.

 

그럼 둘의 차이점은 무엇인가?

 

가장 큰 차이점은 동기화에 유무이다. StringBuffer동기화지원 / StringBuilder동기화미지원한다.

StringBuffer는 동기화를 지원하므로 멀티쓰레드 환경에서 안전하다는 점이 있고, StringBuilder는 동기화를 미지원하기 때문에 단일 쓰레드 환경에 적합하며 성능은 StringBuffer보다 더 좋다. 

 

결론

 

멀티쓰레드 환경 : String or StringBuffer 사용 / 문자열 연산이 많다면 StringBuffer 사용

단일쓰레드 환경 : StringBuilder 사용 (동기화 고려가 필요 없을 시 사용)

댓글