JVM/Java

[Java] String, StringBuffer, StringBuilder의 차이점 스윽

헹창 2019. 7. 30.
반응형

차이점

 

String 과 StringBuffer(StringBuilder), 두 클래스 모두 문자열을 담고 연산하는 것인데

차이가 뭐지? 성능이 어떻게 다르지?  궁금했던 분들에게 그 차이점을 스윽 정리해드리고자 한다!

 

아래 표를 보면 된다 !

 

String StringBuffer StringBuilder
문자열을 저장하고 관리하는 클래스
immutable (불변) mutable (가변)
new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다.
문자열 연산을 했을 때, 메모리 공간이 변하는 것이 아닌 새로운 String 객체를 만드는 것이다.

문자열 연산에 있어서 new로 객체 생성을 한번 한 후, 
연산이 필요할 때 크기를 변경시켜 문자열을 변경한다
동기화(Synchronized)를 지원한다
멀티스레딩 환경에서 동기화 가능하다
동기화(Synchronized) 지원하지 않아
멀티스레딩 환경에서 사용불가능하다

 

 

 

표를 슥- 읽고 왔다면 한번 살표볼까?

 

String str = "Hello"; 
str += " world"; 
str += "!!!"; 

 

 

위 코드와 같이 연산을 했을 때, 서로 다른 객체를 계속 생성하게 되는 것이다.

 

 

 

이렇게 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야 하는 단점(언제 제거될지 모름)이 있고,

 

이러한 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없다.

 

대신 String 클래스의 객체는 불변하기 때문에 단순 참조의 경우 String 클래스가 StringBuffer(StringBuilder)보다 좋은 성능을 보인다.

 

 

String과 new String의 차이는 아래 링크를 참고하세요

Link : https://haenny.tistory.com/18

 

[Java] String과 new String 차이

[Java] String과 new String 차이 Java에서 String 문자열은 두가지 생성 방식이 있다. 1 2 3 String str1 = new String("Hello"); String str2 = "Hello"; String str3 = "Hello"; cs 첫 번째 new 연산자를 이용..

haenny.tistory.com

 

 

반면 StringBuffer와 StringBuilder 클래스는 문자열 연산에 있어서 클래스를 한번만 만들고(new), 연산이 필요할 때 크기를 변경시켜서 문자열은 변경하므로 문자열 연산이 자주 있을 때 사용하면 성능이 좋다.

 

사용방법은 다음과 같다.

 

StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.apeend("world");
 

 

String과는 다르게 sb라는 StringBuffer 객체에 append, insert, delete 등의 메소드를 통해 StringBuffer객체가 가지고 있는 문자열 변경이 가능하다.

 

 

그렇다면 StringBuffer와 StringBuilder의 차이는 ??

 

 

위 표에서 본 것과 같이 StringBuffer는 동기화 지원, StringBuilder는 동기화를 지원하지 않는 차이를 보인다.

 

 

 

결론 !!!!!

 

  String StringBuffer StringBuilder
적합한 환경 문자열 연산이 적고
단순 참조 경우
문자열 연산이 많고,
멀티쓰레드 환경
싱글쓰레드나 쓰레드를
신경쓰지 않아도 되는 환경
성능 String < StringBuffer < StringBuilder
단, 안정성을 위해서는 StringBuffer를 많이 사용한다.

 

 

 

 

728x90
반응형

댓글

추천 글