연산자 오버로딩 (Operator Overloading)
연산자 오버로딩은 기존의 C++ 연산자를 사용자 정의 타입(클래스)에 대해 재정의하는 기능입니다. 이를 통해 객체 간의 연산을 보다 직관적으로 수행할 수 있습니다.
1. 기본 개념
연산자 오버로딩은 함수 형태로 정의되며, 클래스의 멤버 함수 또는 전역 함수로 구현할 수 있습니다.
2. 멤버 함수로 연산자 오버로딩
연산자를 멤버 함수로 오버로딩하는 방법은 다음과 같습니다:
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// + 연산자 오버로딩
Complex operator + (const Complex &c) {
return Complex(real + c.real, imag + c.imag);
}
void display() {
cout << "Real: " << real << ", Imag: " << imag << endl;
}
};
int main() {
Complex c1(3.0, 4.0);
Complex c2(1.0, 2.0);
Complex c3 = c1 + c2;
c3.display(); // Real: 4.0, Imag: 6.0 출력
return 0;
}
3. 전역 함수로 연산자 오버로딩
연산자를 전역 함수로 오버로딩하는 방법은 다음과 같습니다:
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// 전역 함수로 + 연산자 오버로딩
friend Complex operator + (const Complex &c1, const Complex &c2);
void display() {
cout << "Real: " << real << ", Imag: " << imag << endl;
}
};
Complex operator + (const Complex &c1, const Complex &c2) {
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
int main() {
Complex c1(3.0, 4.0);
Complex c2(1.0, 2.0);
Complex c3 = c1 + c2;
c3.display(); // Real: 4.0, Imag: 6.0 출력
return 0;
}
4. 입출력 연산자 오버로딩
<<
와 >>
연산자를 오버로딩하여 객체의 입출력을 지원할 수 있습니다:
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// << 연산자 오버로딩
friend ostream& operator << (ostream &out, const Complex &c);
// >> 연산자 오버로딩
friend istream& operator >> (istream &in, Complex &c);
};
ostream& operator << (ostream &out, const Complex &c) {
out << "Real: " << c.real << ", Imag: " << c.imag;
return out;
}
istream& operator >> (istream &in, Complex &c) {
cout << "Enter real part: ";
in >> c.real;
cout << "Enter imaginary part: ";
in >> c.imag;
return in;
}
int main() {
Complex c1;
cin >> c1;
cout << c1 << endl;
return 0;
}
예제 문제
문제 1: 2D 벡터 클래스 작성 및 + 연산자 오버로딩
2D 벡터를 나타내는 클래스를 작성하고, +
연산자를 오버로딩하여 두 벡터의 합을 계산하는 프로그램을 작성하세요.
해설:
#include <iostream>
using namespace std;
class Vector2D {
private:
double x;
double y;
public:
Vector2D(double x = 0, double y = 0) : x(x), y(y) {}
// + 연산자 오버로딩
Vector2D operator + (const Vector2D &v) {
return Vector2D(x + v.x, y + v.y);
}
void display() {
cout << "X: " << x << ", Y: " << y << endl;
}
};
int main() {
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2;
v3.display(); // X: 4.0, Y: 6.0 출력
return 0;
}
이 프로그램은 2D 벡터 클래스를 작성하고, +
연산자를 오버로딩하여 두 벡터의 합을 계산합니다.
문제 2: 복소수 클래스 작성 및 == 연산자 오버로딩
복소수를 나타내는 클래스를 작성하고, ==
연산자를 오버로딩하여 두 복소수가 같은지 비교하는 프로그램을 작성하세요.
해설:
#include <iostream>
using namespace std;
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// == 연산자 오버로딩
bool operator == (const Complex &c) {
return (real == c.real && imag == c.imag);
}
void display() {
cout << "Real: " << real << ", Imag: " << imag << endl;
}
};
int main() {
Complex c1(3.0, 4.0);
Complex c2(3.0, 4.0);
Complex c3(1.0, 2.0);
if (c1 == c2) {
cout << "c1 is equal to c2" << endl;
} else {
cout << "c1 is not equal to c2" << endl;
}
if (c1 == c3) {
cout << "c1 is equal to c3" << endl;
} else {
cout << "c1 is not equal to c3" << endl;
}
return 0;
}
이 프로그램은 복소수 클래스를 작성하고, ==
연산자를 오버로딩하여 두 복소수가 같은지 비교합니다.
문제 3: 3D 점 클래스 작성 및 << 연산자 오버로딩
3D 점을 나타내는 클래스를 작성하고, <<
연산자를 오버로딩하여 점의 좌표를 출력하는 프로그램을 작성하세요.
해설:
#include <iostream>
using namespace std;
class Point3D {
private:
double x;
double y;
double z;
public:
Point3D(double x = 0, double y = 0, double z = 0) : x(x), y(y), z(z) {}
// << 연산자 오버로딩
friend ostream& operator << (ostream &out, const Point3D &p);
};
ostream& operator << (ostream &out, const Point3D &p) {
out << "X: " << p.x << ", Y: " << p.y << ", Z: " << p.z;
return out;
}
int main() {
Point3D p1(1.0, 2.0, 3.0);
cout << p1 << endl;
Point3D p2(4.0, 5.0, 6.0);
cout << p2 << endl;
return 0;
}
이 프로그램은 3D 점 클래스를 작성하고, <<
연산자를 오버로딩하여 점의 좌표를 출력합니다.
다음 단계
14일차의 목표는 C++의 연산자 오버로딩에 대해 학습하는 것이었습니다. 다음 날부터는 상속과 다형성에 대해 다룰 것입니다.
내일은 "상속과 다형성"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!
'-----ETC----- > C++ 마스터 시리즈' 카테고리의 다른 글
[C++ 마스터] Day 15: 상속과 다형성 (0) | 2024.08.01 |
---|---|
[C++ 마스터] Day 13: 생성자와 소멸자 (0) | 2024.08.01 |
[C++ 마스터] Day 11: 구조체와 열거형 (0) | 2024.08.01 |
[C++ 마스터] Day 12: 클래스와 객체 지향 프로그래밍 (OOP) 기초 (0) | 2024.08.01 |
[C++ 마스터] Day 9: 포인터와 참조자 (0) | 2024.08.01 |