연산자 오버로딩 개요
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 40번째.
연산자 오버로딩을 사용하면 사용자 정의 클래스와 함께 사용할 때 +, -, == 같은 연산자가 어떻게 동작할지 정의할 수 있습니다. a.add(b) 같은 메서드를 호출하는 대신, 더 직관적인 a + b를 작성할 수 있습니다.
C++에서 연산자는 본질적으로 특별한 이름을 가진 함수입니다. 연산자를 오버로드하려면 operator 키워드 뒤에 기호를 사용하여 함수를 define합니다:
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)를 호출합니다모든 연산자를 오버로드할 수 있는 것은 아닙니다. 범위 확인 연산자 ::, member 액세스 ., 삼항 연산자 ?:, 그리고 sizeof는 오버로드할 수 없습니다. 또한 새로운 연산자를 만들거나 연산자의 우선순위를 변경할 수 없습니다. *는 항상 +보다 먼저 평가됩니다.
연산자는 위와 같이 member 함수로 구현하거나 non-member 함수로 구현할 수 있습니다. 다음 수업에서는 각 접근 방식을 언제 사용해야 하는지, 그리고 특정 범주의 연산자를 Overload하는 방법을 배우게 됩니다.
챌린지
쉬움2D coordinate를 나타내고 + operator를 사용하여 두 점을 더할 수 있는 Point class를 만들어 보겠습니다. 이는 operator 오버로딩을 배우는 첫 단계로, 직접 만든 class가 익숙한 operator와 함께 작동하도록 합니다.
코드를 구성하기 위해 두 개의 파일을 만듭니다.
Point.h: x 및 ycoordinates(둘 다int)를 저장하는Pointclass를define합니다.class에는 다음이 있어야 합니다.- x 및 y
coordinates를 위한privatemember - x 및 y 값을
takes하는 생성자 - Getter
getX()및getY()(둘 다const) - 두 점을 더하고 결합된
coordinates를 가진 새로운Point를return하는 오버로드된+operator
+operator는 다른Point를constreference로takes하고 새로운Point를return하는member함수로 구현해야 합니다. 어느operand도 수정하지 않doesn기 때문에const로Mark합니다.- x 및 y
main.cpp: 두 개의 점을 나타내는 네 개의 정수(x1, y1, x2, y2를 각각 별도의 줄에 입력)를input에서Read합니다. 두 개의Pointobjects를Create하고,+operator를 사용하여 함께 더한 다음results를 표시합니다.Outputformat:Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
여기서 핵심은 p1 + p2가 실제로 내부적으로 p1.operator+(p2)를 호출한다는 점입니다. 오버로드한 operator를 사용하면 Point p3 = p1 + p2;와 같이 직관적인 코드를 작성할 수 있으며, Point p3 = p1.add(p2);와 같은 코드를 작성할 필요가 없습니다.
std::stoi()를 사용하여 input 문자열을 정수로 변환합니다. 헤더 파일에서 헤더 가드를 사용하는 것을 잊지 마세요.
직접 해보기
#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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러