문자열 연결
String은 소위 불변 객체라고 한다.
2개의 String 객체가 있을 때, 두 객체를 더하는 연산을 하면 새로운 String을 생성한다.
즉 더하는 행위는 메모리 할당과 메모리 해제를 발생시키며 더하는 연산이 많아진다면 성능이 낮아지는 결과로 이어질 수 있다.
StringBuilder/StringBuffer는 String끼리 더할 때 새로운 객체를 생성하는 것이 아니라, 기존의 데이터에 더하는 방식을 사용하므로 속도가 빠르고 상대적으로 부하가 적다. 따라서 긴 문자열을 더하는 상황이 발생할 경우 StringBuilder를 적극적으로 사용하는 것이 좋다.
StringBuilder는 클래스 안에 배열 공간을 미리 만들어놓고 문자열을 추가하는 함수가 호출되면 추가되는 문자열을 해당 배열 공간에 바로 추가한다.
만약 추가하다가 배열 공간이 부족해지면 이때만 공간을 늘려서 기존 문자열을 복사하는 방식이기 때문에, 복사하는 횟수가 현저히 줄어들어 시간이나 공간적으로 매우 효율적이다.
StringBuffer
멀티 스레드 환경에서 사용할 수 있도록 동기화가 되어있다.
기본 생성자로 생성하면 배열의 크기가 16인 초기 버퍼(buffer)를 만든다.
StringBuilder
단일 스레드 환경에서만 가용하도록 설계되어있다.
StringBuilder(int 값); 값만큼 문자를 저장하고 초기 버퍼를 가진다.
버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼가 크게 중요하지 않다.
※ 최근 JDK버전(JDK 1.5 version 이후)에서는 StringBuilder를 사용하지 않는 경우가 많다.
문자열 연산에 String 클래스를 사용하더라도 컴파일 단계에서 StringBuilder로 컴파일되어 작동하도록 되어있다.
때문에 따로 StringBuilder를 사용할 이유가 없어졌다.
예제 1.
<StringBuilder>
StringBuilder sb = new StringBuilder();
System.out.println(sb);
sb.append("추가"); //①
sb.append("JAVA");
System.out.println(sb);
sb.insert(2, "+"); //②
System.out.println(sb);
sb.deleteCharAt(3); //③
System.out.println(sb);
sb.delete(1, 4); //④
System.out.println(sb);
sb.replace(1, 2, "SPRING"); //⑤
System.out.println(sb);
String str = sb.toString(); //⑥
System.out.println(str);
- ① .append( "a" ): 뒤에 "a" 추가
- ② .insert( index, "a" ): 해당 위치에 "a" 추가
- ③ .deleteCharAt( index ): 해당 위치의 문자 제거
- ④ .delete( 시작, 끝 ) 시작부터 끝 직전(끝-1)까지 제거
- ⑤ .replace( 시작, 끝, "a" ); index 시작부터 끝 직전(끝-1) 까지의 문자를 "a"로 교체
- ⑥ .toString: StringBuilder를 String으로 변환
[실행결과]
추가JAVA
추가+JAVA
추가+AVA
추VA
추SPRINGA
추SPRINGA
'JAVA' 카테고리의 다른 글
추상화 (Abstract) (0) | 2021.07.19 |
---|---|
인터페이스 (interface) (0) | 2021.07.19 |
오브젝트 (Object) (0) | 2021.07.19 |
접근제어자 (AccessModifier) (0) | 2021.07.18 |
생성자 (Constructor) (0) | 2021.07.18 |