1) String 객체의 특성
자바에서 String 객체는 한 번 생성하면 크기가 불변(immutable)한다.
그래서 문자열 연산( + , concat ) 등으로 으로 원래 있던 String 문자열에 다른 문자열을 붙이면,
원래 객체에 추가로 붙는 것이 아니라 새로운 String 객체를 만들고, 거기에 연산을 한 문자열을 저장하고 참조하는 것이다.
String 클래스 객체는 Heap 메모리 영역에 생성이 되어 , 한번 생성한 객체의 내부 내용 변화시킬 수 없고
, 기존 객체가 제거되면 가비지 컬렉션의 대상이 된다.
이런 과정을 거치기 때문에 문자열 연산이 많은 경우(ex. jdbc 연결 쿼리) 성능이 좋지 않다.
하지만 불변 객체는 간단하게 사용 가능하고, 동기화에 신경쓰지 않아도 되어 (Thread-safe) 내부 데이터를 자유롭게 공유 가능하다.
2)StringBuilder, StringBuffer의 특성
StringBuilder와 StringBuffer는 자바에서 String 관련 주제를 다룰 때 자주 등장한다.
가변의 속성을 가지고 있다는 점이 불변인 String과 비교되는 큰 차이다.
이 둘은 문자열을 한 번 만들고 연산이 필요할 때마다 크기를 변경해가며 문자열을 변경한다.
따라서 변경될 때마다 새롭게 객체를 만드는 String 보다 더 빠르다.
그렇다면 StringBuilder와 StringBuffer의 차이는 무엇일까? 바로 동기화에 있다.
StringBuilder의 경우 동기화를 보장하지 않지만 StringBuffer의 경우 동기화를 보장한다.
아래 문자열을 추가하는 append 메서드 구현을 보면 동기화 여부를 확인할 수 있다.
그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,
단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다.
단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.
정리하자면
1. String은 짧은 문자열을 더할 경우 사용
2. StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용
3. StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.
<참고한 글>
https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java
=> Stringbuilder와 Buffer의 성능 차이를 눈으로 볼 수 있다.
<추가로 보면 좋을 글>
https://madplay.github.io/post/java-string-literal-vs-string-object
https://madplay.github.io/post/java-garbage-collection-and-java-reference
'cs > java' 카테고리의 다른 글
for문으로 키코드 찍기 (1) | 2023.11.24 |
---|---|
while문과 do - while문의 차이 (0) | 2023.02.11 |
switch 문에서 break; 사용하는 경우 와 사용하지 않는 경우 (0) | 2023.02.11 |