[JAVA] String vs. StringBuffer vs. StringBuilder

yekyeong·2021년 8월 6일
0

Java

목록 보기
1/2

Java에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.
연산이 많지 않은 상황에서는 어느 클래스를 사용하더라도 큰 이슈가 발생하지 않는다.하지만 연산이 많아지거나 멀티쓰레드 환경에서는 각 클래스의 특성을 파악하여 상황에 맞는 클래스를 적절하게 사용해주어야 한다.

Immutable(불변)의 String

String은 immutable 즉, 불변의 속성을 가지고 있다. 코드와 그림으로 이 속성에 대해서 설명하겠다.

String str = "Hello";
str += " World"; // [Hello World]

다음과 같은 코드에서 String 참조변수 str이 가리키는 곳에 저장된 "Hello"에 " World"가 더해져 "Hello World"가 되었다고 쉽게 착각할 수 있다.

하지만 실제로는 String 참조변수 str은 "Hello"에서 "Hello World"라는 새로운 문자열을 가리키게 되는 것이다. String 클래스는 불변하기 때문에 문자열이 수정되는 시점에서 메모리에 새로운 String 인스턴스가 할당되는 것이다. 이렇듯 문자열을 합해주는 +연산자를 많이 사용하다보면 String 객체 수가 증가하기 때문에 프로그램 성능이 느려질 수 있다.

Mutable(가변)의 StringBuffer와 StringBuilder

반면에 StringBuffer와 StringBuilder는 가변성을 갖는다. 즉, 동일한 객체 내에서 문자열 변경이 가능하다는 뜻이다.

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // [Hello World]

StringBuffer와 StringBuilder의 차이점

StringBuffer와 StringBuilder의 가장 큰 차이점은 동기화의 유무이다. StringBuffer는 멀티쓰레드 환경에서 동기화가 된다. 즉, thread-safe하다. 반면에, StringBuilder는 동기화를 지원하지 않는다. 하지만 싱글쓰레드에서 연산처리가 빠르다는 장점이 있다.


정리

  • String : 문자열 연산이 적고 자주 참조(조회)하는 경우
  • StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경인 경우
  • StringBuilder : 문자열 연산이 많고 동기화를 고려하지 않아도 되는 경우

(참고)

profile
2년차 백엔드 개발자

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN