JAVA/이것이 자바다
이것이 자바다 | 13장 제네릭
한 면만 쓴 종이
2022. 8. 3. 18:08
📍제네릭을 사용해야 하는 이유
📎컴파일 시 강한 타입 체크를 할 수 있음
📎타입 변환(casting)을 제거함
📍제네릭 타입 (class<T>, interface<T>)
📎모든 종류의 객체를 저장(Object)하면서 타입 변환이 발생하지 않도록 하는 방법 => 제네릭
Box<String> box = new Box<String>();
// Box 클래스 내부
public class Box<String> {
private String t;
public void set(String t) { this.t = t; }
public String get() { return t; }
}
📍멀티 타입 파라미터 (class<K, V, ...>, interface<K, V, ...>)
📎제네릭 타입은 두 개 이상의 멀티 파라미터 사용이 가능함
Product<Tv, String> product1 = new Product<Tv, String>(); // new Product<>(); 도 가능
product1.setKind(new Tv());
product2.setModel("스마트Tv");
Tv tv = product1.getKind();
String tvModel = product1.getModel();
📍제네릭 메소드 (<T, R> R method(T t))
📎제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말함
📎제네릭 메소드 선언 방법
public <타입파라미터, ...> 리턴타입 메소드명(매개변수, ...) {...}
// 예시
public <T> Box<T> boxing(T t) {...}
📍제한된 타입 파라미터 (<T extends 최상위타입>)
📎타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 제한돈 파라미터가 선언됨
상위 타입에는 인터페이스도 들어갈 수 있음
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ... }
📎메소드의 중괄호 {} 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버로 제한됨
public <T extends Number> int compare(T t1, T t2) {
double v1 = t1.doubleValue();
double v2 = t2.doubleValue();
return Double.compare(v1, v2);
}
📍와일드카드 타입 (<?>, <? extends...>, <? super ...>)
📎보통 ?를 와일드카드라고 부름
제네릭타입<?> : 제한 없음
제네릭타입<? extends 상위타입> : 상위 클래스 제한
제네릭타입<? super 하위타입> : 하위 클래스 제한
📍제네릭 타입의 상속과 구현
제네릭 타입도 다른 타입처럼 부모 클래스가 될 수 있음
public class ChildProduct<T, M> extends Product<T, M> {...}