본문 바로가기

스터디/소연

자료형 - String / StringBuffer

String

  • 문자열 객체의 인스턴스 주소를 담고 있는 참조형(reference type) 변수
  • 스택(stack) 영역이 아닌 객체와 같이 힙(heap) 에서 문자열 데이터가 생성되고 다뤄짐
  • Java에서 String은 불변(immutable) 객체로 한 번 생성된 String 객체의 값은 변경될 수 없음
  • 불변성 때문에 여러 쓰레드에서 동시에 사용해도 안전

String 클래스에 있는 모든 메소드들은 원래의 문자열을 변경X, 새로운 String 객체를 반환

ex) replace(), substring(), toLowerCase(), toUpperCase() 등과 같은 String 클래스의 메소드들을 사용

> 원래의 문자열 자체를 수정하는 것이 아니라 수정된 새로운 문자열을 가진 새로운 String 객체를 반환

String str = "Hello";
str.toUpperCase();
System.out.println(str); // "Hello"

위 코드는 "HELLO"가 아닌 "Hello"를 출력함

str.toUpperCase() 호출이 원래 str 객체를 대문자로 바꾸는 것이 아니라 대문자 버전의 새 String 객체를 만들고 그것을 반환

원래 str 변수가 참조하는 String 객체("Hello")는 변하지 X

 

String str = "Hello";
str = str.toUpperCase();
System.out.println(str); // "HELLO"

위 코드는 line 2에서 toUpperCase()가 대문자 버전의 새 String 객체를 만들고, 그 참조값을 다시 str 변수에 할당 > HELLO가 출력됨

 

String의 이러한 특성 때문에 문자열 연산이 많은 경우 성능 저하가 발생할 수 있음

문자열에 대한 어떤 변경 작업이든 간에 항상 새로운 String 객체가 생성 > 메모리 추가 사용 > 가비지 컬렉터(Garbage Collector)가 더 자주 동작하기 때문

 

이를 보완하기 위해나온 것이 가변성을 가진 StringBuilder, StringBuffer 클래스

문자열 추가/수정/삭제 등 연산을 많이 써야하는 상황에서 사용

StringBuffer & StringBuilder

문자열을 변경할 수 있는 가변 객체

내부 문자열을 직접 변경하는 메소드를 제공하고 있음

StringBuilder랑 StringBuffer 차이

  동기화 멀티스레드 단일스레드
StringBuffer O (모든 주요 메소드가 synchronized로 동기화되어 있음) 안전 동기화 오버헤드 발생 >비효율적
StringBuilder X 안전 X 더 빠른 성능
  • 단일 쓰레딩 환경에서 대량의 문자열 조작 작업이 필요한 경우: StringBuilder
  • 멀티 쓰레딩 환경에서 안전한 문자열 조작이 필요한 경우: StringBuffer

String과는 다르게 가변 객체(mutable object)를 키로 사용하는 경우, 해당 객체의 상태(값)이 변경되면 그에 따른 해시값 역시 변화하게 된다. 이것은 데이터 불일치를 초래할 수 있으므로 보통 가변 객체를 해시 테이블 등의 자료구조에서 키로 사용하는 것은 권장하지 않는다.

 

https://velog.io/@gkdbssla97/자료구조-String-StringBuffer-StringBuilder에-대해서

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

스프링 Bean의 Scope에 대해서 설명해주세요.  (1) 2024.04.18
자료형 - HashSet, HashMap  (0) 2024.04.11
자료형 - Array / ArrayList / LinkedList  (0) 2024.04.11
이진 탐색  (0) 2024.04.11
시간복잡도(Time Complexity)  (0) 2024.04.11