Generic
μμνκΈ°μ μμ κ΄λ ¨ μ©μ΄λ₯Ό μ λ¦¬ν΄ λκ²μ΄λ€.
νκΈ | μμ΄ | μ |
맀κ°λ³μν νμ | parameterized type |
|
μ€μ νμ 맀κ°λ³μ | actual type parameter |
|
μ λ€λ¦ νμ | generic type |
|
μ κ· νμ 맀κ°λ³μ | formal type parameter |
|
λΉνμ μ μμΌλμΉ΄λ νμ | unbounded wildcard type |
|
λ‘ νμ | raw type |
|
νμ μ νμ 맀κ°λ³μ | bounded type parameter |
|
μ¬κ· νμ νμ | recursive type bound |
|
νμ μ μμΌλμΉ΄λ νμ | bounded wildcard type |
|
μ λ€λ¦ λ©μλ | generic method |
|
νμ ν ν° | type token |
|
Genericμ΄λ 무μμΌκΉ?
JDK 1.5μ μ²μ λμ λμμΌλ©°, μ λ€λ¦μ ν΄λμ€ λ΄λΆμμ μ¬μ©ν λ°μ΄ν° νμ μ μΈλΆμμ μ§μ νλ κΈ°λ²μ μλ―Ένλ€.(μνμ½λ© )
μμ μμ λ₯Ό 보면 Fruit
μΈμ€ν΄μ€λ₯Ό μμ±ν λ, Apple
, Banana
λ₯Ό λ£μ΄ νμ
μ μ§μ νκ³ μλ€. μ¦, ν΄λμ€λ₯Ό μ μ ν λλ μ΄λ€ νμ
μ΄ λ€μ΄μ¬μ§ νμ νμ§ μκ³ , μΈμ€ν΄μ€λ₯Ό μμ±ν λ λ°μ΄ν° νμ
μ μ§μ νλ κΈ°λ₯μ΄λ€.
μ μ λ€λ¦μ μ¬μ©ν κΉ?
Genericμ ν΄λμ€μ μΈν°νμ΄μ€, λ©μλλ₯Ό μ μν λ νμ μ νλΌλ―Έν°λ‘ μ¬μ©ν μ μκ² νλ€. Generic νμ μ μ΄μ©ν¨μΌλ‘μ¨ μλͺ»λ νμ μ΄ μ¬μ©λ μ μλ λ¬Έμ λ₯Ό μ»΄νμΌ κ³Όμ μμ μ κ±°ν μ μκ²λμλ€. νμ νλΌλ―Έν°λ μ½λ μμ± μ ꡬ체μ μΈ νμ μΌλ‘ λ체λμ΄ λ€μν μ½λλ₯Ό μμ±νλλ‘ ν΄μ€λ€.
μ»΄νμΌ μ κ°ν νμ
체ν¬λ₯Ό ν μ μλ€.
μ»΄νμΌ μΈμ΄μ κΈ°λ³Έμ λͺ¨λ μλ¬λ μ»΄νμΌμ΄ λ°μν μ μλλ‘ νλ κ²μ΄ μ’λ€.(μ€λ₯λ 빨리 λ°κ²¬ν μλ‘ μ’λ€.) λ°νμμ μ€μ λ‘ μ ν리μΌμ΄μ μ΄ λμνκ³ μλ μν©μ΄κΈ° λλ¬Έμ λ°νμμ λ°μνλ μλ¬λ νμ μ¬κ°ν λ¬Έμ λ₯Ό μ΄λν μ μκΈ° λλ¬Έμ΄λ€.
μλ μ±κ³΅μ μΌλ‘ μ»΄νμΌλμ§λ§, λ°νμμ ClassCastException
μ΄ λ°μνλ κ²μ 보μ¬μ£Όλ μμ μ΄λ€. μ΄λ Generic Typeμ μ¬μ©ν΄ μ»΄νμΌ νμμ μ€λ₯λ₯Ό λ°κ²¬ν μ μλλ‘ ν μ μλ€.
Generic typeμΌλ‘ λ³κ²½ νμλ java: incompatible types: java.lang.String cannot be converted to int
μ»΄νμΌ μ€λ₯κ° λ°μνλ κ²μ νμΈν μ μλ€.
μ¦, μ»΄νμΌ λ¨κ³μμ μ€λ₯ κ²μΆμ΄ κ°λ₯νλ©°, νμ μμ μ±μ μΆκ΅¬ν μ μκ²λλ€.
νμ
λ³ν(casting)μ μ κ±°νλ€.
Generic Type
Generic Typeμ νμ
μ νλΌλ―Έν°λ‘ κ°μ§λ ν΄λμ€(class<T>
)μ μΈν°νμ΄μ€(interface<T>
)λ₯Ό λ§νλ€.
νμ νλΌλ―Έν°λ λ³μλͺ κ³Ό λμΌν κ·μΉμΌλ‘ μμ±λ μ μμ§λ§, μΌλ°μ μΌλ‘ λλ¬Έμ νκΈμλ‘ νννλ€. Generic Typeμ μ€μ μ½λμμ μ¬μ©νλ €λ©΄ νμ νλΌλ―Έν°μ ꡬ체μ μΈ νμ μ μ§μ ν΄μΌνλ€.
μμ μ½λμμ ν΄λμ€ νλ νμ μ Objectλ‘ μ μΈν μ΄μ λ νλμ λͺ¨λ μ’ λ₯μ κ°μ²΄λ₯Ό μ μ₯νκ³ μΆμ΄μμ΄λ€. Objectλ λͺ¨λ μλ° ν΄λμ€μ μ΅μμ μ‘°μ(λΆλͺ¨) ν΄λμ€μ΄λ€. μμ κ°μ²΄λ λΆλͺ¨νμ μ λμ ν μ μκΈ° λλ¬Έμ λͺ¨λ μλ° κ°μ²΄λ Objectνμ μΌλ‘ μλ νμ λ³νλμ΄ μ μ₯λλ€.
λ€μκ³Ό κ°μ΄ getμΌλ‘ κ°μ Έμ€κΈ°μν΄μλ κ°μ νμ λ³νμ΄ νμνλ€.
Object νμ μ μ¬μ©νλ©΄ λͺ¨λ μ’ λ₯μ μλ° κ°μ²΄λ₯Ό μ μ₯ν μ μλ€λ μ₯μ μ μμ§λ§, μ μ₯ν λμ μ½μ΄μ¬ λ νμ λ³νμ΄ λ°μνλ©°, μ¦μ νμ λ³νμ μ 체 νλ‘κ·Έλ¨ μ±λ₯μ μ’μ§ λͺ»ν κ²°κ³Όλ₯Ό κ°μ Έμ¬ μ μλ€.
Genericμ ν΅ν΄μ νμ λ³νμ΄ λ°μνμ§ μλλ‘ ν μ μλ€.
μ¬κΈ°μ Tλ ν΄λμ€λ‘ κ°μ²΄λ₯Ό μμ±ν λ ꡬ체μ μΈ νμ μΌλ‘ λ³κ²½λλ€. κ·Έλ κΈ° λλ¬Έμ μ μ₯ν λμ μ½μ΄μ¬ λ νμ λ³νμ΄ λ°μνμ§ μλλ€. μ΄μ κ°μ΄ genericμ ν΄λμ€ μ€κ³μ ꡬ체μ μ νμ μ λͺ μνμ§ μκ³ , νμ νλΌλ―Έν°λ‘ λ체νλ€κ° μ€μ ν΄λμ€κ° μ¬μ©λ λ ꡬ체μ μΈ νμ μ μ§μ ν¨μΌλ‘μ¨ νμ λ³νμ μ΅μνμν¨λ€.
νμ
νλΌλ―Έν°
νμ νλΌλ―Έν°μ μ΄λ¦μ μ§κΈ° λλ¦μ΄μ§λ§, μΌλ°μ μΌλ‘ λλ¬Έμ νκΈμλ‘ νν 보νΈμ μΌλ‘ μμ£Ό μ¬μ©νλ νμ 맀κ°λ³μλ λ€μκ³Ό κ°λ€.
νμ 맀κ°λ³μ | μλ―Έ |
| Element |
| Key |
| Number |
| Type |
| Value |
| 2nd, 3rd, 4th types |
λ€μ΄μλͺ¬λ <>
<>
μ λ€λ¦ νμ
λ³μ μ μΈκ³Ό κ°μ²΄ μμ±μ λμμ ν λ νμ
νλΌλ―Έν°μ ꡬ체μ μΈ νμ
μ μ§μ νλ μ½λκ° μ€λ³΅λ μ μλ€. κ·Έλ κΈ° λλ¬Έμ μλ°7μμ λΆν°λ <>
(λ€μ΄μλͺ¬λμ°μ°μ)λ₯Ό μ 곡νλ€. μλ° μ»΄νμΌλ¬λ νμ
νλΌλ―Έν° λΆλΆμ <>
μ°μ°μλ₯Ό μ¬μ©νλ©΄ νμ
νλΌλ―Έν°λ₯Ό μ μΆν΄μ μλμΌλ‘ μ€μ ν΄μ€λ€.
λ€μ€ νμ
νλΌλ―Έν°(Multiple Type Parameters)
Generic Typeμ λ κ° μ΄μμ λ©ν° νμ νλΌλ―Έν°λ₯Ό μ¬μ©ν μ μλ€. μ΄ κ²½μ° κ° νμ νλΌλ―Έν°λ₯Ό μ½€λ§λ‘ ꡬλΆνλ€.
Raw Types
Raw typeμ νμ νλΌλ―Έν°κ° μλ μ λ€λ¦ νμ μ μλ―Ένλ€.
Raw typeμ Javaκ° μ λ€λ¦μ λμ νκΈ°μ (JDK 5.0) μ΄μ κΈ°μ‘΄ μ½λμμ νΈνμ±μ 보μ₯νκΈ° μν΄μ μ 곡νκ³ μλ κ²μ΄λ€.
νμ§λ§, raw typeμ paratmeterized typeμΌλ‘ μ€μ νλ©΄ κ²½κ³ λ¬Έκ΅¬λ₯Ό λ³Ό μ μλ€.
λν, raw typeμ μ¬μ©ν΄, μ λ€λ¦ νμ μ μ λ€λ¦ λ©μλλ₯Ό νΈμΆνλ κ²½μ°μλ κ²½κ³ κ° νμλλ€.
μ κ²½κ³ λ raw typeμ΄ generic type κ²μ¬λ₯Ό μλ΅ν΄ μμ νμ§ μμ μ½λκ° λ°νμμμ λ°κ²¬λ μλ μλ€λ κ²½κ³ λ¬Έκ΅¬μ΄λ€. κ·Έλ¬λ―λ‘, raw typeμ μ΅λν μ¬μ©νμ§ μλ κ²μ΄ μ’μΌλ©°, μμΈν λ΄μ©μ [effective java - ITEM 26]μμ νμΈν μ μλ€.
Generic Method
μΌλ° ν΄λμ€μ λ©μλμμ νμ 맀κ°λ³μλ₯Ό μ¬μ©ν΄ μ μ κ°λ₯
μ λ€λ¦ λ©μλμμ νμ 맀κ°λ³μ λ²μλ λ©μλ λ΄λΆλ‘ μ νλλ€.
μ λ€λ¦ ν΄λμ€μ μμ±μμμλ μ¬μ© κ°λ₯
Generic Methodλ 맀κ°νμ κ³Ό λ¦¬ν΄ νμ μΌλ‘ νμ νλΌλ―Έν°λ₯Ό κ°λ λ©μλμ΄λ€.
νμ
맀κ°λ³μ <T>
λ λ°λμ λ©μλμ μμμ(public
, static
)μ λ°νν μ¬μ΄μ μμΉλμ΄μΌνλ€.
Generic λ©μλλ λ€μκ³Ό κ°μ΄ νΈμΆλ μ μλ€.
Util.<Integer, String>compare(p1, p2)
κ³Ό κ°μ΄ νμ
μ λͺ
μμ μΌλ‘ μΌμ§λ§, λ€μκ³Ό κ°μ΄ μλ΅ν΄λ μ»΄νμΌλ¬κ° μ μΆν μ μλ€.
μ νλ νμ
νλΌλ―Έν°(<T extends μ΅μμνμ
>
)
<T extends μ΅μμνμ
>
)νμ
νλΌλ―Έν°μ μ§μ λλ ꡬ체μ μΈ νμ
μ μ νν νμκ° μ’
μ’
μλ€. μ«μλ₯Ό μ°μ°νλ μ λ€λ¦ λ©μλμ 맀κ°κ°μΌλ‘λ Number
νμ
λλ κ·Έ νμ ν΄λμ€ νμ
(Integer
, Double
, Long
, Short
, ...) μ μΈμ€ν΄μ€λ§ κ°μ ΈμΌνλ€. μ΄λ¬ν μ΄μ λ‘ μ νλ νμ
νλΌλ―Έν°κ° νμν κ²½μ°κ° μλ€.
μμ νμ
μ ν΄λμ€λΏλ§ μΈν°νμ΄μ€λ κ°λ₯νλ€. νμ§λ§ μΈν°νμ΄μ€λΌκ³ ν΄μ implementsλ₯Ό μ¬μ©νμ§ μλλ€.( extends
μ¬μ©)
νμ νλΌλ―Έν°μ ꡬ체μ νμ : μμνμ , μμνμ μ νμ λλ ꡬνν΄λμ€
{}
μμμμ νμ νλΌλ―Έν° λ³μ : μμ νμ μ λ©€λ²(νλ, λ©μλλ‘ μ ν)
μ¬κΈ°μ μ£Όμν μ μ ν¨μ λ΄μμ νμ
νλΌλ―Έν° λ³μλ‘ μ¬μ©ν κ²μ μμ νμ
μ λ©€λ²(νλ, λ©μλ)λ‘ μ νλλ€λ μ μ΄λ€. doubleValue()
λ Number
ν΄λμ€μ λ©μλμ΄κΈ°λλ¬Έμ μ¬μ©ν μ μλ κ²μ΄λ€.
Muliple Bounds
μ νλ νμ νλΌλ―Έν°λ₯Ό μ¬λ¬κ°λ‘ μ€μ ν μ μλ€.
μ¬κΈ°μ D
ν΄λμ€μ νμ
νλΌλ―Έν°λ A
, B
, C
λͺ¨λ μ νμ νμ ν΄λμ€μ¬μΌνλ©°, μ΄μ€ νκ°κ° ν΄λμ€μΈ κ²½μ° λ°λμ λ¨Όμ μ μΈλμ΄μΌνλ€.
μμ κ°μ΄ A
κ° ν΄λμ€μ΄μ§λ§, μΈν°νμ΄μ€μΈ B
λ³΄λ€ λ¦κ² μ μΈλλ€λ©΄ μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
Generic Methodμ Bounded Type Parameter
μ νλ νμ νλΌλ―Έν°(Bounded Type Parameter)λ μ λ€λ¦ μκ³ λ¦¬μ¦μ ꡬνν λ ν΅μ¬μ΄λλ€.
μ λ©μλλ μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
>
μ°μ°μλ κΈ°λ³Έν(int
, short
, double
, long
...)μλ§ λμμ΄ νμ©λκΈ° λλ¬Έμ΄λ€. μ¦, >
μ°μ°μλ κ°μ²΄κ° λΉκ΅μ μ¬μ©ν μ μμΌλ©°, Comparable
μΈν°νμ΄μ€λ₯Ό μ¬μ©ν΄ ν΄λΉ μ€λ₯λ₯Ό ν΄κ²°ν μ μλ€.
Comparable
μΈν°νμ΄μ€λ‘ μ νλ νμ
μ μ¬μ©ν΄ κ°μ²΄λ₯Ό λΉκ΅ν μ μλ€.
Generics, Inheritance, Subtypes
νμ
κ° νΈνμ΄λλ€λ©΄, νΉμ νμ
μ κ°μ²΄λ₯Ό λ€λ₯Έ νμ
μ ν λΉμ΄ κ°λ₯νλ€. Object
λ Integer
μ μμ ν΄λμ€μ΄κΈ° λλ¬Έμ ν λΉμ΄ κ°λ₯νλ€. κ°μ²΄μ§ν₯ μ΄λ‘ μμλ μ΄λ¬ν κ²½μ°λ₯Ό "is a" κ΄κ³λΌκ³ λΆλ₯Έλ€. "Integer is a Object" μ΄λ―λ‘ Objectμ Integerκ° ν λΉμ΄ κ°λ₯ν κ²μ΄λ€.
λν, "Integer is a Number" μ΄λ―λ‘ μ μμ μ½λ λν μ μλνλ κ²μ λ³Ό μ μλ€.
μ΄λ¬ν κ·μΉμ μ λ€λ¦μμλ λκ°μ΄ μ μ©λλ€. μ λ€λ¦ νμ νΈμΆμ, νμ μΈμκ° "is a" κ΄κ³λΌλ©΄ νμ μΈμλ‘ μ λ¬ν μ μλ κ²μ΄λ€.
μ¬κΈ°μ μ£Όμν΄μΌν λΆλΆμ΄ μλ€.
boxTest()
λ©μλμ μΈμλ‘ μ΄λ€ νμ
μ λ°μ μ μμκΉ? λλΆλΆ Box<Integer>
μ Box<Double>
μ΄ μ λ¬ κ°λ₯ν κ±°λΌκ³ μκ°ν κ²μ΄λ€. νμ§λ§, Box<Integer>
μ Box<Double>
μ Box<Number>
μ μλΈνμ
μ΄ μλκΈ° λλ¬Έμ μΈμκ°μΌλ‘ μ λ¬ ν μ μλ€.
Generic Classes and Subtyping
μ λ€λ¦ ν΄λμ€ μμ λλ μ λ€λ¦ μΈν°νμ΄μ€ ꡬνμ, λ ν΄λμ€κ° "is a" κ΄κ³λ₯Ό λ§λ€ μ μλ€.
μλ₯Ό λ€μ΄, Collection
ν΄λμ€λ₯Ό μ¬μ©ν λ, ArrayList<E>
λ List<E>
λ₯Ό ꡬννκ³ , List<E>
λ Collection<E>
λ₯Ό μμ λ°κ³ μλ κ²μ λ³Ό μ μλ€.
κ·Έλ¬λ―λ‘, ArrayList<String>
μ List<String>
μ Collection<String>
μ νμ νμ
μΌλ‘ "is a"κ΄κ³κ° μ±λ¦½νκ² λλ κ²μ΄λ€.
List<E>
μΈν°νμ΄μ€λ₯Ό μμλ°λ PayloadList
κ° λ€μκ³Ό κ°μ΄ μ μλμμ λ, PayloadList
λ λ€μκ³Ό κ°μ μλΈνμ
κ΄κ³κ° νμ±λ μ μλκ±Έ λ³Ό μ μλ€.
Type Inference(νμ
μΆλ‘ )
νμ μΆλ‘ μ μ»΄νμΌλ¬κ° κ° λ©μλ νΈμΆκ³Ό ν΄λΉ μ μΈμ κ²ν νκ³ νΈμΆμ μ μ©ν μ μκ² νλ μΈμλ₯Ό κ²°μ νλ λ₯λ ₯μ΄λ€. μΆλ‘ μκ³ λ¦¬μ¦μ μΈμμ μ νκ³Ό κ²°κ³Όκ° ν λΉλκ±°λ λ°νλλ μ νμ κ²°μ νκ³ , κ°μ₯ ꡬ체μ μΈ νμ μ μ°ΎκΈ° μν΄ λ Έλ ₯νλ€.
Type Inference and Generic Methods
μ μμ μμ μ λ€λ¦ λ©μλ addBox()
λ νμ
맀κ°λ³μ(U
)κ° μ μΈλμ΄μλ€. μΌλ°μ μΌλ‘ μ»΄νμΌλ¬λ ν΄λΉ μ λ€λ¦ λ©μλλ₯Ό νΈμΆνλ κ³³μ λ³΄κ³ νμ
νλΌλ―Έν°λ₯Ό μΆλ‘ ν μ μλ€. μ λ€λ¦ λ©μλ addBox
λ₯Ό νΈμΆν λ, ꡬ체μ μΈ νμ
맀κ°λ³μλ₯Ό μ£Όμ§ μμλ μ»΄νμΌλ¬κ° μλμΌλ‘ κ°μ μΆλ‘ ν μ μλ€.
κ·Έλ¬λ―λ‘, λλΆλΆ νμ μ ꡬ체μ μΌλ‘ μ μΈνμ§ μκ³ λ μ¬μ©ν μ μλ κ²μ΄λ€.
Type Inference and Instantiation of Generic Classes
μ λ€λ¦ ν΄λμ€λ₯Ό μμ±μλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±ν λ νμ
μΈμ λμ <>
λ€μ΄μλͺ¬λ μ°μ°μλ₯Ό μ¬μ©νλ©΄, μ»΄νμΌλ¬λ νμ
μΈμλ₯Ό μ μΆν μ μλ€.
μ λ€λ¦ ν΄λμ€μ μμ±μμ νμ
맀κ°λ³μνν μμ±μ λμ μλμ²λΌ <>
λ§ μ¬μ©νμ¬ μ μΈν μ μλ€.
νμ§λ§, <>
μ°μ°μλ₯Ό μ μΈνμ§ μμΌλ©΄, raw νμ
μ΄λ―λ‘ νμ
μΆλ‘ μ νμ§ μκΈ°λλ¬Έμ μ£Όμν΄μΌνλ€
Type Inference and Generic Constructors of Generic and Non-Generic Classes
μ λ€λ¦ ν΄λμ€μ λΉμ λ€λ¦ ν΄λμ€(non-generic) λͺ¨λ μ λ€λ¦ μμ±μλ₯Ό μ μΈν μ μλ€.
μ μ½λλ 맀κ°λ³μνλ νμ
MyClass
μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€. μ λ€λ¦ ν΄λμ€μΈ MyClass
μμ νμ 맀κ°λ³μ X
μ λν΄ Integer
νμ
μ λͺ
μμ μΌλ‘ μ§μ νκ³ μλ€. μ΄ μ λ€λ¦ ν΄λμ€μ μμ±μλ νμ λ§€κ° λ³μ T
λ₯Ό ν¬ν¨νκ³ μμΌλ©°, μ»΄νμΌλ¬λ μ΄ μ λ€λ¦ ν΄λμ€(MyClass
)μ μμ±μμ νλΌλ―Έν° νμ
μ΄ String
μΈ κ²μ μΆλ‘ ν μ μλ€. μλ° SE 7 μ΄μ μ μ»΄νμΌλ¬λ μ λ€λ¦ λ©μλμ μ μ¬ν μ λ€λ¦ μμ±μμ μ€μ νμ
νλΌλ―Έν°λ₯Ό μΆλ‘ ν μ μμΌλ©°, μλ° SE7 μ΄μ μ»΄νμΌλ¬λ <>
λ€μ΄μλͺ¬λ μ°μ°μλ₯Ό μ¬μ©νλ©΄, μ λ€λ¦ ν΄λμ€μ μ€μ νμ
νλΌλ―Έν°λ₯Ό μΆλ‘ ν μ μλ€.
μ μμμμ μ»΄νμΌλ¬λ μ λ€λ¦ ν΄λμ€ MyClass<X>
μ νμ
νλΌλ―Έν°κ° Integer
μμ μΆλ‘ ν μ μκ³ , μ΄ μ λ€λ¦ ν΄λμ€μ μμ±μμ νμ
νλΌλ―Έν° T
κ° String
μμ μΆλ‘ ν μ μλ€.
Target Types
νκ² νμ ννμμ μλ° μ»΄νμΌλ¬κ° μμνλ λ°μ΄ν° νμ μ΄λ€.
μ μ μΈλ¬Έμ 리ν΄νμ
μ List<String>
νμ
μΌλ‘ λ°κ³ μκΈ°λλ¬Έμ List<String>
λ₯Ό μμν μ μλ€. μ΄ λ°μ΄ν° νμ
μ λ°λ‘ target typeμ΄λΌ νλ€. emptyList()
λ©μλκ° List<T>
λ₯Ό λ°ννκΈ°λλ¬Έμ μ»΄νμΌλ¬λ T
κ° String
μ΄λΌκ³ μΆλ‘ ν μ μλ€.
λ¬Όλ‘ μμ κ°μ΄ T
νμ
μ λͺ
μ ν μ μμ§λ§, λ¬Έλ§₯μ String
μΈκ²μ΄ λͺ
λ°±νκΈ° λλ¬Έμ μ μ΄μ£Όμ§ μμλ λλ€. λͺ
μμ μΌλ‘ νμ
μ μ μΈν΄μ€μΌνλ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ.(Type witness)
μ μμ λ Java SE7μμ μ»΄νμΌ λμ§ μμΌλ©°, List<Object> cannot be converted to List<String>
μ€λ₯κ° λ°μνλ€. μ»΄νμΌλ¬λ T
μ νμ
μΈμκ° νμνμ§λ§, μ무κ²λ μ£Όμ΄μ§μ§ μμκΈ° λλ¬Έμ Object
λ₯Ό νμ
μΈμλ‘ κ°κ²λλ€. Collections.emptyList()
λ List<Object>
κ°μ²΄λ₯Ό λ°ννκΈ°λλ¬Έμ μ»΄νμΌ μ€λ₯λ₯Ό λ°μμν€λ κ²μ΄λ€. Java SE7μμλ λ°λμ νμ
κ°μ λͺ
μν΄μΌνλ€.
νμ§λ§, Java SE8 μ΄μλΆν°λ νκ² νμ
μ κ²°μ ν λ λ©μλμ μΈμ κ°λ μ΄νΌλλ‘ νμ₯λμμΌλ―λ‘, λͺ
μν΄μ€ νμκ° μμ΄μ‘λ€. μ¦, Collections.emptyList()
μ λ°ν κ°μΈ List<T>
κ° List<String>
μΈκ² μΆλ‘ μ΄ κ°λ₯ν΄μ‘κΈ° λλ¬Έμ Java SE8λΆν°λ μλ μμλ μ»΄νμΌ λλ€.
Wildcards (μμΌλμΉ΄λ)
μ λ€λ¦μμ unkwonνμ
μ νννλ ?
λ₯Ό μΌλ°μ μΌλ‘ μμΌλμΉ΄λλΌκ³ λΆλ₯Έλ€. μμΌλμΉ΄λλ νλΌλ―Έν°, νλ, μ§μλ³μ νμ
, 리ν΄νμ
λ± λ€μν μν©μμ μ°μ΄λ©°, μ λ€λ¦ λ©μλ νΈμΆ, μ λ€λ¦ ν΄λμ€ μΈμ€ν΄μ€ μμ±, μμ νμ
(super type)μ νμ
μΈμλ‘λ μ¬μ©λμ§ μλλ€.
μ½λ | μ’ λ₯ | μ€λͺ |
| Unbounded wildcards λΉνμ μ μμΌλ μΉ΄λ | μ ν μμ (νμ νλΌλ―Έν°λ₯Ό λμΉνλ ꡬ체μ νμ μΌλ‘ λͺ¨λ ν΄λμ€λ μΈν°νμ΄μ€ νμ μ΄ μ¬ μ μλ€.) |
| Upper Bounded Wildcards μν κ²½κ³ μμΌλμΉ΄λ | μμ ν΄λμ€ μ ν (νμ νλΌλ―Έν°λ₯Ό λμΉνλ ꡬ체μ νμ μΌλ‘ μμ νμ μ΄λ νμ νμ λ§ μ¬ μ μλ€.) |
| Lower Bounded Wildcards νν κ²½κ³ μμΌλμΉ΄λ | νμ ν΄λμ€ μ ν (νμ νλΌλ―Έν°λ₯Ό λμΉνλ ꡬ체μ νμ μΌλ‘ νμ νμ μ΄λ μμνμ μ΄ μ¬ μ μλ€.) |
μκ°μμ΄ λ μ μλ νμ μ΄ μλμ κ°λ€.
Person
Worker
Student
HighStudent
Course<?>
: μκ°μμ λͺ¨λ νμ (Person, Worker, Student, HightStudent)Course<? extends Students>
: μκ°μλ Studentμ HighStudentλ§ κ°λ₯Course<? super Worker>
: Worker, Personλ§ κ°λ₯
Unbounded Wildcards
List<?>
μ κ°μ΄ ?
μ ννλ‘ μ μλλ©°, λΉνμ μ μμΌλμΉ΄λ νμ
μ΄ μ¬μ©λ μ μλ μλ리μ€λ λ€μκ³Ό κ°λ€.
Object ν΄λμ€μμ μ 곡λλ κΈ°λ₯μ μ¬μ©νμ¬ κ΅¬νν μ μλ λ©μλλ₯Ό μμ±νλ κ²½μ°
νμ νλΌλ―Έν°μ μμ‘΄μ μ΄μ§ μμ μΌλ° ν΄λμ€μ λ©μλλ₯Ό μ¬μ©νλ κ²½μ°( ex)
List.clear
,List.size
,Class<?>
)
μ λ©μλμ λͺ©νλ μ΄λ ν νμ μ 리μ€νΈκ° μ€λλΌλ κ·Έ μμλ₯Ό μΆλ ₯νλ κ²μ΄λ€. νμ§λ§, μ μμ λ νκ°μ§ λ¬Έμ μ μ΄ μλ€.
List<Object>
μΈμ List<Integer>
, List<String>
, List<Double>
μ μΆλ ₯μ java: incompatible types:
μ»΄νμΌ μ€λ₯κ° λ°μνλ©° μ€ν¨νλ€. μλνλ©΄ List<Object>
μ νμνμ
μ΄ μλκΈ° λλ¬Έμ΄λ€.
λΉνμ μ μμΌλμΉ΄λ νμ
μ μ¬μ©νλ€λ©΄, μ±κ³΅μ μΌλ‘ μΆλ ₯λλ κ²μ μ μ μλ€. μλνλ©΄, μ΄λ ν νμ
Aκ° μλ List<A>
λ List<?>
μ νμ νμ
μ΄κΈ° λλ¬Έμ΄λ€.
λΉνμ μ μμΌλμΉ΄λ List<?>
μμ κ°μ Έμ¨ μμλ Object
νμ
μ΄λ€.
λΉνμ μ μμΌλ μΉ΄λλ μ΄λ ν νμ
μ΄ μλ μ½μ μ μλλ‘, λͺ¨λ νμ
μ κ³΅ν΅ μ‘°μμΈ Object
λ‘ λ°λλ€.
μ¬κΈ°μ μ£Όμν μ μ List<Object>
μ List<?>
μ΄ κ°μ§ μμΌλ©°, List<Object>
μλ Object
μ νμ νμ
μ λͺ¨λ λ£μ μ μμ§λ§, List<?>
μλ μ€μ§ null
λ§ λ£μ μ μλ€. μλνλ©΄ λΉκ²½κ³ μμΌλ μΉ΄λμ μμκ° μ΄λ ν νμ
μ΄ λ€μ΄μ€λ μ§ μ μ μμΌλ―λ‘, νμ
μμ μ±μ μ§ν€κΈ° μν΄ null
λ§ μΆκ°ν μ μλ€.
λ§μ½ λ€μκ³Ό κ°μ΄ λͺ¨λ νμ
μ λ£μ μ μκ² νλ€λ©΄, List<Integer>
μ Double
μ μΆκ°νλ λͺ¨μ λ°μνκ² λλ€. μ΄λ μ λ€λ¦μ νμ
μμ μ±μ μλ°νκ² λλ©°, null
λ§ μΆκ°ν μ μλλ‘ νλ€.
Upper Bounded Wildcards
μν κ²½κ³ μμΌλ μΉ΄λλ₯Ό μ¬μ©ν΄ λ³μμ λν μ νμ μνν μ μλ€. μλ₯Ό λ€μ΄, List<Integer>
, List<Double>
, List<Number>
μμλ§ λμνλ λ©μλλ₯Ό μν λ μν κ²½κ³ μμΌλ μΉ΄λλ₯Ό μ¬μ©νλ©΄λλ€.
List<Number>
λ μ€μ§ List<Number>
λ§ μ¬ μ μμΌλ―λ‘, Number
λ° Number
μ νμν΄λμ€κ° λͺ¨λ μ¬ μ μλ List<? extends Number>
λ³΄λ€ λ μ νμ μ΄λ€.
μ¦, <? extends T>
λ Tμ νμ νμ
λ§ μ¬ μ μλ€.
<? extends T>
μμ Getν μμλ T
μ΄λ€.
<? extends T>
μμ Getν μμλ T
μ΄λ€.μν κ²½κ³ μμΌλ μΉ΄λμ μμλ T
νΉμ T
μ νμ ν΄λμ€μ΄λ©°, μμλ€μ μ΅κ³ κ³΅ν΅ μ‘°μμΈ T
λ‘ μ½μΌλ©΄ μ΄λ€ νμ
μ΄ μ€λ T
λ‘ μ½μ μ μλ€.
μ¬κΈ°μ λ§μ½ νμ νμ
μΈ Integer
λ‘ νλ©΄ μ»΄νμΌ μ€λ₯κ° λ°μνλ€. μλνλ©΄, Double
μ Number
λ‘ κ°μ΄ λ€μ΄μ€κ² λλ©΄, Integer
λ‘ νμ
μ λ³νν μ μκΈ° λλ¬Έμ΄λ€.
List<? extends T>
μλ nullλ§ μ½μ
ν μ μλ€.
List<? extends T>
μλ nullλ§ μ½μ
ν μ μλ€.μνκ²½κ³ μμΌλμΉ΄λμ μμκ° μ΄λ€ νμ
μΈμ§ μ μ μκΈ° λλ¬Έμ null
λ§ μ½μ
ν μ μλ€.
Lower Bounded Wildcards
<? super T>
μ ννλ‘, List<? super T>
μ κ°μ΄ μ¬μ©νλ€. T
νΉμ T
μ μμ ν΄λμ€λ§ μΈμλ‘ μ¬ μ μλ€.
<? super T>
μμ Getν μμλ Object
μ΄λ€.
<? super T>
μμ Getν μμλ Object
μ΄λ€.T
νν κ²½κ³ μμΌλμΉ΄λμ μμλ T
μ μμ ν΄λμ€ μ€ μ΄λ ν νμ
λ μ¬ μ μλ€. μ΄λ ν νμ
μ΄ μλ μ½μ μ μλλ‘, T
λ€μ κ³΅ν΅ μ‘°μμΈ Object
λ‘ λ°λλ€. List<Integer>
, List<Double>
, List<Number>
κ° μλ λͺ¨λ μ½μ μ μλ€.
List<? super T>
μλ T
μ νμ ν΄λμ€λ§ μ½μ
ν μ μλ€.
List<? super T>
μλ T
μ νμ ν΄λμ€λ§ μ½μ
ν μ μλ€.λ§μ½ intsκ° List<Integer>
μΌ κ²½μ° Number
λ Integer
μ μμ ν΄λμ€ μ΄λ―λ‘ μμλ₯Ό μΆκ°ν μ μλ€. List<Integer>
, List<Number>
, List<Object>
μ€ μ΄λ ν 리μ€νΈκ° μ¬μ§ intsλ μμ§ λͺ»νλ€. νμ§λ§ κ·Έ μ€ μ΄λ ν 리μ€νΈκ° μ€λλΌλ, Integer
μ νμ ν΄λμ€λ μμλ‘ μΆκ°ν μ μλ€.
Wildcards and Subtyping
λΉμ λ€λ¦ ν΄λμ€μμλ μμ ν΄λμ€μ νμ ν΄λμ€λ₯Ό λμ ν μ μλ€.
νμ§λ§, μ λ€λ¦ ν΄λμ€μμλ μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
μλνλ©΄ List<B>
λ List<A>
μ νμ νμ
μ΄ μλλ©°, μλ¬΄λ° κ΄κ³κ° μλ€. List<B>
μ List<A>
μ κ³΅ν΅ μ‘°μμ List<?>
μ΄λ€. κ·Έλ λ€λ©΄, B
μ A
μ μμλ₯Ό λ°λ μ λ€λ¦ νμ
μ λ§λ€κ³ μΆμλλ μμ κ²½κ³ μμΌλμΉ΄λλ₯Ό μ¬μ©νλ©΄λλ€.
List<? extends Integer>
λ List<? extends Number>
μ νμ νμ
μ΄κΈ° λλ¬Έμ κ°λ₯νλ€. μλνλ©΄ Integer
μ νμ νμ
μ Number
μ νμνμ
μ΄κΈ° λλ¬Έμ, μλμ κ°μ κ΄κ³κ° μ±λ¦½λλ€.
Wildcard Capture
μ»΄νμΌλ¬λ μ΄λ ν κ²½μ°μ, μμΌλμΉ΄λμ νμ
μ μΆλ‘ νλ€. μλ₯Όλ€μ΄, List<?>
리μ€νΈκ° μ μλμ΄μμλ, μ»΄νμΌλ¬λ μ½λμμ νΉμ νμ
μ μΆλ‘ νλ€. μ΄λ¬ν μλ리μ€λ₯Ό μμΌλμΉ΄λ μΊ‘μ²λΌκ³ νλ€.
"capture of" μ€λ₯ 문ꡬλ₯Ό μ μΈνκ³ λ μμΌλμΉ΄λ μΊ‘μ²λ₯Ό μ κ²½μ°μ§ μμλ λλ€.
μ μμ μμλ foo()
λ©μλμμ List.set(int, E)
λ₯Ό νΈμΆν λ μ»΄νμΌλ¬λ List
μ μ½μ
λλ κ°μ²΄μ μ νμ νμΈν μ μκΈ° λλ¬Έμ μ€λ₯λ₯Ό λ°μμν¨λ€. μ΄λ¬ν μ νμ μ€λ₯κ° λ°μνλ©΄ μΌλ°μ μΌλ‘ μ»΄νμΌλ¬λ λ³μμ μλͺ»λ νμ
μ κ°μ ν λΉνκ³ μλ€κ³ λ―Ώλλ€λ κ²μ μλ―Ένλ€. μ΄λ κ² μλ° μ»΄νμΌνμμ νμ
μμ μ μΆκ°νκΈ°μν΄ μ λ€λ¦μ΄ μΆκ°λ κ²μ΄λ€.
μ΄λ¬ν κ²½μ° fooHelper()
μ²λΌ private helper methodλ₯Ό λ§λ€μ΄μ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€. helper λ©μλ λλΆμ μ»΄νμΌλ¬λ T
κ° μΊ‘μ³ λ³μμΈ CAP#1
μμ μΆλ‘ ν μ μλ€. μΌλ°μ μΌλ‘ helper λ©μλλ originalMethodNameHelper
λ‘ μ§μ λλ€.
Type Erasure
μ λ€λ¦μ νμ μ μμ μ±μ 보μ₯νλ©°, μ€νμκ°μ μ€λ²ν€λκ° λ°μνμ§ μλλ‘ νκΈ°μν΄ μΆκ°λλ€. μ»΄νμΌλ¬λ μ»΄νμΌ μμ μ μ λ€λ¦μ λν΄ μμ νμ μκ±°(type erasure)λ₯Ό νλ€. μ¦, μ»΄νμΌ νμμλ§ νμ μ μ½ μ‘°κ±΄μ μ μνκ³ , λ°νμμλ νμ μ μ κ±°νλ€λ λ»μ΄λ€.
unbounded Type(
<?>
,<T>
)μObject
λ‘ λ³νbound type(
<E extends Comparable>
)μ κ²½μ°λ Objectκ° μλComprarable
λ‘ λ³νμ λ€λ¦ νμ μ μ¬μ©ν μ μλ μΌλ° ν΄λμ€, μΈν°νμ΄μ€, λ©μλμλ§ μκ±° κ·μΉμ μ μ©
νμ μμ μ± λ³΄μ‘΄μ μν΄ νμμ type casting
νμ₯λ μ λ€λ¦ νμ μμ λ€νμ±μ 보쑴νκΈ°μν΄ bridge method μμ±
νλμ© μμ λ₯Ό 보면μ μμλ³Ό κ²μ΄λ€.
unbounded Type(<?>
, <T>
)μ Object
λ‘ λ³ν
<?>
, <T>
)μ Object
λ‘ λ³νtype erasureκ° μ μ©λλ©΄μ νΉμ νμ
μΌλ‘ μ νλμ§ μμ <T>
λ λ€μκ³Ό κ°μ΄ Object
λ‘ λ체λλ€.
μ λ€λ¦ λ©μλμμλ λμΌνλ€.
T
λ λΉνμ μ νμ
μ΄λ―λ‘, μ»΄νμΌλ¬κ° Object
λ‘ λ³ννλ€.
bound type(<E extends T>
)μ κ²½μ°λ Objectκ° μλ T
λ‘ λ³ν
<E extends T>
)μ κ²½μ°λ Objectκ° μλ T
λ‘ λ³ννμ λ νμ
(bound type)μμλ μ»΄νμΌ μμ μ μ νλ νμ
μΌλ‘ λ³νλλ€. Comparable
λ‘ λ³νλ κ²μ νμΈν μ μλ€.
μ¬κΈ°μλ Shape
λ‘ λ³νλ κ²μ νμΈν μ μλ€.
νμ₯λ μ λ€λ¦ νμ
μμ λ€νμ±μ 보쑴νκΈ°μν΄ bridge method μμ±
μ»΄νμΌλ¬κ° μ»΄νμΌ μμ μ μ λ€λ¦ νμ μμ μ±μ μν΄ bridge methodλ₯Ό μμ±ν μ μλ€. λ€μ μμ λ₯Ό μ΄ν΄λ³΄μ.
μ λκ°μ ν΄λμ€κ° μλ€. μ΄λ λ€μκ³Ό μ½λλ₯Ό μ€νν΄μΌνλ€κ³ μλ₯Ό λ€μ΄λ³΄μ.
νμ
μ΄ μκ±°λ νμλ λ€μκ³Ό κ°μ΄ μ μ©λλ©°,λ°νμμ ClassCastException
λ₯Ό λ°μμν€κ² λλ€.
νμ
μκ±° νμ Node
μ MyNode
λ λ€μκ³Ό κ°μ΄ λ³νλλ κ²μ λ³Ό μ μμΌλ©°, μκ±° νμλ Node
μκ·Έλμ² λ©μλκ° setData(T data)
μμ setData(Object data)
λ‘ λ°κΎΈκΈ° λλ¬Έμ MyNode
μ setData(Integer data)
λ₯Ό overriding ν μ μκ² λλ€.
λ°νμ μμλ λ€μκ³Ό κ°μ΄ νμ
μ΄ μκ±°λ μνλ‘ λ³ν κ²μ΄λ€. (Object
λ‘ λ³ν) κ·Έλ κ² λλ©΄, Object
λ‘ λ³νκ² λλ κ²½μ°μ λν λΆμΌμΉλ₯Ό μμ κΈ° μν΄ μ»΄νμΌλ¬λ λ°νμμ ν΄λΉ μ λ€λ¦ νμ
μ νμ μκ±°λ₯Ό μν bridge methodλ₯Ό μμ±ν΄μ€λ€.
κ·Έλ κΈ°λλ¬Έμ ClassCastException
μμΈλ₯Ό λμ§λ κ²μ μ μ μλ€.
Reifiable vs Non-Reifiable
Reifiable Type
λ°νμμμ μμ νκ² μ€λΈμ νΈ μ 보λ₯Ό ννν μ μλ νμ μ μ€μ²΄ν νμ (Reifiable Type)μ΄λΌκ³ νλ€. μ¦, μ»΄νμΌ λ¨κ³μμ νμ μκ±°μ μν΄ μ§μμ§μ§ μλ νμ μ 보μ΄λ€.
μμ νμ (ex)
int
,double
,float
,byte
λ±λ±Number
,Integer
μ κ°μ μΌλ° ν΄λμ€μ μΈν°νμ΄μ€ νμλΉνμ μμΌλμΉ΄λ(
?
)κ° ν¬ν¨λ 맀κ°λ³μν νμ (ex)List<?>
,ArrayList<?>
Raw type (ex)
List
,ArrayList
,Map
λΉνμ μ μμΌλμΉ΄λλ μ μ΄μ νμ
μ 보λ₯Ό μ ν λͺ
μνμ§ μμμΌλ―λ‘, μ»΄νμΌμμ νμ
μκ±°λ₯Ό νλ€κ³ ν΄λ μμ μ λ³΄κ° μκΈ° λλ¬Έμ μ€μ²΄ν νμ
μ΄λΌ λ³Ό μ μμΌλ©°, νμ
μκ±°μ μν΄ μ»΄νμΌ μμ μ Object
λ‘ λ³νλλ€.
Non-Reifiable Type
μ»΄νμΌ λ¨κ³μμ νμ μκ±°μ μν΄μ νμ μ λ³΄κ° μ κ±°λ νμ μ΄λ€. μ΄ κ²½μ° λ°νμμμ λ°νμμμ μ μ μλ μ λ³΄κ° μλ€.
Generic Type (ex)
List<E>
Parameterized Type (ex)
List<Number>
,ArrayList<String>
Bounded wildcard Type (ex)
List<? extends Number>
,List<? super String>
Heap Pollution
ν μ€μΌμ νλΌλ―Έν°ν λ νμ μ λ³μκ° ν΄λΉ νλΌλ―Έν°νλ νμ μ΄ μλ κ°μ²΄λ₯Ό μ°Έμ‘°ν λ λ°μνλ€.
raw typeκ³Ό νλΌλ―Έν°νλ νμ μ΄ μμ¬ μ¬μ©λλ κ²½μ°
unchecked castκ° μ¬μ©λ κ²½μ°
Potential Vulnerabilities of Varargs Methods with Non-Reifiable Formal Parameters
κ°λ³μΈμ(varargs) 맀κ°λ³μλ₯Ό ν¬ν¨ν μ λ€λ¦ λ©μλλ ν μ€μΌμ μ λ°ν μ μλ€.
μ»΄νμΌμμ addToList()
λ©μλ μ μ λΆλΆμ λ€μκ³Ό κ°μ κ²½κ³ λ¬Έκ΅¬κ° λ¬λ€.
μ»΄νμΌμ΄ κ°λ³μΈμ(varargs) λ©μλλ₯Ό λ§λκ²λλ©΄ κ°λ³μΈμ(varargs) νλΌλ―Έν°λ₯Ό λ°°μ΄λ‘ λ³νμν¨λ€. νμ§λ§, μλ°λ νλΌλ―Έν°νλ νμ
μ λ°°μ΄μ μμ±μ νμ©νμ§ μλλ€. μ μμ μμ ArrayBuilder.addToList
κ°λ³μΈμ 맀κ°λ³μ T...
λ₯Ό T[]
λ°°μ΄λ‘ λ³ννλλ°, νμ
μκ±°μ μν΄μ μ»΄νμΌλ¬λ κ°λ³μΈμ νλΌλ―Έν°λ₯Ό Object[]
λ‘ λ³νμν€κ²λκ³ κ²°κ³Όμ μΌλ‘ νμ€μΌμ κ°λ₯μ±μ΄ μκΈ°λ κ²μ΄λ€.
ꡬ문μ νμ€μΌμ μ μ¬μ μΌλ‘ λ΄μ¬νκ³ μλλ°, μ»΄νμΌλ¬λ κ²½κ³ λ¬Έκ΅¬λ₯Ό μμ±νμ§ μκ³ μλ€. μλνλ©΄, μ»΄νμΌλ List<String>... l
μ νμ νλΌλ―Έν° List[]
λ‘ λ³νν λ μ΄λ―Έ κ²½κ³ λ₯Ό λ§λ€μκΈ° λλ¬Έμ΄λ€. μ¦, λ³μ l
μ Object[]
μ νμ νμ
μΈ List[]
νμ
μ κ°κ²λκ³ μ΄ κ΅¬λ¬Έμ μ ν¨νκ² λλ κ²μ΄λ€.
μ¬κΈ°μ objectArray
μ 첫λ²μ§Έ μμμ Integer
νμ
μ κ°μ²΄ 리μ€νΈλ₯Ό ν λΉνκ³ ,
ArrayBuilder.faultyMethod
λ₯Ό νΈμΆνλ€λ©΄, λ°νμμμ ClassCastException
μ€λ₯λ₯Ό λ°μμν€λ κ²μ΄λ€.
Prevent Warnings from Varargs Methods with Non-Reifiable Formal Parameters
νλΌλ―Έν°ν νμ
μ κ°λ³μΈμ λ©μλκ° ClassCastException
μ λ°μμν€μ§ μκ³ , λΉμ·ν μ€λ₯κ° λ°μνμ§ μλ λ€λ κ²μ΄ 보μ₯λλ©΄(νμ
μμ μ±μ΄ 보μ₯) static
κ³Ό μμ±μκ° μλ λ©μλ μ μΈλΆμ@SafeVarargs
μ΄λ
Έν
μ΄μ
μ μΆκ°ν΄ κ²½κ³ λ¬Έκ΅¬λ₯Ό μ§μΈ μ μλ€. μ΄ μ΄λ
Έν
μ΄μ
μ λ©μλ ꡬνμμ varargs νμ νλΌλ―Έν°μ λν΄ λΆμ μ ν μ²λ¦¬λ₯Όνμ§ μμμμ λνλΈλ€. μ’μ λ°©λ²μ μλμ§λ§ λ©μλ μ μΈμ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘λ κ²½κ³ λ¬Έκ΅¬λ₯Ό μ΅μ ν μ μλ€.
λ¨, μ΄κ²½μ°μλ λ©μλ νΈμΆ λΆλΆμμ μμ±λλ κ²½κ³ λ₯Ό λ§μμ£Όμ§λ μλλ€.
Generic Typeμ μμκ³Ό ꡬν
μ λ€λ¦ νμ λ λΆλͺ¨ ν΄λμ€κ° λ μ μλ€.
μμ μ λ€λ¦ νμ μ μΆκ°μ μΌλ‘ νμ νλΌλ―Έν°λ₯Ό κ°μ§ μ μλ€.
μ λ€λ¦ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ μ λ€λ¦ νμ μ΄λλ€.
μ°Έκ³
Last updated