본문 바로가기
☁️ 구름 X kakao DeepDive/☁️ Java

[Java] StringBuilder란 무엇인가? (그리고 String의 불변성)

by 뽀짜꼬 2025. 1. 18.
728x90
반응형

자바


StringBuilder

문자열 조작에 사용되는 클래스이다.


왜 사용하는가?

효율적이기 때문에 사용한다.

이게 왜 효율적이냐를 설명하려면

문자열의 불변 특성에 대해서 먼저 이해하고 가야한다.

 

  • 문자열 String은 불변(Immutable) 객체이다. 문자열을 수정할 때 마다 새로운 객체가 생성되고, 따라서 메모리를 더 사용한다.
  • StringBuilder는 가변(Mutable) 객체로, 동일한 객체 내부에서 문자열을 수정하므로 메모리와 처리 속도가 더 효율적입니다
  • 따라서 자주 변경해야하는 문자열은 StringBuilder를 사용해야한다.

 

불변 객체인 String

- string에서 동일한 문자열 리터럴을 여러번 생성하면,

새로운 객체를 생성하지 않고 String Pool에서 동일한 객체를 참조(즉 재사용)한다.

String str1 = "Hello";
String str2 = "Hello";
// str1과 str2는 동일한 객체를 참조한다

내가그린기린그림
내가그린기린그림

 

위의 그림처럼 두 스트링이 동일한 객체를 참조하고 있음을 알수있다.

 

그런데 만약 여기서 str2를 수정한다면 어떻게 될까?

public class Main {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = str1.concat(" World");

        System.out.println("str1: " + str1); // "Hello"
        System.out.println("str2: " + str2); // "Hello World"
    }
}

내가그린기린그림

 

concat은 str1을 수정하지 않고, Hello Wrold라는 새로운 객체를 만들어서 반환한다.

이렇게 문자열을 수정할 때 마다 매번 새로운 객체가 만들어지고,

기존의 문자열은 변하지 않는다.

그러니까 메모리가 많이 소모가 되겠지.

 

또한

public class Main {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        String str3 = new String("Hello");

        System.out.println(str1 == str2); // true (같은 객체 참조)
        System.out.println(str1 == str3); // false (다른 객체 참조)
        System.out.println(str1.equals(str3)); // true (값은 동일)
    }
}

 

이렇게 new를 이용해 새로운 객체 str3를 만드는 경우에도

값은 동일하되, 각 문자열은 다른 객체를 가리킨다.

내가그린기린그림

 

문자열이 이렇게 불변성을 가진 이유는 "안전성" 때문이다.

하지만, 문자열을 자주 수정해줘야 할 경우에는 이렇게 새로운 객체를 만들기 보다는

기존의 객체를 수정하는게 훨씬 메모리를 절약할 수 있겠지


그러면 이제 사용법에 대해 알아보자.

StringBuilder의 주요 메서드

1. append(String str)

  • 문자열을 끝에 추가한다.
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!"); // "Hello, World!"
System.out.println(sb);

2. insert(int offset, String str)

  • 특정 위치에 문자열을 삽입한다.
  • 아래 코드의 경우에는 6번째 인덱스에 삽입
StringBuilder sb = new StringBuilder("Hello World");
sb.insert(6, "Beautiful "); // "Hello Beautiful World"

3. delete(int start, int end)

  • 지정된 범위의 문자열을 삭제한다.
StringBuilder sb = new StringBuilder("Hello, World!");
sb.delete(5, 7); // "Hello World!"

4. replace(int start, int end, String str)

  • 지정된 범위의 문자열을 다른 문자열로 대체한다.
StringBuilder sb = new StringBuilder("Hello, World!");
sb.replace(7, 12, "s2ej1n"); // "Hello, s2ej1n!"

5. reverse()

  • 문자열을 뒤집는다.
StringBuilder sb = new StringBuilder("Hello");
sb.reverse(); // "olleH"

6. toString()

  • StringBuilder 객체를 문자열로 변환한다.
  • 문자열 조작을 끝마친 후에 최종 문자열을 반환하기 위해서는 toString()을 호출해야한다.
StringBuilder sb = new StringBuilder("Hello");
String str = sb.toString(); // "Hello"
728x90
반응형