오버로딩은 말 그대로 과적, 과부하로 같은 이름의 함수가 여러 개가 존재하여 과부화 걸린다고 보시면 됩니다.
오버로딩에는 함수의 오버로딩(Overloading) , 연산자 오버로딩(Operator Overloading)이 있습니다.
함수의 오버로딩(Overloading)
가장 기본적인 함수의 오버로딩부터 봅시다.
void Function(int a)
{
std::cout << "a";
}
void Function(char b)
{
std::cout << "b";
}
int main()
{
Function('b');
return 0;
}
코드를 보시면 똑같은 이름의 Function 함수가 있습니다.
둘의 차이점은 int형 a와 char형 b로 인자만 다릅니다.
이렇게 두 개 이상의 동일한 이름의 함수에서 다른 인자 사용(인자 유형, 인자 수 등)하는 걸 오버로딩이라 부릅니다.
Using different arguments in a function of the same name (Type of arguments, number of arguments, …)
위의 상황에서 main()에서 보시면 Function('b')로 인자에 char형 'b'를 전달하였습니다.
실제 출력해보면 b가 출력이 됩니다.
이렇게 오버로딩은 인자에 따라 함수가 실행됩니다.
The function is executed depending on the arguments
만약 Funtion(1) 로 호출했으면 int a 인자의 Funtion함수로 실행이 되어 a가 출력 될 것입니다.
주의점
만약 아래 코드처럼 short형 변수가 인자로 들어가면 어떻게 될까요?
short s = 1;
Function(s);
이럴 땐 인자가 정확히 일치하는 함수가 없기 때문에 아래와같이 최대한 비슷한 함수를 찾게 됩니다.
만약 위의 방식으로도 일치하는 함수가 없다면 더 포괄적인 형변환으로 함수를 찾게 됩니다.
연산자 오버로딩(Operator Overloading)
연산자도 사실 하나의 함수로 취급됩니다.
따라서 연산자 또한 오버로딩이 가능합니다. 함수니깐요
사용법은 간단합니다.
(리턴 타입) operator(연산자) (연산자가 받는 인자)
예를 들어 Apple 클래스가 있으면 (리턴 타입)으로 Apple를 사용할 수 있습니다.
이 Apple을 덧셈에 사용하고 싶으시면 (연산자) 부분에 +를 사용해주시면 됩니다.
Apple operator+ (연산자가 받는 인자)
이런식으로 말이죠.
인자는 말그대로 연산할 때 연산할 대상을 가져오는 것입니다.
Apple operator+ (const Apple& a)
보통 const
키워드를 붙여주는데 인자의 값이 함수 내부에서 바뀌지 않는 다고 확신할 수 있으면 const
붙여주면 됩니다.
주의점
오버로딩된 연산자의 출력은 닫혀 있어야 합니다.
The output of the overloaded operator must be closed
다시 말해, 출력(결과)은 같은 클래스의 객체여야 합니다.
예를 들어 Apple 라는 클래스가 있으면 Apple + Apple 의 결과는 Apple 클래스 타입이여야한다는 식이죠.
그럼 만약 첫 번째 피연산자가 객체가 아닌 연산자를 어떻게 오버로드할 수 있을까요?
How can we overload an operator whose first operand is not an object?
예를 들어 객체가 아닌 정수같은 것들이랑 연산을 하는 것입니다.
Apple + 3 이런 느낌으로요.
#include <iostream>
class Apple{
private:
int value;
public:
Apple(int val) : value(val) {}
int getValue() const {
return value;
}
};
// MyClass 객체와 정수를 더하는 '+' 연산자 전역 함수로 오버로딩
Apple operator+(const Apple& A, int value)
{
int result = A.getValue() + value;
return Apple(result);
}
int main() {
Apple apple(5);
Apple result = apple + 5;
std::cout << "결과는 : " << result.getValue();
}
위의 코드 처럼 객체가 아닌 정수랑 연산할 땐 '+' 연산자를 전역 함수로 오버로딩하면 됩니다.
이러면 피연산자가 클래스 객체 아니라도 연산이 됩니다.
출처
C++ 조교님 수업 자료
모두의 코드 - 씹어먹는 C++ - <4 - 2. 클래스의 세계로 오신 것을 환영합니다. (함수의 오버로딩, 생성자)>
https://modoocode.com/173
모두의 코드 - 씹어먹는 C++ - <5 - 1. 내가 만든 연산자 - 연산자 오버로딩>
https://modoocode.com/202
'그냥 개발글 > C++' 카테고리의 다른 글
리터럴(literal) (0) | 2023.12.12 |
---|---|
레퍼런스 (참조) (0) | 2023.12.12 |
동적 할당 new, delete (0) | 2023.12.12 |
클래스 (0) | 2023.12.12 |