본문 바로가기
Java

메서드 오버라이딩 리턴 타입이 다른 경우 (Java)

by latissimus 2021. 10. 4.

1. 오버로딩, 오버라이딩

 

프로그래밍 언어 기초 공부를 할 때, 수업이나 책에서 상속을 배우면서 보통 오버로딩과 오버라이딩을 같이 배운다. 보통 이런 식으로 배운다.

 

 

메서드 오버로딩 : 동일 이름의 메서드를 매개변수만 다르게 하여 여러 개 정의할 수 있는 기능

-> 사용 조건 : 이름 동일, 매개변수 개수 다름 or 타입 다름, 반환형 무관

 

메서드 오버라이딩 : 상속 관계에 있을 때, 하위 클래스에서 상위 클래스 메서드를 재정의 하는 것

-> 사용 조건 : 메서드 이름 동일, 매개변수 개수, 데이터 타입 동일, 반환형 동일

 

이 중 오늘 기록할 내용은 오버라이딩의 반환형에 대해서다.

 

 

 

 

2. 이전에 들었던 의문

 

혼자 공부를 할 때 오버라이딩은 반환형이 동일해야 한다는 내용을 책에서 봤었는데, 막상 수업에서는 반환형이 다른 경우도 오버라이딩이 되는 경우를 보고 혼란을 겪었던 기억이 있다.

 

그 당시에는 진도가 바빠서 (반환형이 무관한 오버로딩과 헷갈렸거니 한 후) 공부를 잘못한 줄 알고 그냥 넘어갔었다. 그런데 기사 시험 공부 중 오버라이딩이 다시 나왔는데 "반환형이 동일해야한다" 라고 적혀 있었다.

 

구글링을 하니 한글로는 결과가 별로 나오지 않아서 영어로 대충 검색하니 맨 위에 스택오버플로우 질문 내용이 나와서 들어가서 읽어보았다.

 

https://stackoverflow.com/questions/14694852/can-overridden-methods-differ-in-return-type

8년전 글이지만 시간을 더 투자하기에는 초심자라 할게 너무 많아서 적당히 쓰고 나중에 더 찾아 보기로 했다.

 

 

 

 

3.스택오버플로 발췌 내용

 

댓글의 내용에서 몇 개 문장을 발췌해 정리하였다. (일부를 주워와서 해석한 내용입니다.)

 

사례 1  : 반환 유형이 void 또는 primitive인 경우

부모 클래스 메서드의 데이터 형식과 재정의 메서드가 같아야 한다. 
예를 들어 반환 유형이 int, float, string 등일 경우 반환 유형이 같아야 한다는 이야기다.

 

결론 : 반환 타입이 원시 타입이거나 void인 경우 반환 유형이 같아야 오버라이딩을 할 수 있다. 반환 타입이 달라서는 안된다.

 

 

사례2 : 반환 유형이 파생(derived) 데이터 타입인 경우

 

"부모 클래스 메서드의 반환 형식이 파생 유형인 경우 오버라이딩 메서드의 반환 형식은 파생 데이터 형식에 대한 하위 클래스의 동일한 파생 데이터 형식이다."

예를 들어, 클래스 A가 있고, B가 A에 대한 하위 클래스이고, C가 B에 대한 하위 클래스이고, D가 C에 대한 하위 클래스라고 가정한다. 여기서 만약 슈퍼 클래스가 유형 A를 반환한다면, 하위 클래스에 있는 오버라이딩된 메서드는 A 또는 B/C/D 유형, 즉 하위 유형을 반환할 수 있다. 이를 공분산(covariance)이라고도 한다.

 

(파생이라고 그대로 해석하는게 맞는지 모르겠다.)

 

예시로 A, B, C, D 순으로 A가 가장 상위 클래스이며 서로 상속한다면, 상위 클래스의 반환형이 A라면 하위 클래스의 반환형에 A뿐 아니라 B,C,D를 모두 사용할 수 있다는 내용이다.

 

 

예시를 조금 더 풀어쓰면 이렇다.

 

==>상위 클래스 X의 메서드에서 리턴값 A이다. 이때 AB, C, D의 상위 클래스이다.

==>상위 클래스 X의 메서드 오버라이딩한 하위 클래스 Y의 메서드의 리턴 값에는 A뿐만 아니라 B, C, D가 모두 올 수 있다.

 

부모 클래스(메서드)의 반환형과 해당 반환형의 하위 형태자식 클래스(메서드)에서 반환형으로 사용할 수 있다는 내용으로이해했다.

 

결론 : 반환 타입이 달라도, 하위 클래스의 반환 타입이 상위 클래스의 반환 타입에서 파생되었다면 상관없다.

 

 

 

전반적으로 자바 5이상부터 공변량(covariant) 반환, 즉 반환 유형을 하위 유형으로 특수화하는 것을 지원한다는 내용이었다. 오래전 글이라 맞는지 확신은 없다. 자고 일어나서 더 찾아봐야겠다.

 

레퍼런스 활용에 대해 고민이 필요하다.

댓글