영넌 개발로그

[C++ 기초] Operator overloading 연산자 오버로딩이란? 본문

코딩/C++

[C++ 기초] Operator overloading 연산자 오버로딩이란?

영넌 2020. 12. 6. 02:26

Operator overloading

operator는 산술 연산자(+, -, *, /), 비교 연산자(==, !=), 증감 연산자(++, --) 등을 의미하고, overloading은 원래 뜻에 새로운 뜻을 더해준다는 의미이다. 따라서 operator overloading은 객체를 메소드 없이 연산자를 통해 바로 계산을 할 수 있도록 만들어 주는 방법이다. 

사용방법 : " operator 연산자 "를 함수 이름으로 사용하여 만든다.

 

 

산술 연산자

벡터 더하기를 하고 싶다고 가정을 해보자

우선 아래 코드는 2차원 좌표를 표시하는 클래스를 간단하게 생성하고 a와 b 객체가 잘 만들어졌음을 확인할 수 있다. 

#include <iostream>

using namespace std;

//2차원 좌표를 표시하는 클래스
class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();
};


void Coord_2D::showCoord() {
	cout << x << ", " << y << endl;
}

int main() {
	Coord_2D a(10, 10);
	Coord_2D b(20, 20);

	a.showCoord();
	b.showCoord();
    
 	return 0;
 }

 

아래와 같이 두 좌표를 그냥 더하려 하면 no operator "+" matches these operands 라는 오류가 뜨는 것을 볼 수 있다. 디버깅하기 전에도 빨간 밑줄로 표시가 된다. 


int main() {
	Coord_2D a(10, 10);
	Coord_2D b(20, 20);

	a.showCoord();
	b.showCoord();

	//..오류
	Coord_2D c = a + b;
	c.showCoord();


	return 0;
}

 

 

operator overloading을 사용하지 않고 코드를 짜려면 아래와 같이 하면 된다.

add를 하는 함수를 만들고 객체를 인자로 받아 객체를 반환한다. 

처음 한번은 a.add(b)로 끝나지만 d = a+b+c 를 하고 싶을 때에는 a.add(b).add(c) 이런 방식으로 코드가 복잡하게 늘어나게 된다. 이렇게 하지 않기 위해 오퍼레이터 오버로딩을 사용한다. 

#include <iostream>

using namespace std;

//2차원 좌표를 표시하는 클래스
class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();
	Coord_2D addCoord(Coord_2D& _k);
};

Coord_2D Coord_2D::addCoord(Coord_2D& _k) {
	Coord_2D temp(x + _k.x, y + _k.y);
	return temp;
}

void Coord_2D::showCoord() {
	cout << x << ", " << y << endl;
}

int main() {
	Coord_2D a(10, 10);
	Coord_2D b(20, 20);

	a.showCoord();
	b.showCoord();

	//Coord_2D c = a + b;
	//c.showCoord();

	Coord_2D c = a.addCoord(b);
	c.showCoord();

	Coord_2D d = a.addCoord(b).addCoord(c);
	d.showCoord();

	return 0;
}

 

 

오퍼레이터 오버로딩을 사용한 벡터 더하기 코드는 아래와 같다.

operator 뒤에 사용하고 싶은 연산자를 붙여 함수이름으로 지정하면 main 문에서 연산자를 그냥 사용할 수 있다.

#include <iostream>

using namespace std;

//2차원 좌표를 표시하는 클래스
class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();

	Coord_2D operator+(Coord_2D& _k);
};

Coord_2D Coord_2D::operator+(Coord_2D& _k) {
		Coord_2D temp(x + _k.x, y + _k.y);
	return temp;
}

void Coord_2D::showCoord() {
	cout << x << ", " << y << endl;
}

int main() {
	Coord_2D a(10, 10);
	Coord_2D b(20, 20);

	a.showCoord();
	b.showCoord();

	//..가능
	Coord_2D c = a + b;
	c.showCoord();

	return 0;
}

 

 

비교 연산자

class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();

	Coord_2D operator+(Coord_2D& _k);
	bool operator==(Coord_2D& _k);
	bool operator!=(Coord_2D& _k);
};

bool Coord_2D::operator==(Coord_2D& _k) {
	return ((x == _k.x) && (y == _k.y));
}

bool Coord_2D::operator!=(Coord_2D& _k) {
	//return ((x == _k.x) && (y == _k.y));
	return !(*this == _k);
}


int main() {
	Coord_2D a(10, 10);
	Coord_2D b(20, 20);

	a.showCoord();
	b.showCoord();
	
	if (a == b) {
		cout << "same" << endl;
	}
	else {
		cout << "different" << endl;
	}

	return 0;
}

 

 

증감 연산자

	Coord_2D& operator++();		//++a
	Coord_2D operator++(int);	//a++

Coord_2D& Coord_2D::operator++(){
	x++;
	y++;
	return *this;
}


Coord_2D Coord_2D::operator++(int) {
	Coord_2D temp = *this;
	x++;
	y++;
	return temp;
}

 

 

 

 


전체 코드

#include <iostream>

using namespace std;

//2차원 좌표를 표시하는 클래스
class Coord_2D {
private:
	int x;
	int y;
public:
	Coord_2D(int _x, int _y): x(_x),y(_y){}
	void showCoord();

	Coord_2D operator+(Coord_2D& _k);
	bool operator==(Coord_2D& _k);
	bool operator!=(Coord_2D& _k);
	Coord_2D& operator++();			//++a
	Coord_2D operator++(int);		//a++
};

Coord_2D Coord_2D::operator+(Coord_2D& _k) {
		Coord_2D temp(x + _k.x, y + _k.y);
	return temp;
}

bool Coord_2D::operator==(Coord_2D& _k) {
	return ((x == _k.x) && (y == _k.y));
}

bool Coord_2D::operator!=(Coord_2D& _k) {
	//return ((x == _k.x) && (y == _k.y));
	return !(*this == _k);
}

Coord_2D& Coord_2D::operator++(){
	x++;
	y++;
	return *this;
}

Coord_2D Coord_2D::operator++(int) {
	Coord_2D temp = *this;
	x++;
	y++;
	return temp;
}

void Coord_2D::showCoord() {
	cout << x << ", " << y << endl;
}

int main() {
	Coord_2D a(10, 10);
	Coord_2D b(20, 20);

	a.showCoord();
	b.showCoord();
	
	if (a == b) {
		cout << "same" << endl;
	}
	else {
		cout << "different" << endl;
	}

	return 0;
}

Comments