JAVA

[Java] String, StringBuffer, StringBuilder 차이점

Isaac01 2024. 3. 25. 14:04
반응형

1. String 

String 객체는 한번 할당된 공간이 변하지 않는다고 해서 'immutable(불변)'자료형 이라고 불린다.

또한 String 객체는 + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 객체에 문자열을

붙이는게 아니라 기존 문자열을 삭제한 후 새 String 객체에 연결된 문자열을 저장하고 그

객체를 참조하는 것이다.

 

- String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성.

한번 생성된 객체의 내부 내용을 변화시킬 수 없다. 기존 객체가 제거되면 Java 의 가지비

컬렉션이 회수한다. 

 

Immutable 한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도

되기 때문에(Thread - safe), 내부 데이터를 자유롭게 공유 가능하지만 추가 / 삭제 연산이

많으면 성능이 좋지 않다.

 

 

 

2. StringBuffer / StringBuilder

StringBuffer / StringBuilder 는 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우,

기존의 버퍼 크기를 늘리며 유연하게 동작한다.  또한 StringBuffer / StringBuilder 는 제공하는

메서드도 똑같고 사용하는 방법도 동일하다.

 

1) StringBuffer / StringBuilder 차이점

둘의 차이점은 딱 한가지로 멀티 쓰레드(Thread)에서 안전(safe)한지 아닌지의 차이 뿐이다.

 

StringBuffer 클래스는 쓰레드에서 안전하다. (thread safe)

StringBuilder 클래스는 쓰레드에서 안전하지 않다. (thread unsafe)

 

두 클래스는 문법이나 배열구성도 모두 같지만, 동기화(Synchronization) 에서의 지원 유무가

다르다. StringBuilder 는 동기화를 지원하지 않는 반면, StringBuffer 는 동기화를 지원하여

멀티 스레드 환경에서도 안전하게 동작할 수 있다.  그 이유는 StringBuffer 는 메서드에서

synchronized 키워드를 사용하기 때문이다.

더 자세한 내용은 <참조>를 확인하면면 된다.

 

2) StringBuffer / StringBuilder 성능 비교

성능은 StringBuilder 클래스가 더 좋다. StringBuffer / StringBuilder 의 차이는 쓰레드 안정성에

있다고 했는데 아무래도 쓰레드 안정성을 버린 StringBuilder 가 좀더 떨 따지고 연산 하니 당연히

좀 더 빠를 수 밖에 없다. 

 

3. 문자열 자료형 정리

String 을 사용해야 할 때

● String 은 불변성

● 문자열 연산이 적고 변하지 않는 문자열을 자주 사용할 경우

● 멀티쓰레드 환경일 경우

 

StringBuilder 를 사용해야 할 때

● StringBuilder 는 가변성

● 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우

● 동기화를 지원하지 않아, 단일 쓰레드이거나 동기화를 고려하지 않아도 되는 경우

● 속도면에선 StringBuffer 보다 뛰어남

 

StringBuffer 를 사용해야 할 때

● StringBuffer 는 가변성

● 문자열의 추가, 수정, 삭제 등이 빈번히 발행하는 경우

● 동기화를 지원하여, 밀티 스레드 환경에서도 안전하게 동작

 

 

4. 주요 메서드

https://opidea.tistory.com/entry/Java-StringBuffer-StringBuilder-%EC%A3%BC%EC%9A%94-%EB%A9%94%EC%84%9C%EB%93%9C

 

[Java] StringBuffer / StringBuilder 주요 메서드

코드로 보는 StringBuffer / StringBuilder 주요 메서드

opidea.tistory.com