안녕하세요.

오늘은 자주 사용되는 String과 StringBuilder, StringBuffer에 대해서 포스팅해보겠습니다.

 

 


 

# 공간적 차이

- String

String은 값 변경 시, Heap영역에 공간이 새로 생성됩니다. 추후에 GC에 의해 제거됩니다.

 

- StringBuilder, StringBuffer

이 둘은 값 변경 시, Stack공간에 값을 저장해 값만 바꿔씁니다.

 

-> 따라서 값이 자주 변경된다면 String보다는 StringBuilder, StringBuffer 사용을 권장합니다.

 

 

 

# 시간적 차이

 

글보단 시간측정을 해보겠습니다.

	public static void main(String[] args) throws Exception{
		
        // 1. StringBuilder 시간 측정
		long time1 = System.currentTimeMillis();
		StringBuilder builder = new StringBuilder();
		for(int i=0;i<100000000;i++) {
			builder.append("a");
		}
		long time2= System.currentTimeMillis();
		System.out.println("StringBuilder ::: " + (time2 - time1));
		
        // 2. StringBuffer 시간 측정
		long time3 = System.currentTimeMillis();
		StringBuffer buffer = new StringBuffer();
		for(int i=0;i<100000000;i++) {
			buffer.append("a");
		}
		long time4= System.currentTimeMillis();
		System.out.println("StringBuffer ::: " + (time4 - time3));
		
        // 3. String 시간 측정
		long time5 = System.currentTimeMillis();
		String str = "";
		for(int i=0;i<500000;i++) {
			str += "a";
		}
		long time6= System.currentTimeMillis();
		System.out.println("String ::: " + (time6 - time5));
		
	}

StringBuilder와 StringBuffer는 각각 1억건의 연산을 했을 때,

String은 Heap사이즈가 초과해서? 오래걸려서? 그런지 1억건으로 하니 측정이 안되서 50만건 연산했을 때

각각의 속도를 측정해보았습니다.

 

 

- 결과

결과가 보이시나요? 비교적 적은 50만건만 연산한 String의 속도가 현저히 느린 것을 확인할 수 있었습니다.

1억건씩 연산한 StringBuilder와 StringBuffer는 StringBuilder가 현저히 빠른 것을 볼 수 있었습니다.

 

"? 그러면 StringBuffer는 언제쓰는거지?" 라는 의구심이 들어 찾아보았습니다.

 

StringBuffer는 StringBuilder와 다르게 동기화를 지원하여, 멀티 쓰레드 환경에서 안정성을 가지고 있습니다.

 

 

- 결론

문자열 단순 조회 용도 = String

연산이 (추가,삭제 등 ) 자주 일어날 때에, 단일 쓰레드 환경 -> StringBuilder

연산이 (추가,삭제 등 ) 자주 일어날 때에, 멀티 쓰레드 환경 -> StringBuffer

 

 


자주 사용되는 문자열을 저장하는 객체들에 대해서 알아보았습니다.

보통은 단일 쓰레드환경에서 자주 사용하니 StringBuilder를 잘 기억해놓아야겠네요!

 

감사합니다.

'Java' 카테고리의 다른 글

[Java] 추상 클래스 vs 인터페이스  (0) 2021.09.03
[Java] 접근 제한자란?  (0) 2021.09.02
[Java] Garbage Collector  (0) 2021.08.25
[Java] JVM이란? 정의 및 동작 방식  (0) 2021.08.22
[Java] 특징 1. 객체지향 프로그래밍  (0) 2021.08.21

+ Recent posts