쯔이's Dev

String vs StringBuilder 본문

JAVA

String vs StringBuilder

jjhim531 2025. 2. 14. 21:08
반응형

1️⃣ String  vs  StringBuilder 기본 개념

  String StringBuilder
가변성 (Mutability) 불변(Immutable) 가변(Mutable)
메모리 사용 새로운 객체 생성 (낭비 多) 같은 객체에서 변경 (효율적)
속도 느림 (객체 재생성) 빠름 (내부 배열 사용)
사용 목적 문자열 변경이 거의 없을 때 문자열을 자주 수정할 때

2️⃣ String (불변 객체, Immutable)

*  특징

  • String 객체는 한 번 생성되면 변경할 수 없음.
  • 문자열을 수정하면 새로운 객체를 생성하고 기존 객체는 GC(Garbage Collector)가 제거함.
  • 문자열 변경이 많을 경우 메모리 낭비가 발생할 수 있음
public class StringExample {
    public static void main(String[] args) {
        String str = "Hello";
        str += " World";  // 새로운 객체가 생성됨
        System.out.println(str);
    }
}

✔️ 실행 과정

  1. "Hello" 객체가 생성됨.
  2. " World"를 추가하려면 새로운 "Hello World" 객체를 생성.
  3. 기존 "Hello"는 더 이상 사용되지 않지만 메모리에 남아 있음 (GC가 제거).

📌 출력

Hello World

✔️ 문제점: "Hello" → "Hello World"로 변경하는데 새로운 객체가 생성됨 → 메모리 낭비 발생 🚨

 

3️⃣ StringBuilder (가변 객체, Mutable)

📌 특징

  • String과 다르게 한 번 생성된 객체를 수정 가능.
  • 내부적으로 char[] 배열을 사용해 문자열을 저장.
  • 문자열을 변경해도 새로운 객체를 생성하지 않고 기존 객체를 수정 → 메모리 효율적.
public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World");  // 기존 객체에서 직접 수정 (객체 생성 X)
        System.out.println(sb);
    }
}

📌 출력

Hello World

4️⃣ 메서드 체이닝 (Method Chaining)

📌 메서드 체이닝이란?

  • 여러 개의 메서드를 연속해서 호출하는 방식.
  • 각 메서드가 자기 자신(this)을 반환하면 연속적으로 호출 가능.

📌 예제 (일반 방식 vs 체이닝)

1️⃣ 일반 방식

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.append("!");   
System.out.println(sb);

출력: Hello World!

2️⃣ 메서드 체이닝 방식

StringBuilder sb = new StringBuilder("Hello")
                         .append(" World")
                         .append("!");
System.out.println(sb);

출력: Hello World!

✔️ 장점:

  • 한 줄로 작성 가능 → 코드 가독성 향상
  • sb.append()가 StringBuilder를 반환하기 때문에 연속 호출 가능

5️⃣ String과 StringBuilder 속도 비교

public class SpeedTest {
    public static void main(String[] args) {
        long startTime, endTime;
        
        // String (느림)
        startTime = System.nanoTime();
        String str = "";
        for (int i = 0; i < 10000; i++) {
            str += "a";  // 새로운 객체 계속 생성 (비효율적)
        }
        endTime = System.nanoTime();
        System.out.println("String 수행 시간: " + (endTime - startTime) + "ns");
        
        // StringBuilder (빠름)
        startTime = System.nanoTime();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            sb.append("a");  // 기존 객체에서 수정 (효율적)
        }
        endTime = System.nanoTime();
        System.out.println("StringBuilder 수행 시간: " + (endTime - startTime) + "ns");
    }
}

출력 예시

String 수행 시간: 1023456789ns
StringBuilder 수행 시간: 12345678ns

✔️ 차이점: StringBuilder가 훨씬 빠름

6️⃣ 언제 String을 쓰고, 언제 StringBuilder를 쓸까?

 

상황 String 사용 StringBuilder 사용
문자열 변경 변경이 거의 없음 자주 변경
성능 고려 중요하지 않음 성능 최적화 필요
멀티스레드 환경 String 사용 (Thread-Safe) StringBuffer 사용 (동기화)

7️⃣ 결론: String vs StringBuilder

  String StringBuilder
불변성(Immutable)
가변성(Mutable)
메모리 사용 비효율적 (새 객체 생성) 효율적 (기존 객체 수정)
속도 느림 빠름
사용 추천 변경이 거의 없는 경우 문자열을 자주 수정하는 경우
멀티스레드 지원 안전 (Immutable) 안전하지 않음

🔥 최종 요약

✅ String은 불변(Immutable)변경할 때마다 새로운 객체 생성 (메모리 낭비)
✅ StringBuilder는 가변(Mutable)같은 객체에서 수정 가능 (빠르고 효율적)
✅ append()를 이용하면 문자열을 추가할 때 객체를 재사용하여 성능이 향상됨
메서드 체이닝(Method Chaining) 을 사용하면 코드를 간결하게 유지할 수 있음

📌 문자열 변경이 많다면 StringBuilder를 쓰는 것이 좋다! 🚀

728x90
반응형

'JAVA' 카테고리의 다른 글

containsKey(f)(equals, hashcode 오버라이딩)  (0) 2025.03.27
StringTokenizer vs split()  (1) 2025.01.30
3-tier 아키텍처(service > dao > db)  (2) 2024.09.30