자바 문자열을 표현하는 객체에는 대표적으로 String, StringBuffer, StringBuilder가 있다.
StringBuffer, StringBuilder와 String의 중요한 차이점은 String은 불변(Immutable) 객체이며, StringBuffer와 StringBuilder는 가변(Muttable) 객체라는 점이다.
여기서 불변(Immutable)과
구분 | 자료형 타입 |
대표적인 Immutable 객체 | String, Boolean, Float, Long |
대표적인 Muttable 객체 | List, ArrayList, HashMap, StringBuilder, StringBuffer |
불변과 가변은 다시 다뤄보자. 다시 돌아와서.
String
String 객체는 한번 할당된 메모리가 변하지 않고 Heap Memory에 생성된 객체의 내용을 변화시킬 수 없다.
String s = "hello";
"hello"가 선언된 문자열 s가 메모리에 할당되고
s = s + "world";
"hello world"라는 새로운 문자열 s가 신규 메모리에 할당되고 기존 "hello"가 할당 된 메모리는 GC에 의해 제거되게 된다.
위와 같은 메모리 할당 방식이기 때문에 문자열 연산이 많은 경우 성능 이슈가 있을 수 있다.
StringBuffer, StringBuilder
StringBuffer와 StringBuilder는 String과 다르게 객체의 공간이 부족할 경우 버퍼 크기를 늘리면서 유연하게 동작하게 된다.
또한 StringBuffer와 StringBuilder가 지원하는 메소드는 모두 동일하며, 두 객체의 차이는 동기화가 되냐 안되냐의 차이이다.
StringBuffer는 Synchronized 키워가 있으며 멀티스레드 환경에서 동기화를 지원한다 (Thread Safe)
그와 다르게 StringBuilder는 동기화를 지원하지 않는다.
요약
- String : 멀티쓰레드 환경이면서 문자열 연산이 적은 경우에 적합하다.
- StringBuffer : 멀티스레드 환경이면서 문자열 연산이 빈번하게 발생하는 경우에 적합하다.
- StringBulider : 단일스레드 환경이면서 문자열 연산이 빈번하게 발생하는 경우에 적합하다.
'Java' 카테고리의 다른 글
[JAVA] RSA 비대칭키 양방향 암호화 구현 (0) | 2022.12.02 |
---|---|
[Java] 0.1 + 0.2 = 0.3이 아니다! (0) | 2022.11.11 |
[Java] 클래스로더(Class loader) (0) | 2022.11.10 |
[Java] JDK11 특징 (0) | 2022.11.09 |
[Java] Reflection으로 객체 비교 (0) | 2022.11.08 |
댓글