본문 바로가기
언어/JAVA

[JAVA] String, StringBuffer, StringBuilder의 차이점

by steadyMan 2022. 4. 19.

해당 주제에 대해선 이미 많은 분들이 정리한 좋은 글이 있지만 성능과 연관이 있고 문자열을 다루는 일은 번번하여 

기록을 남깁니다. 

 

자바에서 문자열을 다루는 클래스는 String, StringBuffer, StringBuilder라는 3개의 클래스가 있다. 

위의 3가지 클래스는 문자열을 저장하고 관리하는 기능을 제공하며 각각 조금의 차이가 존재합니다. 

 

문자열의 연산이 많지 않다면 무관하나 연산이 많아지면 클래스의 종류에 따라 성능이슈가 발생할 수 있고,

쓰레드환경의 변화에도 이슈가 발생할 수 있습니다. 이렇기에 클래스의 특성을 이해하고 상황에 따라

알맞은 클래스를 사용해야 합니다. 

String과 StringBuffer, StringBuilder의 차이점 

String과 StringBuffer, StringBuilder의 가장 큰 차이점은 String은 불변의 속성을 갖는다는 점입니다. 

String st = "connect";
st = st += "success"; // st = connect success

직관적이고 사용이 편리하여 위와같이 String을 사용한 문자열 연산을 많이 사용하는데 겉으로 봐선

String객체가 한개 생성되고 해당 객체에 문자열 연산을 한 것으로 보이지만 

 

String은 크기가 고정되어 있어 문자열을 수정할 수 없기 때문에 수정될 때마다 새로운 객체가 리턴됩니다.

두 번째 줄에 문자열 연산이 발생되면서 "connect success"라는 문자열이 저장된 새로운 String 객체가 생성되고 기존의

String객체는 남아 있다가 GC에 의해 사라집니다. 

 

위와 같이 불변성을 가지는 String을 사용한 다수의 문자열 연산은 좋은 효율을 기대할 수 없습니다. 

그래서 가변성을 가지는 StringBuffer, StringBuilder 클래스를 사용해야 합니다. 

 

StringBuffer, StringBuilder은 가변성을 가지기에  append0, delete() 등의 내부 메소드가 있어서 동일 객체 안에서

문자열을 수정하는 것이 가능합니다. 

StringBuffer sb = new StringBuffer();
sb.append("connect");
sb.append("success");

StringBuffer, StringBuilder의 차이점

Buffer와 Builder의 가장 큰 차이점은 동기화 지원의 유무입니다. Buffer는 동기화를 지원하여

멀티쓰레드 환경에서 안전하다는 특징이 있습니다. 

String을 사용해야 하는 경우 

Buffer, Builder을 생성할 경우 buffer의 크기를 초기에 설정해야 하는데 String보다 생성 속도가 느리고,

문자열 수정 시 버퍼를 늘리고 줄이는 내부연산이 필요하므로 많은 양의 문자열 연산이 아니라면 String클래스

사용이 더 성능에 유리하다. 

 

참고 

https://coding-factory.tistory.com/546

https://ifuwanna.tistory.com/221

 

 

'언어 > JAVA' 카테고리의 다른 글

[JAVA] JAVA 8 interface의 변경사항  (0) 2022.06.10
[JAVA] 캡슐화  (0) 2022.05.26
[JAVA] 예외(Exception) 처리에 관한 고찰  (0) 2022.01.22
[JAVA] 메모리영역, static, 싱글톤  (1) 2021.02.25
[JAVA]자바 문자비교  (2) 2020.12.08

댓글