1. 배경
- 문자열을 다루는 대표적인 3개의 클래스.
- 평소에 3개의 클래스들에 대한 차이를 헷갈려했는데 오늘 공부중에 관련내용이 나와 이참에 확실하게 차이점을 공부하려한다.
2. 주요 차이점
- String <->StringBuffer/StringBuilder 클래스들의 가장 큰 차이는 변경가능여부이다. 한번 생성된 String인스턴스가 갖고 있는 문자열은 read only, 변경 불가능(immutable) 클래스이다.
- StringBuffer <->StringBuilder의 차이는 동기화 여부에 따른다. StringBuffer는 동기화를 지원해 멀티쓰레드에 안전하도록 되있기에 멀티쓰레드 환경이 아닌 경우 동기화는 불필요하게 성능을 낮춘다. 단일쓰레드에선 Builder클래스가 더 유리하다.
3. 예시
- String클래스
위 코드와 같이 문자열 결합시 인스턴스내의 문자열이 바뀌는 것이 아닌 새로 결합된 문자열을 담는 String인스턴스가 새로 생성된다. 연산시 마다 새로운 문자열을 가진 String 인스턴스가 생성되기에 메모리공간을 낭비하게 된다.
- StringBuffer/StringBuilder
a. append()는 반환타입이 StringBuffer이며 자신의 주소를 반환한다.
b. 위 코드와 같이 sb에 새로운 문자열이 추가되고 자기 주소를 반환해 sb2에는 sb의 주소가 저장된다.
c. 그러므로 sb, sb2를 출력하면 값이 동일하다.
d. 추가적으로 append().append()의 방식으로 연속호출이 가능하다.
4. 정리
String | 1. 문자열 연산이 적거나 간단한 경우 2. 멀티쓰레드 환경에 유리 |
문자열 연산, 변경 시 해당 인스턴스의 값이 변경되는 것이 아닌 새로운 인스턴스를 생성하므로 잦은 연산 발생 시 메모리낭비가 우려된다. |
StringBuffer | 1. 문자열 연산이 많은 경우 2. 멀티쓰레드 환경에 유리 |
객체 생성시 값을 입력하지 않으면 기본 16개의 길이를 가진 배열로 생성된다. 문자열 변경 시 해당 배열에 추가됨. |
StringBuilder | 1. 문자열 연산이 많은 경우 2. 싱글쓰레드 환경에 유리 |
상동 |
5. 추가
String의 메모리 할당 방식에 대해서도 궁금한 점이 생겼다. 일단 아래 블로그에서 가볍게 공부를 하고 추후 자세한 내용을 포스팅 해보자
Java String 의 메모리에 대한 고찰
Java 언어에서 String은 무심코 사용되는 클래스 중에 하나가 아닐까 생각이 든다. String은 두 가지 생성 방식이 있고 각각의 차이점이 존재한다.
medium.com
'Java' 카테고리의 다른 글
Java - List의 제네릭 타입이 달라도 오버로딩은 불가하다. (0) | 2023.10.03 |
---|---|
Java - List vs Map (0) | 2023.09.21 |
Java - 서블릿과 서블릿 컨테이너 (0) | 2023.07.08 |
Java - 얕은 복사 vs 깊은 복사(shallow copy vs deep copy) (0) | 2022.12.07 |
Java 입력방법 2가지 (0) | 2022.09.01 |