저의 velog에 작성된 글은 모두 저의 주관적인 생각 및 이해를 바탕으로 작성된 글이므로
정확하지 않은 내용을 있을 수 있음을 알립니다.
[교재] 윤성우 열혈 C++ 프로그래밍
오버로딩과 오버라이딩은 다형성을 지원하는 언어를 공부할 때 반드시 등장하는 개념 중 하나이다. 이 두 개념은 이름도 비슷하고 실제 내용도 비슷하기 때문에 헷갈리기 쉽다.
따라서 오늘은 오버로딩과 오버라이딩은 각각 무엇이고 차이점에 대해 알아볼 것이다.
C++를 공부하고 있다면, 대부분 C언어에 대한 문법을 어느정도 알고 있을 것이다. C언어를 사용해보면 알겠지만, C언어에서는 아래 예시와 같이 동일한 이름을 가진 함수를 허용하지 않는다.
int MyFunc(int num)
{
num++;
return num;
}
int MyFunc(int a, int b)
{
return a+b;
}
하지만 C++문법의 오버로딩 조건만 만족한다면, C언어에서 허용하지 않는 위와 같은 함수들을 '오버로딩'이라는 개념을 통해 해결할 수 있다. 그렇다면 오버로딩의 조건이란 뭘까?
[오버로딩의 조건]
매개변수의 자료형 또는 개수가 달라야한다!
예를 들어보자
Ex1)
int YoonsFunc(char c) { . . . }
int YoonsFunc(int n) { . . . }
첫 번째 예시의 경우 매개변수의 개수는 같지만 자료형이 다르므로 오버로딩 조건을 만족한다. 따라서 위의 예시는 정상적으로 코드를 실행한다.
Ex2)
int YoonsFunc(int a, int b) { . . . }
int YoonsFunc(int a, int b, int c) { . . . }
두 번째 예시의 경우 매개변수의 개수가 다르므로 오버로딩을 만족한다. 따라서 위의 예시도 정상적으로 코드를 실행한다.
Ex3)
int YoonsFunc(double a) { . . . }
void YoonsFUnc(double a) { . . . }
세 번째 예시는 매개변수의 개수와 자료형의 개수가 모두 같다. 하지만 함수의 반환형이 다르다. 이는 오버로딩 조건에 만족할까? 답은 그렇지 않다. 함수의 반환형은 함수를 구분하는 기준이 될 수 없으므로 위의 코드는 컴파일 오류를 발생시킨다.
오버라이딩을 설명하기 위해 상황을 가정하겠다. A클래스와 B클래스가 있고, B클래스는 A클래스를 상속한다고 가정하자. 이때 A클래스와 B클래스 모두 같은 이름의 함수를 쓰고자 하지만 실제 함수의 내용은 다르다고 할 떄 이것을 어떻게 구현할 수 있을까??
위의 상황을 코드를 구현해보면 아래와 같다.
class A {
private:
. . .
public:
void Get(int n) { cout << "This" << endl; }
. . .
};
class B : public A {
private:
. . .
public:
void Get(int n) { cout << "That" << endl; }
. . .
};
A클래스와 B클래스는 Get이라는 같은 이름의 함수를 가지고 있다. 심지어 함수의 반환형, 매개변수의 개수와 자료형까지 모두 같다. 하지만 A클래스의 Get함수는 "This"를 출력하고, B클래스의 Get함수는 "That"을 출력하므로 같은 함수처럼 보이지만, 실질적인 함수의 내용은 다르다. 이 개념이 바로 오버라이딩이다.
하나의 객체에서 같은 이름을 가진 함수라고 할지라도 오버로딩 조건에 맞다면 쓸 수 있도록 하는
문법이다!
* 오버로딩의 조건 - 매개변수의 자료형 또는 개수가 달라야한다!
서로 다른 객체 사이에 같은 이름의 함수를 가졌지만 함수의 내용을 다를 때 이전에 내용을 덮어쓰는 것!
오버로딩과 오버라이딩의 개념 및 차이에 대해 설명했다. Intro애서 언급했듯 이름도, 개념도 비슷하기 때문애 정확하게 알고 상황에 맞게 적용하기를 바란다.
유익한 글이었습니다.