StringBuffer vs StringBuilder

wnstjq·2023년 2월 14일
0

java

목록 보기
2/5
post-thumbnail

StringBuffer

  • 내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, StringBuffer 인스턴스를 생성할 때 그 크기를 지정할 수 있습니다.
  • 멀티스레드에 안전하도록 동기화되어 있기에 동기화가 StringBuffer의 성능을 떨어뜨립니다.
  • 따라서 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어트리게 됩니다.
// StringBuffer 생성
StringBuffer sb = new StringBuffer("abcd");  // sb : abcd

// StringBuffer 변경
sb.append("efgh");  // sb : abcdefgh
sb.append("ij").append("kl");  // sb : abcdefghijkl

// 같은 내용의 문자열을 가지는 두 StringBuffer 생성
StringBuffer sb1 = new StringBuffer("abcd");
StringBuffer sb2 = new StringBuffer("abcd");

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

// toString()을 호출하여 String 인스턴스를 생성
String s1 = sb1.toString();
String s2 = sb2.toString();

System.out.println(s1.equals(s2));  // true
  • 위와 같이 StringBuffer는 equals 메서드가 오버라이딩 되어 있지 않아서 equals는 물론, '==' 로도 문자열의 내용을 비교할 수 없다. 따라서 문자열의 내용을 비교하고 싶다면 toString()을 호출하여 String 인스턴스를 얻은 후 equals 메서드를 사용해서 비교해야 한다.

StringBuilder

  • StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다. 즉, StringBuffer와 StringBuilder는 완전히 똑같은 기능으로 구현되어 있습니다.

  • 따라서 멀티쓰레드 환경에서는 StringBuffer를 사용하고, 그렇지 않다면 StringBuilder를 사용하는 것이 좋습니다.

정리

  • StringBuilder > StringBuffer >>> String

  • 하지만 사용하는 환경에 따라 성능이 차이가 나기 때문에 다양한 고려 사항을 고민해서 선택해서 사용 해한다. 간단하게 정리하면 아래와 같다.

    - 멀티 쓰레드 환경에서 하나의 문자열에 대하여 다른 문자나 문자열의 추가가 많이 발생할 경우 StringBuffer 클래스를 사용하는 게 유리하다.

    - 멀티 쓰레드 환경에서 하나의 문자열에 대하여 다른 문자나 문자열의 추가가 많이 발생할 경우 StringBuilder 클래스를 사용하는 게 유리하다.

    - String 클래스는 문자열의 + 연산 회수가 많지 않을 경우에 유리하다.

profile
공부방

0개의 댓글