본문 바로가기

강의자료/C/C++

042. 클래스의 객체간에도 사칙연산이 가능하게 해보자.


◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


일반적으로 사칙연산은 숫자간에 사용한다.
숫자가 아닌 데이터에서 사칙연산을 수행할수는 없기때문이다.
그리고 클래스로 만들어진 객체는 분명 숫자가 아니기때문에 사칙연산이 불가능하다는 생각이 들 것이다.
하지만 객체간에도 사칙연산이 가능하다. 물론 사칙연산이 어떻게 수행될지는 우리가 직접 지정해줘야 한다.
이는 연산자 오버로딩이라는 기능을 통해서 이루어지며, 이는 결국 사칙연산의 모양을 하고 있는 멤버함수일 뿐이다.

// 연산자 오버로딩에 대해서 이해한다.
// 연산자 오버로딩을 하면 좋은 점.
// 1. 코딩을 편하게 할 수 있다.
// 2. 코드를 이해하기가 편해진다.
// 3. 연산자 우선순위의 규칙을 적용받을 수 있다.(멤버함수로는 불가능.)

#include 
using namespace std;

class Point  
{
private:
	int x;
	int y;

public:
	Point(int _x, int _y);
	~Point();

	void position();
	void move(int _x, int _y);

	// 복사생성자.
	Point(const Point& p);  
	Point(const Point* p);

	int getX() const {return x;}  //값을 바꿀 수 없다. 
	int getY() const {return y;}  //값을 바꿀 수 없다. 

	// 연산자 오버로딩.
	Point():x(0), y(0) {}
	Point operator +(const Point& rhs) const;
	Point operator -(const Point& rhs) const;
	Point& operator =(const Point& rhs);
};

Point::Point(int _x, int _y)
{ 
	x=_x;  
	y=_y;
}

Point::Point(const Point& p)
{
	x=p.getX();
	y=p.getY();                     
}
Point::Point(const Point* p)
{
	x=p->getX();
	y=p->getY();                   
}

Point::~Point()
{
	cout << "Point die~~." << endl;                
}

void Point::position()
{
	cout << "(" << x << " , " << y << ")" << endl;     
} 

void Point::move(int _x, int _y)
{
	x+=_x;  //_x만큼 이동  
	y+=_y;  //_y만큼 이동     
}

// 연산자 오버로딩.
Point Point::operator +(const Point& rhs) const
{
	return Point(x+rhs.getX(), y+rhs.getY());      
}
Point Point::operator -(const Point& rhs) const
{
	return Point(x-rhs.getX(), y-rhs.getY());  
}
Point& Point::operator=( const Point& rhs )
{
	if( this != &rhs )	
	{
		this->x = rhs.getX();
		this->y = rhs.getY();
	}
	return *this;
}

void main()
{
	// 원래 객체끼리의 연산은 불가능하다.
	Point p5(5,8);  //스택에 객체 생성 
	Point p6(2,7);   
	Point p7;       //기본 생성자로 생성
	p7=p5+p6;       //두 점을 더한다, 대입연산자 실행.(임시객체 소멸)
	Point p8=p5-p6; //한 점에서 다른 한점을 뺀다, 바로 복사생성자 실행.
	cout << "(" << p5.getX() << "    " << p5.getY() << ")" << endl;
	cout << "(" << p6.getX() << "    " << p6.getY() << ")" << endl;
	cout << "(" << p7.getX() << "    " << p7.getY() << ")" << endl;
	cout << "(" << p8.getX() << "    " << p8.getY() << ")" << endl;
}