본문 바로가기
Java/Java

[Java] 와일드카드(Wildcard)

by 기록하는_사람 2022. 10. 18.

와일드카드(Wildcard)

📌 와일드카드(Wildcard)

 

📌 제네릭 메소드와 와일드 카드 기반 메소드는 기능적으로 같은 역할을 함.

→ 상호 대체 가능.

 

📌 와일드 카드(Wildcard) 사용 이유

: 코드 간결. 

 

📄 WildcardTest.java

package generics;

class Box4<T> {  // 제네릭 기반의 클래스. 
	private T ob;
	public void set(T o) { ob = o; }
	public T get() { return ob; }
	
	@Override
	public String toString() {
		return ob.toString();
	}
}

class Unboxer {
	public static <T> T openBox(Box4<T> box) {
		return box.get();
	}
	
	// public static <T> void peekBox(Box4<T> box) {  // 제네릭 메소드. 
	public static void peekBox(Box4<?> box) {  // 와일드 카드.
		System.out.println(box);
	}
}

public class WildcardTest {

	public static void main(String[] args) {
		Box4<String> box = new Box4<>();
		
		box.set("Hello");
		
		Unboxer.peekBox(box);  // Hello
	}

}

 

와일드카드(Wildcard) - 상한 제한, 하한 제한

📌 상한 제한된 와일드 카드(Upper-Bounded Wildcards)

Box<? extends Number> box

→ Box<T> 인스턴스를 참조하는 참조변수 box.

     Box<T>  인스턴스의 T는 Number 또는 Number을 상속하는 하위 클래스여야 함. 

public static void peekBox(Box<? extends Number> box) {
	Systmem.out.println(box);
}

  Box<Integer>, Box<Double>과 같은 제네릭 타입의 인스턴스만 인자로 받을 수 있음. 

 

📌 하한 제한된 와일드 카드(Lower-Bounded Wildcards)

Box<? super Integer> box

Box<T> 인스턴스를 참조하는 참조변수 box.

     Box<T> 인스턴스의 T는 Integer 또는 Integer가 상속하는 클래스여야 함.

public static void peekBox(Box<? super Integer> box) {
	System.out.println(box);
}

Box<Integer>, Box<Number>, Box<Object>만 인스턴스 인자로 받을 수 있음. 

 

댓글