본문 바로가기

Java

Java String, StringBuilder, StringBuffer

728x90

자바에서 문자열 클래스는 대표적으로 String, StringBuilder, StringBuffer가 있다.

사실 String밖에 다루지 않아봐서 잘 몰랐는데 좋은 경험을 하게 되어서 나머지 두 클래스도 다뤄야 겠다고 생각했다.

 

String과 (StringBuilder, StringBuffer)의 차이

String과 StringBuilder/StringBuffer의 차이는  String 클래스는 immutable(불변), StringBuilder와 StringBuffer 클래스는mutable(가변)적인 클래스라는 차이가 있다.

 

불변/가변은 자바의 Heap메모리 영역과 관련이 있다.

자바에서 객체들은 Heap영역에 메모리를 할당을 받게되는데, String처럼 불변 속성의 클래스인 경우 값이 변하면 기존에 할당 받은 메모리 크기가 변하는게 아닌 새로운 메모리를 할당받는다.

 

반대로 가변 속성의 클래스는 기존 할당받은 메모리 영역의 크기가 변하는 것이다.

 

 

StringBuilder와 StringBuffer의 차이

StringBuilder와 StringBuffer의 차이는 synchronized(동기화) 키워드의 차이다.

자바에서는 메서드에 synchronized를 붙여서 동기식으로 실행할 수 있다.

원리는 멀티 쓰레드의 환경에서 오직 한 쓰레드만 접근을 가능하게 하여 실행 시키기 때문에 동기화 처리가 가능한 것이다.

 

StringBuffer는 모든 메서드에 아래 그림처럼 synchronized 처리가 되어있다.

다른 쓰레드의 접근을 막기 때문에 멀티 쓰레드 환경에서 성능의 하락과 안정성 상승을 얻은 것이다.

 

 

 

StringBuilder는 StringBuffer와 다르게, 같은 메서드의 경우에도 아래 그림처럼 synchronized 처리가 되어 있지않다.

 

따라서 싱글 쓰레드의 환경에서 동기화 처리는 필요없기 때문에 StringBuilder를, 멀티 쓰레드 환경에서는 StringBuffer를 사용하면 알맞을 것 같다.

728x90