우선 얘기하고 싶은 것을 위해서 간단한 설명을 하도록 하겠다.
우리는 하나의 연산자를 보고 여러가지 생각을 떠올릴 수 있다.
다음의 예시들을 보도록 하자.
수학적 의미로서의 '+'의 예시
2 + 3 = 5
색상 혼합에서의 '+'의 예시
빨강 + 파랑 = 보라
문자열에서의 '+'의 예시
"에어팟" + "2" = "에어팟2"
이렇게 다양하게 생각을 할 수 있다.
그런데, C++에서는 기본적으로 맨 위에서 예시를 들었던
수학적 의미로서의 '+'만을 사용하더라.
따라서, 숫자와 숫자만 계산이 가능하고, 그 이외의 것들은 전부 계산이 불가능하다.
하지만, 코드를 작성하다보면 클래스를 활용할 때, 단순히 정해진 연산자만 이용하다 보면
불편함을 겪는 경우가 많이 발생하게 되더라.
따라서, 클래스를 사용하는 경우 동일한 연산자를 사용하지만 다른 기능을 하도록 할 수 있다.
이처럼 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상을 다형성이라고 부른다.
그리고, 정해진 연산자를 다르게 작동하도록 만드는 것을 '연산자 중복'이라고 부른다.
연산자 함수를 선언하기 위해서는, operator 키워드와 함께 다음과 같이 선언해야 한다.
리턴타입 operator 연산자(매개변수리스트);
예를 들어서 다음과 같은 Character 클래스가 있다고 해보자.
class Character{
public:
int money;
Character(int money = 0) {this->money = money;}
};
두 명의 캐릭터가 가진 돈의 합을 알고 싶다.
두 명의 캐릭터와 두 명의 캐릭터가 가진 돈의 합을 담을 하나의 객체를 생성한다.
Character a(500), b(1000), c;
두 명의 캐릭터를 합치는 + 연산자는 일반 +의 사용과 동일하게 사용하면 된다.
c = a + b;
코드를 완성하고 컴파일을 한다고 했을 때 컴파일러가 위의 코드를 만났을 때,
컴파일러는 C++에서 사용하는 기본으로 사용하는 +를 사용하려고 한다.
하지만, 두 개의 피연산자가 숫자가 아닌 객체인 것을 확인하고
+ 연산자가 객체에 대해서 새로 선언되어있는지 확인한다.
이를 위해서, a + b는 다음과 같이 변형된다.
a. + (b);
이 식은 Character 객체 a의 멤버 함수 operator+()를 호출하며, b를 매개 변수로 넘겨주는 함수 호출이다.
이 호출이 성공하기 위해서는, operator+() 함수를 Character 클래스의 멤버 함수로 선언하도록 한다.
class Character{
Character operator+ (Character op2); // + 연산자 함수 선언
};
operator+ 함수를 클래스의 멤버 함수로 선언했으면, operator+ 함수의 내용 또한 구현을 해야 한다.
Character Character::operator+(Character op2){
Character tmp;
tmp.money = this->money + op2.money;
return tmp;
}
여기에서 this는 Character 객체 a 자신에 대한 포인터이고,
op2는 Character 객체 b를 전달받은 매개 변수이므로,
객체 a의 money와 객체 b의 money를 더하는 내용을 담고 있다.
이 연산자 함수는 더하기 연산의 결과를 가진 tmp 객체를 리턴한다.
#include <iostream>
using namespace std;
class Character {
public:
int money;
Character(int money = 0) { this->money = money; }
Character operator+(Character op2);
};
Character Character::operator+(Character op2) {
Character tmp;
tmp.money = this->money + op2.money;
return tmp;
}
int main() {
Character a(500), b(1000), c;
c = a + b;
cout << "c.money : " << c.money;
}
실행결과는
c.money : 1500
이 나온다.
그렇다면 아래와 같은 경우는 어떻게 될까?
Character a(500), b;
b = 1000 + a;
위에서 확인한 것과 마찬가지로,
컴파일러는 숫자에 대한 +만 기본으로 설정 되어있기 때문에
+에 대해 새로 정의가 되어 있는지 찾아본다.
컴파일러는 operator+() 함수를 발견하고 b = 1000 + a; 를 다음과 같이 변형하려고 할 것이다.
1000. + (a)
하지만, 이 코드는 1000이 객체가 아니기 때문에 오류가 발생한다.
이처럼 첫 번째 피연산자가 객체가 아닌 경우 컴파일러는 다음과 같이 문장을 변형한다.
+ (1000, a)
따라서, 이 연산자를 구현하기 위해서는 operator+() 함수를 Character 클래스의 외부 함수로 구현을 해야만 한다.
Character operator+ (int op1, Character op2){
Character tmp;
tmp.money = op1 + op2.money;
return tmp;
}
'Coding > C++' 카테고리의 다른 글
C++ ios_base::sync_with_stdio(false); cin.tie(NULL); (0) | 2022.09.17 |
---|---|
명품 C++ Programming 6장 Open Challenge (0) | 2019.08.13 |