본문 바로가기
언어/C++

[C++ 기본 공부정리] 16-2. OOP 상속성 - 멤버 함수 오버라이딩(overriding)

by 민-Zero 2020. 1. 7.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

1. 오버로딩(overloading)과 오버라이딩(overriding)

오버로딩(overloading)과 오버라이딩(overriding)이름이 비슷하여 많이 헷갈리니까 주의하자. 앞서 정리한 것처럼 오버 로딩은 동일한 함수명을 가진 함수를 매개변수를 다르개하여 여러개로 정의하여 다양한 상황에 사용할 수 있도록 하는 것이였다. 이제 정리할 오버 라이딩은 주로 상속에서 쓰이며 OOP의 다형성의 특징을 지닌 것으로 동일한 함수명에 대해 원래 기능을 무시하고 아예 새롭게 재정의하는 것을 말한다. 오버로딩은 동일한 기능을 다양한 매개변수의 환경에서 동작하기 위해 사용하고 오버라이딩은 다른 기능을 동작하도록 함수를 재정의 하는 것이므로 기존 함수와 동일한 원형을 가진다.

  오버로딩(overloading) 오버라이딩(overriding)
매개변수 변경 함수 원형 유지
동작 기능 기능 유지 변경 또는 확장

간단히 정리하면 표와 같은 차이가 있다. 물론 오버로딩을 진행할 때 함수의 기능을 변경해도 되지만 주로 동일한 기능을 동작할 때 다양한 인수를 받아들이기 위해 사용하는 것일 뿐이다.

 

2. 멤버 함수 오버라이딩

상속을 통해 자식 클래스가 부모 클래스의 멤버들을 지정한 접근제어자에 의해 물려받게 된다. 앞서 보인 것처럼 똑같은 기능을 그대로 사용해야 한다면 그냥 호출하면 되지만 만일 기능의 확장이나 전혀 다른 동작을 해야 한다면 오버라이딩을 통해 재정의해야 한다. 

 

오버라이딩을 할때 2가지 방법을 통해 진행할 수 있다.

① 자식 클래스에서 직접 오버라이딩

② virtual(가상) 함수를 이용하여 오버라이딩

virtual 함수는 다형성 부분에서 자세하게 정리하자.

 

자식 클래스에서 직접 오버라이딩 하는 예시이다.

부모 클래스인 Person은 멤버 변수로 name이라는 사람의 이름을 저장하는 변수와 해당 사람의 정보를 출력하는 기능을 가진 PrintInfo함수를 가지고 있다. 이 클래스를 상속받아 Student라는 자식 클래스를 생성 Student만의 멤버변수인 stu_num을 만들었다. Person에서 구현한 해당 사람의 정보를 출력하는 기능을 자식 클래스에선 좀더 확장시켜 이름뿐만 아니라 학번까지 출력하기위해 오버라이딩을 통해 기능을 재정의한 모습이다. Person에 정의된 함수와 동일한 원형을 지니고 기능부분을 이름 뿐만 아니라 학번까지 출력하도록 재정의 하였다.

따라서 Student 클래스를 이용하여 stu1이라는 객체를 생성하여 PrintInfo 함수를 호출하면 Person에서 정의한 함수와 다른 기능을 수행하게 되며 범위지정연산자(::)를 사용하여 부모클래스의 멤버 함수도 호출 가능하다.

 

※주의

만약 Person* pt_person 처럼 클래스 포인터 변수를 생성하여 접근하려고 하면 Person 클래스를 이용해 생성한 객체에는 제대로 접근이 된다. 하지만 포인터변수에 Student 클래스를 이용해 생성한 객체를 참조하게 하면 Student 클래스에서 오버라이딩을 통해 재정의한 기능이 아닌 Person클래스에서 정의한 기능이 수행되는 것을 확인할 수 있다.

즉, 포인터가 자식 클래스로 만든 객체를 가리키게 하여도 저장된 객체의 타입이 기준이 아니라 생성한 포인터 변수의 포인터 타입이 기준이 되기 때문에 stu1.Person::PrintInfo()처럼 Person 클래스의 함수를 참조하게 된것이다. 따라서 클래스 포인터 변수는 해당 변수의 타입에 해당하는 클래스의 멤버만 호출할 수 있다.

 

이러한 경우를 해결하는 방법이 오버라이딩의 두번째 방법인 virtual 함수를 이용한 오버라이딩이다.

virtual을 이용하여 멤버 함수를 가상 함수로 선언하게 되면 포인터 변수의 타입이 아닌 포인터가 실제로 담고있는 객체의 주소에 따라 호출하는 대상을 바꿀수 있다. 가상 함수는 뒤에 자세히 정리하자.

댓글