공변 반환 타입(Covariant Return Type)이란?
공변 반환 타입(Covariant Return Type)은 오버라이딩(재정의)하는 메서드의 반환 타입을 의미합니다. 이 기능을 활용하면 부모 클래스에 정의된 메서드를 재정의할 때, 원래 반환 타입보다 더 구체적인 하위 클래스 타입으로 반환 타입을 좁혀서 지정할 수 있습니다.
공변 반환 타입을 사용하면 호출부에서 반환값을 다룰 때 불필요한 타입 캐스팅(casting)이나 반환 타입 검사 없이 곧바로 하위 클래스 타입으로 사용할 수 있다는 큰 장점이 있습니다. 코드가 간결해지고 타입 안전성도 높아집니다.
적용 조건
- 공변 반환 타입은 참조형(non-primitive) 반환 타입에만 적용됩니다. int, double처럼 기본형(primitive) 타입에는 사용할 수 없습니다.
- 자바 5(Java 5)부터 도입된 기능으로, 재정의한 메서드의 반환 타입은 반드시 부모 메서드 반환 타입의 하위 클래스여야 합니다.
예제 코드
다음 예제는 부모 클래스의 get() 메서드를 자식 클래스에서 더 구체적인 반환 타입으로 재정의하는 모습을 보여줍니다.
class SuperClass {
SuperClass get() {
System.out.println("SuperClass");
return this;
}
}
public class Tester extends SuperClass {
Tester get() {
System.out.println("SubClass");
return this;
}
public static void main(String[] args) {
SuperClass tester = new Tester();
tester.get();
}
}실행 결과
SubClass
동작 원리 설명
위 예제에서 Tester 클래스는 SuperClass의 get() 메서드를 재정의하면서 반환 타입을 SuperClass에서 Tester로 좁혔습니다. 반환 타입이 부모 메서드 반환 타입의 하위 클래스이기 때문에 컴파일러는 이를 정상적으로 허용합니다.
main() 메서드에서는 SuperClass 타입의 참조 변수로 Tester 객체를 생성했지만, 런타임에는 실제 객체인 Tester의 get() 메서드가 호출됩니다. 이것이 바로 다형성(polymorphism)과 공변 반환 타입이 함께 동작하는 모습입니다. 만약 공변 반환 타입이 없다면 자식 클래스에서 반환값을 사용할 때마다 명시적으로 (Tester) 캐스팅을 해야 하는 번거로움이 있었을 것입니다.