본문으로 바로가기

[JAVA][면접 질문] StringBuilder, StringBuffer 의 차이

category JAVA/JAVA 2022. 4. 14. 11:48

목적

실제 면접에서 받은 질문을 복기하기 위함

※질문 : StringBuilder와 StringBuffer의 차이점을 아시나요?

 

내용

  • 먼저 String과 (StringBuilder, StringBuffer)를 비교하며 설명하겠습니다.
  • StringBuilder, StringBuffer는 String의 단점을 보완한 클래스입니다.
  • String은 내부의 문자열을 수정할 수 있다.
ex) String data = "ABC"
           data += "DEF"
  • 문자열 결합 연산자 '+'를 사용할 때 새로운 메모리 영역이 생긴다.
  • String data = "ABC"를 하면
    • 메모리 스택 영역엔 data 변수가 생성된다.
    • 메모리 힙 영역엔 처음 ABC 객체가 생성된다.
  • data += "DEF"
    • 이 때 처음 생성된 ABC 객체 뒤에 DEF가 붙는게 아니라 ABCDEF 객체가 새로 생긴다.
    • 그 객체를 변수 data가 참조
    • 즉 메모리 힙 영역에 ABC, ABCDEF 객체 2개가 생성된 상태
    • 즉 String으로 문자열 변경 추가 할 때 새로운 String 객체가 생성돼서 다시 재참조를 하는 그런 결과가 벌어진다.
  • 총 몇개의 객체가 생성될까 생각해봅시다.
String data = value1 + value2 + value3
  • 메모리 영역에 아래와 같은 총 5개의 객체가 생성됩니다.
    • A: value1, 
    • B: value2
    • C: value3
    • D: value1 + value2
    • E: D + value3
    • 객체가 많이 생성됩니다. 이런 단점을 보완해서 나온 것이 StringBuilder, StringBuffer 입니다.
  • StringBuilder, StrinBuffer 공통점
    • 내부에 buffer를 가지고 있어서 문자열 데이터를 저장해두고 사용합니다.
      • (buffer = 데이터를 임시로 저장하는 메모리)
    • 버퍼 내부에서 추가, 수정, 삭제 작업을 할 수 있다.
    • 버퍼 내부에서만 변경이 되지, StringBuffer 자체가 여러개가 생성되는 것은 아니다.
  • StringBuilder, StrinbBuffer 차이점
  • StringBuilder
    • 단일 스레드 환경 : 멀티 쓰레드 환경에서 불안정하다.
    • 동기화를 보장하지는 않습니다.
    • 대부분 구현체에서 빠르므로 StringBuffer보다 우선 사용하는 것을 권장합니다. 

<StringBuilder 클래스 설명>

  • StringBuffer
    • 멀티 스레드 환경 : 여러 개의 쓰레드 환경에서 데이터가 변경이 될 때 안전하게 사용할 수 있는 객체 StringBuffer
    • 쓰레드로부터 안전하고 동기화 됩니다.

<StringBuffer 클래스 설명>

  • 메소드
    • append : 데이터 추가
    • insert : 중간에 데이터 삽입
    • delete : 특정 구간의 문자 삭제
    • delteCharAt : 특정 자리의 문자 삭제
    • replace : 글자를 교체한다.
    • reverse : 순서를 뒤바꾼다.
      • ex) abcdef -> fedcba
    • setCharAt : 특정 자리의 문자 변경

최종 답변

StringBuilder와 StringBuffer의 차이점은 동기화 여부에 있습니다.

StringBuilder는 동기화 기능을 제공하지 않아 멀티 쓰레드 환경에 불안정한 점이 있습니다.

그러므로 수정할 수 있는 문자열이 필요하고 하나의 스레드만 해당 문자열에 액세스하고 수정하는 경우에 사용합니다.

 

반면 StringBuffer는 동기화 기능을 제공하여 멀티 쓰레드 환경에 안전합니다.

그러므로 수정할 수 있는 문자열이 필요하고 여러 스레드에서 액세스하여 수정하는 경우에 사용합니다.

 

(사실 여러 글을 참조했지만 StringBuilder가 결국 좀 더 빠르므로 StringBuilder를 사용하라는 얘기가 많다.

StringBuffer는 멀티 쓰레드 환경에 안전하다는데 이를 증명한 글은 찾지 못했다. 나중에 직접 테스트를 해볼 수 있으면 좋겠다.)

 

 

참고

https://www.youtube.com/watch?v=0uHQDnYYXKw 

https://stackoverflow.com/questions/355089/difference-between-stringbuilder-and-stringbuffer 

 

Difference between StringBuilder and StringBuffer

What is the main difference between StringBuffer and StringBuilder? Is there any performance issues when deciding on any one of these?

stackoverflow.com