제네릭 클래스의 상속
- 제네릭 클래스는 상속이 가능하다.
- 이때 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>를 타겟 타입이라 한다.
- Box<Integer> iBox = EmptyBoxFactory.<Integer>makeBox();
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
제네릭 인터페이스의 정의와 구현
- 인터페이스도 제네릭으로 정의할 수 있다.
'☕ Java > 이론' 카테고리의 다른 글
[Java] List 컬렉션 클래스 (0) | 2022.01.25 |
---|---|
[Java] Map 컬렉션 클래스 (0) | 2022.01.25 |
[Java] 컬렉션 프레임워크 (0) | 2022.01.18 |
[Java] 제네릭3 (와일드 카드) (0) | 2022.01.17 |
[Java] 제네릭1 (제네릭 클래스, 제네릭 메소드) (0) | 2022.01.13 |
[Java] Arrays 클래스 (0) | 2022.01.12 |
[Java] 기본 클래스 (Math, Random, StringTokenizer) (0) | 2022.01.12 |
[Java] BigInteger, BigDecimal 클래스 (0) | 2022.01.11 |