ABOUT ME

Today
Yesterday
Total
  • 자바의정석 - StringBuffer()란?
    Java/자바의정석 2023. 2. 22. 23:40
    반응형

    StringBuffer란?

    문자열을 저장,변경하는 클래스

     

    보다싶이 아주 간단하다. 문자열을 저장하고 변경하는 클래스이다.

    예시를 보면서 이해해보도록 하자.

     

    String Buffer사용 이유 - String은 불면객체 - immutable

    자바에서 String은 불변객체(immutable)이다. 즉, 한번 생성되면 그 내용을 바꿀 수 없다는 뜻이다.

    정확하게 말하자면 내용이 아닌 주소를 바꿀 수 없다.

    String str1 = "a";
    String str2 = "a";
    str1 = "aa";

    위의 코드를 한번 살펴보자

    str1, str2와 같이 값이 같은 String은 String Pool 내에서 String 객체를 공유한다.

    여기서 str1의 값을 aa로 변경한다면 String Pool내에서 새로운 주소가 생성되는 것이다.

    String str3 = str1 + str2  => aaa  / 결과값이 출력이된다.

    문자열끼리 합을 하지만 고유의 주소를 가지고 있기 때문에 aaa라는 새로운 주소가 생성되는것이다.

    아래의 그림을 본다면 더더욱 이해가 편하다.

    <출처 https://dololak.tistory.com/699>

     

    String Buffer사용 이유!

    메모리의 낭비를 막기위해서!

    세부사항

    • 배열을 처음 생성한다면 길이를 변경할수없다. 공간이 부족하면 새로운 배열을 생성해야한다.
    • 1.새로운 배열을 생성, -> 2. 내용 복사, -> 3.참조변경  이러한 일들이 반복된다면 성능이 떨어짐

    이러한 이유들로 StringBuffer를 사용한다. 간단하게 예시코드를 살펴보자.

     

    StringBuffer 길이 지정 예제

      public StringBuffer(int length){
          value = new char[length];
          shared = false;
      }
    *버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이된다.
      public String Buffer() {
          this(16);
      }
          16보다 더큰 크기를 지정할때 사용한다.
      public String Buffer(String str){
          this(str.length() + 16);
          append(str);
      }

    StringBuffer(int length)와같이 배열의 길이를 지정하여 사용한다.

    (사용할 데이터에맞는 크기를 지정해준다.)

    이코드에서는 디폴트값으로 16의 길이를 지정받도록 설정해두었다.

    만약 더 긴 문자열을 넣어야한다면 기존의 코드에서 + 를 해주면된다.

     

    또 다른 코드를 한번보자. 아래의 코드는 자바의정석Ex9_11번의 예제코드이다.

    package JavaChap09;
    
    class Ex9_11 {
        public static void main(String[] args) {
            //StringBuffuer 클래스란-> 문자열을 저장하는 클래스
            StringBuffer sb  = new StringBuffer("abc");
            StringBuffer sb2 = new StringBuffer("abc");
    
            System.out.println("sb == sb2 ? " + (sb == sb2));
            System.out.println("sb.equals(sb2) ? " + sb.equals(sb2));
    
            // StringBuffer의 내용을 String으로 변환한다.
            String s  = sb.toString(); // String s = new String(sb);와 같다.
            String s2 = sb2.toString();
    
            System.out.println("s.equals(s2) ? " + s.equals(s2));
        }
    }

     

    ==============실행결과================

    sb == sb2 ? false
    sb.equals(sb2) ? false
    s.equals(s2) ? true


    실행결과를 본다면 한가지 의문이 들것이다.

    왜 equals가 false일까..?

    그 이유는 StringBuffer클래스는  equals()메서드를 오버라이딩하고 있지않아, equals 기능구현이 불가능하다.

    StringBuffer를 String으로 변환하여 비교해야한다. 때문에  toString()을 사용하여 비교하여야한다.

     

     

    StringBuffer()의 여러가지 기능

    append() : 끝에 문자열을 추가
    delete() : 삭제
    insert() :삽입

    위와같은 기능들이 대표적으로 있으며 반환타입이 StringBuffer이다.

    StringBuffer sb = new StringBuffer("abc");
    sb.append("123");
    sb.append("zz");

    위에서 살펴보았떤 길이 지정 예제를 이용하여 길이가 16인 배열을 생성하였다고 가정하자.

    a b c ...

    sb참조변수를 선언하여 문자열을 집어넣으면 이와같은 그림이 그려진다. 

    추가로 append를 사용하여 123을 추가한다면

    a b c 1 2 3 ...

    이와같은 맨 뒤에 123이 추가되어 이와같은 그림이 그려진다.

     

    마지막으로 append를 사용하여 zz까지 추가한다면

    a b c 1 2 3 z z ...

    이와같은 그림이 그려진다.

     

    위의 코드를 조금 더 간략하게 표현하자면

    StringBuffer cd = new StringBuffer("abc");
    ab.append("123").append("zz");
    System.out.println(ab);

    이렇게  ab.append().append()를 연속적으로 사용이 가능하다.

    이것이 가능한 이유는 append()의 반환타입이 StringBuffer이기 때문에 연속적으로 사용이가능하다.

    반응형

    댓글

Designed by Tistory.