오버로딩
C++에서 오버로딩은 이름은 같지만 매개변수가 다른 여러 함수를 정의하는 기능입니다. 다른 동작을 가진 함수에서 같은 이름을 지정할 수 있으므로 보다 유연하고 확장 가능한 코드가 가능합니다.
컴파일러는 컴파일 타임에 전달된 인수를 기반으로 호출할 오버로드된 함수의 버전을 결정합니다.
적절한 함수를 선택하는 프로세스를 "함수 오버로딩 해결"이라고 하며 컴파일 단계에서 컴파일러에 의해 수행됩니다.
C++에서 오버로드된 함수의 매개변수는 매개변수의 수, 매개변수 유형 또는 둘 다에서 달라야 합니다.
오버로드된 함수의 반환 유형은 같거나 다를 수 있지만 호출할 함수를 결정할 때 고려하지 않습니다.
함수 오버로딩의 예
#include <iostream>
using namespace std;
int sum(int x, int y) {
return x + y;
}
float sum(float x, float y) {
return x + y;
}
int main() {
cout << sum(1, 2) << endl; // Output: 3
cout << sum(1.1f, 2.2f) << endl; // Output: 3.3
return 0;
}
이 예제에서 "sum"이라는 이름이 같은 두 개의 함수를 정의하지만 하나는 두 개의 정수를 사용하고 다른 하나는 두 개의 부동 소수점을 사용합니다. 정수 인수로 "sum" 함수를 호출하면 두 개의 정수를 취하는 "sum" 함수 버전이 호출되고 float 인수로 "sum" 함수를 호출하면 부동 소수점 인수를 취하는 "sum" 함수 버전이 호출됩니다.
오버로딩의 장점
- 재사용성 : 오버로딩을 통해 다른 작업에 동일한 함수 이름을 재사용할 수 있으므로 코드를 더 읽기 쉽고 유지 관리하기 쉽습니다. 이렇게 하면 약간식 다른 작업마다 새 함수를 만들 필요가 없습니다.
- 유연성 : 오버로딩을 통해 다양한 데이터 유형과 인수를 처리할 수 있는 함수를 정의할 수 있습니다. 이는 프로그래머가 다른 데이터 유형 또는 매개변수와 함께 동일한 기능을 사용할 수 있는 유연성을 제공합니다.
- 향상된 코드 가독성 : 오버로딩은 다른 작업을 처리하기 위해 이름이 다른 여러 함수를 생성할 필요가 없기 때문에 코드를 더 읽기 쉽게 만들 수 있습니다. 대신 프로그래머는 유사한 작업에 동일한 함수 이름을 사용할 수 있으므로 코드 가독성이 향상되고 코드의 복잡성이 줄어듭니다.
- 유형 안전성 : 오버로딩은 컴파일러가 함수에 전달된 인수를 확인하고 인수 유형에 따라 호출할 함수의 적절한 버전을 결정할 수 있도록 하여 코드에서 유형 안전성을 보장하는 데 도움이 됩니다.
- 코드 중복 감소 : 오버로딩은 코드 복제 필요성을 줄입니다. 대신 동일한 기능을 사용하여 다른 작업을 수행할 수 있으므로 코드 중복이 줄어들고 코드가 더 간결하고 유지 관리가 쉬워집니다.
오버라이딩
C++에서 함수 오버라이딩(overriding)은 파생 클래스(derived class) 기본 클래스(base class)에 이미 정의된 가상 함수(virtual function)를 자체 구현할 수 있는 기능입니다.
파생 클래스에서 가상 함수를 오버라이딩하면, 해당 함수가 파생 클래스의 객체에서 호출될 때 기본 클래스의 구현은 무시되고, 파생 클래스에서 제공되는 구현이 사용됩니다.
파생 클래스에서 가상 함수를 오버라이딩하려면, 함수 선언이 기본 클래스의 가상 함수와 동일한 시그니처(이름, 반환타입, 매개변수)를 가져야 합니다.
파생 클래스에서 함수를 선언할 때 "override"키워드를 사용하면, 해당 함수가 기본 클래스의 가상 함수를 오버라이딩하려는 것임을 나타낼 수 있습니다. 이렇게 하면 함수 선언과 오버라이딩하려는 가상 함수의 시그니처가 일치하지 않을 경우, 컴파일 시간에 오류가 발생하여 확인할 수 있습니다.
오버라이딩 예시
#include <iostream>
class Shape
{
public:
virtual void area()
{
std::cout << 0 << std::endl;
return;
}
};
class Circle : public Shape
{
public:
void area() override
{
std::cout << 3.14159 * radius * radius << std::endl;
return;
}
private:
double radius;
};
int main()
{
Shape* CShape = new Circle;
CShape->area();
return 0;
};
위 예시에서 Shape 클래스는 0을 출력하는 가상 함수 area()를 정의합니다. Circle 클래스는 Shape 클래스를 상속하고, 반지름을 기반으로 원의 면적을 계산하는 자체 구현으로 area() 함수를 오버라이딩합니다. Circle 객체에서 area()를 호출하면, Shpae 클래스의 구현 대신 Circle 클래스의 구현이 사용됩니다.
오버라이딩의 장점
- 다형성 : 오버라이딩은 C++에서 다형성을 가능하게 하며, 프로그램이 사용하는 객체의 타입에 따라 가상 함수의 다른 구현을 사용할 수 있습니다. 이는 코드를 더 유연하고 유지보수하기 쉽게 만듭니다.
- 확장성 : 오버라이딩은 파생 클래스가 기본 클래스가 제공하는 기능을 확장할 수 있도록 하여, 기존 코드를 수정하지 않고도 프로그램에 새로운 기능을 추가하기 쉽게 만듭니다.
- 추상화 : 오버라이딩은 기본 클래스가 관련된 클래스 집합의 인터페이스(interface)를 정의하고, 파생 클래스가 자체 구현을 제공하도록 함으로써 추상화를 구현하는 데 사용될 수 있습니다.
- 코드 재사용 : 오버라이딩은 파생 클래스에서 기본 클래스에서 제공하는 기능을 사용하는 새로운 가상 함수의 새로운 구현을 제공함으로써 코드를 재사용하는 데 사용될 수 있습니다.
개인적인 공부목적으로 작성된 글입니다 틀린 부분이 있다면 지적 감사하겠습니다.
'이론' 카테고리의 다른 글
메모리 단편화 (0) | 2023.04.18 |
---|---|
얕은 복사와 깊은 복사의 차이 (1) | 2023.04.18 |
램버트 조명 공식 (0) | 2022.08.09 |
렌더링 파이프라인 구조 (0) | 2022.08.09 |
0x00 시간 복잡도 순서 (0) | 2022.08.02 |
댓글