본문 바로가기
728x90

도서/이펙티브자바7

Item 11. equals를 재정의하려거든 hashCode도 재정의하라 equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 그렇지 않으면 클래스 인스턴스를 HashMap 같은 컬랙션의 원소로 사용할 때 문제가 발생한다. 자바 레퍼런스의 Object에 있는 hashCode의 명세를 보면 다음과 같이 hashCode를 설명한다. 1. equals 비교에 상요되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동한 그 객체의 hashCode 메서드는 호출 횟수와 무관하게 같은 값을 반환해야 한다. 단, 애플리케이션을 재실행 한다면 값이 달라져도 상관없다. 2. equals(Object)가 두 객체를 같다고 판단하면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다 (논리적으로 같은 객체는 같은 해시코드를 반환해야 한다). 3. equals(Obj.. 2022. 3. 3.
Item 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임의 핵심은 계산을 일련의 변환(transformation)으로 재구성하는 것이다. 여기서 각 변환은 가능한 이전 단계의 결과를 받아서 처리하는 순수 함수여야 한다. 이를 위해서는 스트림 연산에 건네는 함수 객체는 모두 side-effect가 없어야 한다. 아래의 예시를 보자. 1 2 3 4 5 6 7 Map freq = new HashMap(); try (Stream words = new Scanner(file).tokens()) { words.forEach(word -> { freq.merge(word.toLowerCase(), 1L, Long::sum); }) } Colored by Color Scripter cs 이 코드는 스트림을 가장한 반복적 코드다. 위에서 명시했듯 스트림에서 사.. 2022. 3. 2.
Item 10. equals는 일반 규약을 지켜 재정의하라 equals 메서드는 재정의하기 쉬워보이지만 잘못 정의하면 큰 문제가 된다. 따라서 문제를 회피하는 가장 쉬운 방법은 재정의를 하지 않는 거다. 그러면 euqals의 메서드 원형은 다음과 같기 때문에 자기 자신과만 같게 된다. 1 2 3 public boolean equals(Object obj) { return (this == obj); } Colored by Color Scripter cs 다음 상황 중 하나라도 해당한다면 euqlas 메서드를 재정의 하지 말라. 각 인스턴스가 본질적으로 고유하다. 각 인스턴스가 고유할 때, 즉, 각 인스턴스의 상태가 중복이 되지 않을 때는 euqals를 재정의 하지 말라. euqals는 깊은 비교를 해야 할 때 사용하라. 인스턴스의 논리적 동치성(logical eq.. 2022. 2. 24.
728x90