∞. 기술 면접/7. 자바

13. 기술면접 - 자바 - String, StringBuilder, StringBuffer

THE HEYDAZE 2021. 10. 22. 10:29
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

String StringBuilder StringBuffer
  새로운 값을 할당 할 때 마다 새로 
  클래스에 대한 객체가 생성된다

  String 에 저장되는 문자열은 private 
  final char[]의 형태이기 때문에 String
  값은 바꿀 수 없다 (불변성)
  
  Array 에 add 가 불가능하기 때문에
  새롭게 인스턴스를 생성해야 함
  (아래 코드 참고)

  String + String + String ...
  ㄴ 각각의 String 주소값이 Stack 에
      쌓이고 , Garbage Collector 가 호출
      되기 전 까지 생선된 String 객체들
      은 Heap 에 쌓이기 때문에 메모리
      관리에 치명적이다
  memory 에 append 하는 방식으로, 
  클래스에 대한 객체를 직접 생성하지
  않는다 

  변경 가능한 문자열

  비동기 처리



  memory 에 append 하는 방식으로, 
  클래스에 대한 객체를 직접 생성하지
  않는다 

  변경 가능한 문자열

  동기 처리

  multiple thread 환경에서 안전
  (thread safe)
  - JDK 1.5 버전 이전에서는 문자열 연산(+, concat()) 을 할 때 조합된 문자열을 새로운 메모리에 할당하여 참조해 성능상 이슈
  - JDK 1.5 버전 이후에는 컴파일 단계에서 String 객체를 StringBuilder 로 컴파일 되도록 변경됨
  - 그래서 JDK 1.5 버전 이후에서는 String Class 를 사용해도 StringBuilder 와 성능 차이 없음
  - 하지만 반복 루프를 사용해서 문자열을 더할 때는 객체를 계속 새로운 메모리에 할당한다 (이전과 동일한 방식)
  - String 클래스를 사용하는 것 보다는 스레드와 관련있으면 StringBuffer, 스레드 안전 여부와 상관 없으면 StirngBuffer 권장

 

public class StringTest {

    public static void main(String[] args) {

        char[] cheese = {'치', '즈'};
        char[] donkats = {'돈', '까', '스'};

        int totalLength = cheese.length + donkats.length;
        int targetIndex = 0;

        char[] cheeseDonkats = new char[totalLength];

        for (int i = 0; i < totalLength; i++) {
            if (cheese.length > i) cheeseDonkats[i] = cheese[targetIndex++];
            else cheeseDonkats[i] = donkats[++targetIndex - donkats.length];
        }
        System.out.println(cheeseDonkats);
    }
}

왼쪽(원본) 오른쪽(컴파일된 코드) - open jdk 1.8 기준 

 

모든 상황에서 컴파일러가 최적화를 해주진 않습니다
일단 open jdk 1.8 기준으로는 컴파일 과정에서 StringBuilder 로 변환이 일어나지 않았습니다
자세한 내용은 아래 참고 블로그에서 확인 바랍니다


참고

https://siyoon210.tistory.com/160

 

String은 항상 StringBuilder로 변환될까?

JDK 1.5 버전 이후부터, String 의 + 연산은 컴파일시에 StringBuilder 를 사용하도록 자동변환되어 성능 최적화가 이뤄진다고 알려져 있습니다. 그러나 String은 항상 StringBuilder로 변환되지 않습니다. Stri

siyoon210.tistory.com