네이버 부스트코스로 자료구조를 듣던 와중 신기한 코드를 발견했다.
if(((Comparable<E>) current.data).compareTo(obj) == 0)
라는 코드인데 설명만 보면
current.data를 Comparable<E>로 캐스팅해서 compareTo메소드를 사용해주는 것이라고 한다.
그런데 여기서 드는 의문 compareTo 메소드를... 오버라이드 하지 않고 사용할 수 있었던가?????
그리고 애시당초 인터페이스로 캐스팅된다는 말이 무슨 말이지??????....
라는 많은 고민 끝에 작성하게 된 글
(검색을 많이 해봤지만 기본적인건지 명확한 답을 구하긴 어려웠다...ㅎㅎ)
우선 인터페이스로 캐스팅 시키는건 흔한 일은 아니다.
보통 extends로 만든 자식 클래스를 부모 클래스로 만들어줄 때 캐스팅을 시키기 때문에
인터페이스로 캐스팅하는 사례 자체를 여기서 처음 봤다.
내가 이해한 코드는 이렇다.
나는 compareTo를 오버라이드 없이 사용할 수 있는 메소드인가?에 집중했지만
찾아본 결과 compareTo는 반드시 오버라이드가 필요한 추상메소드였다.
그리고 Integer, String 등 값을 가지는 wrapper 클래스는 모두 Comparable을 implement한 상태이기에
compareTo 메소드를 클래스에 자체적으로 오버라이드 한 상태이다.
그렇기에 (Comparbale<E>) current.data 라는 코드는 current.data에 들어오는 클래스를 구현 클래스로 삼아
Comparable<E>를 사용할 수 있게 업캐스팅 되고 구현 클래스 안에 있는 오바라이드 된 compareTo를 사용할 수 있게 된다.
글을 작성하면서
인터페이스로 업캐스팅하면 인터페이스 안에 있는 메소드 밖에 못 쓰기 때문에
구현된 compareTo메소드를 사용하지 못하는거 아닌가?
라고 생각했는데
stackOverflow에 들어가보니 아니라고 한다.
obj가 MyInterface를 구현한다 해서 obj가 인터페이스를 통해서만 참조될 수 있다고 생각하지 말아야 한다. 구현 클래스를 인터페이스로 업캐스팅하는것은 간단하게 myinterface가 필요한 곳에 obj를 사용할 수 있게 해주는 것이다.
오버라이드 된 메소드는 구현 객체가 업캐스팅 되어도 실제 인스턴스(구현 객체)의 메소드로 실행된다.
그 케이스의 경우 ScottishPerson의 메소드가 BritishPerson 메소드를 참조하여 구현했다고 할지라도 인스턴스가 ScottishPerson이기에 메소드는 ScottishPersion으로 부터 온다.
이 부분에 대해서 좀 더 자세히 알아보고 글을 적고 싶지만
자바의 특성에 대해 자세히 적기엔 글의 정확도가 많이 떨어질거 같아
아래의 사이트로 갈음한다. ;-;
참조
cast an object to an interface in java? - Stack Overflow
java - Why is upcasting a Class not changing overridden methods? - Stack Overflow
'CS공부 > 자료구조' 카테고리의 다른 글
[Java] 해시함수의 충돌을 피하기 위해 테이블 사이즈를 소수, 홀수로 만들어야 하는 이유 (0) | 2022.12.08 |
---|---|
[Java] Iterator과 Iterable 그리고 iterator()을 알아보자(alaboza..) (0) | 2022.12.02 |
[Java] 연결 리스트를 공부하고 있는데 포인터라는 말이 계속 나온다 (0) | 2022.12.01 |
[Java] 자바로 구현한 연결리스트(single linkedlist) addLast 메소드 쉽게 이해하는 법 (0) | 2022.11.29 |
[Java] 자바로 구현한 연결리스트(single linkedlist) addFirst 메소드 잘 이해하는 법 (0) | 2022.11.29 |
댓글