연산자 오버로딩 개요
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 40번째.
연산자 오버로딩은 +, -, 또는 ==와 같은 연산자가 사용자 정의 클래스와 함께 사용될 때 어떻게 동작하는지 정의할 수 있게 해줍니다. a.add(b)와 같은 메서드를 호출하는 대신, 더 직관적인 a + b를 작성할 수 있습니다.
C++에서 연산자는 본질적으로 특별한 이름을 가진 함수입니다. 연산자를 오버로드하려면, operator 키워드 뒤에 기호를 사용하여 함수를 정의합니다:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// + 연산자 오버로딩
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};이제 두 벡터를 자연스럽게 더할 수 있습니다:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // v1.operator+(v2)를 호출함모든 연산자를 오버로드할 수 있는 것은 아닙니다. 범위 지정 연산자 ::, 멤버 액세스 ., 삼항 연산자 ?:, 그리고 sizeof는 오버로드할 수 없습니다. 또한, 새로운 연산자를 만들거나 연산자의 우선순위를 변경할 수 없습니다. *는 항상 +보다 먼저 평가됩니다.
연산자는 (위와 같이) 멤버 함수로 구현되거나 비멤버 함수로 구현될 수 있습니다. 이어지는 레슨들에서 각 접근 방식을 언제 사용해야 하는지, 그리고 특정 범주의 연산자들을 오버로드하는 방법에 대해 배우게 될 것입니다.
챌린지
쉬움2D 좌표를 나타내고 + 연산자를 사용하여 두 점을 더하는 기능을 지원하는 Point 클래스를 만들어 보겠습니다. 이것은 연산자 오버로딩(operator overloading)의 첫 번째 단계로, 사용자 정의 클래스가 익숙한 연산자와 함께 작동하도록 만드는 과정입니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Point.h: x 및 y 좌표(둘 다int)를 저장하는Point클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- x 및 y 좌표를 위한 private 멤버
- x 및 y 값을 받는 생성자
- 게터(Getter)
getX()및getY()(둘 다 const) - 두 점을 더하고 결합된 좌표를 가진 새로운
Point를 반환하는 오버로딩된+연산자
+연산자는 다른Point를 const 참조로 받고 새로운Point를 반환하는 멤버 함수로 구현되어야 합니다. 피연산자 중 어느 것도 수정하지 않으므로const로 표시하십시오.main.cpp: 입력에서 네 개의 정수(별도의 줄에 x1, y1, x2, y2)를 읽어 두 점을 나타냅니다. 두 개의Point객체를 생성하고,+연산자를 사용하여 더한 다음 결과를 표시합니다.출력 형식:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
여기서 핵심적인 통찰은 p1 + p2가 실제로는 배후에서 p1.operator+(p2)를 호출한다는 점입니다. 오버로딩된 연산자를 사용하면 Point p3 = p1.add(p2);와 같은 코드 대신 Point p3 = p1 + p2;와 같이 직관적인 코드를 작성할 수 있습니다.
std::stoi()를 사용하여 입력 문자열을 정수로 변환하십시오. 헤더 파일에 헤더 가드(header guards)를 포함하는 것을 잊지 마세요.
치트 시트
연산자 오버로딩을 사용하면 +, - 또는 ==와 같은 연산자가 사용자 정의 클래스에서 어떻게 동작할지 정의할 수 있으며, a.add(b) 대신 a + b와 같은 직관적인 구문을 사용할 수 있게 해줍니다.
연산자를 오버로딩하려면 operator 키워드 뒤에 기호를 붙여 함수를 정의합니다:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// + 연산자 오버로드
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};사용법:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // v1.operator+(v2)를 호출합니다일부 연산자는 오버로딩할 수 없습니다: ::, ., ?:, 그리고 sizeof. 새로운 연산자를 만들거나 연산자 우선순위를 변경할 수 없습니다.
연산자는 멤버 함수 또는 비멤버 함수로 구현될 수 있습니다.
직접 해보기
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// 입력 읽기
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: 입력값을 사용하여 두 개의 Point 객체 생성
// TODO: + 연산자를 사용하여 두 점을 더하기
// TODO: 요구된 형식으로 결과 출력:
// Point 1: (<x1>, <y1>)
// Point 2: (<x2>, <y2>)
// Sum: (<sum_x>, <sum_y>)
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.