반응형

StringBuffer 클래스

  • String처럼 문자형 배열(char[])을 내부적으로 가지고 있다.

 


StringBuffer클래스는 문자열을 저장하기 위한 클래스이다.
String처럼 문자형 배열을 내부적으로 가지고 있다. 그래서 여러개의 문자들을 저장할 수 있다.

 

  • 그러나, String과 달리 내용을 변경할 수 있다. (mutable)

String과 StringBuffer 둘다 문자열을 다루기 위한 것이지만, String은 불변인데, StringBuffer는 mutable(변경가능)이다.
즉, StringBuffer는 내용이 변경 가능하다는 이야기다.

그래서, StringBuffer sb = new StringBuffer("abc"); 처럼
StringBuffer를 만들고, 문자열 "abc"를 저장하는 StringBuffer를 만들면 아래 그림처럼 표현할 수 있다.

char[] 배열이 만들어지고, 각 인덱스에 'a', 'b', 'c'가 저장된다.

 

그리고 여기다가 append()라는 명령어를 이용해서
sb.append("123");을 하면, sb의 내용 뒤에 "123"을 추가한다.

즉, 내용이 변경 가능하다.

그래서 문자열을 따룰 때는, 기본적으로 String클래스를 사용하지만,
이처럼 문자열을 가지고  추가, 변경등을 해야할 떄는 StringBuffer클래스를 사용하는 것이 좋다.

 


 

StringBuffer의 생성자

  • 배열은 길이 변경불가. 공간이 부족하면 새로운 배열 생성해야 한다.

 

앞서 배운 것 처럼, 배열은 한번 만들면, 길이를 변경할 수 없다.
그래서, 공간이 부족하면 새로운 배열을 생성해야 한다.

만약에 처음에 길이가 5인 배열을 만들어서, 1, 2, 3, 4, 5를 저장했는데,
뒤에다 추가로 6을 저장하고 싶지만, 배열에 공간이 없다.

이럴 때, 제일 좋은 방법은, 해당 배열의 길이를 늘리면 좋겠지만, 배열은 길이 변경이 불가능하다.

그래서 어떻게 해야하냐면,
1. 새로운 배열을 생성해야 한다.  보통 기존의 배열길이의 2배 짜리로 만드는 것이 관례다.
2. 그다음, 기존의 배열에 담겨있던 내용을 복사해줘야한다.
3. 참조변경을 해줘야한다.

 

 

  • StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.

배열의 저장공간이 부족하면, 새로 배열을 만들고, 기존의 배열의 값을 복사하고, 참조를 변경해줘야하는 번거로운 작업이 필요한데,
이런 일들이 자꾸일어나면 성능이 떨어질 것이다.

그래서, StringBuffer는 처음부터, 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.

  • 그래서, 생성자 중에 StringBuffer(int length)  라는것이 있어서 길이를 정할 수 있다.
    가능하면 length에 적절한 크기를 지정해야 한다.

우리가 실행상황을 완전히 예측할 수 없어서, 충분히 공간을 여유있게 지정해주었어도, 부족한 경우가 생길 수 있다.
그런 것은 어쩔수 없다(?) 해결방법을 고민해 봐야할 부분인 것 같다.

적어도, 아까처럼 공간이 부족해서 새로배열생성하고, 기존배열값 복사하고, 참조변경해주는 이런 일들을 최소화 해야하는 것이다.

그래서 적절한 크기를 지정해주는 것이 매우 중요하다.

버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.

그리고 만약에 StringBuffer(String str) 에 "abc"를 넣어주면,
"abc"길이가 3이므로 3 + 16해서 길이가 19인 배열이 만들어진다.
즉, 지정한 문자열의 길이보다 16 더 크게 버퍼를 생성한다.

 


 

StringBuffer의 변경

  • StringBuffer는 String과 달리 내용 변경이 가능하다.

 

StringBuffer는 String과 달리 내용 변경이 가능하다.
그래서, StringBuffer는  StringBuffer sb = new StringBuffer("abc"); 객체를 만든 다음에,
sb.append("123"); 을 통해서 문자열을 추가하면, 아래와 그림과 같이 sb내용 뒤에 "123"이 추가된다.

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

등의 메서드를 가지고 있다.
다음시간에 StringBuffer의 메서드를 쭉 공부할 것이다.

 

  • append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환한다.

이런 메서드들의 중요한 특징이,
메서드의 반환 타입이 StringBuffer 라는 것이다. 

만약, 위 그림의 배열이 StringBuffer객체 sb일때,
StringBuffer sb2 = sb.append("ZZ"); 를 하면,

참조변수 sb2에 기존의 SrringBuffer의 주소를 반환한다. (내용변환이 가능하기 떄문)

그래서 sb를 출력해도 abc123ZZ가 출력되고,
sb2를 출력해도 abc123ZZ가 출력된다.

그리고, sb.append("123")을 해도 반환값이 sb자기 자신이기 때문에,
여기다가 바로 이어서 .append("ZZ") 를 해주는 것이 가능하다.
성능상 차이는 없지만, 코드가 좀더 간결해 질 수 있다.

어쨋든, sb.append("123").append("ZZ")같은 코드가 가능한 이유가,
메서드들의 반환타입이 StringBuffer이기 때문이다.

 


 

StringBuffer의 비교

  • ​StirngBuffer는equals()가오버라이딩되어있지않다.(주소비교)

 

StringBuffer를 사용하면서 조심해야 할 것이,
equals()가 오버라이딩 되어있지 않다는 것이다.
String은 equals()가 오버라이딩 되어있는데, StringBuffer는 오버라이딩 되어있지 않다.

그렇다는 말은, equlas()는 StringBuffer에서는 주소비교를 한다는 것이다.
즉, this == obj로 코드가 작성되어있다는 것이다.

 

그래서 내용이 같아도, 반환값은 false다.

주소비교는 당연히 다른객체이므로 false다.

그러면, StringBuffer의 비교는 어떻게 해야할까?

  • StringBuffer을 String으로 변환 후에 equals()로 비교해야 한다.

 

그래서 StringBuffer에 toString()을 호출해서 StringBuffer를 String으로 바꾼다음에,
String의 equals()를 이용해서 비교해야 내용비교를 할 수 있다.

반응형

'JAVA' 카테고리의 다른 글

StringBuilder, Math 클래스  (0) 2022.04.17
StringBuffer 클래스의 메서드  (0) 2022.04.16
StringJoiner, 문자열과 기본형 변환  (0) 2022.04.15
String 생성자  (0) 2022.04.15
String클래스, 문자열 비교, 빈 문자열  (0) 2022.04.14