[1주차 - Frame Work를 위한 Java] String, StringBuffer, StringBuilder

Update:     Updated:

카테고리:

태그:

StringBuilder와 StringBuffer는 무슨 차이가 있는가?

결론부터 말하자면..
StringBuffer는 멀티 쓰레드 환경에서 안전하지만, 느리다.
StringBuilder는 멀티 쓰레드 환경에서 안전하지 않지만, 빠르다.

Java에서 String을 처리하는 법

String 클래스의 instance는 immutable이다.
한 번 만들어진 instance는 불변이기 때문에 굳이 내용이 같을 경우 새로운 instance를 생성할 필요가 없다.
따라서 String instance는 java에서 다음과 같이 처리한다.

code를 통해 살펴보자..

class ImmutableString {
    public static void main(String[] args){
        // 문자열 생성 방법 1(literal)
        String str1 = "Simple String";
        String str2 = "Simple String";

        // 문자열 생성 방법 2(new keyword)
        String str3 = new String("Simple String");
        String str4 = new String("Simple String");
        
        if(str1 == str2)
            System.out.println("str1과 str2는 동일 인스턴스 참조");
        else
            System.out.println("str1과 str2는 다른 인스턴스 참조");

        if(str3 == str4)
            System.out.println("str3과 str4는 동일 인스턴스 참조");
        else
            System.out.println("str3과 str4는 다른 인스턴스 참조");
    }
}
# 실행결과
str1과 str2는 동일 인스턴스 참조
str3과 str4는 다른 인스턴스 참조

이러한 결과가 나오는 것은 String 인스턴스의 생성 방법에 따라 저장되는 공간이 다르기 때문이다.

image

StringBuilder, StringBuffer

String의 반복적인 인스턴스 생성은 프로그램의 성능을 저하시킨다.
문자열끼리의 연산은 빈번한 인스턴스의 생성을 야기시킬 수 있으므로 이를 방지하기 위해 StringBuilder, StringBuffer 클래스를 사용한다.

StringBuilder, StringBuffer 클래스는 내부적으로 문자열을 저장하기 위한 메모리 공간을 지닌다.
이 메모리공간은 String 클래스의 메모리 공간과는 다르게 문자를 ‘추가’하거나 ‘삭제’하는 것이 가능하다.
따라서, ‘수정하면서 유지해야 할 문자열’이 있다면 이 클래스에 그 내용을 담아서 관리하는 것이 효율적이다.

똑같은거 아닌가?

StringBufferStringBuilder

  1. 생성자를 포함한 메소드의 수
  2. 메소드의 기능
  3. 메소드의 이름과 매개변수의 선언
    위 세 가지가 일치한다. 이는 사실상 같은 클래스임을 의미한다.

기능상으로는 완전히 동일하나 그 내부 동작 과정에서는 차이가 있다.

StringBuffer는 쓰레드에 안전하지만, StringBuilder는 쓰레드에 안전하지 않다.

위의 말은 같은 자원에 대해 여러 thread가 접근할 때, synchronization(동기화) 처리가 되어있는가 와도 같은 말이다.

  • StringBuffer
    image

  • StringBuilder
    image

Reference

StringBuilder와 StringBuffer는 무슨 차이가 있는가?

java-for-framework 카테고리 내 다른 글 보러가기

첫 번째 글입니다 가장 최근 글입니다

댓글 남기기