1. String , StringBuilder , StringBuffer
- 자바에서는
String
, Stringbuilder
, Stringbuffer
처럼 3가지의 문자열 처리 방식이 존재한다.
- 세 가지의 문자열 처리방식은 각각 서로 다른 쓰임을 가져 장,단점이 존재한다.
- 주요한 차이점은 불변성 , 성능 , 동기화정도가 있음
2. String VS StringBuilder, StringBuffer
String
과 StringBuilder, StringBuffer
의 차이점은 불변성과 가변성으로 나눌 수 있다
String
객체는 한 번 생성되면 내용을 변경할 수 없는 불변성을 가지고, StringBuilder, StringBuffer
객체들은 내용을 변경할 수 있는 가변성을 가진다.
2-1 String
- 문자열을 생성하거나 조작하면 항상 새로운 객체가 생성되어 공간의 낭비가 생길 수 있다.
- 다른 객체처럼
+
연산이나 concat()
메소드로 문자열을 이어붙일 수 있다
- 하지만 합쳐진 내용으로 새로운 String 인스턴스를 생성하게 되므로 메모리 공간이나 속도의 저하가 발생할 수 있다.

- 실제로 value라는 변수 final 값으로 지정되어 있어서 값을 바꾸지 못하는 것이다.
- String은 생성 방식에 따라서 생성되는 메모리 영역이 달라진다.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
(1) String str1 = “hello”;
- String Pool에서
"hello"
가 있는지 찾음
- 문자열 리터럴이 존재하는 지 확인하는 것
- 문자열 리터럴은 재사용하여 메모리를 절약하는 역할을 한다.
- 만약 String pool에
"hello"
문자열이 존재하지 않는다면
"hello"
문자열을 String Pool에 생성하고 str1은 이 문자열을 참조함
- 이미 String pool에
"hello"
문자열이 존재한다면
- 새로운 문자열을 생성하지 않고 , String pool에 있는
"hello"
를 재사용하며 str이 이를 참조하게 됨
(2) String str2 = “hello”;
- String Pool에서
"hello"
가 존재하는 지 찾아봄
- 이미 존재하므로 새 객체를 생성하지 않고,
str2
는 String Pool의 동일한 "hello"
객체를 참조하게 됨
- 결과적으로
str1
과 str2
는 같은 객체를 참조하게되는 것
(3) String str3 = new String(“hello”);
new String("hello")
는 힙 메모리에 새로운 객체를 생성한다.
- 이 객체는 String Pool과는 독립적으로 존재하며,
str3
는 새로 생성된 객체를 참조한다.
- 하지만 String Pool에는
"hello"
가 이미 있으므로, str3
는 String Pool의 "hello"
와는 다른 객체를 참조하게 되는것이다.
구분 | String Pool | 힙 메모리 |
---|
위치 | 힙 메모리의 특별한 영역 | 힙 메모리의 일반적인 영역 |
재사용 | 동일한 문자열 리터럴을 재사용 | 항상 새로운 객체를 생성 |
성능 | 메모리 효율이 높음 | 메모리 사용량이 증가 |
생성 방식 | 리터럴로 생성 | new 키워드로 생성 |
2-2 StringBuilder , StringBuffer
2-2-1 공통점
- 두 가지 모두 객체의 내용을 변경할 수 있다.
- 추가, 삽입, 삭제 등의 작업을 할 때 새로운 객체를 생성하지 않는다.
2-2-2 StringBuilder
- 동기화(Synchronization)
StringBuilder
는 스레드-안전(Thread-Safe)
하지 않다
- 단일 스레드 환경에서 성능이 더 우수함
- 사용 목적
- 문자열을 자주 변경하거나 조작해야 하는 단일 스레드 환경에 적합.
2-2-3 StringBuffer
- 동기화(Synchronization)
StringBuffer
는 스레드-안전(Thread-Safe)
하다.
- 동기화된 메서드로 구성되어 있어 멀티스레드 환경에서도 안전하게 사용할 수 있다.
- 사용 목적
- 멀티스레드 환경에서 문자열을 자주 변경해야 할 때 적합.
2-3 비교 요약
특징 | String | StringBuilder | StringBuffer |
---|
불변성 | 불변 | 가변 | 가변 |
동기화 | 지원하지 않음 | 지원하지 않음 | 동기화 지원 |
성능 | 느림 | 빠름(단일 스레드) | 느림(멀티 스레드) |
사용 사례 | 변경이 적은 경우 | 단일 스레드 환경 | 멀티 스레트 환경 |