새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
불변객체 TIL
오늘은 불변 객체를 학습해봤습니다.
불변 객체의 장점은 다음과 같습니다.
-
상태 변경이 불가능하기에 이해하기 쉽고 안정적인 서비스 개발에 도움이 됩니다.
중간에 인스턴스의 상태가 변경되지 않기때문에 불필요한 메소드를 읽어볼 필요가 없습니다.
-
map,set,cache에 쓰기에 적절하다.
가변 객체라면 자료구조에 인스턴스를 넣고 상태를 수정하는 경우 원본 객체를 찾을 수 없습니다.
하지만 불변 객체라면 상태가 변경되지 않기에 hashCode는 불변하기에 오류가 발생하지 않습니다.
-
Thread-safe합니다.(안전한 공유 가능)
상태가 변경되지 않고 최초 할당된 값을 가지므로
race condition
으로 인한 문제가 발생하지 않습니다. -
불변 객체를 필드로 사용한다면 방어적 복사를 할 필요가 없습니다.
-
불변 객체는 변하지 않기 때문에 한번 계산된 결과를 캐싱하여 성능을 높일 수 있습니다.
단점은 다음과 같습니다
- 메모리 사용 증가가 있습니다. 상태 변경시 새로운 객체를 생성하기에 상태 변경이 빈번하다면 메모리 사용량이 증가될 수 있습니다.
- 새로운 객체 생성과 소멸로 가비지 컬렉션이 빈번하게 일어나면 성능 오버헤드가 발생할 수 있습니다.
- 복잡한 객체 생성으로 생성자 또는 필더 패턴을 사용하여 객체를 생성해야하므로 , 코드가 더 복잡해질 수 있습니다.
- 불변 컬렉션의 경우 요소를 추가할 때마다 새 리스트가 발생하게 되고 성능에 영향을 줄 수 있습니다.
정리하면, 불변 객체는 안정성과 예측 가능성을 높아져 불필요한 코드를 확인하지 않아도 되며 자료구조에서도 안전하게 사용이 가능합니다. 다만 메모리 사용량의 증가와 성능 오버헤드, 복잡한 객체 생성등이 있지만 적절하게 사용하는 것이 중요하다고 합니다.
사실 불변 객체에 대해서 어느정도 알고 있었지만, 실제로 적용해보려고 하니
메소드로 상태가 변경될 때마다 매번 새 객체를 만들어야한다는 압박감이 생겼습니다.
어차피 다른 쓰레드에서 공유하지 않는데 불변 객체를 사용해야할까 생각이 들었지만
비즈니스 로직이 400줄 넘어가는 코드를 보고 최대한 불변 객체를 사용해서 상태가 예상되는 것이 얼마나 중요한지 깨달았습니다.
그리고 자주 상태가 변경된다면 어떻게 최소한으로 새 객체를 만들지 고민을 해봐야겠습니다.
댓글남기기