자바에서 String은 좀 이상하다고 한다.
int와 char와 달리 참조형 객체로 분류된다. 그럼에도 기본타입처럼 쓸 수 있ㄷ다.
불변객체
기본적으로 자바에서는 String 객체의 값은 변경할 수 없다.
불변 객체(Immutable Object)란?
한 번 값이 설정되면 변경될 수 없는 객체를 의미한다.
Java에서 String은 왜 불변일까?
내부적으로 char[] 배열로 데이터를 저장하지만, String 클래스는 이 배열을 final로 선언해서 외부에서 수정할 수 없게 막아둠
왜 불변으로 만들었을까?
1. 쓰레드 안전(Thread-safe)
- 불변 객체는 공유해도 안전 → 여러 쓰레드에서 동시에 사용해도 문제 없다
2. Hashing 최적화
- String은 자주 HashMap의 키로 사용됨
- 해시값을 한 번 계산해서 캐싱해두면, 변경되지 않기 때문에 효율적
3. 문자열 상수 풀 (String Constant Pool) 활용 가능
- "hello" 같은 리터럴은 JVM의 문자열 상수 풀에 저장됨
- 불변이기 때문에 같은 문자열은 재사용 가능하다
문자열을 "변경"하고 싶을 땐?
- StringBuilder: 단일 쓰레드에서 빠른 수정
- StringBuffer: 멀티 쓰레드에서 안전한 수정
알게된 점
final로 수정을 불가하게 만들 수 있다.
그러나 final이 접근까지 못하게 하는 건 아니다.
기본 적으로 주소 값을 수정 못하게 하는 거라, 그 안의 내용은 수정이 가능할 수 있다.
ex) final <String> list = new ArrayList()<>;
list.add("hi");
list.add("bye");
가능하다는 뜻
'java' 카테고리의 다른 글
로깅 앤 디버깅 (0) | 2024.06.09 |
---|---|
증감 연산자 (0) | 2024.01.23 |
하라는 indexof() 공부는 안하고 물리에 빠진 건에 대하여. (0) | 2023.05.19 |
내맘대로 디버깅(Debug) (0) | 2023.05.17 |
몰래 온 손님 toString() (2) | 2023.05.16 |