본문 바로가기
Computer Science/JAVA

[JAVA] String, StringBuffer, StringBuilder, StringJoiner 차이

by 그적 2022. 10. 21.

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

댓글