☕ Java/이론

[Java] 제네릭2 (상속, 제네릭 인터페이스)

an2z 2022. 1. 14. 17:15

제네릭 클래스의 상속

  • 제네릭 클래스는 상속이 가능하다.
  • 이때 T의 인자가 서로 다르면 상속관계를 형성하지 않는다.
    • 예) Box<Object> box = new Box<String>( ); // 불가능
    • Object와 String는 상속관계이지만, Box<Object>와 Box<String>는 상속관계를 형성하지 않는다.
      Box<Object>와 Box<String>은 상속관계를 형성하지 않는 별개의 자료형이기 때문이다.
    • 이러한 자료형을 "매개변수화 타입" 또는 "제네릭 타입"이라 한다.
class Box<T> { // 제네릭 클래스 (상위 클래스)
    protected T ob;

    public void set(T o) { ob = o;}
    public T get() { return ob;}
}

class SteelBox<T> extends Box<T> { // 제네릭 클래스 (하위 클래스)
    public SteelBox(T o) { // 생성자
        ob = o;
    }
}

class GenericInheritance {
    public static void main(String[] args) {
         // 상위클래스형(Box<T>) 참조변수가 하위클래스형(SteelBox<T>) 인스턴스 참조 가능
         Box<Integer> iBox = new SteelBox<>(5959);    
         Box<String> sBox = new SteelBox<>("simple");

         System.out.println(iBox.get());
         System.out.println(sBox.get());
    }
}

// 실행 결과
5959
simple

  • SteelBox 제네릭 클래스는 Box 제네릭 클래스 상속한다.
  • 따라서 Box 참조변수로 SteelBox 인스턴스를 참조할 수 있다.
  • Box<Integer>, Box<String>은 매개변수화 타입 또는 제네릭 타입이라 하며, 일종의 자료형이다.

 

타겟 타입

  • 타겟타입(Target Types)이란 T에 전달되는 자료형을 결정 짓기 위한 정보(참조변수의 타입)를 의미한다.
  • 자바 7부터 제네릭 메소드를 호출할 때 타입 인자를 생략할 수 있다.
    • Box<Integer> iBox = EmptyBoxFactory.<Integer>makeBox();
      Box<Integer> iBox = EmptyBoxFactory.makeBox(); // 생략 가능
    • 대입 연산자 왼쪽에 선언된 매개변수의 형을 보고 컴파일러가 유추를 진행한다.
    • makeBox 메소드는 Box<Integer>인스턴스의 참조 값을 반환해야 함을 유추
    • 이렇게 T의 유추에 사용된 정보 Box<Integer>를 타겟 타입이라 한다.
class Box<T> {
    protected T ob;

    public void set(T o) { ob = o;}
    public T get() { return ob;}
}

class EmptyBoxFactory {
    public static <T> Box<T> makeBox() { // 제네릭 메소드 정의
        Box<T> box = new Box<>(); // 상자 생성
        return box; // 생성한 상자 반환
    }
}

public class TargetTypes {
    public static void main(String[] args) {
        // Box<Integer> iBox = EmptyBoxFactory.<Integer>makeBox();
        Box<Integer> iBox = EmptyBoxFactory.makeBox(); // 제네릭 메소드의 타입인자 생략 가능
        iBox.set(25);
        System.out.println(iBox.get());
    }
}

// 실행 결과
25

 

 

제네릭 인터페이스의 정의와 구현

  • 인터페이스도 제네릭으로 정의할 수 있다.