연산자 오버로딩(Operator Overloading)은 클래스 타입의 객체가 일반 데이터 타입처럼 연산자를 사용할 수 있도록 만드는 기능입니다.
C++에서 기본적으로 지원하지 않는 사용자 정의 타입 간의 연산을 가능하게 합니다.
| 연산자 | 함수 | |
|---|---|---|
| 피연산자 개수 | 고정되어 있음 | 자유롭게 설정 가능 |
| 사용 방식 | 자연스러운 표현 가능 (a + b) | 명시적인 함수 호출 필요 (a.add(b)) |
| 사용자 정의 | 일부 연산자는 오버로딩 불가능 (::, ., .*) | 자유롭게 정의 가능 |
멤버 함수 방식
a + b 형태에서 a가 클래스인 경우에만 사용 가능.class Position {
public:
Position operator+(const Position& arg) { /* 연산 로직 */ }
};
전역 함수 방식
a + b 형태에서 a가 클래스가 아니어도 사용 가능합니다.Position operator+(int a, const Position& b) { /* 연산 로직 */ }
#include <iostream>
using namespace std;
class Position {
public:
// 두 Position 객체를 더하는 연산자
Position operator+(const Position& arg) {
Position pos;
pos._x = _x + arg._x;
pos._y = _y + arg._y;
return pos;
}
// Position 객체와 정수를 더하는 연산자
Position operator+(int arg) {
Position pos;
pos._x = _x + arg;
pos._y = _y + arg;
return pos;
}
// 두 Position 객체가 같은지 비교하는 연산자
bool operator==(const Position& arg) {
return _x == arg._x && _y == arg._y;
}
// 정수를 대입하는 연산자
Position& operator=(int arg) {
_x = arg;
_y = arg;
return *this;
}
// Position 객체를 대입하는 연산자 (복사 대입 연산자)
Position& operator=(const Position& arg) {
_x = arg._x;
_y = arg._y;
return *this;
}
// 전위 증가 연산자 (++pos)
Position& operator++() {
_x++;
_y++;
return *this;
}
// 후위 증가 연산자 (pos++)
Position operator++(int) {
Position ret = *this;
_x++;
_y++;
return ret;
}
public:
int _x;
int _y;
};
// 전역 함수 방식 (정수 + Position 객체)
Position operator+(int a, const Position& b) {
Position ret;
ret._x = b._x + a;
ret._y = b._y + a;
return ret;
}
int main() {
Position pos1;
pos1._x = 0;
pos1._y = 0;
Position pos2;
pos2._x = 1;
pos2._y = 1;
// Position + Position
Position pos3 = pos1 + pos2;
// Position + int
Position pos4 = pos3 + 1;
// int + Position (전역 함수 사용)
Position pos5 = 1 + pos3;
// 객체 비교 연산
bool isSame = (pos3 == pos4);
// 대입 연산자 테스트
Position pos6;
pos6 = 5;
pos3 = pos6 = 5;
// 전위, 후위 증가 연산자 테스트
pos3++;
++pos3;
++(++pos3);
pos6 = pos3++;
return 0;
}
연산자 오버로딩 적용 전
Position pos3 = pos1 + pos2; // 연산자 오버로딩 없으면 컴파일 오류 발생
Position + Position 연산을 지원하지 않으므로 오류 발생.멤버 연산자 함수 vs 전역 연산자 함수
Position pos4 = pos3 + 1; // 멤버 함수
Position pos5 = 1 + pos3; // 전역 함수
operator+ (int)는 Position + int만 지원.int + Position 형태를 지원하려면 전역 함수 방식으로 정의해야 함.대입 연산자 (operator=)
Position pos6;
pos6 = 5; // operator=(int) 호출
pos3 = pos6 = 5; // 연속적인 대입 연산 가능
operator=(int)을 사용하면 pos6의 _x, _y 값이 5로 설정됨.pos3 = pos6 = 5; 형태로 연속적인 대입 연산이 가능.증감 연산자 (operator++)
pos3++;
++pos3;
++(++pos3);
pos6 = pos3++;
++pos): 값이 증가된 후 반환됨.pos++): 현재 값을 저장한 후 증가된 값을 반환.pos6 = pos3++; 수행 후, pos6에는 증가 전 값이 저장됨.기본적으로 Position + Position 같은 연산을 수행할 수 없지만, 연산자 오버로딩을 사용하면 자연스럽게 연산을 수행할 수 있습니다.
Position pos3 = pos1 + pos2; // 연산자 오버로딩 사용
Position pos3 = pos1.add(pos2); // 일반 함수 사용 (가독성이 떨어짐)
operator+를 사용하면 직관적인 코드 작성 가능.Position pos6;
pos6 = pos3 = 5;
operator=)를 정의하면 연속적인 대입이 가능.++pos;
pos++;
++ 연산자를 직관적으로 사용할 수 있음.