String , StringBuilder , StringBuffer

LeeJongJoo·2025년 1월 18일
0

Java

목록 보기
7/8

1. String , StringBuilder , StringBuffer

  • 자바에서는 String, Stringbuilder, Stringbuffer 처럼 3가지의 문자열 처리 방식이 존재한다.
  • 세 가지의 문자열 처리방식은 각각 서로 다른 쓰임을 가져 장,단점이 존재한다.
  • 주요한 차이점은 불변성 , 성능 , 동기화정도가 있음

2. String VS StringBuilder, StringBuffer

  • StringStringBuilder, StringBuffer 의 차이점은 불변성가변성으로 나눌 수 있다
  • String 객체는 한 번 생성되면 내용을 변경할 수 없는 불변성을 가지고, StringBuilder, StringBuffer 객체들은 내용을 변경할 수 있는 가변성을 가진다.

2-1 String

  • 문자열을 생성하거나 조작하면 항상 새로운 객체가 생성되어 공간의 낭비가 생길 수 있다.
  • 다른 객체처럼 +연산이나 concat() 메소드로 문자열을 이어붙일 수 있다
    • 하지만 합쳐진 내용으로 새로운 String 인스턴스를 생성하게 되므로 메모리 공간이나 속도의 저하가 발생할 수 있다.

  • 실제로 value라는 변수 final 값으로 지정되어 있어서 값을 바꾸지 못하는 것이다.
  • String은 생성 방식에 따라서 생성되는 메모리 영역이 달라진다.
String str1 = "hello";  // (1)
String str2 = "hello";  // (2)
String str3 = new String("hello"); // (3)

(1) String str1 = “hello”;

  • String Pool에서 "hello" 가 있는지 찾음
    • 문자열 리터럴이 존재하는 지 확인하는 것
    • 문자열 리터럴은 재사용하여 메모리를 절약하는 역할을 한다.
  • 만약 String pool에 "hello" 문자열이 존재하지 않는다면
    • "hello" 문자열을 String Pool에 생성하고 str1은 이 문자열을 참조함
  • 이미 String pool에 "hello" 문자열이 존재한다면
    • 새로운 문자열을 생성하지 않고 , String pool에 있는 "hello" 를 재사용하며 str이 이를 참조하게 됨

(2) String str2 = “hello”;

  • String Pool에서 "hello" 가 존재하는 지 찾아봄
  • 이미 존재하므로 새 객체를 생성하지 않고, str2는 String Pool의 동일한 "hello" 객체를 참조하게 됨
  • 결과적으로 str1str2같은 객체를 참조하게되는 것

(3) String str3 = new String(“hello”);

  • new String("hello")힙 메모리에 새로운 객체를 생성한다.
  • 이 객체는 String Pool과는 독립적으로 존재하며, str3는 새로 생성된 객체를 참조한다.
  • 하지만 String Pool에는 "hello"가 이미 있으므로, str3는 String Pool의 "hello"와는 다른 객체를 참조하게 되는것이다.
구분String Pool힙 메모리
위치힙 메모리의 특별한 영역힙 메모리의 일반적인 영역
재사용동일한 문자열 리터럴을 재사용항상 새로운 객체를 생성
성능메모리 효율이 높음메모리 사용량이 증가
생성 방식리터럴로 생성new 키워드로 생성

2-2 StringBuilder , StringBuffer

2-2-1 공통점

  • 두 가지 모두 객체의 내용을 변경할 수 있다.
  • 추가, 삽입, 삭제 등의 작업을 할 때 새로운 객체를 생성하지 않는다.

2-2-2 StringBuilder

  • 동기화(Synchronization)
    • StringBuilder스레드-안전(Thread-Safe)하지 않다
    • 단일 스레드 환경에서 성능이 더 우수함
  • 사용 목적
    • 문자열을 자주 변경하거나 조작해야 하는 단일 스레드 환경에 적합.

2-2-3 StringBuffer

  • 동기화(Synchronization)
    • StringBuffer스레드-안전(Thread-Safe) 하다.
    • 동기화된 메서드로 구성되어 있어 멀티스레드 환경에서도 안전하게 사용할 수 있다.
  • 사용 목적
    • 멀티스레드 환경에서 문자열을 자주 변경해야 할 때 적합.

2-3 비교 요약

특징StringStringBuilderStringBuffer
불변성불변가변가변
동기화지원하지 않음지원하지 않음동기화 지원
성능느림빠름(단일 스레드)느림(멀티 스레드)
사용 사례변경이 적은 경우단일 스레드 환경멀티 스레트 환경

0개의 댓글