[Java] 자바 StringBuilder 문자열 클래스 알아보자! (append,insert...)

2020-12-14


etc-image-0
etc-image-1

StringBuilder는 문자열을 버퍼에 담에 그 안에서 추가 수정 삭제 작업을 할 수 있도록 도와주는 클래스이다. 하지만 이와 같은 클래스가 왜 필요한지 궁금할 수가 있다. 아래의 예제 코드를 가지고 왜 필요한지 이야기해보자.

		String str = "ABC";
		str += "D";

 

몇몇의 사람들은 위의 코드와 같이 따로 StringBuilder를 사용하지 않고 기존 String 변수에 새로운 값을 넣어주면 쉽게 해당 문자열을 변경할 수 있는 거 아닌가 라고 생각할 수 있다.  물론 해당 방법으로도 문자열을 수정할 수 있지만, 여기에는 큰 단점이 있다. 바로 String은 연산과 같은 과정을 통해 새로운 문자열로 변경될 경우 새로운 스트링 객체로 리턴이 된다는 것이다. 이러한 문제는 구현하고자 하는 프로그램의 크기가 작으면 큰 문제가 되지 않으나, 문자열을 지속적으로 변경해주어야 하는 경우와 프로그램 자체가 방대할 경우 불필요한 스트링 객체수의 지속적인 발생으로 해당 프로그램의 성능이 크게 저하 시킬 수 있다는 점이다.

 

때문에 StringBuilder 클래스를 통해 새로운 객체를 만들지 않고도 자유롭게 문자 변경 작업을 하는 게 프로그램 성능 차원에서  훨씬 효율적이라고 할 수 있다.


etc-image-2

그러면 이제 구체적인 사용법을 알아보도록 하자. 선언 방법은 간단하며, 아래와 같다.

package String.StringBuilder;

public class main {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		//문자열이 커질수록 자동으로 크기를 추가하기 때문에 초기에 주는 생성자에
		//크기값을 줄 필요가 크게 없다.
	
	}

}

 

주석에 쓰여있듯이 StringBuilder의 크기는 문자열이 추가될수록 자동적으로 커지니 크게 신경 쓰지 않아도 된다.


etc-image-3

 

문자열을 추가하는 방법은 여러 가지인데, 가장 많이 사용하는 문자 추가 메서드는 append이다. StringBuilder 변수 제일 뒤에 원하는 문자열을 자유롭게 추가할 수 있도록 해준다. 아래는 그 예이다.

package String.StringBuilder;

public class main {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		//문자열이 커질수록 자동으로 크기를 추가하기 때문에 초기에 주는 생성자에
		//크기값을 줄 필요가 크게 없다.
		
		sb.append("I ");
		sb.append("am ");
		sb.append("aaa");
		//문자열 끝에 추가
		
		System.out.println(sb);
	
	}

}

etc-image-4

처음에는 아무것도 없으니 0번째 순서에 I 가 추가되고 이후 그 뒤에 am 그 뒤에 aaa가 추가되어 정상적으로 출력되었다.


다음 특정 위치에 문자열을 추가하는 메서드인 insert이다. 사용법은 아래와 같다.

package String.StringBuilder;

public class main {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		//문자열이 커질수록 자동으로 크기를 추가하기 때문에 초기에 주는 생성자에
		//크기값을 줄 필요가 크게 없다.
		
		sb.append("I ");
		sb.append("am ");
		sb.append("aaa");
		//문자열 끝에 추가
		
		sb.insert(5, "+");
		//특정 위치에 추가
		System.out.println(sb);
	}

}

etc-image-5
etc-image-6

5번째 위치에 "+"를 추가해 보았다. 그러면 해당 문자열이 추가됨에 따라 위와 같이 aaa의 첫 번째 위치는 6번으로 밀리게 된다. (앞서 말한 듯이 StringBuilder의 크기는 문자열이 추가될수록 자동으로 증가한다.)


다음은 추가하는 것이 아닌 문자열을 수정하는 메서드인 setCharAt / replace를 알아보자. 둘의 차이는 우선 setCharAt는 문자열 하나를 수정할 때 사용하고 replace는 특정 구간을 수정할때 사용한다. 아래는 그 예제이다.

package String.StringBuilder;

public class main {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		//문자열이 커질수록 자동으로 크기를 추가하기 때문에 초기에 주는 생성자에
		//크기값을 줄 필요가 크게 없다.
		
		sb.append("I ");
		sb.append("am ");
		sb.append("aaa");
		//문자열 끝에 추가
		
		sb.setCharAt(5, 'b');
		//char 이기 때문에 작은 따옴표 사용
		System.out.println(sb);
		sb.replace(6, 8, "cc");
		//시작점 끝점 설정후 해당 구간 변경원하는 문자열 추가.
		System.out.println(sb);
		
	}

}

etc-image-7

어렵지 않은 메서드이기 때문에 쉽게 이해될 것이라고 본다. 다만 replace의 경우 시작점의 경우 바로 그지점(6번)부터 끝 지점의 바로 앞부분까지가 구간이다.(8번이니 7번 위치의 구간까지 변경됨)


etc-image-8

모든 문자열 수정이 완료되면, StringBuilder객체를 아래와 같이 String 객체에 넣어주면 된다.

package String.StringBuilder;

public class main {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		//문자열이 커질수록 자동으로 크기를 추가하기 때문에 초기에 주는 생성자에
		//크기값을 줄 필요가 크게 없다.
		
		sb.append("I ");
		sb.append("am ");
		sb.append("aaa");
		//문자열 끝에 추가
		
		String result = sb.toString();
		//모든 문자열이 수정이 완료되면, 완전한 스트링 타입에 객체에 저장
		System.out.println(result);
		
	}

}

etc-image-9
etc-image-10