"

Cpp - 바인딩, 동적 바인딩, 가상 μ†Œλ©Έμž

2022. 5. 6. 12:21ㆍC++



πŸ’‘ 바인딩, 동적 바인딩, 가상 μ†Œλ©Έμž

바인딩과 동적 바인딩 (dynamic binding)

바인딩(binding) : ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ–΄λ–€ μŠ€μ½”ν”„μ˜ ν•¨μˆ˜μΈμ§€ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜λŠ” 것

virtual을 μ‚¬μš©ν•˜λ©΄ 포인터 νƒ€μž…(Person)에 λ”°λ₯Έ ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ, μ €μž₯ν•œ 객채(sujilee)의 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλŠ” 것을 μ „ κ²Œμ‹œκΈ€μ—μ„œ ν™•μΈν•˜μ˜€λ‹€. μ™œ κ·Έλ ‡κ²Œ λ™μž‘ν• κΉŒ?

C++의 μ»΄νŒŒμΌλŸ¬λŠ” ν•¨μˆ˜ 호좜 μ‹œ ν•΄λ‹Ή μŠ€μ½”ν”„ μ•ˆμ— μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜κ³ , ν•΄λ‹Ή ν•¨μˆ˜κ°€ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ„ μ•Œμ•„μ•Όν•œλ‹€. κ·Έλž˜μ•Ό ν•΄λ‹Ή ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹œμž‘ μ£Όμ†Œλ‘œ 점프할 수 있기 λ•Œλ¬Έμ΄λ‹€.

정적 바인딩 동적 바인딩
컴파일 μ‹œμ— ν•„μš”ν•œ ν•¨μˆ˜λ₯Ό 바인딩.
가상 ν•¨μˆ˜κ°€ μ•„λ‹Œ λ©€λ²„λŠ” λͺ¨λ‘ 정적 바인딩을 ν•˜κ²Œ λœλ‹€.
가상 ν•¨μˆ˜λŠ” 런 νƒ€μž„ μ‹œμ— ν•¨μˆ˜λ“€μ„ 바인딩해 μ‚¬μš©ν•œλ‹€.

C++μ—μ„œλŠ” ν•¨μˆ˜μ˜ μ˜€λ²„λ‘œλ”© κΈ°λŠ₯으둜 인해 바인딩 μž‘μ—…μ΄ λ³΅μž‘ν•΄μ§„λ‹€. 일반적인 멀버 ν•¨μˆ˜μ˜ 경우 ν•¨μˆ˜λͺ…이 μ€‘λ³΅λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 컴파일 μ‹œ 정적 바인딩을 ν•˜λ©΄ 그만인데, μ˜€λ²„λ‘œλ”©μ„ μœ„ν•΄ 가상 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 μ»΄νŒŒμΌλŸ¬λŠ” μ–΄λ–€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ•Όν•˜λŠ”μ§€ 미리 μ•Œ 수 μ—†λ‹€. λ”°λΌμ„œ 런 νƒ€μž„(ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑)에 μ˜¬λ°”λ₯Έ ν•¨μˆ˜κ°€ 싀행될 수 μžˆλ„λ‘ 동적 바인딩을 ν•œλ‹€.

  • λͺ¨λ“  가상 ν•¨μˆ˜κ°€ 동적 바인딩을 ν•˜μ§€λŠ” μ•ŠμŒ

    νƒ€μž…μ΄ λΆ„λͺ…ν•  λ•Œμ—λŠ” 정적 바인딩, λΆ€λͺ¨ν΄λž˜μŠ€ νƒ€μž… ν¬μΈν„°λ‚˜ μ°Έμ‘°λ₯Ό 톡해 ν˜ΈμΆœν•  μ‹œλŠ” 동적 바인딩

가상 μ†Œλ©Έμž (virtual destructor)

virtual ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ ν¬μΈν„°λ‘œ 클래슀λ₯Ό μ΄μš©ν•˜λŠ”λ°, λ§Œμ•½ 동적 할당을 μ΄μš”ν•΄ ν• λ‹Ήν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” κ²½μš°λ„ μžˆμ„ 것이닀.

일반적인 상속 μ‹œ μƒμ„±μžμ™€ μ†Œλ©Έμž ν˜ΈμΆœκ³Όμ •μ„ μ‚΄νŽ΄λ³΄μž

#include <iostream>

class Parent {
    public: 
        Parent() {
            std::cout << "Parent class Constructor called" << std::endl;
        }
        ~Parent() {
            std::cout << "Parent class Destructor called" << std::endl;
        }
};

class Child: public Parent {
    public: 
        Child() {
            std::cout << "Child class Constructor called" << std::endl;
        }
        ~Child() {
            std::cout << "Child class Destructor called" << std::endl;
        }
};

int    main() {
    Child kid;
}

κ²°κ³Ό

Parent class Constructor called
Child class Constructor called
Child class Destructor called
Parent class Destructor called

μžμ‹ν΄λž˜μŠ€ 객체λ₯Ό μƒμ„±ν•˜λ €λ©΄ λ¨Όμ € λΆ€λͺ¨ 클래슀의 멀버가 μ „λ‹¬λ˜μ–΄μ•Όν•˜λ―€λ‘œ, λΆ€λͺ¨ 클래슀의 μƒμ„±μžκ°€ κ°€μž₯ λ¨Όμ € ν˜ΈμΆœλœλ‹€. κ·Έ ν›„ μžμ‹ν΄λž˜μŠ€μ˜ μƒμ„±μž 호좜. μ†Œλ©ΈμžλŠ” μžμ‹ν΄λž˜μŠ€μ˜ μ†Œλ©Έμžκ°€ λ¨Όμ € 호좜되고 κ·Έ λ‹€μŒ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μ†Œλ©Έμžκ°€ ν˜ΈμΆœλœλ‹€.

  • λ§Œμ•½ λΆ€λͺ¨ 클래슀의 ν¬μΈν„°λ‘œλΆ€ν„° μžμ‹ν΄λž˜μŠ€λ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°λŠ” μ–΄λ–¨κΉŒ?
int    main() {
    Parent *adult;
    Child *kid = new Child;

    adult = kid;
    delete adult;
}

κ²°κ³Ό

Parent class Constructor called
Child class Constructor called
Parent class Destructor called

μ „ κ²Œμ‹œκΈ€μ—μ„œ μš°λ¦¬λŠ” λΆ€λͺ¨ 클래슀의 ν¬μΈν„°λ‘œλΆ€ν„° μžμ‹ν΄λž˜μŠ€λ₯Ό ν˜ΈμΆœν•  경우, 가상 ν•¨μˆ˜λ‘œ μ •μ˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό μ˜€λ²„λ‘œλ”©ν•΄ μ‚¬μš©ν•  μ‹œ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ 멀버 ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 것을 ν™•μΈν–ˆλ‹€.

μ†Œλ©Έμž λ˜ν•œ ν•¨μˆ˜μ΄κ³ , μžμ‹œν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λ‘œλ”©λœ ν•¨μˆ˜λΌκ³  λ³Ό 수 있기 λ•Œλ¬Έμ— μ†Œλ©Έμž 호좜 μ‹œ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μ†Œλ©Έμžλ§Œ ν˜ΈμΆœλœλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법이 λ°”λ‘œ 가상 μ†Œλ©Έμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

#include <iostream>

class Parent {
    public: 
        Parent() {
            std::cout << "Parent class Constructor called" << std::endl;
        }
        virtual ~Parent() {
            std::cout << "Parent class Destructor called" << std::endl;
        }
};

class Child: public Parent {
    public: 
        Child() {
            std::cout << "Child class Constructor called" << std::endl;
        }
        virtual ~Child() {
            std::cout << "Child class Destructor called" << std::endl;
        }
};

int    main() {
    Parent *adult;
    Child *kid = new Child;

    adult = kid;
    delete adult;
}

κ²°κ³Ό

Parent class Constructor called
Child class Constructor called
Child class Destructor called
Parent class Destructor called

동적 할당을 μ‚¬μš©ν•˜κ³ μž ν•˜λ©΄, λ°˜λ“œμ‹œ μ†Œλ©Έμžλ„ 가상 ν•¨μˆ˜λ‘œ μ„ μ–Έν•΄ μžμ‹ν΄λž˜μŠ€μ˜ μ†Œλ©Έμžλ„ 호좜될 수 μžˆλ„λ‘ ν•˜μž