-
자바의정석 - 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이기 때문에 연속적으로 사용이가능하다.
반응형'Java > 자바의정석' 카테고리의 다른 글
자바 Math의 주요 메서드 (0) 2023.02.22 여러가지 StringBuffer메서드 (0) 2023.02.22 자바 equals()와 hashcode()는 왜 같이 재정의해야하는가? (0) 2023.02.22 자바 hashCode(), identityHashCode() (0) 2023.02.22 자바 equals()는 대체 왜 쓰는가...? (0) 2023.02.22