Menu
Coddy logo textTech

연산자 오버로딩 개요

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하는 방법을 배우게 됩니다.

challenge icon

챌린지

쉬움

2D coordinate를 나타내고 + operator를 사용하여 두 점을 더할 수 있는 Point class를 만들어 보겠습니다. 이는 operator 오버로딩을 배우는 첫 단계로, 직접 만든 class가 익숙한 operator와 함께 작동하도록 합니다.

코드를 구성하기 위해 두 개의 파일을 만듭니다.

  • Point.h: x 및 y coordinates(둘 다 int)를 저장하는 Point classdefine합니다. class에는 다음이 있어야 합니다.
    • x 및 y coordinates를 위한 private member
    • x 및 y 값을 takes하는 생성자
    • Getter getX()getY()(둘 다 const)
    • 두 점을 더하고 결합된 coordinates를 가진 새로운 Pointreturn하는 오버로드된 + operator

    + operator는 다른 Pointconst referencetakes하고 새로운 Pointreturn하는 member 함수로 구현해야 합니다. 어느 operand도 수정하지 않doesn기 때문에 constMark합니다.

  • main.cpp: 두 개의 점을 나타내는 네 개의 정수(x1, y1, x2, y2를 각각 별도의 줄에 입력)를 input에서 Read합니다. 두 개의 Point objectsCreate하고, + operator를 사용하여 함께 더한 다음 results를 표시합니다.

    Output format:

    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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러