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> {...}