📚 이것이 자바다 [개정판]
- 결정되지 않은 타입을 파라미터로 처리하고 객체 생성 시점에 구체적인 타입으로 대체하는 기능
- 제네릭 타입으로 선언 후 구체적인 타입을 지정하지 않으면 Object 타입이 암묵적으로 사용된다
✨ 타입 파라미터를 대체하는 타입은 클래스 및 인터페이스이다
✨ 기본 타입은 타입 파라미터의 대체 타입이 될 수 없다
public class Box<T> { // 결정되지 않은 content의 타입을 T라는 파라미터로 정의
public T content;
}
Box<String> box = new Box<String>(); // 타입 파라미터를 String으로 대체
box.content = "안녕";
String content = box.content; // 강제 타입 변환 필요 없이 String값을 얻음
// 변수 선언할 때와 동일한 타입으로 호출하고 싶으면
// 생성자 호출 시 생성자에는 타입을 명시하지 않고 <>만 붙일 수 있다
Box<Integer> box = new Box<>(); // 타입 파라미터를 Integer으로 대체
Integer box = box.content;
// 타입 파라미터가 메소드 선언부에서 정의된다
public <타입파라미터> 리턴타입 메소드명(매개변수) {}
class Box<T> {
private T t;
public T getT() {
return t;
}
}
public class GenericEx5 {
public static <T> Box<T> boxing(T t) { // 메소드 생성
Box<T> box = new Box<T>();
box.setT(t);;
return box;
}
public static void main(String[] args) {
Box<Integer> box1 = boxing(100); // 메소드 호출
int intValue = box1.getT();
System.out.println(intValue);
Box<String> box2 = boxing("hi");
String strValue = box2.getT();
System.out.println(strValue);
}
}
- 타입 파라미터를 대체하는 구체적인 타입을 제한할 필요가 있다
- 예를 들어 숫자 연산을 위한 제네릭 메소드는 Number 또는 정수, 실수 클래스로 제한된다
- 이처럼 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 것을 제한된 타입 파라미터라 한다
public <T extends 상위타입> 리턴타입 메소드(매개변수) { }
public <T extends Number> boolean compart(T t1, T t2) {
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
return (v1 == v2);
}
// 1. 대체타입으로 Student와 자식 클래스인 HighStudent와 MiddleStudent만 가능
리턴타입 메소드명(제네릭타입<? extends Student> 변수) {}
// 2. 대체타입으로 Worker와 부모 클래스인 Person만 가능
리턴타입 메소드명(제네릭타입<? super 부모클래스> 변수) {}
// 3. 어떤 타입이든 가능
리턴타입 메소드명(제네릭타입<?> 변수) {}