μμΌλ μΉ΄λ (WildCards)
μ λ€λ¦ μ½λμμ λ¬Όμν (?) λ μμΌλ μΉ΄λλΌκ³ λΆλ¦°λ€. μμΌλ μΉ΄λλ unkonwn type μ μλ―Ένλ€.
μμΌλ μΉ΄λλ λ§€κ°λ³μμ νμ
, νλ νΉμ μ§μ λ³μμ λ¦¬ν΄ νμ
λ±μ νμ©λλ€.
μμΌλ μΉ΄λλ μ λ€λ¦ λ©μλ νΈμΆ νΉμ μ λ€λ¦ ν΄λμ€μ μΈμ€ν΄μ€νμλ μ¬μ©λ μ μλ€.
Upper Bounded Wildcards
- λ³μμ λν μ νμ μν νκ³ μΆμ κ²½μ° Upper Bounded Wildcardsλ₯Ό μ¬μ©ν μ μμ΅λλ€.
- μλ₯Όλ€μ΄ List<Integer>, List<Doublce> and List<Number> νμ μ λͺ¨λ λ°μ μ μλ λ©μλλ₯Ό μμ±νκ³ μΆμ κ²½μ° Upper Bounded Wildcardsλ₯Ό μ¬μ©νλ©΄ λ©λλ€.
Upper Bounded Wildcardsλ₯Ό μ μΈνκΈ° μν΄μλ wildcard character(β?β)μ
extends
ν€μλλ₯Ό λ¬λ©΄ λ©λλ€. λ°μ΄λλ νμ
νλΌλ―Έν°μ λ§μ°¬κ°μ§λ‘ μ΄ λ¬Έλ§₯μμ extends λ νμ₯(extends)κ³Ό ꡬν(implements)μ ν¬κ΄ν©λλ€.public static void process(List
<? extends Foo>
list) { /* ... */ }
static void process(List<? extends Foo> list) { Foo foo = list.get(0); for (Foo elem : list) { // ... } }
foreach λ¬Έμ elem λ³μλ Fooλ‘ μ μΈλλ©° Fooμ λ©μλλ₯Ό νμ©ν μ μμ΅λλ€.
Unbounded Wildcards
- unbounded wildcard νμ μ whildcard character(β?β)μ νΉλ³ν μ¬μ©λ²μ λλ€.
- μλ₯Όλ€μ΄ List<?> λ list of unkown type μ΄λΌκ³ λΆλ₯΄λ©° μ΄λ° μ μΈμ΄ μ μ©ν λκ°μ§ μλ리μ€κ° μμ΅λλ€.
- μμ±νλ €λ λ©μλμ ꡬνμ΄ Object ν΄λμ€μ κΈ°λ₯λ§μΌλ‘ μΆ©λΆν λ
- μ λ€λ¦ ν΄λμ€μ λ©μλλ₯Ό μμ±ν λ λ©μλμ ꡬνμ΄ μ λ€λ¦ ν΄λμ€μ νμ μΈμμ μμ‘΄μ μ΄μ§ μμ κ²½μ°
- e.g. List.size or List.claer
μλλ¦¬μ€ 1. μμ±νλ €λ
printList(List )
μ ꡬνμ Object
ν΄λμ€μ toString
λ©μλ λ§μΌλ‘ μΆ©λΆν¨public static void printList(List<Object> list) { for (Object elem : list) System.out.println(elem + " "); System.out.println(); }
printList λ μ΄λ νμ
μ΄λΌλ 루νλ₯Ό λλ©° μΆλ ₯νκ³ μΆλ€.
νμ§λ§ μμ ꡬνμ κ·Έ λͺ©μ μ λ¬μ±ν μ μλ€. μμ νμ΅νμλ μ λ€λ¦κ³Ό μλΈνμ
μ λ°λΌ List<Object>λ List<Integer> νμ
μ λ°μ μ μκ³ ν΄λΉ λ©μλλ₯Ό μ€ννκΈ° μν΄μλ μ νν List<Object> νμ
μ νλΌλ―Έν°λ§ μ λ¬ λ°μ μ μλ€.

unbounded wildcard λ₯Ό ν΅ν΄ λͺ©μ μ λ¬μ±ν μ μλ€.
public static void printList(List<?> list) { for (Object elem: list) System.out.print(elem + " "); System.out.println(); }
μμμ ꡬ체 νμ
A
μ λν΄μ List<A>λ List<?> μ μλΈ νμ
μ΄λ€
List<Object>
μ List<?>
μ μ°¨μ΄λ₯Ό μλκ²μ΄ μ€μνλ€. μ΄ λμ μλΈ νμ
μ λν΄μ μ°¨μ΄λ₯Ό κ°μ§ λΏλ§ μλλΌ μ½μ
μ λν΄μλ μ°¨μ΄λ₯Ό κ°μ§λ€. List<Object>
μλ Object
νΉμ μ무 Object
μ μλΈνμ
κ°μ²΄λ₯Ό λ£μ μ μμ§λ§ List<?>
μλ null
λ§ λ£μ μ μλ€.Lower Bounded Wildcards
Upper Bounded Wildcards μΉμ
μμλ Upper Bounded Wildcards κ° unknown type μ νΉμ νμ
μ μλΈ νμ
μΌλ‘ μ ννλ€λ κ²κ³Ό κ·Έκ²μ΄
extends
ν€μλλ₯Ό μ¬μ©νλκ²μ μ΄ν΄λ³΄μμ΅λλ€.λΉμ·νκ² Lower Bounded Wildcards λ unkown typeμ νΉμ νμ
μ μνΌ νμ
(λΆλͺ¨)λ‘ μ ν νκ³
super
ν€μλλ₯Ό μ¬μ©ν©λλ€. <? super A>
Integer κ°μ²΄λ₯Ό 리μ€νΈμ λ£λ λ©μλλ₯Ό μμ±ν λ Lower Bounded Wildcards λ₯Ό νμ©νλ€λ©΄ Integer κ°μ²΄λ₯Ό λ΄μ μ μλ Number, Object νμ
μ νλΌλ―Έν°λ μ²λ¦¬ν μ μμ΅λλ€.
public static void addNumbers(List<? super Integer> list) { for (int i = 1; i <= 10; i++) { list.add(i); } }
μμΌλ μΉ΄λμ μλΈ νμ Wildcards and Subtyping


- κΈ°λ³Έμ super, extends λ₯Ό λͺ¨λ μνΌ νμ μΌλ‘ κ°μ§
- λκΉμ§ κ°λ©΄ κΌ unbounded wildcards λ₯Ό μνΌ νμ μΌλ‘ κ°μ§
μμΌλ μΉ΄λ μΊ‘μ³μ ν¬νΌ λ©μλ (Wildcard Capture and Helper Methods)
μ»΄νμΌλ¬κ° μμΌλ μΉ΄λμ νμ
μ μΆλ‘ νλ κ²½μ°κ° μλ€.
μ΄λ₯Ό Wildcard CaptureλΌκ³ λΆλ₯Έλ€. λλΆλΆμ κ²½μ° Wildcard Captureλ κ±±μ νμ§ μμλ λμ§λ§ μλ¬ λ©μμ§μ βcapture of β κ΅¬λ¬Έμ΄ μμΌλ©΄ ν΄κ²°ν΄ μ£Όμ΄μΌ νλ€.
public class WildcardError { void foo(List<?> i) { i.set(0, i.get(0));//μ»΄νμΌ μλ¬ } }
i.get(0)λ₯Ό νλ©΄ Object κ°μ²΄λ₯Ό λ°ννκ³ μ΄λ₯Ό List<?> iμ set ν μ μλ€λ μλ¬μ΄λ€. iμ λ£μ΄μ€ μ μλ κ²μ nullλ°μ μλ€.
μ λ€λ¦μ λμ
ν μ΄μ μ€ νλμΈ μ»΄νμΌ νμμ μλ¬ μ‘κΈ°λ₯Ό μ»΄νμΌλ¬κ° μ΄μ¬ν μννκ³ μκΈ° λλ¬Έμ μλ¬κ° λ°μνλ κ²μ΄λ€.
νμ§λ§ μ μ½λλ 리μ€νΈμ 0λ²μ§Έ μΈλ±μ€ κ°μ κΊΌλ΄μ 0λ²μ§Έ μΈλ±μ€μ λ£λ νμ
μ μ ν λ¬Έμ κ° μλ μ½λμ΄λ€. μ΄κ²½μ° private ν¬νΌ λ©μλλ₯Ό ν΅ν΄ μ»΄νμΌλ¬μκ² μμ μ μλλ₯Ό μ릴 μ μλ€.
public class WildcardFixed { void foo(List<?> i) { fooHelper(i); } // Helper method created so that the wildcard can be captured // through type inference. private <T> void fooHelper(List<T> l) { l.set(0, l.get(0)); } }
Guidelines for Wildcard Use
