스터디/CS

[CS] Java String, StringBuilder, StringBuffer 차이

kwang2134 2025. 3. 28. 16:27
728x90
반응형
728x90

String

자바의 문자열을 다루는 클래스로 불변(immutable)입니다. 한 번 생성된 String 객체의 내용은 변경할 수 없고 새로운 String 객체를 생성하여 참조를 변경할 수 있습니다.

주요 특징

  • 불변성(Immutability): String 객체는 생성 후 내용을 변경할 수 없는 불변성 객체
  • String pool: 문자열 리터럴로 생성된 String 객체는 문자열 상수풀에 저장되어 메모리 효율을 높이고 동일한 문자열에 대해 여러 참조가 같은 메모리 주소를 가리킬 수 있게 함
  • Thread-Safe: String은 불변성으로 객체의 내용이 변하지 않기 때문에 멀티스레드 환경에서 여러 스레드가 동시에 같은 String 객체를 읽어도 안전하게 동작
  • final 클래스: String 클래스는 final로 선언되어 상속이 불가능하고 이는 불변성 유지와 보안 강화에 기여

주요 메서드

  • charAt(int index): 지정된 인덱스의 문자를 반환
  • concat(String str): 다른 문자열을 현재 문자열에 연결
  • contains(CharSequence s): 지정된 문자열이 포함되어 있는지 확인
  • equals(Object anObject): 두 문자열이 동일한지 비교
  • indexOf(String str): 지정된 문자열의 첫 번째 발생 위치를 반환
  • length(): 문자열의 길이를 반환
  • replace(char oldChar, char newChar): 문자열에서 특정 문자를 다른 문자로 대체
  • split(String regex): 정규식을 사용하여 문자열을 나눔
  • substring(int beginIndex): 지정된 인덱스부터 시작하는 부분 문자열을 반환
  • toLowerCase(): 문자열을 소문자로 변환
  • toUpperCase(): 문자열을 대문자로 변환

concat(String str)과 +연산

두 문자열을 합치는 두 가지 방법의 차이는 무엇인가?

  • concat(String str): 기존 문자열과 연결할 문자열의 내용을 새로운 String 객체에 복사 후 연결된 새로운 문자열 반환
  • + 연산: 컴파일 단계에서 StringBuilder로 변환되어 append 연산 후 toString()을 통해 반환
  concat(String str) + 연산
성능(여러 개의 문자열을 합치는 경우) 합칠 때 마다 새로운 String 객체 생성으로 비효율적 append 연산으로 합친 후 한 번의 toString() 을 통한 객체 생성으로 효율적
쓰레드 안정성 불변성인 String 객체 내용을 복사해 새로운 객체로 옮기는 것으로 멀티쓰레드 환경에도 안전 StringBuilder를 통해 처리되어 동기화 과정이 없는 StringBuilder는 멀티쓰레드 환경에 안전하지 않음

StringBuilder

자바에서 가변 문자열을 다루는 데 사용되는 클래스입니다. String과 달리 문자열을 동적으로 수정할 수 있는 mutable한 특징을 가지고 있으며 문자열 추가, 삽입, 삭제, 교체, 뒤집기 등 다양한 작업을 효율적으로 수행 가능합니다.

주요 특징

  • Mutable: StringBuilder는 가변(mutable)으로 문자열을 동적으로 수정 가능
  • Non-Thread-Safe: StringBuilder는 동기화 과정이 없어 스레드에 안전하지 않음 → 여러 스레드가 접근할 경우 데이터의 일관성이 깨질 수 있음
  • 성능: StringBuilder는 문자열을 추가하거나 수정할 때 새로운 객체를 생성하지 않아 성능이 좋음

주요 메서드

  • append(String str): 지정된 문자열을 현재 문자열의 끝에 추가
  • insert(int offset, String str): 지정된 위치에 문자열을 삽입
  • replace(int start, int end, String str): 지정된 범위의 문자열을 다른 문자열로 교체
  • delete(int start, int end): 지정된 범위의 문자열을 삭제, 혹은 지정 인덱스의 문자 삭제
  • reverse(): 문자열을 뒤집음.
  • toString()StringBuilder의 내용을 String으로 반환
  • length(): 문자열의 길이를 반환
  • capacity()StringBuilder의 현재 용량을 반환
  • ensureCapacity(int min)StringBuilder의 용량을 최소한으로 설정

생성 방법

  • StringBuilder(): 기본 용량(16)을 갖는 빈 StringBuilder를 생성
  • StringBuilder(int capacity): 지정된 초기 용량을 갖는 빈 StringBuilder를 생성
  • StringBuilder(String str): 지정된 문자열로 초기화된 StringBuilder를 생성
  • StringBuilder(CharSequence seq): 지정된 문자열 시퀀스로 초기화된 StringBuilder를 생성

StringBuffer

StringBuilder와 마찬가지로 가변 문자열을 다루는 클래스입니다. 동적으로 수정할 수 있는 mutable한 특징을 가지고 있고 문자열을 추가, 삽입, 삭제, 교체, 뒤집기 등 작업을 효율적으로 수행할 수 있습니다.

주요 특징

  • Mutable: StringBuffer는 가변(mutable)으로 문자열을 동적으로 추가하거나 수정 가능
  • Thread-Safe: StringBuffer는 내부적으로 동기화되어 있어 멀티스레드 환경에서도 안전하게 사용 가능 → 여러 스레드가 동시에 접근해도 데이터의 일관성 유지 가능
  • 성능: StringBuffer는 문자열을 추가하거나 수정할 때 새로운 String 객체를 생성하지 않아 String 보다 성능이 좋지만 동기화 과정에서 발생하는 오버헤드로 StringBuilder 보단 느림

주요 메서드

  • append(String str): 지정된 문자열을 현재 문자열의 끝에 추가
  • insert(int offset, String str): 지정된 위치에 문자열을 삽입
  • delete(int start, int end): 지정된 범위의 문자열을 삭제
  • replace(int start, int end, String str): 지정된 범위의 문자열을 다른 문자열로 교체
  • reverse(): 문자열을 뒤집음
  • toString()StringBuffer의 내용을 String으로 반환
  • length(): 문자열의 길이를 반환
  • capacity()StringBuffer의 현재 용량을 반환

생성 방법

  • StringBuffer(): 기본 용량(16)을 갖는 빈 StringBuffer를 생성
  • StringBuffer(int capacity): 지정된 초기 용량을 갖는 빈 StringBuffer를 생성
  • StringBuffer(String str): 지정된 문자열로 초기화된 StringBuffer를 생성
  • StringBuffer(CharSequence seq): 지정된 문자열 시퀀스로 초기화된 StringBuffer를 생성

비교

클래스 불변성 쓰레드 안전성 성능

클래스 불변성 스레드 안정성 성능
String 불변 안전 낮음 → 매번 String 객체 생성
StringBuilder 가변 불안전 빠름 → 동기화 과정이 없고 객체 생성 없이 여러 번 문자열을 조작 가능
StringBuffer 가변 안전 보통 → 객체 생성 없이 여러 번 문자열 조작이 가능하나 동기화 과정에서 오버헤드 발생

 

728x90

'스터디 > CS' 카테고리의 다른 글

[CS] 자바 예외 - Java Exception  (0) 2025.04.07
[CS] 자바의 final, finally, finalize  (0) 2025.04.04
[CS] 자바 문자열 할당 방식  (0) 2025.03.27
[CS] 객체 지향 프로그래밍 특징  (0) 2025.03.26
[CS] Garbage Collection  (0) 2025.03.25