연산자 오버로딩
C++에서 제공하는 클래스 타입(사용자 정의 타입)에도 연산자를 사용할 수 있게 하는 문법
Example)
기본타입 으로 쓰는 int형 X와Y를 더해서 Z에 값을 넣는
Z = X + Y
클래스타입 Point(int x,int y)인 P1과 P2를 각각 P1(1,1) P2(2,2)로 초기화 후 P3에 넣기
P3 = P1 + P2
Point 형이지만 위에 기본타입 처럼 연산자를 적용할 수 있게 하는 문법
덧셈 연산자 오버로딩 코드
class point {
int x;
int y;
public:
point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
void print() const { cout << x << "," << y << "\n"; }
int getX() const { return x; }
int getY() const { return y; }
point operator+(const point& arg) const { //arg와 멤버변수 x와y값을 변경하려하면 컴파일 에러!
point pt;
pt.x = this->x + arg.x;
pt.y = this->y + arg.y;
return pt;
}
void main() {
point p1(1, 2), p2(3, 4), p3(1,2);
//덧셈
p3 = p1 + p2; //p1.operator+(p2)와 같다.
p3.print();
p3 = p1.operator+(p2);
p3.print();
}
결과
기본적으로 쓰이는 +는 컴파일러 내부에 정의되어 있어 사용이 가능하지만 클래스타입은 따로 정의해야 합니다.
operator를 오버로딩 하여 연산자를 적용시킬 클래스 타입을 반환형으로 해주면 쉽게 사용 할 수 있습니다.
그 외 연산자(단항 연산자(--, ++), 이항 연산자)
class point {
int x;
int y;
public:
point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
void print() const { cout << x << "," << y << "\n"; }
int getX() const { return x; }
int getY() const { return y; }
/***************** 증가 **********************/
const point& operator++() { //전위 증가
++x; ++y;
return *this;
}
const point operator++(int) { //후위증가
point pt(x,y);
++x; ++y;
return pt;
}
/***************** 감소 **********************/
const point& operator--() { //전위 감소
--x;
--y;
return *this;
}
const point operator--(int) { //후위 감소
point pt(x, y);
--x;
--y;
return pt;
}
/***************** 비교 **********************/
bool operator==(const point& arg) const { //같은지 비교
return x == arg.x && y == arg.y;
}
bool operator!=(const point& arg) const { //틀린지 반환
return !(*this == arg);
} //멤버 함수 연산자 오버로딩
point operator+(const point& arg) const { //arg와 멤버변수 x와y값을 변경하려하면 컴파일 에러!
point pt;
pt.x = this->x + arg.x;
pt.y = this->y + arg.y;
return pt;
}
};
//전역 함수 오버로딩
const point operator-(const point& argL, const point& argR) {
return point(argL.getX() - argR.getX(), argL.getY() - argR.getY());
}
멤버 함수 오버로딩과 전역 함수 오버로딩
멤버 함수 오버로딩은 클래스 내부에 함수가 정의되어 있어 this를 통해 private인 멤버 변수에 접근할 수 있지만,
전역 함수 오버로딩은 클래스 외부에 함수가 정의되어 있기 때문에 클래스 내부의 멤버 변수에 접근할 수 없어 클래스에 Getter를 선언하여 캡슐화를 깨지않게 합니다.
객체 지향 프로그래밍(OOP)에서 Getter Setter 사용은 거의 필수적으로 합니다.
소스코드는 STL교재를 따라 작성한 코드입니다.
'C++ > STL' 카테고리의 다른 글
[STL] 클래스 타입 변환 연산자 오버로딩 (0) | 2025.02.09 |
---|---|
[STL] 타입 변환 연산자 오버로딩 (0) | 2025.02.09 |
[STL] 스마트 포인터 (0) | 2025.02.09 |
[STL] 배열 인덱스 연산자 오버로딩 (0) | 2025.02.09 |
[STL] 함수 호출 연산자 오버로딩 (0) | 2025.02.09 |