1. μκ° ¶
μμ¦ μ¬μ¬νλ©΄ μ΄μν μ±
λ€μ 보λλ° μ΄λ° μ΄μΌκΈ°κ° λμμ μκ°ν λ§ν κ°μΉκ° λκ»΄μ§λ―λ‘ μ μ.
(μ¬μ¬νλ©΄ μλλ₯Ό μ½μ κ² -_-; μ€λ‘μ§ μ½λμλ§ κ΄μ¬μλ μ¬λμ΄λΌλ©΄ BACK λ²νΌμ~ λ³λ‘ μ¬λ―Έμλ λ΄μ©μΌλ‘ μ΄μ΄μ§ κ²μΌλ‘ 보μ)
(μ¬μ¬νλ©΄ μλλ₯Ό μ½μ κ² -_-; μ€λ‘μ§ μ½λμλ§ κ΄μ¬μλ μ¬λμ΄λΌλ©΄ BACK λ²νΌμ~ λ³λ‘ μ¬λ―Έμλ λ΄μ©μΌλ‘ μ΄μ΄μ§ κ²μΌλ‘ 보μ)
κ°μ²΄ μ§ν₯μμ κ°μ₯ μ€μν κ°λ
μ κΌ½μΌλΌλ©΄ 무μμκΌ½μκΉ?
λ€λ¦ μλ λ€νμ±(Polymorphism)μ΄λΌκ³ νμ§ μμκΉ μΆλ€.
λ€λ¦ μλ λ€νμ±(Polymorphism)μ΄λΌκ³ νμ§ μμκΉ μΆλ€.
μ΄ λ€νμ±μλ μ’
λ₯κ° μλ€λ κ²μ μλ €λμ§ λͺ¨λ₯΄κ² λ€.
첫째λ μ΅μ΄λ‘ μ μλ λ€νμ±μΈ ParametricPolymorphism, λμ§Έλ μ΄μ©λ€ μ겨λ λ²λ¦° Ad-hocPolymorphism μ΄λ κ² λκ°μ§κ° μ‘΄μ¬νλ€.
νλ² κ°λ μ μ°¨μ΄λ₯Ό μ΄ν΄νκ³ μλ°5μμ μ§μνκΈ° μμν genericμ λμ μ μλ―Έμ λν΄μ μκ°ν΄λ³΄λ μκ°μ΄ λ κ²μ΄λ€.
첫째λ μ΅μ΄λ‘ μ μλ λ€νμ±μΈ ParametricPolymorphism, λμ§Έλ μ΄μ©λ€ μ겨λ λ²λ¦° Ad-hocPolymorphism μ΄λ κ² λκ°μ§κ° μ‘΄μ¬νλ€.
νλ² κ°λ μ μ°¨μ΄λ₯Ό μ΄ν΄νκ³ μλ°5μμ μ§μνκΈ° μμν genericμ λμ μ μλ―Έμ λν΄μ μκ°ν΄λ³΄λ μκ°μ΄ λ κ²μ΄λ€.
κ·Έλ¦¬κ³ λ΄μ©μ΄ λλΆλΆ μ±
μ μλ λ΄μ©μμ νμν λΆλΆλ§ κ°μΆλ¦° λ΄μ©μ΄λΌ μλ΅λ λΆλΆμ΄ μ‘΄μ¬νλ
μ½μ΄λ³΄κ³ μΆμ μ¬λμ λμκ΄μμ μ°Ύμμ μ½μ΄λ³΄λ©΄λ¨. (λͺμ₯μλ¨)
μ½μ΄λ³΄κ³ μΆμ μ¬λμ λμκ΄μμ μ°Ύμμ μ½μ΄λ³΄λ©΄λ¨. (λͺμ₯μλ¨)
ps. γ
‘.γ
‘;; μ°λ¦¬λ μ κ±°κΉμ§ λ°°μ°μ§λ μμλλ°... μμ νκ΅μμ
μ΄λ γ
γ
2. λ€νμ±? ¶
μ°¨λ₯Ό μκ°ν΄λ³΄μ. μ°λ¦¬ μ£Όλ³μ μ°¨λ μ λ§λ‘ λ§λ€.
κ·Έμ€ μ°¨λ€μ μΆμννμ¬ ννν λͺ
μ¬ Car, κ·Έκ²μ νμμ κ²λ€μ sportCar, luxuryCar μ΄λ κ² 3κ°μ κ°μ²΄λ₯Ό μκ°ν΄λ³΄μ.
λΉμ°ν νμμ 2κ°μ κ°μ²΄λ μ μμ 2κ°μ κ°μ²΄λ₯Ό μμνλ€.
λΉμ°ν Car μ sportCar, luxuryCar λ μλ‘ λμΌν μλ¦¬λ‘ μμ§μ΄κ² μ§λ§ λμΌνμ§λ μλ€.
getCar(:String):Car λΌλ λ©μλλ₯Ό μκ°ν΄λ³΄μ.
~cpp public Car getCar(String clientType) { if("young man".equals(clientType)) { return new SportCar(); } else if("old man".equals(clientType)) { return new LuxuryCar(); } else { //Error! return null; } }
μκΈ° λ©μλλ₯Ό ν΅ν΄μ
~cpp Car sportCar = getCar("young man"); Car luxuryCar = getCar("old man");μ μμ μΈ μ μλ€.
λ°λΌμ SportCar, LuxuryCarμ μΈμ€ν΄μ€(instance)κ° Carκ°μ²΄ λ³μμΈ sportCar, luxuryCarμ λμ
μ΄ κ°λ₯νλ€.
κ·Έλ¦¬κ³ μμ κ°μ κ²μΌλ‘ νμ¬ λ€νμ±μ΄λΌκ³ νλ λ°©μμ΄ κ΅¬νλμ΄μ Έ μλ€.
λμΌν Carμ΄κΈ°λ νμ§λ§ run()μ΄λΌλ λ©μμ§λ₯Ό 2κ°μ κ°κΈ° λ€λ₯Έ μ°¨μ μ£Όλ©΄ λΉμ°ν νμ°¨λ
μμ²λ κ°μλλ‘ μλκ° λΆμ΄μ λ¬λ¦¬κΈ°κ² μ§λ§ λ€λ₯Έ μ°¨λ κ°μλ보λ€λ μΉμ°¨κ°μ΄λΌλ κ° κ·ΈμΈμ μμμ λμ±
μ κ²½μ μ΄ run()μ΄λΌλ λ°©μμΌλ‘ λ¬λ¦¬κ² λ κ²μ΄λ€.
λλ΅ μ΄κ²μ΄ λ€νμ±μ΄λΌλ κ²μΌλ‘ ννλλ€.
3. Parametric Polymorphism ¶
λ³Έλ ν΄λ¦¬λͺ¨νΌμ¦μμ μΆκ΅¬ν λ°©μ μ¦ νλΌλ©νΈλ¦ λ°©μμ μνλ©΄ μκΈ°μ μμ μ μ©ν λ λμ μΊμ€ν
μ΄ νμκ° μμ΄μΌνλ€.
μ μ€ν¬μΈ μΉ΄μ ν°λ³΄μμ§μ΄ λ¬λ Έλ€λ λ°μμ ν΄λ³΄μ.
~cpp Car sportCar = getCar("young man"); sportCar.startTurboEngine();μ΄λ¨κΉ?
λΉμ°ν μλ¬κ° λλ€. ν°λ³΄μμ§μ μ€ν¬μΈ μΉ΄μ λ¬λ¦° κ²μ΄μ§ CarλΌλ κ°μ²΄μλ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ λ€λ©΄ λ€μμ?
~cpp SportCar sportCar = getCar("young man"); sportCar.startTurboEngine();μμ μλ¬κ° λλ€. SportCarμ λμ λλ getCar():Carλ SportCarλ³΄λ€ μμμ κ°λ μ Carμ΄κΈ° λλ¬Έμ΄λ€.
μ΄λ₯Ό ν΄κ²°ν μ½λλ λ€μκ³Ό κ°λ€.
~cpp SportCar sportCar = (SportCar) getCar("young man"); sportCar.startTurboEngine();μλ¬λ νΌνλ€. νμ§λ§ μ°λ¦¬κ° 그리λ λ°λΌλ§μ§ μλ ν격μ κ°μ²΄μ§ν₯ μΈμ΄κ° λλλλν ννλ²μ μ΄λ€.
λ³Έλ νλΌλ©νΈλ¦ ν΄λ¦¬λͺ°νΌμ¦μ μκΈ°μ κ°μ λ¬Έμ μ ν΄κ²°μ μν΄μ λ°©μ΄μ μλ¨μ μ 곡νλ€.
무μμΈκ³ νλ, λ°λ‘ 리ν΄ν΄μΌν κ°μ²΄μ νμ
μ μΈμλ‘ μ€λ€λ κ°λ
μ΄λ€. (C++μ ν
νλ¦Ώ κ°μ§?)
μμ κ°μ κ°λ
μ μ½λλ‘ μμ±μ΄ λλ©΄ λμ μΊμ€ν
μ΄ νμ μμλΏλ§μλλΌ μλͺ»λ νμ
μΊμ€ν
μΌλ‘ μΈν
μλ¬μμ λ°©μ§ν μ μλ€.
μ΅κ·Ό μλ° 5 μμλ generics λΌλ κΈ°λ₯μ λμ
ν¨μΌλ‘μ νλΌλ©νΈλ¦ ν΄λ¦¬λͺ¨νΌμ¦μ μ§μνκΈ° μμνλ€.
genericsμ λν μμ
~cpp class Pair<SomeObjectType> { SomeObjectType x, y; Pair(SomeObjectType x, SomeObjectType y) { this.x = x; this.y = y; } SomeObjectType getFirstObject (Pair<SomeObjectType> p) { return p.x; } }
μκΈ°μ κ°μ λ°©μμΌλ‘ μμ±νκ² λλ©΄ λ€μκ³Ό κ°μ΄ νΉμ ν λ°μ΄ν° νμ ꡬμ λ°μ§ μλ
λ‘μ§μ΄ μμ±λλ€.
~cpp Pair<Integer> p; p = new Pair<Integer>(new Integer(0), new Integer(1)); Integer x = p.getFirstObject(p); Pair<Boolean> p; p = new Pair<Boolean>(new Boolean(0), new Boolean(1)); Boolean x = p.getFirstObject(p); . . . .
μ΄λ κ² νλΌλ©νΈλ¦ ν΄λ¦¬λͺ¨νΌμ¦μ λμ
ν¨μΌλ‘μ μ’λ μ°μν μ½λκ° μμ±λλ€.