[Java] 문자열클래스 string/ stringbuffer / stringbuilder
정리
srting,stringbuffer,stringbuilder의 공통점은 모두 string문자열을 관리하는 클래스
string클래스는
new연산을 통해 한번 생성하되면 메모리공간은 변하지 않은 불변객체입니다.
그래서 연산이 필요하면 메모리공간을 늘리는것이 아니라 계속해서 인스턴스를 생성하므로 성능이 떨어집니다.
대신 단순하게 읽는 조회연산에선 속도가 빠릅니다.
sringbuffer, stingbuilder 클래스는
string과 다르게 연산에 따라 메모리 크기를 변경할 수 있습니다.
멀티스레드 환경에서 동기화가 가능한지에 따라 stringbuffer와 stingbuilder로 구분할 수 있습니다.
stringbuffer는 멀티스레드 환경에서 동기화가 가능하지만 stringbuilder는 불가능합니다.
그래서 stringbuilder는 단일스레드환경에서 연산속도가 빠릅니다.
String | StringBuffer | StringBuilder | |
불변객체 | 가변객체 | 가변객체 | |
메모리크기 변경 | 불가능 | 가능 | 가능 |
멀티스레드 환경 동기화 | 가능 | 불가능 | |
장점 | 조회연산에서 빠름 | 단일스레드 연산속도 빠름 |
string 불변객체
문자를 수정하려면 지우고 다시 생성해야함
new 연산을 통해 생성되면 메모리 공간은 절대 변하지 않는다.
문자열 연산이 많으면 메모리 공간이 변하는게 아니라 새로운 객체를 만들어서 공간을 추가하는것
단점) 문자열 연산이 많아지면 성능이 떨어진다.
계속 새로운 문자열이 만들어지게 되면 기존의 문자열은 가비지 콜렉터에 의해 제거되어야 한다.
그리고 문자열 연산이 많아지면 계속 해서 객체를 만드는 오버헤드가 발생해서 성능이 떨어짐
장점) 단순하게 읽어가는 조회연산에서는 빠르게 읽을 수 있다.
stringbuffer 가변
new연산으로 클래스를 한번 만들고, 필요할때 크기를 변경해서 문자를 변경
append()처럼 계속 크기가 바뀜
멀티스레드 환경에서 synchronized키워드가 가능해서 동기화가 가능함. thread-safe
stringBuilder 가변
동기화 지원x
멀티쓰레드환경에 부적합
장점) 싱글스레드일 경우 stringbuffer보다 성능이 좋음(연산 속도가 빠르다)'
동기화?
멀티쓰레드에서는 여러스레드가 프로세스의 자원을 공유해서 사용한다.
그래서 스레드 끼리 공유된 자원을 순서에 맞춰 사용하는것