String, StringBuffer, StringBuilder
모두 문자열을 저장하고, 관리하는 클래스 이다. char와 String의 가장 큰 차이점도 이점에 있다.
char는 문자 함수이고
String은 클래스라는 차이를 알아야 한다.
char와 String의 차이는 다음 기회에 다시 안내하기로 하겠다.
먼저 String 과 다른 클래스(StringBuffer, StringBuilder)의 차이점을 알아보겠다.
두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변함)하고, StringBuffer는 mutable(변함,변하기쉬움)하다는 것이다.
결론부터 말하자면,
단순하게 성능으로 따지면 StringBuilder > StringBuffer >>> String 이지만
각 문자열 클래스들은 성능 이슈 외에도 사용 편의성, 멀티스레드 환경 등 여러가지 고려해야할 요인이 있으므로 이에 적합한 것을 사용하면 될 것이다.
한마디로 StringBuilder와 StringBuffer는 사용 목적에 따라 다르다라는 것이다.
먼저 스트링은
String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않는다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열이 붙는 것이 아니라, 새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 한다. (즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성되며, 한 번 생성된 객체의 내부 내용을 변화시킬 수 없다. 기존 객체가 제거 되면 Java의 가비지 컬렉션이 회수한다.)
String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않지만, Imuutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기 때문에(Thread-Safe), 내부 데이터를 자유롭게 공유할 수 있다.
StringBuffer 와 StringBuilder 차이점
기본적으로 두 클래스가 제공하는 메소드는 동일하지만 StringBuffer는 멀티 쓰레드 상태에서 동기화를 지원한다. (각 메소드 별로 synchronized 키워드가 존재)
String 을 + 를 활용해 합치는 경우 매번 인스턴스를 생성하기 때문에 성능상에 이슈가 많다. 이런 성능 이슈를 개선하기위해 JDK 1.5 버전 이후에는 컴파일 단계에서 StringBuilder로 컴파일 되도록 변경되기 때문에 + 를 활용해도 성능상에 큰 이슈는 없다.
사실 두 클래스의 가장 큰 차이점은 동기화 여부이다.
StringBuffer는 각 메서드 별로 Synchronized Keyword 가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다. 하지만, StringBuilder는 동기화를 보장하지 않는다.
그렇기 때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.
'Develop > Java' 카테고리의 다른 글
자바 reflection (0) | 2018.05.17 |
---|---|
Quick sort (0) | 2016.11.21 |
자바 reflection (0) | 2016.11.17 |
문자열 "ABCDEFG"를 역순으로 출력 (0) | 2016.11.17 |
JAVA의 접근제한자 (0) | 2016.11.15 |