C++ 연산자 오버로딩 이라는 개념은 생소하다. 왜냐하면 Java, C# 에서는 들어본 적이 없다.
C++ 자료형은 int, float, double, char 등이 존재하고 사칙 연산이 가능하다.
사용자 정의 자료형에는 구조체(struct) 와 클래스가 있다.
C언어에서는 구조체는 사칙 연산이 불가능하다. C언어에서는 클래스는 없다.
C++ 에서 클래스에서 생성한 객체끼리 사칙 연산이 가능하도록 만들어 놓은 것이 연산자 오버로딩이다.
연산자 오버로딩은 operator 라는 함수명을 사용하며 뒤에 사칙연산자( +, -, *, / )가 붙는다.
#include <iostream> using namespace std;
class Point { private: int x, y; public: Point(int _x=0, int _y=0) : x(_x), y(_y){} void ShowPosition(); Point operator+(const Point& p); bool operator==(const Point& p); Point operator-(const Point& p); friend bool operator!=(const Point&, const Point&); // friend 선언 // Point 클래스 입장에서 다른 클래스 또는 전역 함수를 자신의 친구로 선언하는 것 // 전역 함수 operator 에게 private 및 protected 멤버에 접근할 수 있는 권한을 부여 // friend 는 정보 은닉에 위배되는 개념 // 연산자 오버로딩에서 유용하게 사용 friend Point& operator--(Point& p); };
void Point::ShowPosition() { cout << "(" << x << ", " << y << ")" << endl; }
// 멤버 함수 기반의 연산자 오버로딩 Point Point::operator+(const Point& p) { // 매개변수 상수화 // const 란 정의된 변수를 상수화하여, 그 값을 변경하지 못하게 하는 것이다. // 값 변경의 위험이 느껴질 때, 매개변수 앞에 const 를 붙여 상수화 시키는 것이다. return Point(x + p.x, y + p.y); }
bool Point::operator==(const Point& p) { if (x == p.x && y == p.y) return true; else return false; }
Point Point::operator-(const Point& p) { return Point(x - p.x, y - p.y); }
bool operator!=(const Point& p1, const Point& p2){ // 전역 함수 // Point 클래스의 private 영역 접근 가능 // friend 로 선언된 대상에게는 완벽하게 public 으로 작용한다. return (p1 != p2); }
Point& operator--(Point& p) { //전역함수 p.x--; p.y--; return p; }
int main() { Point p1(1, 6); // 객체가 생성될 때 메모리가 할당된다. Point p2(2, 4); Point p3 = p1.operator+(p2); //Point p3 = p1 + p2; Point p4 = p3 - p2; // Point p4 = p3 - p2 + p1; 로 해봐도 결과가 나오는 걸 확인 할 수 있다.
p1.ShowPosition(); p2.ShowPosition(); p3.ShowPosition(); p4.ShowPosition();
--p2; p2.ShowPosition(); }
|
Point p3 = p1 + p2; 에서 p1, p2는 객체이므로 기본적으로 + 연산이 불가능하다.
앞에 operator 라는 키워드를 붙여서 p1과 p2를 이용해서 operator +라는 함수를 호출해주게 되는 것이다.
p1.operator+(p2); 로 operator 함수가 호출되어 수행하도록 약속되어 있다.
테스트에 사용한 파일
c++operator.cpp