[Java]/문법, 자료구조, 알고리즘

StringBuilder, StringBuffer

응파카 2023. 3. 3. 18:49

문자열 이어붙이기

StringBuilder에는 연결하고자 하는 문자열을 넣어 붙일 수 있는 append()라는 메소드가 있다.

하지만 평소 문자열을 이어붙일 때

String a = "문자열을";
System.out.println(a);

String a = a + "붙여보자";
String a = a;
System.out.println(a);
input output
  문자열을
문자열을붙여보자

이런 간단한 방법을 사용했는데(혹은 concat 메소드) 왜 굳이 StringBuilder.append() 를 사용하는 것인지 궁금했고,
둘의 차이를 알아보았다.

 


메모리 할당과 해제

📢 And you know, object create always takes more time than other operations,

which results in inefficient code
  • String 객체끼리 더하는 방법은 연결한 문자열을 새 문자열로 생성하고,
    이전 문자열은 자바 가비지컬렉터에 의해 처리되는 절차를 밟는다.
  • 만약 수많은 문자열을 붙이는 작업을 반복한다고 할 때,
    String 객체끼리 붙이는 과정에서 계속 메모리 할당과 해제가 일어나므로 코드의 비효율성이 증대된다는 것이다.
String a = "문자열을";
System.out.println(a);
System.out.println(System.identityHashCode(a)); //주소 출력

a = a + "붙여보자";
System.out.println(a);
System.out.println(System.identityHashCode(a)); //주소 출력

 

input output
  문자열을
1239731077
문자열을붙여보자
557041912

String a에 문자열을 붙이면 주소가 바뀌는 것을 볼 수 있다.

 

 

 

StringBuilder

이를 위한 대안이 StringBuilder이다.

  • String → 변경 불가능한 문자열을 생성
  • StringBuilder → 변경 가능한 문자열을 생성

이라는 차이점이 있다.

StringBuilder stringBuilder = new StringBuilder();
		
stringBuilder.append("문자열을");
System.out.println(stringBuilder);
System.out.println(System.identityHashCode(stringBuilder));
//주소 출력
		
stringBuilder.append("붙여보자1").append("붙여보자2");
System.out.println(stringBuilder);
System.out.println(System.identityHashCode(stringBuilder));
//주소 출력
input output
  문자열을
1239731077
문자열을붙여보자1붙여보자2
1239731077

위와같이 문자열이 변경되어도 주소가 같음을 확인할 수 있다.

 

 

 

StringBuffer

StringBuffer 역시 StringBuilder 와 마찬가지로 Mutable한 성질을 갖고 있어 생성 후에도 변경이 가능하다.

다만 둘 사이에는 이러한 차이점이 있다.

  • StringBuilder
    • Single Thread 환경에 적합
    • 동기화를 지원하기 때문에 Thread Safe 보장
    • 하지만 동기화를 거치기 때문에 속도는 떨어짐
  • StringBuffer
    • Multi Thread 환경에 적합
    • 동기화를 지원하지 않지만 더 빠른 속도

JDK 1.5 이후로는 Single Statement 로 String의 + 연산 시 StringBuilder로 변환하는 기능이 생겨 최적화 되었지만, 반복문 등에서는 최적화가 지원되지 않기 때문에 StringBuilder를 직접 사용하는 것이 좋다.

 


레퍼런스

Why Use StringBuffer and StringBuilder in Java

'[Java] > 문법, 자료구조, 알고리즘' 카테고리의 다른 글

HashMap  (0) 2023.03.10
소수 (에라토스테네스의 체)  (0) 2023.03.10
String 클래스 메소드 정리  (0) 2023.03.06
조합(Combination)  (0) 2023.02.24
Java 배열 정렬 방법  (0) 2023.01.31