시냅스

[Java] Generic - 와일드 카드 Wildcard 본문

Java, Spring

[Java] Generic - 와일드 카드 Wildcard

ted k 2022. 7. 11. 23:02

와일드카드(Wildcard) <?>

와일드 카드는 모든 타입을 대신할 수 있는 타입이다.

와일드 카드는 정해지지 않은 unknown type 이기 때문에 모든 타입에 대한 호출이 가능하다.

 

상한 경계 와일드 카드

<? extends T> - ? 는 앞으로 들어올 타입으로 T의 자손 객체 타입이어야 한다.

 

하한 경계 와일드 카드

<? super T> - ? 는 앞으로 들어올 타입으로 T이거나 조상 객체 타입이어야 한다.

 

getter 와 setter에서 상항/하한 경계 와일드 카드 사용으로 발생할 수 있는 문제를 아래 코드를 통해 알아본다.

예시 코드

class Box<T> {
    protected T ob;

    public T getOb() {
        return ob;
    }

    public void setOb(T ob) {
        this.ob = ob;
    }

    @Override
    public String toString() {
        return ob.toString();
    }
}

class Toy {
    @Override
    public String toString() { return "I am a Toy"; }
}

class BoxHandler {
    public static void outBox(Box<? extends Toy> box) {
        // 박스가 참조하는 인스턴스를 대상으로 꺼내는 작업만 허용하겠다는 의미
        // 아래에서 box.set은 컴파일 에러
        // 매개변수로 toy 인스턴스를 저장할 수 있는 상자만 전달된다는 사실을 보장할 수 없기 때문에
        // ? 가 toy보다 작은애라 set안됨
        Toy t = box.getOb();
        // box.set(); 컴파일 에러
        System.out.println(t);
    }
    public static void inbox(Box<? super Toy> box, Toy n) {
        // 박스가 참조하는 인스턴스 대상으로 넣는 작업만 허용하겠다는 의미
        // get 메소드는 반환되는 값을 저장하기 위해 선언한 참조변수의 형을 Toy로 결정했다는 사실에서 문제가 발생
        // super 면 반환 타입이 toy 이거나 Toy 이상이라 get 안됨
        box.setOb(n);
        // box.get(); 컴파일 에러
    }
}

public class BoundedWildcardUsage2 {
    public static void main(String[] args) {
        Box<Toy> box = new Box<>();
        BoxHandler.inbox(box, new Toy());
        BoxHandler.outBox(box);
    }
}

'Java, Spring' 카테고리의 다른 글

IOC와 DI, 컨테이너  (0) 2022.07.25
좋은 객체 지향 설계의 5가지 원칙 (SOLID)  (0) 2022.07.15
[Java] 객체지향(OOP) 관련 용어 정리  (0) 2022.07.15
[JAVA] Equals와 hashcode  (0) 2022.07.11
자바 가상 머신, JVM이란  (0) 2022.07.11
Comments