Java

[Java] 문자열 String, Buffer, Builder

Big Iron 2023. 7. 23. 23:42

Java를 공부하며 문자열은 String만 있는 줄 알았고 String만 사용했다.
하지만 종종 StringBuilder, StringBuffer가 보이는데 흔히 String은 불변이고 나머지는 가변이라고 한다.

String 이란?
변경할 수 없으며(불변) 고정된 문자를 저장하는 데 사용

image

  1. a는 "안녕" 이다.
  2. a는 "안녕하세요" 이다. -> String은 불변인데 a가 바뀐 것 아닌가?

먼저 눈에 보이는 문자열 a의 값은 바뀐게 맞다. 그러나 위에서 말하는 불변이란 주소값을 가리킨다. 즉, 처음의 참조변수 a는 "안녕" 이라는 값을 가리키는 주소값을 갖게된다.

그리고 새로운 두 번째 참조변수 a는 "안녕하세요"를 새롭게 가리키는 주소값을 갖게되며 기존의 a값인 "안녕"과 해당하는 주소값은 더이상 사용하지 않는다.(더이상 사용하지 않는 메모리는 GC라는 가비지 컬렉터에서 처리하게 됨)

결론은 최초 생성한 참조변수 String의 값에 무엇을 더하더라도 기존의 주소값은 바뀌지 않고 새로운 주소값을 갖는 새 개체가 생성되며 기존의 개체는 더이상 사용되지 않고 GC가 처리한다.


StringBuilder란?
변경 가능하며(가변) 문자열 조작에 사용된다
단일 스레드 환경에 사용됨

StringBuffer란?
변경 가능하며(가변) 문자열 조작에 사용된다
스레드 안전이 필요한 다중 스레드 환경에 사용됨

 

image

 

  1. StringBuilder aa는 "빌더안녕" , StringBuffer aaa 는 "버퍼안녕" 이다.
  2. aa는 "빌더안녕하세요" , StringBuffer aaa는 "버퍼안녕하세요" 이다.
    Builder, Buffer는 가변인데 aa, aaa의 값이 바뀌어서 가변인가?

-> 조금 더 자세히는 Builder, Buffer는 최초 주소값 하나를 갖는 개체를 수정하더라도 새로운 개체를 생성하지 않는다는 것이다.

불변과 가변 이라는 단어가 혼란스러웠다.
문자열을 다른 문자로 수정한다는 것인지 아니면 무엇인지... 코드로 직접 확인해보며 궁금증을 조금 해결한 것 같다.