JAVA

재할당 vs 내부 상태 변경

싸블양 2025. 10. 8. 16:35

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