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 |