본문 바로가기
패스트캠퍼스 챌린지(C++ 올인원)

패스트캠퍼스 챌린지 29일차

by 승욱은 2021. 11. 29.

와..! 벌써 29일..! 오늘까지 하고 내일까지 쓰면 드디어 끝..! 얼마 안남았다..! 화이팅이다 나..!

 

오늘은 너무나 머리가 아픈 나머지 낮잠을 자고 오후 늦게 활동을 시작했다.. ㅠ 그마저도 헤롱한지라 조금 더 쉬다가 시작했다..! 그래서 오늘은 PS도 하나밖에 못했고, 과외가 있던 탓에 c++강의도 한 개 밖에 못들었다.. ㅠ

 

아무튼 그래서 오늘 배운 내용은..! 바로 동적 결합과 정적 결합이다.

 

이 둘은 오버로딩과 오버라이딩에서 사용되는 개념인데, 정적 결합은 컴파일하는 순간에 같은 이름의 함수끼리 어떤 함수가 호출될지 결정되는 것을 이야기하고, 동적 결합은 컴파일하는 순간에는 같은 이름의 함수끼리 어떤 게 호출될지는 몰라도, 프로그램이 실행되는 중간에 그것이 결정되는 것을 이야기한다고 한다.

 

예를 들면 

int func(int x, int y){
	return x+y;
}
int func(int x){
	return x+10;
}

int main(){
	cout << func(10) << endl;
}

다음과 같은 함수가 있을 때는 오버로딩이고, 컴파일 시에 어떤 함수가 호출될 지 결정된다. 즉 어떻게 하더라도 호출되는 함수를 바꿀 수는 없다.

 

하지만 다음과 같은 경우는 조금 다르다.

class Animal
{
public:
    int *p;
    virtual void eat() const
    {
        cout << "냠" << endl;
    }
};

class Cat : public Animal
{
public:
    virtual void eat() const override
    {
        cout << "냥" << endl;
    }
};

class Dog : public Animal
{
public:
    virtual void eat() const override
    {
        cout << "멍" << endl;
    }
};

int main()
{
	Animal *a = new Dog;
    a->eat();
}

Animal a가 가르키고 있는 실제 객체는 Dog의 객체지만, 참조변수, 즉, 리모콘은 Animal 타입이다. 따라서 "냠"이 출력될 것이라 예상할 수 있지만 virtual로 오버라이딩 되어있으므로 Dog를 찾아가 "멍"이 출력되게 된다. 이것이 컴파일 되는 순간에 결정되지 않고, 러닝타임에 결정된다고 하는데, 나는 IDE를 VSC를 쓰고 있는지라 해보진 못했지만, 강사님께서 VS 디버깅 모드로 중간에 virtual 함수의 포인터(로 추정되는 것)의 주소를 인위적으로 바꿔주니 "냥"을 출력할 수 있었다. 즉, 컴파일 타임에는 어떤 것이 출력될지 정확하게 결정되지 않았기에 바뀔 수 있었던 것이다.

 

상당히 흥미롭다. 주소를 바꾸어 다른 걸 출력해본다니.. 상상도 못해봤는데 이 강사님, 생각보다 대단하신 분인 것 같다.

 

 

동적결합, 정적결합을 배우는 모습

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

패스트캠퍼스 : https://bit.ly/3FVdhDa

 

수강료 100% 환급 챌린지 | 패스트캠퍼스

딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

fastcampus.co.kr

 

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #C++실력완성올인원패키지

댓글