[JAVA] StringBuffer 클래스와 StringBuilder 클래스

sy·2023년 7월 10일
0

JAVA

목록 보기
7/8

StringBuffer 클래스

  • String 클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer 클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer 인스턴스를 생성할 때 그 크기를 지정할 수 있다.
  • 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다. 편집 중인 문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업 효율이 떨어진다.
  • String 클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴스 변수로 선언한다.

생성자

  • StringBuffer 클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
  • StringBuffer(int length)를 사용해서 인스턴스에 저장될 문자열의 길이를 고려하여 충분히 여유 있는 크기로 지정하는 것이 좋다.
  • 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.

변경

StringBuffer sb = new StringBuffer("abc");

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


append()는 반환 타입이 StringBuffer인데 자신의 주소를 반환한다.

StringBuffer sb2 = sb.append("ZZ");
System.out.println(sb); // abc123ZZ
System.out.println(sb2); // abc123ZZ

비교

StringBuffer클래스는 equals 메서드를 오버라이딩하지 않아서 StringBuffer 클래스의 equals 메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.

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

System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false

toString()은 오버라이딩 되어 있어서 StringBuffer 인스턴스에 toString()을 호출하면, 담고 있는 문자열 String으로 반환한다. 그러므로 문자열을 비교 하기 위해서 toString()을 호출해서 String 인스턴스를 얻은 다음 equals 메서드를 사용해서 비교해야한다.

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

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

생성자와 메서드

StringBuilder

StringBuffer는 멀티쓰레드에 안전(thread safe)하도록 동기화 되어 있다. 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨린다. 그래서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다. StringBuffer와 완전히 똑같은 기능으로 작성 되어 있어서 StringBuffer 대신 StringBuilder를 사용하도록 바꾸기만 하면 된다.

StringBuilder sb = new StringBuilder();
sb.append("abc");

StringBuffer도 충분히 성능이 좋기 때문에 성능 향상이 반드시 필요한 경우를 제외하고 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없다.




출처
https://www.youtube.com/watch?v=FvaXjnBpGgc

0개의 댓글