Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 함수 오버로딩과 오버라이딩의 차이점 총정리

C++에서 함수 오버로딩(Function Overloading)함수 오버라이딩(Function Overriding)은 이름은 비슷하지만 동작 방식과 적용 시점이 완전히 다른 개념입니다. 이 글에서는 두 개념의 차이점을 항목별로 정리하고, 비교표를 통해 한눈에 이해할 수 있도록 설명합니다.

함수 오버로딩(Overloading)이란?

오버로딩은 같은 이름의 함수를 매개변수의 개수나 타입을 다르게 하여 여러 번 정의하는 기법입니다.

  • 별도의 키워드 없이 사용할 수 있습니다.

  • 함수 원형(prototype)은 매개변수의 개수나 타입에 따라 달라집니다.

  • 컴파일 타임(compile time)에 호출 대상이 결정됩니다.

  • 생성자(constructor)는 오버로딩이 가능합니다.

  • 소멸자(destructor)는 오버로딩할 수 없습니다.

  • 초기 바인딩(early binding), 즉 정적 바인딩을 구현하는 데 사용됩니다.

  • 호출되는 함수의 버전은 사용된 매개변수의 개수나 타입에 의해 결정됩니다.

  • 같은 이름으로 매개변수의 개수 또는 타입만 다르게 하여 함수를 재정의합니다.

함수 오버라이딩(Overriding)이란?

오버라이딩은 상속 관계에서 기반 클래스의 가상 함수를 파생 클래스에서 동일한 원형으로 재정의하는 기법입니다.

  • 함수 원형(prototype)은 그대로 유지됩니다.

  • 런타임(runtime)에 호출 대상이 결정됩니다.

  • 가상(virtual) 함수만 오버라이딩할 수 있습니다. 일반 멤버 함수는 재정의되지 않고 단순히 숨겨집니다.

  • 소멸자도 가상 소멸자로 선언하면 오버라이딩할 수 있습니다.

  • 오버라이딩은 후기 바인딩(late binding), 즉 동적 바인딩이라고도 불립니다.

  • 오버라이딩되는 함수는 기반 클래스에서 'virtual' 키워드로 선언되어야 합니다.

  • 파생 클래스 객체의 주소가 포인터에 할당되면, 해당 포인터를 통해 호출되는 함수는 객체의 실제 타입에 따라 결정됩니다.

  • 파생 클래스에서 같은 원형으로 함수를 재정의하며, C++11부터는 'override' 키워드를 사용해 재정의임을 명시적으로 표시할 수 있습니다.

오버로딩 vs 오버라이딩 비교표

구분오버로딩오버라이딩
바인딩 시점컴파일 타임런타임
함수 원형매개변수 개수/타입이 달라야 함반드시 동일해야 함
필요 키워드없음기반 클래스에 'virtual'
생성자오버로딩 가능오버라이딩 불가
소멸자오버로딩 불가가상 소멸자로 오버라이딩 가능
바인딩 종류초기 바인딩(정적)후기 바인딩(동적)

마무리

오버로딩은 컴파일 타임에 매개변수 정보를 기반으로 호출될 함수를 결정하는 정적 다형성이고, 오버라이딩은 런타임에 객체의 실제 타입을 기반으로 호출 대상을 결정하는 동적 다형성입니다. 두 개념의 차이를 정확히 이해하면 C++의 다형성을 훨씬 효과적으로 활용할 수 있습니다.