final set<> 인데 numbers.add()가 왜 가능한가?
→ 핵심은 “재할당” vs “내부 상태 변경”차이를 이해하는가?
자바에서 final은 “변수가 다른 객체를 가리키도록 재할당되는 걸 막는다”는 뜻이지, 그 객체 안의 내용을 바꾸는 걸 막는 게 아니다.
예를 들어
final Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
여기서 final이 적용된 건 numbers라는 변수다. numbers는 HashSet 객체를 가리키고 있는데,
그 “참조”를 다른 객체로 바꾸는 게 불가능하다.
정리하면 final은 화살표로 가리키고있는 곳을 바꾸는게 불가능하다는것으로 나는 이해했다.
numbers = new HashSet<>(); // ❌ 재할당이라 에러
하지만, numbers.add(2); // ✅ OK, 이건 '객체 내부 상태 변경'
이건 객체 내부 상태를 바꾸는 것이라서 final이 막지 않는다.
정리
- final은 “박스” 자체를 못 바꾸게 하는 거고
- add()는 “박스 안에 든 내용물을 바꾸는 거”
그래서 final은 “불변”을 보장하지 않아요. 참조만 고정할 뿐, 내용은 mutable(가변)일 수 있다.
'JAVA' 카테고리의 다른 글
| 오버라이드(override) (0) | 2025.10.12 |
|---|---|
| get(Accessor) 과 set(Mutator) (0) | 2025.10.09 |
| 자바의 generic 정리 (0) | 2025.10.06 |
| 스택과 힙 다시 정리 (0) | 2025.09.12 |
| Entity설계 시 ID 값을 Long으로 지정하는 이유 (0) | 2025.09.10 |