본문 바로가기
JAVA

[JAVA] StringBuffer 클래스 (StringBuilder)

by Amy IT 2022. 5. 28.

지금까지 문자열을 생성할 때 String 클래스를 이용했습니다. 그런데 String 클래스는 한 번 생성된 문자열은 변경되지 않는다는 불변(immutable) 특징을 가집니다. 다양한 메소드로 문자열을 가공해도 기존 문자열은 변경되지 않고 새롭게 변경된 문자열이 생성되기 때문에, 문자열 연산시 메모리를 비효율적으로 사용하게 됩니다. 따라서 문자열이 자주 변경되거나 문자열 연산작업이 많은 경우에는 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋습니다. 이 클래스들은 문자열이 변경되어도 새로운 문자열이 생성되지 않고 저장된 문자열이 동적으로 변경되는 가변(mutable) 특징을 가집니다.

StringBuffer와 StringBuilder의 사용법은 거의 유사합니다. StringBuffer는 무거운 대신 thread-safe한 반면, StringBuilder는 성능이 좋은 대신 thread-unsafe하다는 점에서 차이가 있습니다. 여기서는 StringBuffer 클래스를 기준으로 정리해 보도록 하겠습니다.

 

StringBuffer 클래스의 대표적인 메소드는 다음과 같습니다. 

 

메소드 설명
length 문자열의 길이를 반환
capacity 초기 버퍼크기를 지정
append 버퍼에 문자열을 추가
insert 버퍼에 문자열을 삽입
delete 버퍼의 문자열을 삭제
toString StringBuffer 객체를 String 객체로 변경

 

public class StringBuffer {
	public static void main(String[] args) {
		StringBuffer s = new StringBuffer("Hello");
		s.append(" world");
		System.out.println(s);
		s.insert(5, "!!! "); //5번 자리에 insert
		System.out.println(s);
		s.delete(0, 5); //0번부터 4번까지 delete
		System.out.println(s);
		String data = s.toString(); //String으로 변경  
	}
}

 

 

StringBuffer 클래스는 문자열이 변경되면 저장되어 있는 문자열을 수정하기 때문에, 새롭게 변경된 문자열을 생성하는 String 클래스보다 처리 속도가 훨씬 빠릅니다. StringBuffer의 append() 메소드와 String의 concat() 메소드, 그리고 += 연산자의 속도를 비교해 보면, append() > concat() > += 연산자 순으로 append()의 처리 속도가 훨씬 빠르다는 것을 알 수 있습니다. 다음은 for문이 만 번 돌면서 aaa... 문자열을 이어 붙이는 작업을 하는 프로그램입니다. currentTimeMillis() 메소드는 현재 시각을 밀리세컨초로 반환하는 함수입니다. 코드 실행 전 시각과 실행 후 시각의 차이를 통해 프로그램 소요 시간을 구할 수 있습니다. 

public class Test {
	public static void main(String[] args) {
		Test t = new Test();
		t.aaa();
		t.bbb();
		t.ccc();
	}
	public void ccc() {
		long start = System.currentTimeMillis();
		String x = "";
		for (int i = 0; i < 10000; i++) {
			x = x.concat("aaaaaaaaaaa");
		}
		System.out.println("x.length():"+x.length());
		System.out.println("concat():"+(System.currentTimeMillis()-start));
	}
	public void bbb() {
		long start = System.currentTimeMillis();
		StringBuffer x = new StringBuffer();
		for (int i = 0; i < 10000; i++) {
			x.append("aaaaaaaaaaa");
		}
		System.out.println("x.length():"+x.length());
		System.out.println("append():"+(System.currentTimeMillis()-start));
	}
	public void aaa() {
		long start = System.currentTimeMillis();
		String x = "";
		for (int i = 0; i < 10000; i++) {
			x += "aaaaaaaaaaa";
		}
		System.out.println("x.length():"+x.length());
		System.out.println("+= 연산자:"+(System.currentTimeMillis()-start));
	}
}

append() 메소드가 훨씬 빠르게 작업을 수행한 것을 확인할 수 있습니다. 

 

 

댓글