2024. 4. 5. 11:51ㆍProgramming 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;
}
▽ 출력 결과
멍멍
야옹
'Programming Language > C++' 카테고리의 다른 글
[C++] 다형성과 추상화 (+ 다운 캐스팅, RTTI) (0) | 2024.04.05 |
---|---|
[C++] 객체지향 언어 특징 (0) | 2024.04.05 |
[C++] BST의 중위 후속자, 중위 선행자 및 BST의 삭제 구현 (0) | 2024.04.04 |
[C++] enum 클래스를 활용하여 BST(이진 탐색 트리) 구현 (0) | 2024.04.04 |
[C++] enum과 enum 클래스 (0) | 2024.04.04 |