영넌 개발로그
[C++ 기초] Operator overloading 연산자 오버로딩이란? 본문
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;
}
'코딩 > C++' 카테고리의 다른 글
[C++ 기초] Inheritance 상속이란? / Multiple inheritance 다중상속? (0) | 2020.12.06 |
---|---|
[C++ 기초] Friend function / Friend class (0) | 2020.12.06 |
[C ++ 디자인 패턴] Singleton 패턴이란 ? (0) | 2020.12.04 |
[C++ 기초] class 내 static 변수, static 함수, const static 변수 (0) | 2020.12.04 |
Comments