equals() 제대로 알고 쓰자! 버그 예방 꿀팁
by DD
6개월 전
조회수 8
LY Corporation의 코드 품질 개선 노력의 일환으로, equals() 오버라이딩 시 주의사항을 강조함
equals()는 동일성(identity) 또는 등가성(equivalence)을 나타내야 하며, 일부 속성만 비교하는 것은 지양해야 함
Kotlin data class의 equals 구현과 캐싱, 표현과 값의 등가성 정의 등, 다양한 예외 케이스를 제시함
equals() 정의의 두 가지 원칙
equals()는 객체의 동일성(identity) 또는 등가성(equivalence)을 명확히 정의해야 한다. 동일성은 객체 참조가 같을 때 true를 반환하며, 등가성은 모든 속성이 같을 때 true를 반환한다. 따라서 equals() 구현 시, 어떤 의미를 부여할지 신중하게 결정해야 한다.
일부 속성만 비교하는 equals()의 문제점
일부 속성만 비교하는 equals()는 예상치 못한 버그를 발생시킬 수 있다. StateFlow나 LiveData와 같은 observable에서 equals()를 사용하여 변경 여부를 판단하는 경우, 특정 속성이 변경되어도 UI가 업데이트되지 않는 문제가 발생한다. 따라서 equals()는 모든 속성을 비교하거나, 별도의 함수를 사용해야 한다.
등가성 정의 시 고려사항
등가성/동등성을 정의할 때는 표현(representation)과 실제 값(actual value)의 차이를 고려해야 한다. Rational(유리수) 예시처럼, 표현 방식에 따라 등가성의 의미가 달라질 수 있다. 따라서 equals()를 구현하기 전에, 해당 객체가 무엇을 나타내는지 정확히 이해하고 등가성 정의를 신중하게 결정해야 한다.