****제가 이해한 내용의 TIL입니다 사실과 다를 수 있으니 찾아보시길 바랍니다  *******

 


오버로딩 : 

오버로딩은 같은 이름의 함수나 연산자를 여러번 정의하는 것을 의미
함수의 매개변수 목록이 달라야합니다.
함수 호출 시 전달된 인자의 종류에 따라 적절한 함수가 호출됩니다.

예를 들어보겠습니다.  제가 밥을 먹는 행위를 함수로 짠다라고 생각해보겠습니다
밥을먹는다(무엇){
cout << 무엇을 먹을거냐 <<"\n";
}

밥을먹는다(무엇){
cout << 무엇을 먹을거냐 <<"\n";
}


이라고 했을때 무엇에는 정말 여러가지의 종류가 많을 것입니다
하지만 그때마다 함수를 짠다면 생각만해도 번거로울것 같습니다..

그래서 오버로딩을 통해 미리 함수를 만들어 놓는 개념입니다.

class Calculator { // 오버로딩의 예시
public:
    // 정수 덧셈
    int add(int a, int b) {
        return a + b;
    }

    // 실수 덧셈
    double add(double a, double b) {
        return a + b;
    }

    // 세 개의 정수 덧셈
    int add(int a, int b, int c) {
        return a + b + c;
    }
};



오버라이딩 : 
 
어제 12/26 TIL에서 공부한 다형성을 구현하기 위한 가상함수입니다 !


오버라이딩은 부모클래스(기반 클래스)의 메서드를 자식클래스(파생클래스)에서 재정의 하는 것을 말합니다.

부모 클래스의 메서드와 동일한 이름, 반환 타입, 매개변수 목록을 가져야하며 다형성을 구현하기 위해 사용합니다.

오버라이딩의 특징은 다음과 같습니다 .

1. 서로 다른 클래스에서 사용합니다 
2. 반드시 상속 관계가 있어야합니다.
(즉 서로 다른 클래스라는건 기반 클래스와 파생클래스를 의미합니다)
3. 런타임에 결정됩니다 (동적 바인딩)
4. 기반 클래스의 메서드는 Virtual 키워드를 사용해야합니다 
//가상함수 : 이유는 아래에 설명 

오버라이딩의 예시는 12/26TIL을 봐주세요 !!

오버로딩과 오버라이딩




여기서 만약에 반환 타입이 다른 함수는 오버로딩이 가능할까요?
아닙니다 ! 매개변수가 같고 반환 타입만 다른 경우는 허용되지 않습니다.


오버라이딩에서 virtual 키워드는 무슨 역할을 하나요? 만일 해당 키워드를 사용하지 않는다면 
동적 바인딩이 아닌 정적 바인딩이 되어 다형성을 잃을 수 있습니다.

 

저는 바인딩이라는 단어를 몰라서 찾아봤습니다 !


바인딩(Binding) 은 함수 호출 시 어떤 함수가 호출될지를 결정하는 과정으로 종류에는 2가지가 있습니다.

(1) 정적 바인딩 (Static Binding)
컴파일 시점에 호출할 함수가 결정됩니다.
함수 호출이 정적으로 결정되므로 실행 속도가 빠릅니다.
비가상 함수(non-virtual function)가 기본적으로 정적 바인딩됩니다.


(2) 동적 바인딩 (Dynamic Binding)
실행 시점에 호출할 함수가 결정됩니다.
런타임에 객체의 실제 타입에 따라 호출할 함수가 결정되므로 유연성을 제공합니다.
가상 함수(virtual function)**가 동적 바인딩됩니다.


다시말해 다형성은 main이 실행하는 동안 해당 함수가 나오면 
객체의 타입에 따라 호출할 함수가 결정됩니다. 하지만 정적 바인딩은 컴파일 시점에 호출할 함수가 결정되어,

유연성이 떨어지게 됩니다. 

 

우리가 만약에 동적할당 없이 배열을 통해 입력을 받는다고 해보겠습니다 

우리가 사용자가 얼마나 올지 몰라서 ,  사용자에게 몇명이 오는지에 대해 입력을 받고 

int a[n]; 이라는 단어를 사용한다면 컴파일에러가 발생할 것입니다.

//이유 : 배열은 정적할당이기 때문에 스택메모리를 사용해 먼저 크기만큼 메모리를 할당받아야합니다.

//          다시말해, 실행하는 순간이 아닌 컴파일 하는 순간 메모리가 할당 받아져 있어야하는데,

            유저에게 몇명이 오는지를 입력을 받는 순간은 프로그램이 실행한 순간일것 입니다.

            따라서 n이라는 미지수를 배열로 입력할 수 없습니다. 

             그 수만큼 배열을 짜기 위해서는 const 라는 키워드를 통해 배열의 최대 인원수를 묶어놔야할 것입니다 .

             사람이 늘어나는것만큼 유동적으로 할 수 없기 때문입니다.

 

따라서 유연성있게 프로그램을 짜는 것이 유저가 게임을 경험함에 있어 좋은 경험을 선사할 것입니다.

 

잠시 삼천포로 빠졌지만, 오버라이딩은 가상함수를 통해 런타임에 객체의 실체 타입에 따라 호출할 함수가 결정되는

유연성을 제공합니다.

 

 

+ Recent posts