Java의 String, StringBuffer, StringBuilder 설명

Posted by 알 수 없는 사용자
2015. 3. 24. 22:35 프로그래밍/JAVA

 우리가 흔히 Java에서 문자열을 다룰때 사용하는 String과 생소하게 다가올 수 있는 StringBuffer, StringBuilder에 대해서 설명하려 한다.


1. String

 문자열을 처리하는 특별한 시스템 클래스의 객체이며, 변형 불가능(immutable)하다. 변형 불가능이라는 말은 String 인스턴스를 생성될 때 메모리의 힙(Heap) 영역에 할당되며 다시는 바꿀수가 없다는 것이다. 문자열을 조작하게 되면 새로운 문자열 인스턴스를 반환해줄 뿐이다. 아래에 작성된 코드는 메모리 영역에서 아래의 그림처럼 동작한다.




 그래서 아래와 같은 코드는 힙 영역에 지속적으로 할당될 수 밖에 없으므로 최악의 코드가 된다.

 JDK1.5 버전 부터는 "+" 연산자와 관련된 코드는 전부 컴파일시 StringBuilder로 변환된 후 사용된다. 하지만 .toString() 메소드로 String 인스턴스를 반환하는 것은 같다. 그러므로 문자열의 크기가 엄청 크거나, 문자열의 처리가 잦은 경우에는 성능상의 문제로 String을 사용하는 것을 고려해봐야 한다.


2. StringBuffer, StringBuilder

 StringBuffer와 StringBuilder는 String과는 다르게 변형 가능(mutable)하다. 내부적으로 배열의 형태로 선언되기 때문에 문자열 처리 후 새로운 인스턴스가 할당되는 것이 아닌 자신의 인스턴스를 계속적으로 변화시킨다고 할 수 있다. String에서의 동일한 예제가 아래와 그림과 같이 동작한다.


여기까진 StringBuffer와 StringBuilder가 같지만, 두개의 가장 큰 차이점은 "동기화"의 지원 여부이다. 두 클래스가 제공하는 메소드는 같지만 아래와 같이 멀티 쓰레드 상태에서 동기화를 지원하는 것이 다르다.


3개의 성능을 비교해보면 StringBuilder > StringBuffer > String 순으로 StringBuilder가 제일 빠른 것을 알 수 있다. 일반적으로 사용하는 String은 쓰기에도 편하고 가독성도 좋지만 문자열의 크기와 사용하고자 하는 용도에 따라서 3가지를 알고 사용하는 것이 현명하다고 할 수 있다.


※ 출처 : http://slipp.net/questions/271


'프로그래밍 > JAVA' 카테고리의 다른 글

JSTL Core Tag (c tag)  (4) 2015.06.02
Java의 Collections (List, Set, Map) 이해  (320) 2015.04.10
Java의 Garbage Collection  (315) 2015.03.27
JAVA 첫번째  (3) 2015.03.17