Java에서 String 클래스는 불변성을 갖는다.
때문에 변하지 않는 문자열을 자주 사용하는 것은 성능에 좋지 않은 영향을 줄 수 있다.
때문에 변경이 자주 일어나는 프로그램에서 String만 사용하게 된다면 효율적인 성능을 기대하기 어렵다.
이때 StringBuilder, StringBuffer를 사용한다면 효과적으로 성능을 개선할 수 있다.
각 개념에 대해 알아보자!
앞서 설명했듯 String은 불변성을 갖는다.
이는 기존의 String 변수가 다른 값을 참조한다면, 기존의 값은 지워지지 않고 다음 참조값을 변수에 저장하는 것이다.
이렇게 되면 메모리 공간 낭비로 인해 성능이 저하되는데, StringBuffer와 StringBuilder는 가변성을 가지고 있어 메모리 공간 낭비를 방지할 수 있다.
StringBuffer와 StringBuilder는 가변적인 공통점이 있다.
위 두 클래스는 모두 AbstractStringBuilder 라는 추상 클래스를 상속받아 구현되어 있기 때문이다.
하지만 두 클래스의 기능은 한 가지 차이점이 있다.
바로 동기화이다.
StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있다. 하지만 StringBuilder는 지원하지 않는다.
그 이유는 StringBuffer는 메소드에서 synchronized
키워드를 사용하기 때문이다.
synchronized
는 여러 개의 스레드가 한 개의 자원에 접근하려고 할 때, 현재 데이터를 사용하고 있는 스레드를 제외한, 나머지 스레드들이 데이터에 접근할 수 없도록 막는 역할을 수행한다.
한편 StringBuilder는 단일 스레드 환경에서 StringBuffer보다 속도면에서 성능이 좋다.
때문에 StringBuffer는 동기화가 필요한 경우, 그렇지 않으면 단일 스레드 환경일때, StringBuilder를 사용하자.
끝!