λ€νμ±μ΄λ?
μλ°μμ λ€νμ±μ κ°μ²΄μ§ν₯ κ°λ μ μ€μν νΉμ§ μ€ νλλ€. λ€νμ±μ΄λ 'μ¬λ¬ κ°μ§ ννλ₯Ό κ°μ§ μ μλ λ₯λ ₯'μ λ§νλ€. κ°μ₯ μ¬μ΄ λ€νμ±μ μμ λ‘λ μ§λ μκ° μ 리νλ μ€λ²λ‘λ©μ΄ μλ€. λν μλ°μμλ ν νμ μ μ°Έμ‘°λ³μλ‘ μ¬λ¬ νμ μ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μλλ‘ ν¨μΌλ‘μ¨ λ€νμ±μ νλ‘κ·Έλ¨μ μΌλ‘ ꡬννμλ€.
μ½κ² λ§ν΄μ λΆλͺ¨ ν΄λμ€ νμ μ μ°Έμ‘°λ³μλ‘ μμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλλ‘ νμλ€λ κ²μ΄λ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Tv { boolean power; // μ μ μν (on/off) int channel; // μ±λ void power() { power = !power } void channelUp() { ++channel; } void channelDown() { --channel; } } class CaptionTv extends Tv { String test; // μΊ‘μ
μ 보μ¬μ£ΌκΈ° μν λ¬Έμμ΄ void caption() { /*μλ΅*/ } } | cs |
μμ κ°μ μ½λκ° μμ±μ΄ λμμ λ ν΄λμ€ Tvμ ν΄λμ€ CaptionTvλ μλ‘ μμκ΄κ³μ μμΌλ©°, μ΄ λ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ¬μ©νκΈ° μν΄μλ new μ°μ°μλ₯Ό ν΅ν΄μ μ¬μ©μ΄ κ°λ₯νλ€.
1 2 | Tv t = new Tv(); CaptionTv c = new CaptionTv(); | cs |
μμ κ°μ΄ 보ν΅μ μΈμ€ν΄μ€ νμ κ³Ό μΌμΉνλ νμ μ μ°Έμ‘°λ³μλ₯Ό μ¬μ©νκΈ° λ§λ ¨μ΄λ€. νμ§λ§ μλ°μ λ€νμ± νΉμ§μΌλ‘ Tvμ CaptionTvκ° μμ κ΄κ³μ μμ κ²½μ° λ€μκ³Ό κ°μ΄ λΆλͺ¨ ν΄λμ€(Tv)μ μ°Έμ‘°λ³μλ‘ μμ ν΄λμ€(CaptionTv)μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλλ‘ νλ κ²μ΄ κ°λ₯νλ€. ( κ·Έ λ°λλ λΆκ°λ₯νλ€, μ»΄νμΌμ λμ§λ§ λ°νμμλ¬ λ°μ )
1 | Tv t = new CaptionTv(); // λΆλͺ¨ νμ
μ μ°Έμ‘°λ³μλ‘ μμ νμ
μ μΈμ€ν΄μ€ μ°Έμ‘° | cs |
μ΄λ° κ²½μ°μ μ΄λ€ μ°¨μ΄μ μ΄ μλ νλ©΄ μΈμ€ν΄μ€ μ체λ CaptionTvμ΄μ§λ§ μ°Έμ‘°λ³μκ° λΆλͺ¨ν΄λμ€ νμ μ΄κΈ° λλ¬Έμ λ³μ tλ‘ μ¬μ©ν μ μλ μμμ λΆλͺ¨ ν΄λμ€ μμμ΄ λλ€. 무μ¨λ§μ΄λκ³ νλ©΄ μμ λ₯Ό 보μ.
1 2 3 4 5 6 | public static void main(String[] args) { Tv t = new CaptionTv(); t.power(); t.caption(); // μλ¬ λ°μ } | cs |
λΆλͺ¨ ν΄λμ€(Tv) μμμ μλ powerλ©μλλ μ μ μλμ΄ λμ§λ§ μμν΄λμ€(CaptionTv)μ λ©μλμΈ caption λ©μλλ μνμ΄ λμ§ μλλ€. νλ§λλ‘ μμ λ°μ μΈμ€ν΄μ€(CaptionTv)μ΄μ§λ§ λΆλͺ¨ν΄λμ€(Tv)μΈ κ²μ²λΌ μ¬μ©μ΄ λλκ²μ μλ―Ένλ€.
μ£Όμν μ μ λ€μ μμ μ κ°μ μν©μ΄λ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Tv { boolean power; // μ μ μν (on/off) int channel; // μ±λ void power() { power = !power } void channelUp() { ++channel; } void channelDown() { --channel; } public String output() { return "Parent"; } } class CaptionTv extends Tv { String test; // μΊ‘μ
μ 보μ¬μ£ΌκΈ° μν λ¬Έμμ΄ void caption() { /*μλ΅*/ } public String output() { return "Child"; } } public class PolymorphismDemo { public static void main(String[] args) { Tv t = new CaptionTv(); System.out.println(t.output()); } } | cs |
μμκ°μ μ½λλ₯Ό μ€ννμ λ κ²°κ³Όκ° μ΄λ»κ² λ κ²κ°μμ§ νλ² μκ°ν΄λ³΄μ.
μ΄λ€ κ²°κ³Όλ₯Ό μμνλμ§λ μ μ μμ§λ§ λ§λλΆλ μμ κ²μ΄κ³ νλ¦°λΆλ μμ κ²μ΄λ€. κ²°κ³Όλ Childκ° λλ€. μ¬κΈ°μ μμν μ μ μμμ λΆλͺ λΆλͺ¨ ν΄λμ€(Tv)μ μμλ§μ μ¬μ©νλ€κ³ νλλ° μ μμν΄λμ€(CaptionTv)μ λ©μλκ° μ¬μ©λ¬λμ§ μꡬμ¬μ΄ λ€κ²μ΄λ€. μν©μ μ 리ν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
1. ν΄λμ€ Tvμ λ°μ΄ν° νμ μ ν΄λμ€ CaptionTvλ‘ μΈμ€ν΄μ€ν νμ λ ν΄λμ€ CaptionTvμ λ©μλ captionμ λ§μΉ μ‘΄μ¬νμ§ μλ κ²μ²λΌ μ€νλμ§ μμλ€.
2. ν΄λμ€ Tvμ λ°μ΄ν° νμ
μ ν΄λμ€ CaptionTvλ‘ν΄μ μΈμ€ν΄μ€ν νμ λ ν΄λμ€ CaptionTvμ λ©μλ outputλ₯Ό μ€ννλ©΄ ν΄λμ€ Tvμμ μ μλ λ©μλκ° μλλΌ ν΄λμ€ CaptionTvμμ μ μλ λ©μλκ° μ€νλμλ€.
μμ μν©μΌλ‘ λ΄€μ λ μμν΄λμ€(CaptionTv)λ₯Ό λΆλͺ¨ν΄λμ€(Tv)μ λ°μ΄ν° νμ μΌλ‘ μΈμ€ν΄μ€ν νμ λ λΆλͺ¨ν΄λμ€(Tv)μ μ‘΄μ¬νλ λ©€λ²λ§μ΄ ν΄λΉ μΈμ€ν΄μ€μ λ©€λ²κ° λλ€. λμμ λΆλͺ¨ν΄λμ€(CaptionTv)μμ μ€λ²λΌμ΄λ©ν λ©€λ²μ λμ λ°©μμ κ·Έλλ‘ μ μ§νλ€.
μ¬κΈ°μ λλ μλ¬Έμ μ΄ κΈ°λ₯μ λλ체 μ΄λμ μ¬μ©νλ? μ΄ μλ¬Έμ λν λ΅μ λ€μμ λ€λ£° μΆμ ν΄λμ€μμ νλ¦°λ€. κ°λ¨ν μμ μ ν¨κ» κ°λ³κ² μ΄ν΄λ³΄κ³ λμ΄κ°μ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | abstract class Calculator{ int left, right; public void setOprands(int left, int right){ this.left = left; this.right = right; } int _sum() { return this.left + this.right; } public abstract void sum(); public abstract void avg(); public void run(){ sum(); avg(); } } class CalculatorDecoPlus extends Calculator { public void sum(){ System.out.println("+ sum :"+_sum()); } public void avg(){ System.out.println("+ avg :"+(this.left+this.right)/2); } } class CalculatorDecoMinus extends Calculator { public void sum(){ System.out.println("- sum :"+_sum()); } public void avg(){ System.out.println("- avg :"+(this.left+this.right)/2); } } public class CalculatorDemo { public static void execute(Calculator cal){ System.out.println("μ€νκ²°κ³Ό"); cal.run(); } public static void main(String[] args) { Calculator c1 = new CalculatorDecoPlus(); c1.setOprands(10, 20); Calculator c2 = new CalculatorDecoMinus(); c2.setOprands(10, 20); execute(c1); execute(c2); } } | cs |
μμμ ν΄λμ€ CalculatorDemoμ execute λ©μλλ CalculatorDecoPlusμ CalculatorDecoMinus ν΄λμ€μ λ©μλ runμ νΈμΆνλ©΄μ κ·Έκ²μ΄ 'μ€νκ²°κ³Ό'λΌλ μ¬μ€μ νλ©΄μ νμνλ κΈ°λ₯μ κ°μ§κ³ μλ€. μ΄ λ execute λ©μλ λ΄λΆμμλ 맀κ°λ³μλ‘ μ λ¬λ°μ κ°μ²΄ Calculatorμ λ©μλμΈ runμ μ€ννκ³ μλ€.
κ·Έλ°λ° μ¬κΈ°μ 맀κ°λ³μμ λ°μ΄ν° νμ μ΄ Calculatorκ° μλ CalculatorDecoPlusμ΄κ±°λ CalculatorDecoMinusλΌλ©΄ μ΄λ»κ² λ κΉ? μμ μμ λ μ€νλμ§ μμ κ²μ΄λ€. λ©μλ execute μ μ₯μμλ 맀κ°λ³μλ‘ μ λ¬λ κ°μ΄ Calculator νμ μ΄κ±°λ Calculator ν΄λμ€λ₯Ό μμλ°μ μμ ν΄λμ€μ΄κΈ° λλ¬Έμ λ©μλ runμ 무쑰건 κ°μ§κ³ μλ€λ 보μ₯μ΄ λλ€. μ΄λ κ² νλμ ν΄λμ€(Calculator)κ° λ€μν λμ(CalculatorDecoPlus, CalculatorDecoMinus)μ νλκ²μ λ€νμ±μ΄λΌκ³ ν μ μλ€. (μ΄ μν©μμλ 맀κ°λ³μμ λ€μ΄μ€λ νμ μ΄ μ¬λ¬κ°κ° λμ΄λ νλμ λ©μλμμ μ²λ¦¬κ° λκΈ° λλ¬Έμ 맀κ°λ³μμ λ€νμ±μ΄λΌκ³ λ λΆλ₯Έλ€.)
λ©μλμλ λ€λ₯΄κ² λ©€λ² λ³μκ° μ€λ³΅ μ μλ κ²½μ°λ λ€λ₯΄κ² λμνλλ° μ΄λ μ°Έμ‘°λ³μμ νμ μ λ°λΌκ°λ€. μλ₯Ό λ€μ΄ λ€μκ³Ό κ°λ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class Tv { boolean power; // μ μ μν (on/off) int channel; // μ±λ String test; void power() { power = !power } void channelUp() { ++channel; } void channelDown() { --channel; } public Tv() { this.test = "Parent"; } } class CaptionTv extends Tv { String test; // μΊ‘μ
μ 보μ¬μ£ΌκΈ° μν λ¬Έμμ΄ void caption() { /*μλ΅*/ } public CaptionTv() { this.test = "Child"; } } public class PolymorphismDemo { public static void main(String[] args) { Tv t = new CaptionTv(); CaptionTv c = new CaptionTv(); System.out.println(t.test); System.out.println(c.test); } } | cs |
μμ μ½λκ° μ€νλλ©΄ κ²°κ³Όκ°μ λ€μκ³Ό κ°λ€.
Parent
Child
μ¦, λ©€λ² λ©μλλ μ°Έμ‘°λ³μμ νμ μ μκ΄ μμ΄ μ€λ²λΌμ΄λ© λ κ²½μ° μ€μ μΈμ€ν΄μ€μ λ©μλ(μ€λ²λΌμ΄λ© λ λ©μλ)κ° νΈμΆλμ§λ§ λ©€λ² λ³μκ° μ€λ³΅μ μ λ κ²½μ°μλ μ°Έμ‘° λ³μμ νμ μ λ°λΌ ν΄λΉ ν΄λμ€μ λ©€λ²λ³μλ₯Ό μ κ·Όνλ€.
(μ°Έκ³ - staticλ©μλμ λ³μλ 'ν΄λμ€μ΄λ¦.λ©€λ²'λ‘ νΈμΆ. μ¦, μ€λ²λΌμ΄λ© λ μΈμ€ν΄μ€ λ©μλλ§ μ°Έμ‘°λ³μμ νμ μ μν₯μ λ°μ§ μμ)
μ°Έμ‘°λ³μμ νλ³ν
μ°Έμ‘°ν λ³μλ κΈ°λ³Έν λ³μμ κ°μ΄ νλ³νμ΄ κ°λ₯νλ€. λ¨ μ‘°κ±΄μ μλ‘ μμκ΄κ³μ μλ ν΄λμ€ μ¬μ΄μμλ§ κ°λ₯νλ€. μ’ λ₯λ λ€μκ³Ό κ°λ€.
1. λΆλͺ¨ ν΄λμ€ -> μμ ν΄λμ€ ( λ€μ΄μΊμ€ν / Down-casting ) : νλ³ν μλ΅ λΆκ°λ₯
2. μμ ν΄λμ€ -> λΆλͺ¨ ν΄λμ€ ( μ
μΊμ€ν
/ Up-casting ) : νλ³ν μλ΅ κ°λ₯
μμμ μ 리ν κ²μ²λΌ 2κ°μ§ μ νμ΄ μλ€. μ μΊμ€ν , λ€μ΄μΊμ€ν . μ°Έμ‘°λ³μμ νλ³νλ μΊμ€νΈμ°μ°μ(κ΄νΈ μμ μνλ νμ μ λ£μ΄μ μμ λΆμ¬μ£Όλκ²)λ₯Ό μ¬μ©νλλ° μ¬κΈ°μ μ£Όμν μ μ λ€μ μμ μ κ°μ΄ μ μΊμ€ν μ μ΄ μΊμ€νΈμ°μ°μλ₯Ό μλ΅ν μ μμ§λ§ λ€μ΄μΊμ€ν μ μλ΅ν μ μλ€λ μ μ΄λ€.
1 2 3 4 5 6 7 8 | public static void main(String[] args) { Tv t = null; CaptionTv c1 = null; CaptionTv c2 = new CaptionTv(); tv = c2; // tv = (Tv) c2; μμ μΊμ€νΈμ°μ°μ μλ΅ (μ
μΊμ€ν
) c1 = (CaptionTv) tv; // μΊμ€νΈμ°μ°μ μλ΅ λΆκ° (λ€μ΄ μΊμ€ν
) } |
instanceof μ°μ°μ
μ΄λ€ νμ
μ λν instanceofμ°μ°μμ κ²°κ³Όκ° trueλΌλ κ²μ κ²μ¬ν νμ
μΌλ‘ νλ³νμ΄ κ°λ₯νλ€λ κ²μ λ»νλ€.
μ¬λ¬ μ’ λ₯μ κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ€λ£¨κΈ°
μμκ΄κ³μ ν΄λμ€λ€μ νλμ λ°°μ΄μ λ΄κ³ μΆμ λ λ€μκ³Ό κ°μ΄ λΆλͺ¨ν΄λμ€μ λ°°μ΄μ μ μΈνμ¬ κ·Έ μμ μ¬λ¬ μμ ν΄λμ€λ€μ λ΄μ μ μλ€.
(μ΄ λν λ€νμ± μ€μ νλ)
μλμ μμ λ₯Ό ν΅ν΄μ μ¬λ¬ μ’ λ₯μ Tvλ₯Ό νλμ Tvλ°°μ΄μ λ΄μμ κ΄λ¦¬κ° κ°λ₯νλ€.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class Tv { boolean power; // μ μ μν (on/off) int channel; // μ±λ public Tv() { this.test = "Parent"; } } class CaptionTv extends Tv { String test; // μΊ‘μ
μ 보μ¬μ£ΌκΈ° μν λ¬Έμμ΄ void caption() { /*μλ΅*/ } public CaptionTv() { this.test = "Child"; } } class WideTv extends Tv { void wide() { /*μλ΅*/ } } class UltraTv extends Tv { void ultra() { /*μλ΅*/ } } public class PolymorphismDemo { public static void main(String[] args) { Tv[] t = new Tv[3]; t[0] = new CaptionTv(); t[1] = new WideTv(); t[2] = new UltraTv(); } } | cs |
μ΄ κΈ°λ₯μ μμ©νμ¬ κ΅¬νλ λΆλΆμ΄ JAVA APIμλ μ‘΄μ¬νλλ° λ°λ‘ Vector ν΄λμ€μ΄λ€. Vectorν΄λμ€λ λ΄λΆμ μΌλ‘ Objectνμ μ λ°°μ΄μ κ°μ§κ³ μκΈ° λλ¬Έμ μ΄λ€ κ°μ²΄λ μ§ νλμ λ°°μ΄μ κ΄λ¦¬κ° κ°λ₯νλ€. (Object ν΄λμ€κ° λͺ¨λ ν΄λμ€μ μμ ν΄λμ€ μ΄κΈ° λλ¬Έμ )
μ°Έκ³ μμ : Javaμ μ μ 3rd Edition