[STL] 연산자 오버로딩

연산자 오버로딩
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교재를 따라 작성한 코드입니다.