[JAVA] StringBuilder는 왜 쓰는 걸까? 정말 효율적인 것일까?

euuuunii·2023년 2월 13일
0

java궁금증

목록 보기
1/3
post-thumbnail

알고리즘 스터디를 하다가 스터디원이 sb.append(0+"\n"); 이런 코드를 작성하여서 String + 연산을 하지않기 위해서 StringBuilder를 사용하는것인데 이렇게 작성하면 무의미하지 않나? 라고 생각하여서 String과 StringBuilder에 대해 더 알아보기로 하였다.

String의 메모리 저장

StringBuilder를 왜 써야하는지 알기 위해서는 자바에서 String이 어떻게 메모리에 저장되는지 알아야 한다.
자바에서 String은 immutable객체이다. String 내용을 바꿀 수 없다는 것이다.

일반적으로 String은 heap영역안의 string pool에 선언된다.

String str = "a";
str.concat("b");

String concat()메서드를 사용하면 String 내용이 바뀌는 것이 아닌, "ab"라는 문자열을 String pool에 새로 만들어 참조하게 된다. 연산을 할 때마다 주소값이 바뀌는 것이다.

따라서 속도적인 측면에서 String의 concat은 지양하는것이 좋다.


String 연결 방법

java에서 String을 연결하는 방법은 다음이 있다.

  • "a" + "b"
  • String.concat()
  • StringBuilder.append()

내용 작성을 위해 서치 중 + 연산은 JDK 1.5 버전부터 컴파일 시에 StringBuilder로 자동변환된다는 사실을 알았다.

String str = "0"+"1"+"2";
->
String str = "012";

알아보니 이렇게 한 줄로 적힌 경우에만 컴파일러가 자동으로 변환한다고 한다. 여러줄로 쓰면 new StringBuilder를 매번 선언하여서 똑같이 성능저하가 있다고 한다.


StringBuilder

StringBuilder는 mutable한 class로 기존의 데이터에 내용을 추가하는 방식을 사용한다.

번외

//1.
StringBuilder sb = new StringBuilder();
sb.append(0+"\n");
sb.append(1+"\n");
//2.
StringBuilder sb = new StringBuilder();
sb.append(new StringBuilder()).append(0).append("\n").toString());
sb.append(new StringBuilder()).append(1).append("\n").toString());

문제를 풀다보면 1과 같이 append 안의 내용을 + 연산으로 작성하는 경우를 많이 보았는데, 이렇게 사용하게되면 2와 같이 컴파일이 될 것이라 생각해서 (확실하지는 않고 그저 생각입니다. 혹시 틀린 부분을 알려주신다면 감사하게 받아들이고 더 공부하도록 하겠습니다.)

아래와 같이 그냥 모두 append로 사용하는것이 효율 적이라고 생각한다.

StringBuilder sb = new StringBuilder();
sb.append(0).append("\n");
sb.append(0).append("\n");

StringBuffer

StringBuilder와 유사한 이름으로 StringBuffer class가 있다.
이 클래스는 공통 메소드 동기화로 멀티 쓰레드 환경에서만 사용한다.


참고 내용 및 출처
code java
StringBuilder 디컴파일 관련 설명 블로그

profile
안녕하세요😊 개발 도중 생기는 궁금증을 탐구하는 블로그 입니다

0개의 댓글