StringBuffer, StringBuilder의 생성자와 메서드에 대한 내용이 궁금하다면 아래의 링크로 가자🐱🏍
05. [자바] StringBuffer, StringBuilder 생성자와 메서드
StringBuffer, StringBuilder의 개념이 궁금하다면 하단의 링크를 클릭하시라. 04. [자바] StringBuffer 와 StringBuilder 결론 결론부터 말하면 특별한 경우가 아니라면 StringBuilder 를 사용하자 StringBuffer..
staticclass.tistory.com
결론
결론부터 말하면 특별한 경우가 아니라면 StringBuilder
를 사용하자StringBuffer
와 StringBuilder
는 생성자부터 메소드까지 정말 또오옥같다 🤷♂️
아래의 본문에는 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의 비교
StingBuffer
는 String클래스
와 다르게 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를 이용하여 비교를 하도록 하자.
댓글