ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • String과 StringBuilder
    Language/Java 2020. 8. 2. 19:26

    우아한테크코스(이하 우테코) 레벨1 복습을 위한 글입니다.

    String은 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체라고 합니다.
    관련 내용을 간단하게 복습해보겠습니다.

     


     

    문자와 문자열

    문자열은 객체지만 문자의 나열로 구성됩니다.

     

    char capitalA = ‘A’; // 문자
    
    String a = “abc”; // 문자열 == 문자의 배열

     

    지금은 abc라는 문자열 객체를 쌍 따옴표 안에 넣어서 생성하고 a라는 변수에 할당했습니다. 하지만 자바에서 일반적으로 객체를 생성하는 방법인 new를 이용하여 생성하는 방법도 있습니다.

     

    String b = new String(“abc”);

     

    하지만 이와 같은 방법은 지양됩니다. 그 이유를 알아보겠습니다.

     

    // String a = "abc";이 컴파일 된 class 코드
    public void testString() throws java.lang.Exception;
        Code:
           0: ldc           #89                 // String abc
           2: astore_1
           3: return
    
    // String b = new String("abc");이 컴파일 된 class 코드
      public void testNewString() throws java.lang.Exception;
        Code:
           0: new           #33                 // class java/lang/String
           3: dup
           4: ldc           #89                 // String abc
           6: invokespecial #93   // Method java/lang/String."<init>":(Ljava/lang/String;)V
           9: astore_1
          10: return

     

    두 방법 모두 같은 문자열 객체를 생성하여 할당하는 코드지만 컴파일 컴파일 후 코드의 내용이 다릅니다.

    이와 같은 이유 이외에도 전자는 heap 메모리 영역의 String Constant Pool에서 관리되는 반면 후자는 heap에 바로 할당됩니다. 

     

     

    String Constant Heap에 할당된 객체는 재활용됩니다. 이렇게 재활용이 되기 때문에 String은 기본적으로 불변의 성질을 가져야합니다. 만일 String이 가변이라면 변수 c에 할당된 값을 "abc"에서 "ABC"로 바꿀 경우 변수 d에 할당된 값도 바뀔 수 있기 때문입니다. 

    불변이기에 만일 변수 d에 할당된 값을 "ABC"로 바꾼다면 아래와 같이 String Constant Heap에 새로운 객체가 할당될 것 입니다.

     

     

     

    StringBuilder

    위에서 언급했듯 문자열은 불변하기에 문자열 문자열을 더하여 다른 내용을 문자열을 만들면 새로운 문자열 객체를 생성합니다. 예를 들자면 "우아한" 과 "테크코스"를 더하면 "우아한테크코스"라는 새로운 문자열 객체가 탄생합니다. 따라서 두 문자열 객체를 더하는 시점에는 메모리 해제와 할당이 계속 발생합니다. 이런 문제점을 해결하기 위한 StringBuilder는 String과 달리 기존 데이터에 새로운 데이터를 더하는 방식을 취하기에 효율적이며 속도도 빠릅니다. 따라서 긴 문자열을 더하는 상황에서는 StringBuilder를 사용하는 편이 좋습니다.

     

    StringBuilder sentence = new StringBuilder();
    sentence.append("우아한");
    sentence.append("테크코스");
    
    System.out.println(sentence.toString());
    // 우아한테크코스

    간단한 사용법입니다.

     

    StringBuilder 이외에 StringBuffer도 있습니다. 전자는 쓰레드들이 StringBuilder클래스에 동시에 접근할 수 있습니다. 그렇지만 후자는 쓰레드들이 동시에 접근하지 못합니다. 즉 Thread-safe합니다. 따라서 비동기로 동작하는 환경에서는 StringBuffer를 쓰는 편이 좋습니다.

     

    그렇다면 문자열 뒤에 새로운 문자를 연결할 때에 StringBUilder만 쓰면 될까요? 그렇지 않습니다. JDK 1.5 버전 이후에는 단순하게 + 를 이용하여 문자열을 더하더라도 컴파일 과정에서 StringBuilder를 사용하도록 변환합니다. 그렇지만 항상 StringBuilder로 변환하는 것은 아닙니다. 결론만을 말하자면 한줄로 문자열들을 더할 경우에는 자동으로 StringBuilder로 변환하고 객체 선언도 한번만 하기에 효율적입니다. 그렇지만 여러줄에 걸쳐 문자열을 더할 경우에는 StringBuilder로 변환하지 않거나 객체를 여러번 생성하기에 효율성이 떨어집니다.

     

     

    참고 자료:

    우아한 테크코스 강의 자료

    https://docs.oracle.com/javase/8/docs/api/

    https://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

    https://siyoon210.tistory.com/160

    댓글

Toneyparky Blog