[자바/코틀린]String, StringBuilder, StringBuffer을 적절하게 이용하자

Lee Yongin·2023년 2월 20일
1

자바/코틀린

목록 보기
1/5
post-thumbnail

진행중인 안드로이드 스터디에서 String, StringBuilder에 대한 차이점을 들은 적이 있다. 아아~이랬지만 혼자 설명은 못할 거 같아서 제대로 정리해보았다.

String, StringBuilder, StringBuffer에 대해

1.string,stringBuilder, stringBuffer에 대해 얘기할 때 나오는 얘기들은 아래와 같다.

  • 문자열 삽입, 삭제, 수정 시 사용하기 적합한가?
  • 불변 or 가변?
  • 수정될 때마다 새로운 객체가 Heap에 생성되는가?
  • 멀티 스레드 환경에서 안전 or 불안전?
  • 동기화 환경에 적합 or 부적합?

JVM 메모리 구조

String, StringBuilder, StringBuffer 모두 Heap에 할당되는데 불변or가변 유무, 멀티 스레드 환경의 동시접근 허용 유뮤로 적절한 사용을 꾀할 수 있다.

String은 가변, StringBuilder와 StringBuffer는 불변이다.
StringBuilder는 멀티스레드의 동시접근이 가능하고, StringBuffers는 스레드 하나씩 접근하게 한다.
이 두가지 기준으로 정리를 했다.

String

String은 내부에 value값이 final로 선언되어 있는 불변객체이다.

불변객체이다...
-> 문자열 값이 바뀌지 않을 때 사용하는 게 좋다
-> 문자열 값을 바꿀 때마다 새로운 객체가 Heap에 생성된다
-> 불변객체이므로 멀티 스레드 환경에서 안전하다(여기저기서 값을 변경하는 일이 없기 때문)

StringBuilder & StringBuffer

공통점

  1. 가변객체이다.
    -> 문자열 값이 빈번하게 바뀔 때 사용하는 게 좋다

차이점

  1. 멀티 스레드환경에서의 동시접근 허용 유무
    StringBuffer는 불가, StringBuilder가능하다.

    위의 코드처럼 StringBuffer는 메서드들에 synchronized 제어자가 붙어있다. synchronized 제어자는 멀티스레드 환경에서 메서드에 한번에 하나의 스레드만 접근하게 한다.

    따라서 StringBuffer가 더 안전하지만, synchronized 제어자를 사용해 lock(다른 스레드의 접근을 막는 것)이 발생하기 때문에 비용이 들 수 있다.

참고자료

string, stringBuilder, stringBuffer: https://yk-coding-letter.tistory.com/11
동시성 제어: https://kotlinworld.com/36
자바의 메모리 구조:https://thenaeul.wordpress.com/2020/12/20/java-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0/

profile
⚡개발자할거야 응애 안드로이드 개발자 ⚡p.s.기록만이 살길이다!

0개의 댓글