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

빈 ꡬ멍 μ±„μš°κΈ°

[OOP] λŸ°νƒ€μž„ λ‹€ν˜•μ„±

좜처

ChatGPT


λŸ°νƒ€μž„ λ‹€ν˜•μ„±(Polymorphism)은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ… 쀑 ν•˜λ‚˜λ‘œ, ν”„λ‘œκ·Έλž˜λ―Έ μ‹€ν–‰ 쀑에 객체가 μƒμœ„ 클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, μ‹€μ œλ‘œ μ–΄λ–€ 클래슀의 λ©”μ†Œλ“œκ°€ 싀행될지λ₯Ό κ²°μ •ν•˜λŠ” κΈ°λŠ₯을 λ§ν•œλ‹€.

 

λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ˜ κ°œλ…

λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ€ 주둜 상속(Inheritance)κ³Ό μΈν„°νŽ˜μ΄μŠ€(Interface)λ₯Ό 톡해 κ΅¬ν˜„λœλ‹€. μƒμœ„ 클래슀(λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€)의 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ ν•˜μœ„ 클래슀의 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 있으며, 호좜된 λ©”μ†Œλ“œλŠ” μ°Έμ‘° λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 객체의 μ‹€μ œ νƒ€μž…μ— 따라 κ²°μ •λœλ‹€.

κ΅¬ν˜„λ°©λ²•

1. 상속을 ν†΅ν•œ λ‹€ν˜•μ„±

  • ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ 클래슀의 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•œλ‹€.
  • μƒμœ„ 클래슀의 μ°Έμ‘° λ³€μˆ˜λŠ” ν•˜μœ„ 클래슀의 객체λ₯Ό 가리킬 수 μžˆλ‹€.
  • λ©”μ†Œλ“œκ°€ 호좜될 λ•Œ, μ‹€μ œ 객체의 νƒ€μž…μ— 따라 ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœλ‹€.
class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // λŸ°νƒ€μž„ μ‹œμ— Dog의 λ©”μ†Œλ“œκ°€ 호좜됨
        Animal myCat = new Cat();  // λŸ°νƒ€μž„ μ‹œμ— Cat의 λ©”μ†Œλ“œκ°€ 호좜됨

        myDog.makeSound();  // "Bark"
        myCat.makeSound();  // "Meow"
    }
}

 

Animal 클래슀의 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ Dog와 Cat 객체λ₯Ό μƒμ„±ν•˜κ³  makeSound λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, 각각 Dog와 Cat의 μ˜€λ²„λΌμ΄λ“œλœ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœλ‹€.

 

2. μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ λ‹€ν˜•μ„±

  • μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ†Œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λ§Œ μ •μ˜ν•˜κ³ , κ΅¬ν˜„μ€ 이λ₯Ό μƒμ†ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ μ œκ³΅ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜κ°€ 이λ₯Ό κ΅¬ν˜„ν•œ 객체λ₯Ό 가리킀고, λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ‹€μ œ 객체의 κ΅¬ν˜„λœ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœλ‹€.
interface Animal {
    void makeSound();
}

class Dog implements Animal {
    public void makeSound() {
        System.out.println("Bark");
    }
}

class Cat implements Animal {
    public void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // λŸ°νƒ€μž„ μ‹œμ— Dog의 λ©”μ†Œλ“œκ°€ 호좜됨
        Animal myCat = new Cat();  // λŸ°νƒ€μž„ μ‹œμ— Cat의 λ©”μ†Œλ“œκ°€ 호좜됨

        myDog.makeSound();  // "Bark"
        myCat.makeSound();  // "Meow"
    }
}

 

λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ˜ λ™μž‘ 방식

동적 바인딩

λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ€ 컴파일 μ‹œμ μ΄ μ•„λ‹Œ μ‹€ν–‰ μ‹œμ μ— μ‹€μ œ λ©”μ†Œλ“œκ°€ κ²°μ •λ˜λŠ” 동적 바인딩을 톡해 μ‹€ν˜„λœλ‹€. 즉, μ»΄νŒŒμΌλŸ¬λŠ” μ°Έμ‘° λ³€μˆ˜κ°€ 가리킬 수 μžˆλŠ” λ©”μ†Œλ“œκ°€ μžˆλ‹€λŠ” κ²ƒλ§Œ μ•Œκ³  있으며, μ–΄λ–€ λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ μ§€λŠ” λŸ°νƒ€μž„μ— 객체의 νƒ€μž…μ— 따라 κ²°μ •λœλ‹€.

λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©

λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ€ λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ„ 톡해 κ΅¬ν˜„λœλ‹€. λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)ν•¨μœΌλ‘œμ¨, λ™μΌν•œ λ©”μ†Œλ“œ 호좜이 λ‹€λ₯΄κ²Œ λ™μž‘ν•  수 μžˆλ‹€.

 

μž₯점

1. μ½”λ“œ μž¬μ‚¬μš©μ„±

λ™μΌν•œ μ½”λ“œλ‘œ λ‹€μ–‘ν•œ 객체λ₯Ό μ²˜λ¦¬ν•  수 μžˆμ–΄ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ 높아진닀.

2. μœ μ—°μ„±

μ‹œμŠ€ν…œμ΄ ν™•μž₯λ˜κ±°λ‚˜ 변경될 λ•Œ μ½”λ“œ μˆ˜μ •μ΄ μ΅œμ†Œν™”λœλ‹€. μƒˆλ‘œμš΄ ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λ”λΌλ„ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš” 없이 κΈ°μ‘΄ ㄴꡬ쑰λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

3. μœ μ§€λ³΄μˆ˜μ„±

μ½”λ“œκ°€ λ³€κ²½λ˜λ”λΌλ„ μœ μ§€λ³΄μˆ˜μ™€ 관리가 μ‰¬μ›Œμ§„λ‹€.

단점

1. μ„±λŠ₯ μ €ν•˜

동적 바인딩은 λŸ°νƒ€μž„μ— λ©”μ†Œλ“œλ₯Ό κ²°μ •ν•˜κΈ° λ•Œλ¬Έμ—, 정적 바인딩에 λΉ„ν•΄ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.

2. λ””λ²„κΉ…μ˜ 어렀움

    μ‹€ν–‰ μ‹œμ μ— λ©”μ†Œλ“œκ°€ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ—, 디버깅 μ‹œ μ–΄λ–€ λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ μ§€ μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ ΅λ‹€.

정리

λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ°•λ ₯ν•œ κ°œλ…μœΌλ‘œ, μƒμœ„ 클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ 톡해 λ‹€μ–‘ν•œ ν•˜μœ„ 클래슀 객체λ₯Ό μ²˜λ¦¬ν•  수 있게 ν•΄μ€€λ‹€. 이둜 인해 μ½”λ“œλŠ” λ”μš± μœ μ—°ν•΄μ§€κ³  μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§„λ‹€. λ‹€λ§Œ, μ‹€ν–‰ μ‹œμ μ— λ©”μ†Œλ“œλ₯Ό κ²°μ •ν•˜λŠ” 동적 λ°”μΈλ”©μœΌλ‘œ 인해 μ„±λŠ₯ μ €ν•˜λ‚˜ λ””λ²„κΉ…μ˜ 어렀움이 μžˆμ„ 수 μžˆμœΌλ―€λ‘œ, 이λ₯Ό 염두에 두고 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.