210111 월요일 강의 정리 - 정적바인딩과 동적바인딩
정적바인딩
컴파일할 때 어떤 걸 호출할지 미리 결정되는 친구, 프로그램 실행 전에 이미 결정됨
대표적으로 오버로딩이 있음
#include <iostream>
using namespace std;
class Parent {
public:
int num;
};
class Child :public Parent {
};
void add(Parent left, Parent right) {
cout << "Parent add: " << left.num + right.num << endl;
}
void add(Child left, Child right) {
cout << "Child add: " << left.num * right.num << endl;
}
int main() {
Parent p0, p1;
p0.num = 10; p1.num = 20;
add(p0, p1); // 30
Child c0, c1;
c0.num = 100; c1.num = 200;
add(c0, c1); // 20000
Parent& ref0 = c0;
Parent& ref1 = c1;
add(ref0, ref1); // ???
}
마지막 세 줄
Parent& ref0 = c0;
Parent& ref1 = c1;
add(ref0, ref1); // ???
ref0이랑 ref1가 실제로 가리키는 친구는 Child 객체이지만 호출한 함수는 파라미터가 Parent 인 void add(Parent, Parent) 함수
이렇게 정적바인딩은 객체의 타입(Parent)만 보고 어떤 함수를 호출할 지 결정하기 때문에 실제로 무엇을 가리키는지는 중요하지 않다.
그래서 void add(Child, Child) 가 아니라 void add(Parent, Parent) 함수를 호출한 것.
동적 바인딩
런타임 도중, 실행하면서 결정되는 친구
대표적으로 오버라이딩이 있음
#include <iostream>
using namespace std;
class Animal {
public:
virtual void func() const {
cout << "운다" << endl;
}
};
class Dog : public Animal {
public:
virtual void func() const override{
cout << "멍" << endl;
}
};
class Cat : public Animal {
public:
virtual void func() const override {
cout << "냥" << endl;
}
};
int main() {
Animal* a0 = new Cat;
Animal* a1 = new Dog;
a0->func();
a1->func();
}
오버라이딩은 런타임 도중 그니까 실행하는 도중에 객체가 실제 가리키는 친구가 뭔지 매번 확인하고 결정함
단 virtual 선언을 했을 경우에 해당.
virtual 선언안하면 정적바인딩되어서 멍 냥이 아니라 운다가 출력됨 (부모에 의해 오버라이딩한 함수가 가려진다)