[Java] StringBuilder를 사용하는 이유
public String solution(String number, int k) {
Stack<Character> stack = new Stack<>();
for (char digit : number.toCharArray()) {
while (!stack.isEmpty() && k > 0 && stack.peek() < digit) {
stack.pop();
k--;
}
stack.push(digit);
}
while (k > 0) {
stack.pop();
k--;
}
StringBuilder result = new StringBuilder();
for (Character ch : stack) {
result.append(ch);
}
return result.toString();
}
왜 result를 String형으로 선언하지 않고, StringBuilder라는 걸 사용했을까요?
StringBuilder를 사용하는 이유는 문자열(String)을 효율적으로 조작하기 위해서입니다.
자바에서 String과 StringBuilder는 메모리 및 성능 측면에서 큰 차이가 있습니다.
1. String의 불변성(Immutable)
자바에서 String은 불변 객체(immutable object)입니다.
즉, 한 번 생성된 String 객체는 그 값을 변경할 수 없습니다.
만약 String에 무언가를 추가하거나 변경하려고 하면, 새로운 문자열 객체가 생성됩니다.
예를 들어,
String result = "";
result += "a"; // 새로운 String 객체 생성
result += "b"; // 또 다른 새로운 String 객체 생성
위 코드는 각 단계에서 새로운 String 객체를 생성합니다.
기존의 result에 문자를 추가할 때마다 새로운 객체가 만들어지고,
이전 문자열에 새로운 문자를 덧붙인 값을 가진 새로운 객체로 할당되죠. 이 과정은 메모리와 성능 측면에서 비효율적입니다.
2. StringBuilder의 가변성(Mutable)
반면에, StringBuilder는 가변 객체입니다.
즉, 한 번 생성된 StringBuilder 객체는 그 값을 변경할 수 있습니다.
새로운 문자열을 추가하더라도 새로운 객체를 생성하지 않고, 기존 객체 내에서 값을 변경합니다.
예를 들어,
StringBuilder result = new StringBuilder();
result.append("a"); // StringBuilder 내부 버퍼에 'a' 추가
result.append("b"); // StringBuilder 내부 버퍼에 'b' 추가
위 코드는 같은 StringBuilder 객체를 사용하여 append 메서드로 값을 계속 추가할 수 있습니다.
즉, 새로운 객체를 생성하지 않으므로 메모리 효율성이 높아집니다.
일반적으로 문자열을 반복해서 더하는 작업을 할 때, StringBuilder는 String보다 훨씬 더 빠릅니다.
String을 반복해서 더하면 매번 새로운 객체를 생성하기 때문에 성능이 저하되지만,
StringBuilder는 기존 객체를 계속 사용하므로 성능이 좋아집니다.