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

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

[OOP] 동적 바인딩

좜처

ChatGPT


동적 바인딩(Dynamic Binding)은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ©”μ†Œλ“œ 호좜 μ‹œμ μ— μ‹€μ œ λ©”μ†Œλ“œμ˜ κ΅¬ν˜„μ„ κ²°μ •ν•˜λŠ” κΈ°μˆ μ΄λ‹€. 동적 바인딩은 λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜λ©°, μ‹€ν–‰ 쀑 μ°Έμ‘° λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 객체의 μ‹€μ œ νƒ€μž…μ— 따라 ν˜ΈμΆœν•  λ©”μ†Œλ“œκ°€ κ²°μ •λœλ‹€. 이λ₯Ό 톡해 λ™μΌν•œ λ©”μ†Œλ“œ 호좜이 객체의 νƒ€μž…μ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•  수 μžˆλ‹€.

 

동적 λ°”μΈλ”©μ˜ λ™μž‘ 방식

1. 컴파일 νƒ€μž„κ³Ό λŸ°νƒ€μž„μ˜ 차이

컴파일 νƒ€μž„ 바인딩

λ©”μ†Œλ“œ 호좜이 컴파일 μ‹œμ μ— κ²°μ •λœλ‹€. μ΄λŠ” 주둜 λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©μ—μ„œ λ°œμƒν•œλ‹€. λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©μ€ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄λ‚˜ κ°œμˆ˜μ— 따라 ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“£κ°€ κ²°μ •λ˜λŠ” κ²ƒμœΌλ‘œ, λŸ°νƒ€μž„ λ‹€ν˜•μ„±κ³ΌλŠ” 관련이 μ—†λ‹€.

λŸ°νƒ€μž„ 바인딩

λ©”μ†Œλ“œ 호좜이 μ‹€ν–‰ μ‹œμ μ— κ²°μ •λœλ‹€. μ΄λŠ” 주둜 λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ—μ„œ λ°œμƒν•˜λ©°, 객체의 μ‹€μ œ νƒ€μž…μ— 따라 호좜될 λ©”μ†Œλ“œκ°€ κ²°μ •λœλ‹€.

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

  • μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)ν•¨μœΌλ‘œμ¨ 동적 바인딩이 이루어진닀.
  • μƒμœ„ 클래슀의 μ°Έμ‘° λ³€μˆ˜κ°€ ν•˜μœ„ 클래슀의 객체λ₯Ό μ°Έμ‘°ν•  λ•Œ, λ©”μ†Œλ“œ 호좜 μ‹œ μ‹€μ œ 객체의 νƒ€μž…μ— 따라 μ˜€λ²„λΌμ΄λ“œλœ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœλ‹€.

3. λ©”λͺ¨λ¦¬ ꡬ쑰

λ©”μ†Œλ“œ ν…Œμ΄λΈ” Method Table

JVM은 각 ν΄λž˜μŠ€μ— λŒ€ν•΄ λ©”μ†Œλ“œ ν…Œμ΄λΈ”μ„ μœ μ§€ν•œλ‹€. 이 ν…Œμ΄λΈ”μ€ λ©”μ†Œλ“œ 이름과 κ·Έ λ©”μ†Œλ“œμ˜ μ‹€μ œ κ΅¬ν˜„ μ£Όμ†Œλ₯Ό λ§€ν•‘ν•œλ‹€.

λ””μŠ€νŒ¨μΉ˜ ν…Œμ΄λΈ” Dispatch Table

객체의 μ‹€μ œ νƒ€μž…μ— 따라 λ©”μ†Œλ“œ ν…Œμ΄λΈ”μ—μ„œ ν•΄λ‹Ή λ©”μ†Œλ“œμ˜ κ΅¬ν˜„μ„ μ°ΎλŠ” 과정이닀. λŸ°νƒ€μž„μ— 객체의 μ‹€μ œ νƒ€μž…μ— 따라 μ μ ˆν•œ λ©”μ†Œλ“œκ°€ μ„ νƒλœλ‹€.

 

동적 λ°°μΈλ”©μ˜ 예제 μ½”λ“œ

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 myAnimal = new Dog();  // Animal νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜κ°€ Dog 객체λ₯Ό μ°Έμ‘°
        myAnimal.makeSound();  // λŸ°νƒ€μž„ μ‹œμ— Dog 클래슀의 makeSound() 호좜됨

        myAnimal = new Cat();  // Animal νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜κ°€ Cat 객체λ₯Ό μ°Έμ‘°
        myAnimal.makeSound();  // λŸ°νƒ€μž„ μ‹œμ— Cat 클래슀의 makeSound() 호좜됨
    }
}

 

μž₯점

1. μœ μ—°μ„±

μƒμœ„ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ ν•˜μœ„ 클래슀 객체λ₯Ό λ‹€λ£° 수 있으며, μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό ν™•μž₯성이 ν–₯μƒλœλ‹€.

2. μ½”λ“œ μž¬μƒμš©μ„±

λ™μΌν•œ μƒμœ„ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ‹€μ–‘ν•œ ν•˜μœ„ 클래슀 객체λ₯Ό μ²˜λ¦¬ν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ 높아진닀.

3. λͺ¨λ“ˆν™”

κ΅¬ν˜„ μ„ΈλΆ€ 사항을 숨기고, μƒμœ„ 클래슀의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μ•„νœ˜ 클래슀의 ꡬ체적인 κ΅¬ν˜„μ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν•˜λ‹€.

 

단점

1. μ„±λŠ₯ 문제

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

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

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

 

동적 바인딩과 κ΄€λ ¨λœ μš©μ–΄

λ‹€ν˜•μ„± Polymorphism

λŸ°νƒ€μž„ λ‹€ν˜•μ„± λ˜λŠ” 동적 바인딩을 톡해 κ°™μœΌ λ©”μ†Œλ“œ 호좜이 λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ 싀행될 수 μžˆλŠ” κ°œλ…μ΄λ‹€.

λ©”μ†Œλ“œ ν…Œμ΄λΈ” Method Table

JVMμ—μ„œ 각 클래슀의 λ©”μ†Œλ“œμ™€ κ΅¬ν˜„ μ£Όμ†Œλ₯Ό λ§€ν•‘ν•œ ν…Œμ΄λΈ”μ΄λ‹€.

가상 λ©”μ†Œλ“œ ν…Œμ΄λΈ” Virtual Method Table

객체의 μ‹€μ œ νƒ€μž…μ— 따라 ν˜ΈμΆœν•  λ©”μ†Œλ“œλ₯Ό κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν…Œμ΄λΈ”μ΄λ‹€.

 

κ²°λ‘ 

동적 바인딩은 λŸ°νƒ€μž„ μ‹œμ μ— λ©”μ†Œλ“œ ν˜ΈμΆœμ„ κ²°μ •ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜λŠ” μ€‘μš”ν•œ κΈ°λŠ₯이닀. 이λ₯Ό 톡해 λ™μΌν•œ λ©”μ†Œλ“œ 호좜이 객체의 νƒ€μž…μ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•  수 있으며, μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆλ‹€. ν•˜μ§€λ§Œ μ„±λŠ₯ μ €ν•˜μ™€ λ””λ²„κΉ…μ˜ 어렀움이 μžˆμ„ 수 μžˆμœΌλ―€λ‘œ, 이λ₯Ό κ³ λ €ν•œ 섀계가 ν•„μš”ν•˜λ‹€.