[java] 제네릭 타입의 상속과 캐스팅

제네릭 타입을 사용할 때 상속과 캐스팅에 대한 이해는 매우 중요합니다. 제네릭 타입이라는 것은 일반적으로 타입이나 메소드를 정의할 때에는 실제 타입이 아니라 추상적인 타입을 사용하는데 유용합니다. 하지만, 이로 인해 제네릭 타입의 상속과 캐스팅이 일반적인 상속 및 캐스팅과 약간 다르게 작동하는 경우가 있습니다.

제네릭 타입의 extends와 super

제네릭 타입에서 상속의 개념은 일반적인 클래스나 인터페이스 상속과는 다릅니다. extends 키워드를 사용하여 제네릭 타입을 상속하는 경우, 실제 타입 파라미터의 상한을 나타냅니다. 이는 부모 클래스가 특정한 타입의 하위클래스만을 받아들일 수 있도록 제한하는 역할을 합니다.

예를 들어, Box<Number>를 상속하는 Box<Integer>는 가능하지만, Box<String>은 불가능합니다.

반면 super 키워드를 사용하여 제네릭 타입을 상속하면, 실제 타입 파라미터의 하한을 나타냅니다. 이는 부모 클래스가 특정한 타입의 상위클래스만을 받아들일 수 있도록 제한하는 역할을 합니다.

제네릭 타입의 캐스팅

제네릭 타입은 실행 시점에는 타입 소거(Type erasure)로 인해 실제 타입 파라미터의 정보가 손실됩니다. 따라서, 제네릭 타입에 대한 캐스팅은 주의가 필요합니다.

가장 일반적인 방법은 instanceof 연산자를 사용하여 캐스팅을 하기 전에 실제 타입을 확인하는 것입니다.

if (object instanceof Box) {
    Box<?> box = (Box<?>) object;
    // ...
}

이외에도 Class.cast() 메소드나 <?> 와일드카드를 사용하는 것도 가능합니다.

결론

제네릭 타입의 상속과 캐스팅은 일반적인 상속 및 캐스팅과는 약간 다른 동작을 합니다. 제네릭 타입을 상속할 때에는 extendssuper 키워드를 이용하여 타입 파라미터의 상한과 하한을 지정할 수 있고, 캐스팅할 때에는 타입 소거로 인한 주의가 필요합니다.

참고 자료: 자바 공식 문서 - 제네릭 타입