D. 연산자 오버로딩
1. 연산자 오버로딩의 기초
a. 연산자 오버로딩이란?
🌟 기존 연산자를 사용자 정의 클래스나 데이터 형식에 대해 재정의하여 새로운 동작을 정의하는 것을 의미
- 사용자 정의 객체끼리 연산자를 사용하거나, 사용자 정의 데이터 형식에 기본 연산자를 적용
- 사용자 정의 클래스의 편의성과 가독성을 높이는 데 사용
- 사용자 정의 데이터 형식에 대한 다양한 연산을 지원하는 데 유용
b. 멤버 연산자의 함수 버전
- a op b 형태에서 왼쪽을 기준으로 실행
- a가 class여야만 함 (반대의 경우 에러)
- 매개변수는 아무값이나 가능
- 이름은 'operator연산자' 로생성, 연산자는 연산하려는 연산자로 사용
⏳ 예제 : 멤버 연산자의 함수
class Pos{
public :
클래스이름 operator+(const 클래스이름& b)
{
Pos pos;
pos.x = x + b.x;
pos.y = y + b.y;
return pos;
}
...
};
int main(){
Pos Pos1;
Pos Pos2;
Pos pos3 = pos1 + pos2
//pos3 = pos1.operator+(pos2);
}
c. 전역 연산자 함수 버전
a op b 형태라면, a/b 모두를 연산자 함수의 피연산자로 사용
⏳ 예제 : 전역 연산자 함수
Pos operator+(int a, const Pos& b){
Pos pos;
pos.x = a+b.x;
pos.y = a+b.y;
return pos;
}
2. 연산자 오버로딩 심화
a. 연산자 지원 범위
다양한 연산자를 지원함. 아래는 ==연산자를 사용하는 예시
⏳ 예제 : 객체가 동일한지 보는 멤버 함수 연산자
class Pos{
public :
...
bool operator==(const Pos& b)
{
return x == b.x && y == b.x;
}
...
}
b. 연산자 오버로딩과 생성자
객체를 생성하면서 대입 연산자를 사용하게 되면
연산자 오버로딩을 사용한 대입 연산자를 실행하는게 아닌 생성자를 부르는용도로 사용됨
⏳ 예제 : 생성자와 대입 연산자
#include <iostream>
using namespace std;
class Pos {
public:
//생성자
Pos(int a) {
x = a;
y = a;
}
//대입 연산자
void operator=(int b)
{
x = b;
y = b;
}
public:
int x = 0;
int y = 0;
};
int main() {
//생성자
Pos pos1(10); //이 코드와 아래 코드는 동일하게 생성자를 실행
Pos pos2 = 10; //연산자 오버로딩 X
//대입 연산자
pos1 = 10;
pos2 = 20;
}
만약 위 대입연산자가 없다고 가정해도, 아래 pos1, pos2는 실행됨
이유는 생성자가 저 코드를 처리하고 있기 때문
심지어 아래 코드처럼 다른 함수를 생성한 후 실행해도, 생성자가 간접적으로 자동으로 대입해서 실행됨
void TestPos(Pos a){}
int main(){
TestPos(10); //Pos(int a)가 실행됨
}
c. explicit 키워드
따라서 explicit 키워드를 사용해서
인자 하나로 생성자를 만드는 경우에 컴파일러가 자동으로 생성자에 대입하지 않도록 해야함!!
🌟 즉, 객체의 자동 형 변환이나 암시적 변환을 방지하고, 명시적인 형 변환을 강제화하는 키워드
⏳ 예제 : explicit 키워드로 오류를 막은 모습
#include <iostream>
using namespace std;
class Pos {
public:
//생성자
explicit Pos(int a) {
x = a;
y = a;
}
//대입 연산자
void operator=(int b)
{
x = b;
y = b;
}
public:
int x = 0;
int y = 0;
};
void TestPos(Pos a){}
int main() {
TestPos(10); //error
Pos pos1(10)
Pos pos2 = 20 //error
//대입 연산자
pos1 = 10; //error
pos2 = 20; //error
}
d. 자기 자신에 대한 참조를 뱉어주는 *this
a = b = c처럼 아래와 같은 대입연산을 대입 연산자 오버로딩에 사용하고 싶다면
코드를 아래와 같이 수정해줘야 함
⏳ 예제 : 자기 자신에 대한 참조를 뱉어주는 *this
#include <iostream>
using namespace std;
class Pos {
public:
//생성자
explicit Pos(int a) {
x = a;
y = a;
}
//대입 연산자
Pos& operator=(int b)
{
x = b;
y = b;
return this* //자기 자신에 대한 참조를 뱉음
}
public:
int x = 0;
int y = 0;
};
int main() {
Pos pos1(10)
Pos pos2;
Pos pos3;
pos1 = pos2 = pos3 //pos2 = pos3부터 연산 시작
}
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -
어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프
www.inflearn.com
'프로그래밍 언어 > C++' 카테고리의 다른 글
[자료형(data type)] C++ 파생형 구조체 총정리 (0) | 2023.09.13 |
---|---|
[게임 프로그래머 입문 올인원] 객체지향 : static과 싱글톤 (33강) (1) | 2023.09.12 |
[게임 프로그래머 입문 올인원] 객체지향 : 멤버 변수 초기화 (31강) (0) | 2023.09.11 |
[게임 프로그래머 입문 올인원] 객체지향 : OOP 3대 요소 / 상속성, 은닉성, 다형성 (28, 29, 30강) (1) | 2023.09.11 |
[게임 프로그래머 입문 올인원] 객체지향 : 객체지향 개론 (27강) (2) | 2023.09.11 |