JAVA

StringBuffer(스트링버퍼)

🤖 Play with Android 🤖 2021. 7. 13. 13:01
728x90


String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.

하지만 StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있다.

 

String클래스는 불변 클래스이다.

String str1 = "hello world";

String str2 = str1.substring(5);

System.out.println(str1);

System.out.println(str2);
  • 실행결과

hello world

world

  • 기존의 str1은 전혀 변화 없다.
  • substring메소드는 5번째 부터 문자열을 잘라서 새로운 문자열을 반환하는 메소드
  • str1자체는 전혀 변화가 없다.

String클래스를 사용할 때 가장 문제가 발생하는 경우는 다음과 같은 코드를 사용할 때 이다.

String str3 = str1 + str2;

System.out.println(str3);

 

 

실행결과

hello world world

 

문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행

String str4 = new StringBuffer().append(str1).append(str2).toString();

System.out.println(str4);

 

 

 


public class StringBufferExam {

    public static void main(String[] args) {

        //StringBuffer는 Stirng 이 가진 단점들을 극복 가능
        StringBuffer sb = new StringBuffer();
        sb.append("hello");
        sb.append(" ");
        sb.append("world");

        String str = sb.toString();
        System.out.println(str);

        //메소드 체이닝 : 자기자신을 리턴하여 계속해서 자신의 메소드를 호출하는 방식
       StringBuffer sb2 = new StringBuffer();
        StringBuffer sb3 = sb2.append("Hello");
        if(sb2 == sb3)
            System.out.println("sb2 == sb3");

        String str2 = sb2.toString();
        String str3 = sb3.toString();
        System.out.println(str2);
        System.out.println(str3);

        String str4 = new StringBuffer().append("Hello").append(" ").append("World").toString(); //마지막은 toStirng()으로
        System.out.println(str4);

        //사실 문자열을 더해주는 것은 StringBuffer 클래스를 이용하는 것이다.

    }
}

출력값

 

 

덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성한다.

따라서 문자열을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 된다.

 

하지만 StringBuffer 인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라지는 효과가 있다.