연산자 오버로딩
만약 플레이어의 위치를 저장하는 Position class가 있다고 해보자.
#include <iostream>
using namespace std;
class Position
{
public:
public:
int _x;
int _y;
};
int main()
{
Position pos1;
pos1._x = 1;
pos1._y = 1;
Position pos2;
pos2._x = 2;
pos2._y = 2;
Position pos3 = pos1 + pos2;
return 0;
}
그래서 플레이어가 pos1에 있다가 pos2 만큼 이동해서 pos3의 위치로 이동하고 싶은데 지금 같은 상황에선 에러가 나는 모습을 볼 수 있다. 이를 해결하기 위해 연산자를 마음대로 커스터 마이징 하는 연산자 오버로딩을 할것이다.
오버 로딩은 지난 포스팅에서도 다뤄봤다.
일단 연산자 함수를 정의해야한다.
함수도 멤버함수 vs 전역 함수가 존재하는 것처럼 연산자 함수도 두 가지 방식으로 만들 수 있다.
#include <iostream>
using namespace std;
class Position
{
public:
// 멤버 연산자 함수
// a op b 형태에서 왼쪽으로 기준으로 실행됨 (a가 클래스여야 가능. a를 '기준 피연산자'라고함)
Position operator+(const Position& arg)
{
Position pos;
pos._x = _x + arg._x;
pos._y = _y + arg._y;
return pos;
}
Position operator+(int arg)
{
Position pos;
pos._x = _x + arg;
pos._y = _y + arg;
return pos;
}
public:
int _x;
int _y;
};
// 전역 연산자 함수
Position operator+(int a, const Position& b)
{
Position pos;
pos._x = b._x + a;
pos._y = b._y + a;
return pos;
}
int main()
{
Position pos1;
pos1._x = 1;
pos1._y = 1;
Position pos2;
pos2._x = 2;
pos2._y = 2;
Position pos3 = pos1 + pos2;
pos3 = pos1.operator+(pos2); // 위와 동일
Position pos3 = 1 + pos2; // 멤버 연산자 함수는 클래스가 앞에 나와야함.(오류)
// 전역 연산자 함수를 넣어줬기 때문에 현재는 오류 x
return 0;
}
그렇다면 둘 중 뭐가 좋은가??? 그런건 없다. 심지어 둘 중 하나만 지원하는 경우도 있다 (a = b 등은 전역 연산자로는 생성할 수 없다.)
디테일
struct vs class
C++ 에서는 struct나 class나 종이 한 장 차이다.
다만 클래스 같은 경우는 보호 수준(엑세스)이 다르다. 즉 기본 접근 지정자가 public 이냐 private이냐 라는 차이점 이외에는 크게 다르지 않다.
그렇다면 왜 둘이 나눠 놓았을까?? C++은 C언어에서 파생되어 발전했기 때문에 호환성을 지키기 위함이다.
그래서 struct는 구조체 (데이터 묶음)을 표현하는 용도로 쓰이고
class는 객체지향의 객체를 표현할 때 쓰인다.
'C++ > 기초' 카테고리의 다른 글
[C++] 타입 변환 - 1 (0) | 2023.11.28 |
---|---|
[C++] 동적 할당 (1) | 2023.11.28 |
[C++] 객체 지향 - 2 (1) | 2023.11.27 |
[C++] 객체 지향 - 1 (3) | 2023.11.27 |
[C++] 포인터 - 4 (다중 포인터, 다차원 배열) (0) | 2023.11.26 |