Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)의 공변 반환 타입(Covariant Return Type)이란 무엇일까?

공변 반환 타입이란?

일반적으로 메서드 오버라이딩(overriding)에서는 슈퍼클래스와 서브클래스의 메서드가 동일한 이름과 매개변수를 가져야 합니다. 하지만 반환 타입에 대해서는 약간의 유연성이 허용됩니다. 즉, 서브클래스의 메서드는 슈퍼클래스 메서드의 반환 타입과 같은 타입을 반환하거나, 그 하위 타입(subtype)을 반환할 수도 있습니다. 이처럼 오버라이딩된 메서드가 부모 메서드의 반환 타입보다 더 구체적인(좁은) 타입을 반환하는 것을 공변 반환 타입(covariant return type)이라고 합니다.

예제로 이해하기

다음 예제를 살펴보겠습니다. 슈퍼클래스에는 demoMethod()라는 메서드가 정의되어 있으며, 이 메서드는 List 타입의 값을 반환한다고 가정합니다. 이 메서드를 오버라이딩할 때 서브클래스의 메서드는 다음 중 하나를 반환할 수 있습니다.

  • 슈퍼클래스와 동일한 List 타입
  • List의 하위 타입인 ArrayList, Stack, Vector

만약 서브클래스의 메서드가 슈퍼클래스의 반환 타입인 List의 하위 타입인 ArrayList를 반환한다면, 이 하위 타입(ArrayList)을 공변 타입(covariant type)이라고 부릅니다. 덕분에 호출 측에서 불필요한 형 변환(casting) 없이 더 구체적인 타입의 객체를 바로 사용할 수 있다는 장점이 있습니다.

코드 예제

class Test{
    int data = 100;
    Test demoMethod(){
        return this;
    }
}
public class Sample extends Test{
    int data = 1000;
    Sample demoMethod(){
        return this;
    }
    public static void main(String args[]){
        Sample sam = new Sample();
        System.out.println(sam.demoMethod().data);
    }
}

위 코드에서 슈퍼클래스 TestdemoMethod()Test 타입을 반환하지만, 이를 상속한 Sample 클래스에서는 반환 타입을 Test의 하위 타입인 Sample로 좁혀서 오버라이딩했습니다. 이것이 공변 반환 타입의 전형적인 활용 사례입니다.

실행 결과

1000

sam.demoMethod()는 오버라이딩된 서브클래스의 메서드를 호출하며, 반환 타입이 Sample이므로 별도의 형 변환 없이 곧바로 Sample의 필드인 data(값 1000)에 접근할 수 있습니다. 만약 공변 반환 타입이 지원되지 않았다면 반환된 객체를 Sample로 명시적으로 캐스팅해야 했을 것입니다.