Back-End/Java(자바)

String , StringBuffer , StringBuilder 차이점

FIF 2019. 6. 17. 13:51
반응형

String과 StringBuffer, StringBuilder의 차이점은

String은 immutable(불변)하고 StringBuffer, StringBuilder는 mutate(가변) 한다는 점이다.

 

쉽게 말해 String은 new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다.

그래서 +연산이나 concat을 이용해서 문자열에 변화를 줘도 메모리 공간이 변하는 것이 아니라 새로운 String 객체를 new로 만들어서 새로운 메모리 공간을 할당하는 것이다.

 

이렇게 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야 하는 단점(언제 제거될지 모름)이있다.

또한 이러한 문자열 연산이 많아질 때, 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없다는 단점이 있다.(+연산 내부적으로 char배열을 사용함)

 

대신 String 클래스의 객체는 불변하기 때문에 단순하게 읽어가는 조회연산에서는 타 클래보다 빠르게 읽을 수 있는 장점이 있다.(+불변하기 때문에 멀티쓰레드 환경에서 동기화를 신경쓸 필요가 없는 장점이 있다.)

 

결론 : String 클래스는 문자열 연산이 적고 조회가 많을 때 멀티쓰레드 환경에서 사용하면 좋다.

 

StringBuffer와 StringBuilder 클래스는 String과 다르게 mutable(변경가능) 하다.

즉, 문자열 연산에 있어서 클래스를 한번만 만들고(new), 연산이 필요할 때 크기를 변경시켜 문자열을 변경한다.

그러므로 문자열 연산이 아주 자주 있을때 사용하면 성능이 좋다.

 

심지어 StringBuffer와 StringBuilder 클래스의 메소드들이 같으므로 호환가능하다.

그렇다면 StringBuffer와 StringBuilder의 차이는 무엇일까?

 

차이점은 StringBuffer는 멀티쓰레드 환경에서 synchronized키워드가 가능하므로 동기화화가 가능하다.

즉, thread-safe하다.

 

StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서는 적합하지 않다.

 

대신 StringBuilder가 동기화를 고려하지 않기 때문에 싱글쓰레드 환경에서 StringBuffer에 비해 연산처리가 빠르다.

 

결론 : 문자열 연산이 많을 때 멀티쓰레드 환경에서는 StringBuffer를, 싱글 쓰레드 또는 신경쓰지 않아도 되는 환경에서는 StringBuilder를 사용하는 것이 적절하다.

 

다시한번 정리하자면,

String클래스는 불변 객체 이기 때문에 문자열 연산이 많은 프로그래밍이 필요할 때 계속해서 인스턴스를 생성하므로 성능이 떨어지지만 조회가 많은 환경, 멀티스레드 환경에서 성능적으로 유리하다.

반응형