공룡호가 사는 세상 이야기

오버로드

일상다반사2006. 3. 3. 13:54
#include

class MyClass
{
public:
int dubai(int a); // int형의 멤버 함수
double dubai(double a); // double형의 멤버 함수
};

int MyClass::dubai(int a)
{
return a * 2;
}

double MyClass::dubai(double a)
{
return a * 2;
}

C언어에서는 프로그램 속에 동일한 이름의 함수를 복수 정의할 수 없지만, C++에서는 가능하다. C++컴파일러는 함수를 이름만이 아닌 이름과 인수로 식별하기 때문. 사람의 입장에서 본다면 int dubai(int a)와 double(double a)는 동일한 dubai라는 이름의 함수이다.

C++컴파일러는 int dubai(int a)를 'dubai라는 이름으로 int형 인수를 지는 함수'로 해석하고 양자를 다른 것으로 구별한다. 컴파일러의 해석 방법을 바꾸는 것만으로 오버로드가 실형되고 있다는 뜻.

오버로드가 무엇에 도움이 되는가. 오버로드는 객체지향의 목적인 프로그래밍의 효율화를 실현한다. int형과 double형으로 dubai라는 동일한 이름의 함수가 정의되고 있기 때문에 MyClass 클래스를 사용하는 측에서는 '인수값을 2배 하기 위해서는 정수나 소수점에 관계없이 dubai라는 이름의 멤버 함수를 호출하면 된다.'는 뜻.
기억해야 할 부분이 적은 채로 종료되는 만큼 효율적이다.

클래스를 정의하는 측에서는 두 개의 멤버 함수를 만들고 있지만 클래스를 사용하는 측에서는 다음과 같이 하나의 동일한 멤버 함수처럼 보인다.

void main(void)
{
MyClass obj;

int a;
double b;

a = obj.dubai(123);
b = obj.dubai(3.14);

}

오버로드를 사용하지 않는다면 어떻게 될까.
int형을 인수로 하는 IntDubai(int a)와 double을 인수로 하는 DblDubai(double a)처럼 다른 이름의 멤버 함수를 정의해야 한다. 그러나 이런 상태는 클래스를 정의하는 측에 있어서 기억해야 할 멤버 함수명이 많아져 귀찮아 질 뿐더러 효율적이지 못하다.

덧붙여 오버로드에 의한 다형성의 실현이 가능하다는 것의 의미를 말하자면, 클래스를 사용하는 측은 MyClass클래스가 갖는 dubai라는 멤버 함수에 정수나 실수를 전달하고 호출한다. 이것은 클래스에 동일한 dubai라는 이름의 메세지를 보낸다는 의미가 되는데, 메세지를 보낸다는 뜻은 멤버 함수를 호출하는 것과 동일한 의미를 가진다.

동일한 메세지를 받은 MyClass클래스는 인수의 자료형에 따라서 다른 처리를 실행한다. int형을 2배로 하여 리턴하는 것과 double형을 두배로 하여 리턴하는 것은 프로그램으로서 다른 응답(처리)이다.

이것은 동일한 메세지에 대해 복수의 다른 응답(처리)을 하는 다형성을 실현하고 있는 것으로 해석이 가능.

한가지 더 중요한 점은, C++ 컴파일러는 이름과 인수로 멤버함수를 식별하지만 반환값은 식별의 대상이 되지 않는다. 그러므로 아래와 같이 이름과 인수가 동일하고 반환값의 자료형만 다른 멤버함수를 정의하는 것은 불가능 하다.

class MyClass
{
public:
int myfunc(char *s);
double myfunc(char *s);
};

멤버 함수의 반환값을 식별의 대상으로 삼지 않는 이유는 클래스를 사용하는 측에서 멤버함수를 호출하더라도 반환값을 반다들이는 것이 필수가 아니기 때문. 예를 들어 다음과 같이 반환값을 받아들이지 않고 멤버 함수 myfunc를 호출했을 경우에는 int형을 반환값으로 하는 myfunc()와 double형을 반환값으로 하는 myfunc()의 어느 쪽을 호출했는가 식별할 수 없다.

이 문제를 없애기 위해 반환값의 자료형은 멤버함수를 식별하는 대상으로 삼지 않는 것이다.

class obj;
obj.myfunc("Hello");

'일상다반사' 카테고리의 다른 글

이공계 미취업자 연수기관  (1) 2006.03.27
시간 관리 전문 강사님의 말씀  (0) 2006.03.06
경주 민속 공예촌[慶州民俗工藝村]  (0) 2006.03.02
사랑을 놓치다  (0) 2006.02.11
외식, 그리고 이사.  (1) 2006.02.05