알고리즘 스터디를 하다가 스터디원이 sb.append(0+"\n");
이런 코드를 작성하여서 String +
연산을 하지않기 위해서 StringBuilder를 사용하는것인데 이렇게 작성하면 무의미하지 않나? 라고 생각하여서 String과 StringBuilder에 대해 더 알아보기로 하였다.
StringBuilder를 왜 써야하는지 알기 위해서는 자바에서 String이 어떻게 메모리에 저장되는지 알아야 한다.
자바에서 String은 immutable객체이다. String 내용을 바꿀 수 없다는 것이다.
일반적으로 String은 heap영역안의 string pool에 선언된다.
String str = "a";
str.concat("b");
String concat()메서드를 사용하면 String 내용이 바뀌는 것이 아닌, "ab"라는 문자열을 String pool에 새로 만들어 참조하게 된다. 연산을 할 때마다 주소값이 바뀌는 것이다.
따라서 속도적인 측면에서 String의 concat은 지양하는것이 좋다.
java에서 String을 연결하는 방법은 다음이 있다.
내용 작성을 위해 서치 중 +
연산은 JDK 1.5 버전부터 컴파일 시에 StringBuilder로 자동변환된다는 사실을 알았다.
String str = "0"+"1"+"2";
->
String str = "012";
알아보니 이렇게 한 줄로 적힌 경우에만 컴파일러가 자동으로 변환한다고 한다. 여러줄로 쓰면 new 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");
StringBuilder와 유사한 이름으로 StringBuffer class가 있다.
이 클래스는 공통 메소드 동기화로 멀티 쓰레드 환경에서만 사용한다.
참고 내용 및 출처
code java
StringBuilder 디컴파일 관련 설명 블로그