본문 바로가기
Programming/JAVA

[JAVA] String, StringBuffer, StringBuilder 차이

by 안녕주 2023. 9. 5.

프로그래머스 Lv.1 3진법 뒤집기 문제를 풀다가 StringBuffer의 기능들을 사용했는데 이 3가지의 차이가 각각 뭔지 궁금해서 찾아봤다. + 입력받을 때 종종 StringBuffer를 사용해서 입력받을 때가 있는데 뭔지 제대로 모르고 사용했어서 확실히 알아보고자 한다.

 

JAVA에서 문자열을 다룰 때는 String, StringBuffer, StringBuilder이 3가지을 사용한다.

이 3가지의 가장 큰 차이는 String은 불변(Immutable), StringBuffer와 StringBuilder는 가변(Mutable) 이다.

 

String

  • String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다.
  • concat 메서드 또는 + 연산자를 통해 기존에 생성된 객체에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 한다.
String a = "Hello";
String b = " JAVA!";
		
System.out.println(a.concat(b)); //String c라는 새로운 객체가 생성된다는 의미이다.

 

즉, String 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성하고 한번 생성된 객체의 내부 내용을 변화시킬 수 없다. (기존 객체가 제거되면 Java의 가비지 컬렉션이 회수한다.)

String 객체는 이러한 이유로 문자열 연산이 많은 경우 성능이 좋지 않다.

 

StringBuilder, StringBuffer

이 둘은 문자열 연산이 많은 경우 사용하면 좋다.

기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.

 

StringBuffer와 StringBuilder의 차이점은 동기화 여부이다.

⭐StringBuffer 

StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다.

멀티스레드 환경이라면 값의 동기화 보장을 위해 StringBuffer를 사용하는 것이 좋다.

스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용

 

StringBuilder

동기화를 보장하지 않는다.

단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 

스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 경우 사용

 

 

 

참고

String, StringBuffer, StringBuilder 차이 및 장단점 | 밥줄과 취미 사이 ːː 못 먹어도 고! (dejavuhyo.github.io)

JAVA String, StringBuffer, StringBuilder 차이점 (tistory.com)

 

 

댓글