Menu
Coddy logo textTech

연산자 오버로딩 개요

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는 오버로드할 수 없습니다. 또한, 새로운 연산자를 만들거나 연산자의 우선순위를 변경할 수 없습니다. *는 항상 +보다 먼저 평가됩니다.

연산자는 (위와 같이) 멤버 함수로 구현되거나 비멤버 함수로 구현될 수 있습니다. 이어지는 레슨들에서 각 접근 방식을 언제 사용해야 하는지, 그리고 특정 범주의 연산자들을 오버로드하는 방법에 대해 배우게 될 것입니다.

challenge icon

챌린지

쉬움

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

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

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