면접준비 - Java String vs StringBuilder vs StringBuffer
오타, 지적 환영입니다.
String
- String은
Immutable
하다. 바꿀 수 없다. 그런데+
와 같은 연산을 수행하는것은 새로운 String객체를 생성하고 이를 반환한다는 의미이다. 그래서 메모리 공간의 낭비가 발생하고 성능이 떨어진다. 그 의미는 결과를 리턴할 String 객체를 새로 생성해서 원본 값들을 모두 담고 거기에 피연산자들을 추가(append) 연산을 한다는 것이다. 굉장히 비효율적. 그렇기에 시간복잡도는"test" + "code"
사실상 O(test의 길이 + code의 길이)만큼 수행된다는 것이다. - JDK1.5 이후에는 컴파일 타임에
StringBuilder
로 변경한다고 한다. - 그래도 불변객체이기에 멀티 쓰레드 환경에서 동기화 작업에는 신경을 쓰지 않아도 됨.
- 그렇기에 업데이트를 자주 하지 않고 조회성에서는 쓰기 좋다.
String Pool
String
은 String Pool에서 관리한다. 동등성, 동일성 포스팅에서 ==
는 가리키는 주소값이 같을때 동일하다고 하였다.
1
2
3
4
5
String a = "Cat"; //String literal
String b = "Cat"; //String literal
String c = new String("Cat");
System.out.println(a == b); // true
System.out.println(a == c); // false
a와 b는 같은 주소를 가리킨다. 이를 메모리 구조로 나타내면
로 나타낼 수 있다. 즉 이러한 방식을 통해 String literal로 정의된 String객체는 똑같은 메모리 값 주소를 가리키므로 그만큼 메모리 재사용성이 늘어나는 것이다. new
연산을 통해 생성된 객체는 Heap영역 내 별도의 메모리를 할당하여 주소를 가리키게 된다.
StringBuilder, StringBuffer
공통점
Mutable
하다.- 그렇기에 연산시 새로운 객체를 생성하지 않고, 기존 객체에 연산을 수행하므로
String
보다는 연산속도가 빠르다. - 따라서 업데이트성이 많은 문자열에 쓰기 유리하다.
차이점
- StringBuilder : Thread-Safe하지 않다. 멀티 스레드 지원이 없다.
- StringBuffer : Thread-Safe하다. 멀티 스레드 지원한다.
StringBuilder는 싱글 스레드환경일 때 사용하고 StringBuffer는 멀티 스레드환경에서 고려해야할 경우 사용하는게 좋다. 무조건적으로 StringBuffer를 사용하는건 아니다. StringBuilder가 성능은 더 좋다. StringBuffer는 내부적으로 synchronized
이 적용되어 block을 걸기 때문이다.
Reference
- https://codingdog.tistory.com/entry/java-string-%EC%97%B0%EC%82%B0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EC%A7%80-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4 String 연산
- https://velog.io/@heoseungyeon/StringBuilder%EC%99%80-StringBuffer%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%8A%94%EA%B0%80 StringBuffer vs StringBuilder
- https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Java/%5BJava%5D%20String%2CStringBuilder%2CStringBuffer%20%EC%B0%A8%EC%9D%B4.md 거의 원본글
- https://github.com/jvm-hater/java-study/blob/main/5%EC%A3%BC%EC%B0%A8/String%20vs%20StringBuilder%20vs%20StringBuffer.md String Pool
This post is licensed under CC BY 4.0 by the author.