본문 바로가기
CS공부/자료구조

[Java] 연결리스트의 remove 메소드에서 오버라이드 없이 compareTo를 사용한다?

by 반달bear 2022. 12. 2.
반응형

네이버 부스트코스로 자료구조를 듣던 와중 신기한 코드를 발견했다.

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가 인터페이스를 통해서만 참조될 수 있다고 생각하지 말아야 한다. 구현 클래스를 인터페이스로 업캐스팅하는것은 간단하게 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

반응형

댓글