본문 바로가기
Language/Java

자바 StringBuffer, StringBuilder 개념부터 사용법까지

by wakestand 2020. 4. 19.
반응형

자바에서 String 외에도

StringBuffer와 StringBuilder가 있는데

보면 뭔 용도로 쓰는지 감이 안올 것이다

 

append를 이용해서 값을 붙일 수 있다고는 하는데

그건 String도 .concat(값) 혹은 + "값" 을 사용해

붙일 수 있어서 뭐지 싶을거다

 

StringBuffer와 StringBuilder는

concat 혹은 +를 하지 않으려고 사용하는 것인데

 

String은 불변(immutable)하기 때문에

값을 변경할 수 없다

 

.concat 혹은 +를 이용한 값 변경은

기존 String에 들어있던 값을 버리고

새로 값을 할당하는 것이다

 

따라서 concat이나 +를 많이 사용할 경우

속도가 현저히 느려지는데

 

String에 concat 혹은 +를 1000번 이상 하게되면

속도가 너무 느려져 비효율적이므로 그 때에는

StringBuffer나 StringBuilder를 사용하라는 것이다

StringBuffer와 StringBuilder는 변하기 때문에(mutable)

.append(), .delete() 등을 통해서 값을 변경할 수 있다

 

위 스크린샷을 보면 .concat을 이용한 방식이

횟수가 많아질 경우

독보적으로 느린 것을 확인할 수 있다

 

다음으로는 StringBuffer와 StringBuilder인데

둘 중에 뭘 쓰냐면

 

StringBuffer는 공통 메소드가 동기화되므로

멀티 쓰레드 환경에서는

StringBuffer를 사용하는 것이 안전하고

(값이 예상치 못하게 변경되는 것 방지)

 

자바 쓰레드 예제 및 사용 이유 알아보기

java에서 스레드(Thread)란 무엇인가? 스레드를 사용하기 전 기존 자바에서는 car.open(); car.entrance(); 이렇게 코드 두 줄이 있다고 하면 car.open()을 수행한 후에 car.entrance();를 수행하게 된다 즉 위 코..

wakestand.tistory.com

그 외에는 StringBuilder가 성능이 뛰어나기에

StringBuilder를 사용해주면 된다

 

StringBuffer, StringBuilder의 주요 메소드는 다음과 같다

 

sb.append(값)

- StringBuffer, StringBuilder 뒤에 값을 붙인다

 

sb.insert(인덱스, 값)

- 특정 인덱스부터 값을 삽입한다

 

sb.delete(인덱스, 인덱스)

- 특정 인덱스부터 인덱스까지 값을 삭제한다

 

sb.indexOf(값)

- 값이 어느 인덱스에 들어있는지 확인한다

 

sb.substring(인덱스, 인덱스)

- 인덱스부터 인덱스까지 값을 잘라온다

 

sb.length()

- 길이 확인

 

sb.replace(인덱스, 인덱스, 값)

- 인덱스부터 인덱스까지 값으로 변경

 

sb.reverse()

- 글자 순서를 뒤집는다

 

이제 간단히 정리해 보자면

 

String에서 concat, + 사용 시 속도가 왜 느려지나?

String은 불변(immutable)하기 때문에

concat, + 사용 시 기존 값을 버리고 새로 할당해서

1000번 이상 수행할 경우 급격히 느려짐

 

StringBuffer, StringBuilder를 사용하는 이유는?

String에서 concat, +를 천번 이상 사용할 경우

속도가 급격히 느려지기 때문에 해당 상황에는

변하는(mutable) StringBuffer와 StringBuilder를 사용한다

 

StringBuffer, StringBuilder의 차이는?

StringBuffer는 공통 메소드 동기화로 인해

멀티 스레드 환경에서만 사용

그 외에는 StringBuilder를 사용하면 됨

 

예제에 사용한 코드는 아래와 같다

 

	public static void main(String[] args) {
		
		String s = new String("s");
		s = s.concat(" 붙이기");
		s = s + " 붙이기";
		// String은 불변(immutable)하기 때문에
		// 기존 것을 버리고 새로 할당하는 식으로 사용 
		
		StringBuffer sbuffer = new StringBuffer("SB");
		sbuffer.append(" 붙이기");
		
		StringBuilder sbuilder = new StringBuilder("SB");
		sbuilder.append(" 붙이기");
		// StringBuffer, StringBuilder는 변하기(mutable)하기 때문에
		// 기존 것에서 append를 사용해서 값 변경 가능
		
		sbuilder.append("붙이기"); // 삽입
		sbuilder.insert(0, "ASDASD"); // 중간에 삽입
		sbuilder.delete(3, 7); // 자르기
		sbuilder.indexOf("ASDB"); // index 확인
		sbuilder.substring(0, 4); // 자르기
		sbuilder.length(); // 길이 확인
		sbuilder.replace(0, 4, "CCCC"); // 글자 바꾸기(0부터 4번째 글자를 날리고 CCCC로 변경)
		
		System.out.println(sbuilder);
		System.out.println(sbuilder.indexOf("붙이기붙이기"));
		System.out.println(sbuilder.substring(0, 4)); // substring 예제
		System.out.println(sbuilder.reverse()); // 순서 뒤집기
		System.out.println(sbuilder.length()); // length 예제

	}
반응형

댓글