문자열 이어붙이기
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를 직접 사용하는 것이 좋다.
레퍼런스
'[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 |