데브허브 | DEVHUB | [10분 테코톡] 후유의 불변 객체와 final[10분 테코톡] 후유의 불변 객체와 final
- 불변 객체는 생성 후 상태를 변경할 수 없는 객체이며,
final 키워드는 변수 재할당을 방지합니다. 🔒
final을 인스턴스 변수에 붙인다고 해서 객체 전체의 불변성이 보장되지 않을 수 있다는 오해가 흔합니다. 💡
- 자바는 "Call by Value" 방식을 사용하여 함수에 값을 전달하며, 메서드 내에서 값이 변경되어도 원본에는 영향을 주지 않습니다. 📞
- 원시 타입 인스턴스 변수에
final을 사용하면 해당 변수의 값은 불변으로 유지됩니다. 🔢
- 참조 타입 인스턴스 변수(가변 객체)에
final을 붙여도, 참조하는 객체의 내부 상태는 변경될 수 있어 불변성이 보장되지 않습니다. 🔄
- 가변 참조 타입의 불변성을 보장하려면, 참조하는 객체 자체를 불변으로 만들거나 생성자에서 "방어적 복사"를 사용해야 합니다. 🛡️
- 가변 컬렉션(예:
ArrayList)을 인스턴스 변수로 가질 경우, final은 컬렉션 참조의 재할당만 막을 뿐, 컬렉션 내부 요소의 추가/삭제 등 변경은 막지 못합니다. 🧺
- 가변 컬렉션의 불변성을 확보하려면, 생성자에서 "방어적 복사"를 하거나, getter에서 새로운 컬렉션 또는 변경 불가능한 뷰를 반환해야 합니다. 🎁
- 결론적으로, 인스턴스 변수에
final을 사용한다고 해서 객체의 완전한 불변성이 보장되는 것은 아니며, 특히 가변 객체나 컬렉션을 포함할 때 추가적인 설계가 필수적입니다. ✅
- 완벽한 불변 객체 구현을 위해서는 '이펙티브 자바' 17장 등 전문 서적을 참고하는 것이 좋습니다. 📚
- 자바가 Call by Value 방식임을 정확히 이해하고 설명할 수 있는 것이 중요합니다. 🗣️