티스토리 뷰

String

immutable(불변) 하다.

String 객체는 한번 생성이 되면 할당된 인스턴스 공간의 메모리가 변하지 않는다.

문자열을 저장하고 + 연산자나 concat 메서드를 통해 새로운 문자열을 붙이면, 기존의 String 객체가 가리키고 있던 문자열이 복사되고 새로운 문자열로 객체가 생성된다. 그리고 새로운 문자열이 만들어진 객체를 참조하도록 한다. (한번 생성된 문자열 객체의 내부를 변경할 수 없다.)
기존 String 객체는 특정 시점에 Garbage Collection에 의해 회수된다.

하지만, immutabe 객체는 thread-safe 하기 때문에
여러 개의 스레드가 동시에 접근하여 읽어도 값이 변하질 않아 문제가 발생하지 않는다. (동기화 문제를 고려하지 않아도 된다.

결국은 문자열 연산이 적고 조회가 많은 멀티스레드 환경에서 적절하게 사용하면 된다.

StringBuffer, StringBuilder

mutable(가변) 하다.

문자열을 저장하여 연산자를 사용해 객체의 공간이 부족해지면 버퍼 크기를 늘리며 문자열을 변경한다.

멀티스레드 환경에서 Synchronized 키워드가 가능 함에 따라 동기화가 가능하다.

멀티스레드 환경에서 thread-safe 함으로 문자열 연산이 많은 작업에 사용하면 된다.

StringBuilder

StringBuffer와 호환이 가능하며 거의 동일하나 동기화를 지원하지 않는다.
그래서 멀티스레드 환경에서는 적합하지 않다.

단일 스레드 환경에서는 StringBuilder가 동기화를 보장하지 않기 때문에 속도가 빠름으로 StringBuilder를 사용한다.

참고

  • StringBuffer, StringBuilder의 경우 버퍼 사이즈를 초기에 설정 해야하는데 버퍼 사이즈를 잘못 초기화 할 경우 오버로드가 걸려 성능이 좋지 않을 수 있다.
  • HashTable, HashMap도 비슷하다.
    동기화 보장이 필요하면 HashTable을 사용하고 필요 없다면 HashMap 사용한다.
댓글
최근에 올라온 글
최근에 달린 댓글
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday