2020-12-14
StringBuilder는 문자열을 버퍼에 담에 그 안에서 추가 수정 삭제 작업을 할 수 있도록 도와주는 클래스이다. 하지만 이와 같은 클래스가 왜 필요한지 궁금할 수가 있다. 아래의 예제 코드를 가지고 왜 필요한지 이야기해보자.
String str = "ABC";
str += "D";
몇몇의 사람들은 위의 코드와 같이 따로 StringBuilder를 사용하지 않고 기존 String 변수에 새로운 값을 넣어주면 쉽게 해당 문자열을 변경할 수 있는 거 아닌가 라고 생각할 수 있다. 물론 해당 방법으로도 문자열을 수정할 수 있지만, 여기에는 큰 단점이 있다. 바로 String은 연산과 같은 과정을 통해 새로운 문자열로 변경될 경우 새로운 스트링 객체로 리턴이 된다는 것이다. 이러한 문제는 구현하고자 하는 프로그램의 크기가 작으면 큰 문제가 되지 않으나, 문자열을 지속적으로 변경해주어야 하는 경우와 프로그램 자체가 방대할 경우 불필요한 스트링 객체수의 지속적인 발생으로 해당 프로그램의 성능이 크게 저하 시킬 수 있다는 점이다.
때문에 StringBuilder 클래스를 통해 새로운 객체를 만들지 않고도 자유롭게 문자 변경 작업을 하는 게 프로그램 성능 차원에서 훨씬 효율적이라고 할 수 있다.
그러면 이제 구체적인 사용법을 알아보도록 하자. 선언 방법은 간단하며, 아래와 같다.
package String.StringBuilder;
public class main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
//문자열이 커질수록 자동으로 크기를 추가하기 때문에 초기에 주는 생성자에
//크기값을 줄 필요가 크게 없다.
}
}
주석에 쓰여있듯이 StringBuilder의 크기는 문자열이 추가될수록 자동적으로 커지니 크게 신경 쓰지 않아도 된다.
문자열을 추가하는 방법은 여러 가지인데, 가장 많이 사용하는 문자 추가 메서드는 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);
}
}
처음에는 아무것도 없으니 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);
}
}
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);
}
}
어렵지 않은 메서드이기 때문에 쉽게 이해될 것이라고 본다. 다만 replace의 경우 시작점의 경우 바로 그지점(6번)부터 끝 지점의 바로 앞부분까지가 구간이다.(8번이니 7번 위치의 구간까지 변경됨)
모든 문자열 수정이 완료되면, 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);
}
}