String, StringBuilder, StringBuffer

Helog·2020년 2월 21일
3

IT기술면접

목록 보기
2/4

String은 불변, StringBuilder, StringBuffer는 가변이다.

StringBuilder는 동기화 미지원, StringBuffer는 동기화를 지원한다.

크게 보면 이렇게 3개를 나눌 수 있다.

앞의 [힙과 스택] 게시물을 봤을때 String은 힙의 스트링풀 영역에 담기는데, 힙인데도 불구하고 불변이라는게 특징이다.
(신기한 스트링풀..)

String은 불변이기 때문에, Heap영역에 저장되더라도 메모리 관리에 비효율적이다.
하지만 빌더와 버퍼와 같이 동기화를 신경쓰지 않아도 된다는 점과 간단한 문자열 조합에는 좋은 성능을 내기 때문에 무조건적으로 빌더와 버퍼를 써야 하는 것은 아니다.

StringBuffer와 StringBuilder의 차이를 알아보려고 한다.
이건 실제로 현대 기술면접 도중 개발 13년차(?) 지원자에게 했던 질문이었다. (나도 몰랐다..)

(1) StringBuffer

Synchronized 동기화를 지원한다

동기화를 지원한다는 것은 멀티스레드 환경을 지원한다는 것이다.(=멀티스레드 환경에서 안전하다)

  • 동기화란 : A스레드와 B스레드가 한 객체를 작업중일 때, A가 값을 바꿔버리면 B가 엉뚱한 값으로 작업을 시도할 수 있다. 여러 스레드가 한 자원을 사용하려고 할 때 다른 스레드의 접근을 막는 것을 동기화라 한다. 데이터의 무결성을 보장해준다.
    다른 스레드의 접근을 막는 동기화를 지원하니, 여러 스레드(멀티 스레드)가 작업하기에 매우 안전한 환경이 만들어진다.
    그래서 동기화를 지원한다는 말은 멀티스레드 환경을 지원한다는 말과 같다고 볼 수 있다.

(2) StringBuilder

non-Synchronized 동기화를 지원하지 않는다

동기화를 지원하지 않기 때문에 단일스레드 환경에서 사용해야 안전하다.
단일스레드 환경에서는 Buffer보다 속도가 빠르다.

하지만 항상 멀티스레드환경인지 단일스레드환경인지 파악하기 어렵기 때문에 나는 Buffer를 사용한다.
확실하게 단일스레드 환경이고, 오류가 나도 큰 문제없다면 Builder를 써도 된다.
하지만 언제나 확실한 것은 없으니...

profile
Hello gaebalja

1개의 댓글