프로젝트를 진행하다 데이터 포맷을 맞춰주기 위해

+ 연산자를 이용해서 String에 값을 넣어서 사용했다

하지만 팀장님께서 짧은경우 상관없는데

문장이 길어지면 성능에 좋지않다고 말씀 해주셨고

 

대체 할것으로 StringBuffer와 StringBuilder가 있는데

이 또한 단일 쓰레드냐 멀티 쓰레드냐 환경을 보고

스스로 판단해서 쓸줄알아야 한다고 조언 해주셨다

 

그래서 3가지의 특징과 차이점 각각의 장단점을 정리해 보고자 한다

 

1. String

String은 immutable (불변) 의 특징을 가진다

복잡하지 않은 짧은, 단순한 상황에서는 + 연산자를 이용하면 된다

불변이란건 한번 생성되면 할당된 메모리 공간이 변하지 않는

String의 특징으로 볼 수 있다

 

만약 + 연산자나 concat 메서드를 이용해서

기존에 생성된 String 문자열에 다른 문자열을 붙여도

기존 문자열에 새로운 문자열이 붙는것이 아니라

완전 새로운 String 객체를 만든 후

새 String 객체에 연결된 문자열을 저장한다

 

그래서 한번 생성된 객체의 내부 내용은 변경시킬 수 없다

기존 객체가 제거되면 가비지 컬렉터가 회수 한다

 

정리 하자면

String 객체는 이러한 이유로 문자열 연산이 많을때 성능에 좋지 않다

하지만 간단히 사용가능하고 동기화 신경을 쓰지 않아도 되고

내부 데이터를 자유롭게 공유가 가능하다는 장점도 있다

 

2. StringBuffer & StringBuilder

StringBuffer와 StringBuilder는 mutable (변함) 의 특징을 가진다

String과 다르게 문자열 연산 등으로 기존 객체의 공간이 부족해 지면

기존의 버퍼 크기를 늘리며 유연하게 동작한다

StringBuffer와 StringBuilder 가 제공하는 메서드는 서로 동일하다

 

그렇다면 두개의 차이는 무엇일까?

 

StringBuffer는 각 메서드별로 Synchronized Keyword 가 존재하여

멀티스레드 환경에서도 동기화를 지원한다

 

StringBuilder는 그와 반대로 동기화를 지원하지 않는다

그래서 싱글스레드 환경에 사용 해야한다

 

정리하자면

멀티스레드는 StringBuffer

싱글스레드는 StringBuilder

 

싱글스레드 환경이라고 StringBuffer를 못쓰는건 아니다

하지만 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다

 

3. 최종 정리

String

- 짧은 문자열을 더할 경우

 

StringBuffer

- 멀티스레드 환경

- 스레드에 안전한 프로그램이 필요할때

- 개발중인 시스템이 스레드에 안전한지 모를때

 

StringBuilder

- 싱글스레드 환경

- 스레드에 안전 여부가 전혀 상관없는 프로그램 개발에

 

 

사실 JDK 1.5 버전 이전에는 문자열 연산인 +, concat 을 쓰면

조합된 문자열을 새로운 메모리에 할당하여 참조해서

성능상에 이슈가 있었다

 

그러나 JDK 1.5 버전 이후에는 컴파일 단계에서 String 객체를 써도

StringBuilder로 컴파일 되도록 변경이 되었다

 

그래서 String 이나 StringBuilder나 성능상 차이가 없어졌지만

반복 루프를 사용해서 문자열을 더하는 경우에는

객체를 계속 추가한다는 사실에는 변함이 없다

 

그래서 싱글스레드라면 StringBuilder를 쓰고

멀티스레드라면 StringBuffer를 쓰는걸 권장한다

 

단순히 성능만 놓고 보면 아래와 같다

StringBuilder > StringBuffer >>> String