본문 바로가기
Android/Java

[ Java ] Java에서 문자열 처리의 효율성을 높이는 방법: StringBuilder 활용하기

by quessr 2024. 3. 22.

 

StringBuilder는 Java에서 문자열을 효율적으로 처리하기 위한 클래스다.
문자열 알고리즘 문제를 풀다가 알게된 자바 클래스인데,
일반적으로 문자열을 연결하거나 수정할 때 사용되며, 가변적인 문자열을 다루는데 유용하다.

기존의 String 클래스는 불변 이기 때문에 문자열을 수정할 때마다 새로운 문자열 객체를 생성하게 된다.
이로 인해 문자열 연산이 많은 경우 메모리와 성능에 부담을 줄 수 있다.
이러한 문제를 해결하기 위해 나온 것이 바로 StringBuilder 클래스 이다.

StringBuilder는 가변적이며, 내부적으로 가변 크기의 문자열 버퍼를 가지고 있다고 한다.
따라서 문자열을 추가하거나 수정할 때마다 새로운 객체를 생성하지 않고도 효율적으로 처리 할 수 있게 되는 것이다.
StringBuilder를 사용하게 되면 특히, 문자열 연산의 성능을 향상시킬 수 있는데 주로 반복문이나 문자열 조작이 많은 작업에서 사용되며
문자열을 동적으로 조작해야 하는 상황에서 유용하게 활용된다.

예를 들어,
"KKHSSSSSSSE" 와 같은 문자열을 입력 받아 같은 문자일 경우 뒤에 문자가 반복된 숫자를 붙여주어 "K2HS7E" 와 같은 출력값을 얻어야 하는 문제의 경우

    public String solution(String str) {

        String answer = "";
        Integer cnt = 1;

        for (int i = 0; i < str.length(); i++) {
            if (i == str.length() - 1 || str.charAt(i) != str.charAt(i + 1)) {
                answer += str.charAt(i);
            } else {
                while (i < str.length() - 1 && str.charAt(i) == str.charAt(i + 1)) {
                    cnt += 1;
                    i += 1;
                }
                answer += str.charAt(i) + String.valueOf(cnt);
                cnt = 1;
            }

        }

        return answer;

    }


처음에는 StringBuilder를 사용하지 않고, 반복문을 돌려서 위와 같이 문자열을 더해주었는데

        StringBuilder answer = new StringBuilder();
        int cnt = 1;

        for (int i = 0; i < str.length(); i++) {
            if (i == str.length() - 1 || str.charAt(i) != str.charAt(i + 1)) {
                answer.append(str.charAt(i));
            } else {
                while (i < str.length() - 1 && str.charAt(i) == str.charAt(i + 1)) {
                    cnt += 1;
                    i += 1;
                }
                answer.append(str.charAt(i)).append(cnt);
                cnt = 1;
            }

        }

        return answer.toString();


다음과 같이 StringBuilder를 사용하여 문자열을 더해주게되면 문자열 연산의 성능을 높여 줄 수 있게 되는 것이다.

 


참고 : https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html