본문 바로가기
JAVA BASE/lang & util

04. [자바] StringBuffer 와 StringBuilder

by staticClass 2020. 12. 25.

 

StringBuffer, StringBuilder의 생성자와 메서드에 대한 내용이 궁금하다면 아래의 링크로 가자🐱‍🏍

 

05. [자바] StringBuffer, StringBuilder 생성자와 메서드

StringBuffer, StringBuilder의 개념이 궁금하다면 하단의 링크를 클릭하시라. 04. [자바] StringBuffer 와 StringBuilder 결론 결론부터 말하면 특별한 경우가 아니라면 StringBuilder 를 사용하자 StringBuffer..

staticclass.tistory.com

 


 

결론

결론부터 말하면 특별한 경우가 아니라면 StringBuilder를 사용하자
StringBufferStringBuilder는 생성자부터 메소드까지 정말 또오옥같다 🤷‍♂️
아래의 본문에는 StringBuffer클래스에 대한 설명이 전부이지만
StringBuilder로 클래스만 바꾸면 메소드,기능,리턴 다 똑같다.😊

StringBuffer sb = new StringBuffer();
sb.append("abc");
  ↓  똑같다 ↓
StringBuilder sb = new StringBuilder();
sb.append("abc");

StringBuilder를 써야하는 이유는?

StirngBuffer는 멀티쓰레드에 안전하도록 동기화되어 있는데 동기화가 StringBuffer의 성능을
떨어뜨리기 때문
이다, 멀티쓰레드로 작성된 프로그램이 아닌 경우 StringBuffer의 동기화
불필요하게 성능만 떨어뜨리게 된다.
그래서 동기화만 빼고 똑같이 만들어둔게 StringBuilder이다.😎

StringBuffer클래스

String은 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer변경이 가능하다.
내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며 인스턴스를 생성하면서 크기를 지정 할 수 있다.
StringBuffer클래스String클래스와 마찬가지로 char[]에 문자열을 저장한다.

public final class StringBuffer implements java.io.Serializable {
    private char[] value;
    ...
}

StringBuffer의 생성자

생성시에는 버퍼의 길이를 충분히 잡아주어야 한다 문자열이 버퍼의 길이를 넘어가게 됐을때 버퍼의 길이를 늘려주는
작업이 발생하는데 이때 작업의 효율이 떨어지기 때문이다.

public StringBuffer(int length) {
    value = new char[length];
    shared = false;
}

public StringBuffer() {        // 버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.
    this(16);                
}

public StringBuffer(int length) {   // 원하는 길이 만큼의 버퍼를 설정할 수 있다.

}

public StringBuffer(String str) {    // 지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성.
    this(str.length() + 16);
    append(str);
}

StirngBuffer클래스 내에는 버퍼의 크기를 변경하는 코드가 존재 하는데
처음 설정된 버퍼의 크기보다 더 큰 문자열을 다루게 될때 이 코드가 실행된다.

// 새로운 길이(newCapacity)의 배열을 생성한다. newCapacity는 정수값이다.
char newValue[] = new char[newCapacity];

// 배열 value의 내용을 배열 newValue로 복사한다.
System.arraycopy(value, 0, newValue, 0, count); // count는 문자열의 길이
value = newValue; // 새로 생성된 배열의 주소를 참조변수 value에 저장.

배열의 길이는 변경될 수 없으므로 새로운 길이의 배열을 생성 후 이전 배열의 값을 복사하게 된다.

StringBuffer의 변경

String과 달리 StringBuffer는 내용을 변경할 수 있다. StringBuffer를 생성하였다고 가정하자.

StringBuffer sb = new StringBuffer("abc");

그리고 sb에 문자열 "123"을 추가하면.

sb.append("123");    // sb의 내용 뒤에 "123"을 추가한다.

append()는 반환타입이 StringBuffer인데 자신의 주소를 반환하다.
아래의 코드대로라면 sb에 문자열 "zz"를 추가하고 난 뒤
반환되는 StringBuffer의 주소가 sb2에 저장된다.

StringBuffer sb2 = sb.append("zz");

append()시에 반환타입이 주소값이기 때문에 이런식의 사용도 가능하다.

sb.append("123");
sb.append("zz"); 
// 한줄씩 추가하는게 아닌
sb.append("123").append("zz");

sb.append("123")부분이 실행되고 나면 결국 sb임으로 다음 문장이 sb.append("zz") 가 된다.

StringBuffer의 비교

StingBufferString클래스와 다르게 equals메소드오버라이딩 되어 있지 않기 때문에
equals로 비교를 해도 등가비교연산자(==)와 같은 결과를 얻게 된다.

StringBuffer sb = new StingBuffer("abc");
StringBuffer sb2 = new StingBuffer("abc");

System.out.println(sb1 == sb2);     // false (주소값을 비교한다.)
System.out.println(sb.equals(sb2));    // false (주소값을 비교한다.)

다행히 toString()은 오버라이딩이 되어있어서 이를 이용해야 한다.

StringBuffer sb = new StingBuffer("abc");
StringBuffer sb2 = new StingBuffer("abc");

String s = sb.toString();
String s2 = sb2.toString();

System.out.println(s.equals(s2));    //true

위와 같은 방법으로 StringBuffer의 문자열을 String으로 바꾼 뒤
String의 equals를 이용하여 비교를 하도록 하자.

댓글