💡 개요
오늘은 자바에서 문자열 표현에 사용되는 String, StringBuffer, StringBuilder에 대해 정리해 보자.
🛠️ String
자바에서 가장 많이 사용되는 문자열 타입이다.
String의 주요 특징 중 하나는 불변이라는 점이다.
한 번 생성된 String 객체는 내부 값을 변경할 수 없다.
따라서 문자열을 변경하는 작업을 하면, 기존 문자열이 수정되는 것이 아니라 새로운 String 객체가 생성된다.
또한, String을 생성하는 방식은 크게 두 가지로 나뉜다: 리터럴 방식과 new 키워드를 사용하는 방식이다.
⚙️ 리터럴 방식 예시
String s1 = "문자열";
이 방식으로 생성된 문자열은 String Constant Pool 영역에 저장된다.
같은 값을 가지는 문자열을 또 생성할 경우, 새로 객체를 만들지 않고 상수 풀에 있는 기존 문자열을 재사용한다.
따라서 두 변수의 참조값도 같아진다.
String s1 = "문자열";
String s2 = "문자열";
System.out.println(s1 == s2); // 동일성 비교
[결과]
true
⚙️ new 키워드
String s1 = new String("문자열");
String s2 = new String("문자열");
System.out.println(s1 == s2); // 동일성 비교
System.out.println(s1.equals(s2)); // 동등성 비교
[결과]
false
true
new 키워드는 다른 객체를 생성할 때 사용하는 생성자 방식과 동일하다.
또한 아예 새로운 문자열 객체를 생성하기 때문에 String Constant Pool에 보관되는 것이 아니라 순수한 힙 영역에 보관된다.
그렇기 때문에 문자열이 저장되는 참조값도 다르다.
🛠️ StringBuilder
StringBuilder는 String과 달리 가변한 문자열 클래스다.
즉, 문자열을 수정할 때마다 새로운 객체를 생성하지 않고, 기존 객체 내부의 값을 직접 변경한다.
이러한 특성 덕분에 문자열을 자주 수정해야 하는 상황에서는 String보다 성능상 유리하다.
하지만 StringBuilder는 동기화를 지원하지 않는다.
아래는 StringBuilder.append() 메서드의 코드이다.
보다시피 append()에 아무런 동기화 관련 코드가 작성되어있지 않다.
그렇기 때문에 멀티스레드 환겨에서 StringBuilder를 사용할 경우 동시성 문제 같은 상황이 발생할 수 있다.
이러한 문제를 극복하기 위해 StringBuffer가 개발되었다.
🛠️ StringBuffer
StringBuffer는 StringBuilder와 마찬가지로 가변 문자열 클래스이며, 기능도 매우 유사하다.
하지만 가장 큰 차이점은 StringBuffer는 동기화를 지원한다는 점이다.
모든 주요 메서드에 synchronized 키워드가 붙어 있어 멀티스레드 환경에서도 안전하게 사용 가능하다.
따라서 StringBuilder와 StringBuffer는 다음과 같은 상황에 따라 선택하면 된다.
- 단일 스레드 환경 ➝ StringBuilder (더 빠름)
- 멀티 스레드 환경 ➝ StringBuffer (스레드 안전)
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.04.13 - CQRS (0) | 2025.04.13 |
---|---|
[개발 일기] 2025.04.12 - 프로세스 vs 스레드 (0) | 2025.04.12 |
[개발 일기] 2025.04.10 - Spring Security Filter (0) | 2025.04.10 |
[개발 일기] 2025.04.09 - 정형 데이터 vs 비정형 데이터 (1) | 2025.04.09 |
[개발 일기] 2025.04.08 - 리퍼러 정책 (1) | 2025.04.08 |