Lina's Toolbox

[Java] StringBuilder를 사용하는 이유 본문

프로그래밍 언어/Java

[Java] StringBuilder를 사용하는 이유

Woolina 2024. 10. 1. 01:07
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는 기존 객체를 계속 사용하므로 성능이 좋아집니다.