[C++] 오버로딩 vs. 오버라이딩 (+ 바인딩)

2024. 4. 5. 11:51Programming Language/C++

오버로딩 vs. 오버라이딩

특징 오버로딩 오버라이딩
함수 이름 동일 동일
매개변수 타입 또는 개수가 다르다. 타입 및 개수가 같다.
반환 타입 달라도 된다. 같아야 한다.
발생 위치 같은 클래스 내 상속 관계에서
목적 다양한 데이터 처리 부모 클래스 기능 재정의
바인딩 정적 바인딩 동적 바인딩

바인딩(Binding)

• 함수 호출 시 실제로 실행될 코드를 연결하는 과정

즉, 어떤 함수를 호출했을 때 컴퓨터가 정확히 어떤 코드를 실행해야 할지 연결하는 작업이다.

정적 바인딩과 동적 바인딩

1) 정적 바인딩

컴파일 시점에 함수 호출과 실행될 코드가 연결된다.

즉, 코드를 컴파일하는 시점에 어떤 함수를 호출하면 어떤 코드가 실행될지 확정된다.

• 오버로딩에서 주로 사용되며, 컴파일러는 함수 이름과 매개변수의 타입과 개수를 보고 어떤 함수를 호출할지 미리 결정한다.

2) 동적 바인딩

런타임 시점에 함수 호출과 실행될 코드가 연결된다.

즉, 프로그램이 실행되는 도중에 어떤 함수를 호출하면 어떤 코드가 실행될지 확정된다.

• 오버라이딩에서 주로 사용되며, 부모 클래스의 포인터로 자식 클래스의 객체를 가리킬 때, 실제 호출될 함수는 실행 시점에 결정된다.


오버로딩(Overloading)

• 동일한 함수명이지만 인자 타입이나 개수가 달라서 컴파일러가 구별하게 해주는 것

인자 타입이나 개수만 다르면 똑같은 함수명으로 여러 개 만들 수 있다.

▷ 예시

#include <iostream>
#include <string>

using namespace std;

int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

string add(string a, string b) {
    return a + b;
}

int main() {
    int num1 = 10, num2 = 20;
    double d1 = 3.14, d2 = 1.59;
    string str1 = "Hello, ", str2 = "world!";

    cout << "정수 더하기: " << add(num1, num2) << endl;
    cout << "실수 더하기: " << add(d1, d2) << endl;
    cout << "문자열 연결: " << add(str1, str2) << endl;

    return 0;
}

▽ 출력 결과

정수 더하기: 30
실수 더하기: 4.73
문자열 연결: Hello, world!

오버라이딩(Overriding)

• 동일한 함수명이지만 호출한 쪽의 함수가 호출되며, 상속 관계에서만 발생한다.

• 오버로딩 관점에서는 오류이다.

부모와 자식 클래스에 동일한 함수명이 있는데 자식 쪽의 함수를 호출한 경우, 자식 쪽 클래스에서 상속받은 부모 쪽의 기능

을 덮어쓰기 때문에 (덮어쓰다 : Override) 자식 클래스 쪽의 함수가 호출된다.

즉, 부모 클래스의 멤버 함수를 자식 쪽에서 재정의 함으로써 자식 클래스에 구현된 기능이 호출되도록 한다.

오버라이딩을 사용하는 이유

부모를 상속받은 자식들 중 어떤 자식이 부모에서 어느 한 기능만 재정의(오버라이딩)해서 본인 쪽에서만 다른 기능으로 사용하고 싶을 때, 부모의 기능을 상속받아도 그 기능들이 다 마음에 들 수는 없다.

이때 몇몇 기능만 재정의해서 사용할 수 있다.

▷ 예시

#include <iostream>

using namespace std;

class Animal {
public:
    virtual void sound() {
        cout << "동물 소리" << endl;
    }
};

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

class Cat : public Animal {
public:
    void sound() override {
        cout << "야옹" << endl;
    }
};

int main() {
    Animal* animal = new Dog();
    animal->sound(); // Dog의 sound()가 호출됨

    animal = new Cat();
    animal->sound(); // Cat의 sound()가 호출됨

    delete animal;

    return 0;
}

▽ 출력 결과

멍멍
야옹