String / StringBuffer / StringBuilder

지프치프·2022년 8월 23일
0

Java/Kotlin

목록 보기
10/11

String Class

String 객체는 한번 생성되어 메모리가 할당되면 메모리 공간이 변하지 않는다.
이는 곧 '+' 연산이나 concat 같이 기존 문자열에 새로운 문자열을 붙이더라도
기존의 String 객체에 붙여지는 것이 아닌
새로운 String 객체를 생성 한 후, 이 객체에 연결된 문자열을 저장하고 참조하도록 한다.
즉 String은 기본적으로 Immutable(불변)이다.

장점

  • Immutable이기 때문에 단순 조회 연산에서는 다른 클래스(StirngBuffer, StringBuilder)보다
    빠르게 읽을 수 있다.
  • Immutable이기 때문에 멀티 스레드 환경에서 동기화를 신경 쓸 필요가 없다.

단점

  • 문자열 연산이 많이 일어날 경우 연산이 끝난 후 남게 된 기존 객체는
    메모리 해제를 위해 GC가 계속 발생하여 성능 저하가 발생
  • 문자열 연산이 많아질 경우 내부적으로 Char 배열을 사용하고 새로운 객체를 계속해서 만들어내기 때문에 오버헤드 발생

JDK 1.5 이후 부터는 String Class를 사용하더라도
StringBuilder로 컴파일 되기 때문에 성능 상 큰 차이가 없음
다만 반복문을 이용한 문자열 연산을 할 경우 객체 생성이 반복된다는 점은 변함 없음

StringBuffer / StringBuilder

StringBuffer와 StringBuilder 클래스는 Mutable(가변)
즉, 객체를 한번 만들면 연산을 할 때마다 메모리 크기를 변경시켜서 문자열을 변경
문자열 연산이 많을 때 사용하면 성능 상 이점이 있음

StringBuffer와 StringBuilder의 차이는 동기화 차이
(제공하는 메소드는 서로 동일함)

  • StringBuffer는 각 메소드 별로 Synchronized 키워드가 존재하여
    멀티 스레드 환경에서도 Thread-Safe를 보장
  • StringBuilder는 동기화를 지원하지 않지만 Single-Thread 환경에서
    StirngBuffer보다 연산속도가 빠름

멀티스레드 환경이면 StringBuffer
싱글스레드 환경이면 StringBuilder

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글