StringBuffer vs StringBuilder

최성원·2023년 6월 8일

백엔드 데브코스

목록 보기
2/6

java.lang.String

  • 문자열을 포함하는 자료형이다
  • String 객체는 불변(immutable)하기 때문에 내용물을 변경할 수 없다
  • 구현 방법은 아래와 같이 2가지 방법이 있다
// 리터럴 방식
String a = "asdf";

// new 키워드 사용
String b = new String("asdf");
  • 리터럴 방식 vs new 키워드
    • 겉보기에는 동일하게 동작하는 것처럼 보인다
    • 하지만 리터럴 방식이 더 좋다고 한다. 자세한 이유는 아래를 참조하자

      String a = "happy java"String b = new String("happy java")에서 a, b 변수는 동일한 문자열 값을 갖게 되지만 완전히 동일하지는 않다.
      첫번째 방식은 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 좀 더 자세히 알아보면, 리터럴 표기법은 "happy java" 라는 문자열을 JVM의 intern pool 이라는 메모리 공간에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 이와는 달리 두번째 방식은 항상 새로운 String 객체를 만든다.
      -점프 투 자바

위처럼 같은 기능이라도 메모리 공간을 다르게 활용하는 등 성능상의 차이점이 있다.
이러한 관점에서 StringBuffer와 StringBuilder 의 차이점을 살펴보자

StringBuffer vs StringBuilder

String 에서의 + 연산

  • String 에서 + 연산은 두 문자열을 이어 붙인 새로운 문자열을 return 한다
String applePen = "apple" + "pen"; // "applepen"
// 해당 작업은 컴파일러에 의해 아래와 같이 실행 된다
String applePen = new StringBuilder("apple").append("pen").toString();
  • String.concat() 메소드를 사용하지 않고 위와 같이 new 키워드를 통해 StringBuilder를 내부적으로 만들어 사용한다
  • 따라서 + 연산을 반복 작업시 성능 저하와 비효율적인 메모리 사용이 예상된다
/* 비효율 코드 예시 */
String a = "a";
for (int i = 0; i < 10000; i++){
	a += "a";
}
// 위 작업은 아래와 같다
String a = "a";
for (int i = 0; i < 10000; i++){
	a = new StringBuilder(a).append("a").toString();
}

/* 위의 작업은 아래처럼 바꾸도록 하자 */
StringBuilder a = new StringBuilder("a");
for (int i = 0; i < 10000; i++){
	a.append("a");
}

StringBuilder vs StringBuffer

StringBuilder 위치: java.lang.StringBuilder

StringBuffer 위치: java.lang.StringBuffer

  • String 과 다르게 가변(mutable)적이다
  • 두 클래스간의 기능은 거의 동일하다
  • 가장 큰 차이점은 멀티스레드 환경에서 thread-safe 의 여부이다
    • StringBuilder -> thread-safe X
    • StringBuffer -> thread-safe O
  • 따라서 동시성이 중요하다면 StringBuffer, 그렇지 않다면 StringBuilder 를 사용하는 것이 성능면에서 더 효율적이라고 할 수 있다
    • (StringBuilder 는 동시성을 보장하지 않는 대신 그만큼 자원이 덜 들어가기 때문에)

요약

특성

String

StringBuilder

StringBuffer

변형 가능?

불가능 가능 가능

동시성 보장(thread-safe)

O X O

성능

느림 젤 빠름 빠름

참고

profile
안녕하세요 백엔드 개발자입니다

0개의 댓글