λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λͺ©λ‘μ΄ μ—†μŠ΅λ‹ˆλ‹€.

[JAVA] λ‹€ν˜•μ„±

πŸ—£ Language/JAVA

    λ‹€ν˜•μ„±μ΄λž€?


    μžλ°”μ—μ„œ λ‹€ν˜•μ„±μ€ 객체지ν–₯ κ°œλ…μ˜ μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜λ‹€. λ‹€ν˜•μ„±μ΄λž€ 'μ—¬λŸ¬ 가지 ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” λŠ₯λ ₯'을 λ§ν•œλ‹€. κ°€μž₯ μ‰¬μš΄ λ‹€ν˜•μ„±μ˜ μ˜ˆμ œλ‘œλŠ” μ§€λ‚œ μ‹œκ°„ μ •λ¦¬ν–ˆλ˜ μ˜€λ²„λ‘œλ”©μ΄ μžˆλ‹€. λ˜ν•œ μžλ°”μ—μ„œλŠ” ν•œ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ—¬λŸ¬ νƒ€μž…μ˜ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•¨μœΌλ‘œμ¨ λ‹€ν˜•μ„±μ„ ν”„λ‘œκ·Έλž¨μ μœΌλ‘œ κ΅¬ν˜„ν•˜μ˜€λ‹€.


    μ‰½κ²Œ λ§ν•΄μ„œ λΆ€λͺ¨ 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜μ˜€λ‹€λŠ” 것이닀.


    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(1020);
             
            Calculator c2 = new CalculatorDecoMinus();
            c2.setOprands(1020);
             
            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;    // μΊμŠ€νŠΈμ—°μ‚°μž μƒλž΅ λΆˆκ°€ (λ‹€μš΄ μΊμŠ€νŒ…)
    }

    cs



    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