String vs StringBuilder vs StringBuffer

반응형
반응형

String vs new String()

1. String은 불변(Immutable) 객체

  • String은 한 번 생성되면 변경할 수 없는 불변 객체임.
  • + 연산을 하면 기존 객체를 수정하는 것이 아니라 새로운 String 객체가 생성됨.
  • 따라서 여러 번 + 연산을 수행하면 힙 메모리에 많은 객체가 생성되어 성능 저하가 발생할 수 있음.

2. 문자열 초기화 방법 (2가지)

  1. 리터럴(" 사용) 초기화
    • String Pool(힙 메모리의 일부)에 저장됨.
    • 동일한 문자열이 존재하면 기존 객체를 재사용하여 메모리를 절약함.
  2. String str1 = "hello";
  3. new 연산자 사용한 초기화
    • Heap 메모리에 새로운 객체가 생성됨.
    • 같은 문자열이라도 매번 새로운 객체를 생성하여 메모리 낭비가 발생할 수 있음.
  4. String str2 = new String("hello");

3. 두 방식의 차이점

String str1 = "hello";
String str2 = "hello";   // str1과 동일한 객체 참조 (String Pool)
String str3 = new String("hello"); // 새로운 객체 생성 (Heap)
  • 리터럴 초기화: 같은 문자열이 있으면 기존 객체를 참조하여 메모리를 절약.
  • new 연산자 초기화: 같은 문자열이어도 새로운 객체를 생성하여 메모리를 더 사용함.

4. 결론

  • 메모리 절약을 위해 String을 리터럴 방식으로 초기화하는 것이 권장됨.
  • 문자열 연산이 많다면 StringBuilder 또는 StringBuffer를 사용하여 불필요한 객체 생성을 방지하는 것이 좋음.

1. 공통점

  • StringBuilder와 StringBuffer는 가변(Mutable) 객체로, 문자열 변경 시 기존 객체를 유지하면서 내부 버퍼를 수정하기 때문에 연산 속도가 훨씬 빠름.
  • + 연산을 수행할 때:
    • String: 연산할 때마다 새로운 객체가 생성됨 → 메모리 낭비 발생
    • StringBuilder/StringBuffer: 내부 버퍼를 수정하여 단 하나의 객체만 유지

2. 차이점 (Thread-safe 여부)

클래스 Thread-safe 여부 특징

StringBuilder ❌ (Thread-safe하지 않음) 단일 스레드 환경에서 빠른 성능 제공
StringBuffer ✅ (Thread-safe, synchronized 사용) 멀티 스레드 환경에서 안전하지만 성능이 상대적으로 느릴 수 있음

3. 사용 선택 기준

  • 문자열 변경이 적으면 → String (불변 객체)
  • 단일 스레드 환경 → StringBuilder (더 빠른 성능)
  • 멀티 스레드 환경 → StringBuffer (Thread-safe 보장, 하지만 불필요한 동기화는 성능 저하 원인이 될 수도 있음)
    • 대신, 멀티 스레드 환경에서도 StringBuilder + synchronized 블록을 활용하면 성능을 최적화할 수도 있음.

✅ 최종 결론

  • 일반적인 경우: StringBuilder가 가장 적합
  • 멀티 스레드 환경: StringBuffer가 안전하지만, 성능이 중요하다면 StringBuilder + synchronized 고려
  • String은 불변 객체이므로 변경이 거의 없을 때만 사용하는 것이 좋음! 🚀
반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

해싱  (1) 2025.01.29
JVM 겉핥기  (2) 2025.01.21
인터페이스  (0) 2022.03.21
SOLID  (0) 2021.09.10
LocalDateTime (미 정재 .ver)  (0) 2021.09.04

댓글

Designed by JB FACTORY