목적
실제 면접에서 받은 질문을 복기하기 위함
※질문 : 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 자체가 여러개가 생성되는 것은 아니다.
- 내부에 buffer를 가지고 있어서 문자열 데이터를 저장해두고 사용합니다.
- StringBuilder, StrinbBuffer 차이점
- 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
'JAVA > JAVA' 카테고리의 다른 글
[JAVA] 리눅스 자바 설치 위치 찾는 방법 (how to find real installed java path) (0) | 2023.02.05 |
---|---|
[Error] Keycloak The method getLocation() is undefined for the type Response (Eureka com.sun.jersey - jsr311-api 관련) (0) | 2023.01.27 |
[Error] Unrecognized field "xml 필드명" (0) | 2023.01.18 |
[JAVA] JsonIgnore, JsonProperty(READ_ONLY) 차이 (0) | 2022.12.26 |
[JAVA][ERROR] String cannot be cast to Integer (0) | 2022.02.18 |