프로그래밍/cpp

오버로딩 오버라이딩 (overloading overriding) c++

콘파냐 2014. 4. 17. 18:08
반응형

오버로딩과 오버라이딩은 C언어에서는 지원하지 않습니다. C++에서 지원한다는 점을 기억해 두시고, 오버로딩과 오버라이딩의 차이점을 설명합니다.


오버로딩(overloading)

오버로딩은 중복정의라고도 합니다. 기존에 만들어 놓은 함수와 이름은 같지만, 인수의 형태가 다른 함수가 있을 때 오버로딩되었다고 합니다.(참고 : 리턴값은 같을 수도 있고 달라질 수도 있습니다. 주의할 점은 인수형태는 같은데 리턴값만 다를 경우는 모호한(ambiguous)표현이라고 에러가 나게 됩니다.) 이때 인수의 개수는 같거나 다르거나 상관은 없습니다.

그리고 오버로딩은 일반 함수나 같은 클래스의 멤버함수간에 이루어집니다.

예를 들어 설명해 드리겠습니다. 




overl의 함수명을 가진 3개의 함수가 있습니다. 오버로딩을 확인할 때는 리턴값은 우선 무시하고 인수값의 형태를 비교 합니다. 세 개의 인수값의 형태가 각각 다르기 때문에 오버로딩 조건에 맞습니다. 각 함수의 기능은 자신의 함수원형을 출력합니다. 그럼 3가지 overl함수를 호출해 보겠습니다.  호출 방법은 인수를 원형에 맞게 쓰기만 하면 컴파일러가 알아서 형태에 맞는 함수를 매칭시켜 줍니다.

오버로딩은 다양한 타입의 인수에 대해서 같은 기능을 하는 함수를 정의할 때 유용합니다. 같은 +연산을 하는 함수를 int형,double형, float형에 대에서 하고싶다면 함수명을 따로 할 필요없이 같은 함수명에 인수타입만 다르게 오버로딩하면 됩니다.





오버라이딩(overriding)

오버라이드(override)를 네이버 사전에서 찾아보면 다음과 같은 뜻이 있습니다.




사전을 뜻처럼 overriding은 기존의 정의된 함수를 무시해버리게 됩니다. 재정의라고도 합니다.  이런 성질의 오버라이딩은 상속관계에서 자식의 클래스가 부모의 클래스에 대해서 행해집니다. 나쁜 자식이 부모를 무시하는 문법이군요.

우선 예를 살펴보겠습니다.




먼저 A클래스에서 over함수가 오버로딩되어 있습니다. B는 A를 상속받고 over(int a, int b)로 over함수를 오버라이딩 했습니다. 먼저 A클래스의 객체를 생성하여 over함수에대한 오버로딩을 시험해 봤습니다. 그리고 B객체를 생성하여 오버라이딩을 시험해봤습니다. 결과는 다음과 같습니다.




오버로딩과 오버라이딩이 모두 적용되었습니다. 문제는 없어보입니다. 그런데 여기서 생각할 점이 있습니다. B클래스는 A클래스를 상속 받아 사용하는 입장입니다. over함수에 대해 같은 구현을 하지만, 인수를 추가하여 오버로딩을 하고싶은 경우 B클래스에서는 안된다는 점입니다. B클래스에서 위처럼 선언을 해버리면 오버라이딩이 되어 상속받은 A클래스의over를 모두 무시해버립니다. 그래서 클래스를 설계할 때 A클래스에 모든 오버로딩 하는 것이 이상적입니다. 아니면 상속클래스에서 over를 모두 오버라이딩을 하고 추가하려는 over(int a, int b)를 오버로딩하면 됩니다.


왜 이렇게 해야하는가...

단순히 자식클래스에서 over만 오버로딩하는 문법이 생기면 되지 않을까, 하는 생각도 듭니다. 

그럼 다음을 살펴보면서 이야기를 해나가겠습니다.




a.over(3.5)에서 3과 5는 int형입니다. 그런데 Test클래스의 멤버함수에 선언된 over함수는 int형 인수를 받아들이지 않는 함수 입니다. 하지만 위 코드의 결과값은 제대로 나옵니다.

int형은 long형이 아니지만, long형이 int형을 받아들일 수 있기 때문입니다. 여기서 int형을 인수를 하는 함수를 추가하여 over를 오버로딩 하게 되면 예상치 예상치 못한 실행결과가 나올 수 있습니다. over(int a, int b)의 동작이 같다면 문제는 없겠지만, 코드가 완전 바뀌게 된다면 문제가 될 것입니다.

위 예처럼 상속관계가 없는 경우에는 오버로딩 관계가 보이기 때문에 염려가 없지만 상속관계인 경우 부모와 자식간에 오버로딩이 가능하다면, 위처럼 인수가 int형인 함수가 새로 오버로딩 될 때 long형타입에 동작하던 함수가 int형 타입으로 동작방식이 바뀔 수 있기 때문에, 깔끔하게 자식클래스에서는 오버라이딩이 되는 것입니다.

반응형