String과 StringBuffer, StringBuilder 차이

누피밥·2024년 4월 23일

Java

목록 보기
8/11
post-thumbnail

Java에서 문자열을 저장할 때 String이라는 데이터 타입을 사용한다. Java에는 String 클래스와 이름이 비슷한 StringBuffer와 StringBuilder가 존재하는데, 해당 클래스 간의 차이를 알아보고자 한다.

String

문자열을 저장하는 데이터 타입이다.
String 클래스는 한번 문자열을 저장하면 변경할 수 없는 변경 불가능한 클래스이다. immutable 하다고 한다.

String a = "a";
String b = "b";
a = a + b;

변수 a에 문자열 "a"를 저장한 후 "b"라는 문자열을 더한다면, 인스턴스 내의 문자열의 값이 변경되는 것이 아니라 "ab"라는 새로운 문자열이 담긴 인스턴스가 생성된다.

위의 코드를 메모리구조로 표현하면 아래와 같다.

a 라는 변수에 새로운 문자열을 할당하니 내부의 값이 변경된 것이 아니라 새로운 문자열을 저장하고 있는 인스턴스가 생성되고 해당 인스턴스를 참조하는 형태로 값의 변경이 이뤄진다.

StringBuffer

String 클래스가 인스턴스 생성 시 지정된 문자열을 변경할 수 없는것에 반해 StringBuffer 클래스는 변경이 가능하다.

String sb = new StringBuffer("abc");
//문자열 123 추가
sb.append("123");

위 코드를 메모리 구조로 표현하면 아래와 같다.

sb 변수가 참조하고있는 인스턴스의 메모리 주소가 변경되지 않고 데이터만 변경되었다는 점을 알 수 있다.

StringBuilder

StringBuffer는 멀티쓰레드에 안전하다. 멀티쓰레드에 안전하기 위해 동기화 되어 있다. 이 동기화는 StringBuffer의 성능을 떨어뜨린다. StringBuffer에서 쓰레드의 동기화가 빠진 것이 StringBuilder이다. 멀티 쓰레드로 작성된 프로그램이 아닌 경우에는 성능향상을 위한다면 StringBuffer대신 StringBuilder를 사용해야한다.

결론

  1. 덧셈 연산자(+)를 사용해서 문자열을 결합하는 행위는 연산 시 마다 새로운 문자열을 가진 String 인스턴스가 생성되어 메모리 공간을 차지하게 되므로 문자열의 연산이 많은 경우 String 보다 StringBuffer클래스를 사용하는 것이 좋다.

  2. 멀티쓰레드 프로그램이 아닌 경우 성능향상이 필요하다면 StringBuffer 보다 StringBuilder를 사용해야 한다.

0개의 댓글