String, StringBuffer, StringBuilder 차이를 알아보려고 한다.
문자열을 다루기 위해서 함수는 기본적으로 String와 StringBuilder 컬렉션 메서드들은 암기해두는 것을 추천!
목차
1. 정의 및 함수 비교
2. StringBuffer와 StringBuilder 속도 비교
3. StringJoiner 존재 이유
1. 클래스 정의 및 함수 비교
String 클래스
: 불변하다는 특징 때문에, 문자열 변경 시 이전과 다른 메모리 주소에 새로운 문자열이 써진다.
주요 함수
함수 | 반환값 | 설명 |
charAt(int idx) | char | 인덱스에 존재하는 문자 반환 |
indexOf(char ch) indexOf(String str) |
int | 앞에서부터 찾고자 하는 값의 인덱스를 반환 못찾을 경우 -1 반환 |
lastIndexOf(char char) lastIndexOf(String str) |
int | 뒤에서부터 찾고자 하는 값의 인덱스를 반환 못찾을 경우 -1 반환 |
concat(String str) | String | 문자열 연결 |
contains(String str) | boolean | 포함하는 경우 true 포함하지 않으면 false |
equals(String str) | boolean | 동일한 경우 true, 동일하지 않을 경우 false |
startsWith(String str) | boolean | 접두사로 시작하면 true, 시작하지 않으면 false |
endsWith(String str) | boolean | 접미사로 시작하면 true, 시작하지 않으면 false |
length() | int | 문자열 길이 반환 |
replace(char old, char new) replace(String old, String new) |
String | 교체 |
replaceAll(String old, String new) | String | 모두 교체 |
split(String rex) | String[] | 일치하는 항목을 중심으로 분할 |
substring(int begin, int end) | String | 새 문자열 반환 |
toLowerCase() | String | 대문자를 소문자로 변환 |
toUpperCase() | String | 소문자를 대문자로 반환 |
toString() | String | 문자열 반환 |
trim() | String | 선행, 후행 공백 제거 |
valueOf() | String | 문자열 반환 |
StringBuffer 클래스
: 가변적인 문자열을 처리할 때 사용한다. 동기화 제공하며, 다중 스레드 환경에서 사용한다.
클래스 내부에 char[] 형태로 저장시켜두어 문자열을 처리한다.
주요 함수
함수 | 반환값 | 설명 |
append(String str) append(StringBuffer str) |
StringBuffer | 끝에 문자열 추가 |
insert(int idx, String str) | StringBuffer | 인덱스 값에 문자열 추가 |
delete(int start, int end) | StringBuffer | 부분 문자열 제거 |
deleteCharAt(int index) | StringBuffer | 인덱스의 문자 제거 |
charAt(int idx) | char | 인덱스의 문자 반환 |
length() | int | 문자 수 반환 |
replace(int start, int end, String str) | StringBuffer | 문자열 교체 |
reverse() | StringBuffer | 문자열 역순 |
substring(int start, int end) | String | 문자열 자르기 |
StringBuilder 클래스
: 가변적인 문자열을 처리할 때 사용한다. 단일 스레드 환경에서 사용하며, StringBuffer와 StringBuilder 중에서 StringBuilder 속도가 더 빠르기 때문에 단일 스레드 환경일 때는 StringBuilder를 사용하자.
클래스 내부에 CharSequence 인터페이스를 이용해 문자열을 처리한다.
주요 함수
함수 | 반환값 | 설명 |
append(String str) append(StringBuffer str) |
StringBuilder | 끝에 문자열 추가 |
insert(int idx, String str) | StringBuilder | 인덱스 값에 문자열 추가 |
charAt(int idx) | char | 인덱스의 문자 반환 |
indexOf(char ch) | int | 앞에서부터 찾고자 하는 값의 인덱스를 반환 못찾을 경우 -1 반환 |
lastIndexOf(char ch) | int | 뒤에서부터 찾고자 하는 값의 인덱스를 반환 못찾을 경우 -1 반환 |
delete(int start, int end) | StringBuilder | 부분 문자열 제거 |
deleteCharAt(int index) | StringBuilder | 인덱스의 문자 제거 |
replace(int start, int end, String str) | StringBuilder | 문자열 교체 |
reverse() | StringBuilder | 문자열 역순 |
length() | int | 문자 수 반환 |
substring(int start, int end) | String | 문자열 자르기 |
2. 속도 비교
import java.util.GregorianCalendar;
public class main
{
public static void main(String[] args)
{
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i<1000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
출처 : https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder
StringBuffer | StringBuilder | |
10000 | 9ms / 0 | 6ms / 0 |
100000 | 28ms / 1490976 | 23ms / 1490976 |
10000000
|
1530ms / 1200224 | 775ms / 1183824 |
StringBuffer가 속도 측면에서 빠른 것을 알 수 있었다.
3. StringJoiner 존재 이유
StringJoiner 존재 이유는 StringBuilder append를 몇 번 사용해보면 알 수 있다.
앞 혹은 끝에 존재하는 값 처리를 위해서이다.
StringBuilder builder = new StringBuilder();
for(int i=0; i<10; i++){
builder.append(i);
builder.append(" ,");
}
System.out.println(builder);
# 출력 : 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,
위와 같은 예제에서 마지막 ,를 따로 처리해줘야 하는 상황에서 StringJoiner가 쓰이면 편리하다.
StringJoiner arr = new StringJoiner(", ");
for(int i=0; i<10; i++) {
arr.add(Integer.toString(i));
}
System.out.println(arr.toString());
# 출력 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
'Computer Science > JAVA' 카테고리의 다른 글
[JAVA] 제너릭과 List (0) | 2020.11.20 |
---|---|
[JAVA] 기본 클래스, Object (0) | 2020.11.20 |
[JAVA] 컬렉션이란? (0) | 2020.11.03 |
[JAVA] 제너릭이란? (0) | 2020.11.03 |
[JAVA] 추상화란? (0) | 2020.10.23 |
댓글