πŸ“™ Java

[Java] λ‹€ν˜•μ„±(Polymorphism)

ji_wonna 2022. 9. 7. 16:12

λ‹€ν˜•μ„±

λ‹€ν˜•μ„±μ΄λž€ ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” 것을 λœ»ν•œλ‹€.

μžλ°”μ—μ„œλŠ” ν•œ νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ₯Ό 톡해 μ—¬λŸ¬ νƒ€μž…μ˜ 객체듀을 μ°Έμ‘°ν•  수 있게 ν•΄μ£ΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

 

 

μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜

μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ 개수λ₯Ό μ‘°μ ˆν•  수 μžˆλ‹€. νƒ€μž… λ³€ν™˜μ€ 상속 관계에 μžˆλŠ” 클래슀 μ‚¬μ΄μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ‹€.

μ—…μΊμŠ€νŒ…(ν•˜μœ„→μƒμœ„ 클래슀 νƒ€μž… λ³€ν™˜)은 ν˜•λ³€ν™˜ μ—°μ‚°μžμΈ κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μžˆμ§€λ§Œ, κ·Έ λ°˜λŒ€μΈ λ‹€μš΄μΊμŠ€νŒ…(μƒμœ„→ν•˜μœ„ 클래슀 νƒ€μž… λ³€ν™˜)의 κ²½μš°μ—λŠ” λ°˜λ“œμ‹œ κ΄„ν˜Έλ₯Ό μž‘μ„±ν•΄μ€˜μ•Όν•œλ‹€.

 

클래슀의 규λͺ¨κ°€ 컀지면 μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž… λ³€ν™˜μ΄ κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό instanceof μ—°μ‚°μžλ₯Ό 톡해 μ•Œ 수 있으며 이λ₯Ό ν™œμš©ν•˜μ—¬ μ—λŸ¬λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

μ°Έμ‘° λ³€μˆ˜ instanceof νƒ€μž…μ˜ λ°˜ν™˜ 값이 false일 λ•ŒλŠ” μ°Έμ‘° λ³€μˆ˜κ°€ null κ°’μ΄κ±°λ‚˜ νƒ€μž… λ³€ν™˜μ΄ λΆˆκ°€λŠ₯함을 λ‚˜νƒ€λ‚΄κ³  true 값이 λ°˜ν™˜λ˜λ©΄ ν•΄λ‹Ή νƒ€μž…μœΌλ‘œ λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

public class Polymorphism {
    public static void main(String[] args) {
        Customer customer = new Customer();
        customer.buyBeer(new Stella());//ν•˜μœ„ 클래슀->μƒμœ„ 클래슀
        customer.buyBeer(new Blanc());
        System.out.println("ν˜„μž¬ μž”μ•‘μ€ "+customer.money+"원 μž…λ‹ˆλ‹€.");
    }
}

class Beer{
    int price;

    public Beer(int price){
        this.price = price;
    }
}
class Blanc extends Beer{
    public Blanc(){
        super(4000);
    }
    public String toString(){
        return "λΈ”λž‘";
    }
}
class Stella extends Beer{
    public Stella(){
        super(5000);
    }
    public String toString(){
        return "μŠ€ν…”λΌ";
    }
}
class Customer{
    int money = 10000;

    //void buyBeer(Blanc blanc); μ΄λ ‡κ²Œ νƒ€μž…μ„ λ”°λ‘œ μž‘μ„±ν•˜λ©΄ λ²ˆκ±°λ‘œμ›€
    //void buyBeer(Stella stella);

    void buyBeer(Beer beer){
        if (money<beer.price){
            System.out.println("μž”μ•‘ λΆ€μ‘±");
            return;
        }
        money -= beer.price;
        System.out.println(beer+" κ΅¬μž… μ™„λ£Œ");
    }
}

μœ„ μ½”λ“œλ₯Ό 보면 Customer 클래슀의 λ©”μ„œλ“œμΈ buyBeer의 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ ν•˜μœ„ 클래슀인 Blancκ³Ό Stella둜 각각 λΆ„λ¦¬ν•΄μ„œ 받지 μ•Šκ³  상속받은 Beerνƒ€μž… ν•˜λ‚˜λ‘œ μ „λ‹¬λ°›λŠ”λ‹€.

 

μ΄λ ‡κ²Œ λ‹€ν˜•μ„±μ„ 잘 ν™œμš©ν•˜λ©΄ λ§₯주의 μ’…λ₯˜κ°€ μ—„μ²­λ‚˜κ²Œ λ§Žμ•„μ Έλ„ 맀번 λ‹€λ₯Έ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 전달받을 ν•„μš”κ°€ μ—†μ–΄μ Έμ„œ μ€‘λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€.