본문 바로가기

Java/Java

(JAVA) equals에 대해서(4)

리스 코프 치환 원칙

컬렉션 Set을 사용해서 전송한 아규먼트에 해당 데이터가 있는지 확인하는 프로그램

public class CounterPointTest {

    private static final Set<Point> unitCircle = Set.of(
            new Point(1,0),  new Point(0,1),
            new Point(-1,0), new Point(0,-1)
    );


    public static boolean onUnitCircle(Point point) {
        return unitCircle.contains(point);
    }


    public static void main(String[] args) {
        
        Point point = new Point(1,0);
        CounterPoint point1 = new CounterPoint(1,0);
        
		//Point type의 객체
        boolean b = onUnitCircle(point);
        //CounterPoint type의 객체
        boolean b1 = onUnitCircle(point1);

        System.out.println(b);
        System.out.println(b1);
    }
}

근데 정말 이상한 게 있다.

인텔리제이 오류일 수 도 있고 내가 잘못 알고 있는 것일 수도 있지만 두 번째 출력 결과는 false가 나오는 것이 당연하지만 첫 번째는 true가 나오는 것이 정상이라고 생각한다.

하지만 출력 결과는 false를 반환한다.

실행결과

정말 이상하다. 그래서 디버깅을 해보았다.

디버깅을 하면 제대로 된 결과가 반환된다...;;

 

혹시 몰라서 Eclipse에서도 테스트를 해보았다.

Eclipse 실행결과

흠 무엇일까... 인텔리제이에서 무엇인가 잘못된 것 같다. 결과가 자명하게 오류라는 것을 보여준다. 어떤 것이 문제인지 다음번에 자세하게 알아보는 것으로 하고 다시 돌아가자! (2시간을 헤맨 나의 시간이 무척 아깝다 ㅠㅠ;)

 

 

//Point type의 객체
boolean b = onUnitCircle(point);
//CounterPoint type의 객체
boolean b1 = onUnitCircle(point1);

 

첫 번째 Point type의 객체를 넘기는 경우 Point에서 정의한 equals 메서드를 탄다.

하지만 두 번째 CounterPoint type의 객체 넘기는 경우 해당 메소드를 타지 않는다.

 

눈으로 확인해보자

 

contains를 사용하게 되면 ImmutableCollections이 정의한 contains 메서드(객체를 파라미터로 받는)로 향하게 된다.

해당 메서드의 probe 함수에서는 주어진 원소를 가지고 있는지 확인하는 코드가 구현되어 있는데 해당 조건에 만족하면 재정의한 equals로 향하지만 그렇지 않다면 equals를 타지 않는다.

두 번째의 경우 원소가 없기에 equals를 타지 않는다.

즉 리스 코프의 치환 원칙 (Liskov substitution principle)에 따르면, 어떤 타입에 있어 중요한 속성이라면 그 하위 타입에서도 마찬가지로 중요하다. 따라서 그 타입의 모든 메서드가 하위 타입에서도 똑같이 잘 작동해야 한다. 
라는 정의에 어긋난다.

References

이펙티브 자바 Effective Java 3/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이복연(개앞맵시)역
출판 : 인사이트 2018.11.01
상세보기

Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

 

'Java > Java' 카테고리의 다른 글

(JAVA) 자바에서 hashCode의 사용  (0) 2020.02.10
(JAVA) Immutable Class  (0) 2020.02.09
(JAVA) 비트연산(2)  (0) 2020.02.08
(JAVA) 비트연산(1)  (0) 2020.02.08
(JAVA) equals에 대해서(3)  (0) 2020.02.07