String vs StringBuffer vs StringBuild
- Coding/Java
- 2018. 10. 3.
String, StringBuffer, StringBuild 비교
String, StringBuffer, StringBuild 는 모두 문자열 관련 클래스이다.
String은 불변함 (immutable)
StringBuffer, StringBuilder는 변함 (mutable)
String 객체의 불변함이 무슨뜻인지 알아보자.
String test = "a"; CASE1. test += "b"; CASE2. test.concat("b");
위 간단한 코드에서, test String 객체는 Hip 메모리 영역에 생성된다. 따라서 두번째 코드에서 += 또는 concat 메소드를 사용하였을때 생성되었던 처음 메모리가 아닌, 새로운 메모리를 생성한다. + 연산자, concat 메소드를 통해 새로 생성된 String 객체를 참조하게 됨으로써 계속된 문자열 연산을 사용할 시, 메모리 낭비가 심하게 일어날 것이다.
StringBuffer는 'thread-safe' 라고도 합니다. 동기화를 보장한다. 따라서 멀티스레드 환경이 아닐경우에 StringBuffer을 사용한다면 성능이 나빠진다.
StringBuilder는 성능이 가장 좋다. StringBuilder는 동기화 처리를 하지 않으므로 속도가 빠르다.
자바에서 동기화란?
여러개의 스레드(thread)가 한 개의 자원을 사용할때, 해당 스레드만 제외하고 나머지는 접근하지 못하게하는 것
따라서, 동기화를 보장하는 StringBuffer는 오직 하나의 쓰레드만 접근이 가능하기 때문에 속도가 저하된다.
클래스 선택
이 3가지의 특징을 본 결과, 어떤 상황에서 어떤 클래스를 사용해야할는지 생각해보자.
- (1) String
= 문자열의 값이 변하지않을 상황에 사용
- (2) StringBuffer
= 문자열의 값이 변할 수 있는 상황이고, 멀티쓰레드(multiple threads) 환경일때 사용
- (3) StringBuilder
= 문자열의 값이 변할 수 있는 상황이고, 문자열에 많은 연산이 사용되거나 싱글쓰레드(single thread) 환경일때 사용
* JDK 1.5 버전 이후부터, String 클래스를 사용하더라도 StringBuilder로 컴파일된다.
'Coding > Java' 카테고리의 다른 글
해당 날짜의 몇 달 후 날짜 구하기 (0) | 2018.10.04 |
---|---|
두 날짜 사이의 차이 구하기 (startDate, endDate) (0) | 2018.10.04 |
생성자 vs 정적 팩터리 메서드 (0) | 2018.10.01 |
@RequestParam으로 파라미터를 받을때 null 가능하게하기 (0) | 2018.05.11 |
PathVariable으로 파라미터를 받을때 dot (.) 사용시 유의할것 (0) | 2018.05.11 |