Menu
Coddy logo textTech

산술 연산자 오버로딩

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 41번째.

+, -, *, /와 같은 산술 연산자는 사용자 정의 클래스가 기본 제공 숫자 형식처럼 동작하도록 오버로드되는 경우가 많습니다. 이러한 연산자는 일반적으로 피연산자를 수정하는 대신 새 객체를 반환합니다.

다음은 산술 연산자를 사용하는 Fraction 클래스입니다:

class Fraction {
    int numerator, denominator;
    
public:
    Fraction(int n, int d) : numerator(n), denominator(d) {}
    
    Fraction operator+(const Fraction& other) const {
        return Fraction(
            numerator * other.denominator + other.numerator * denominator,
            denominator * other.denominator
        );
    }
    
    Fraction operator*(const Fraction& other) const {
        return Fraction(numerator * other.numerator, 
                        denominator * other.denominator);
    }
};

두 연산자 모두 어느 피연산자도 수정하지 않으므로 const로 표시되어 있다는 점에 유의하세요. 이 연산자들은 결과가 담긴 새로운 Fraction을 생성하여 반환합니다.

+=와 같은 compound 대입 연산자의 경우 패턴이 다릅니다. 이러한 연산자는 왼쪽 피연산자를 수정하고 그 피연산자에 대한 참조를 반환합니다:

Fraction& operator+=(const Fraction& other) {
    numerator = numerator * other.denominator + other.numerator * denominator;
    denominator = denominator * other.denominator;
    return *this;
}

일반적인 관행은 기본 연산자를 복합 대입 연산자를 사용하여 구현함으로써 코드 중복을 줄이는 것입니다:

Fraction operator+(const Fraction& other) const {
    Fraction result = *this;    // 이 객체를 복사
    result += other;            // 복합 대입 연산 사용
    return result;
}

이 접근 방식은 두 연산자가 일관성을 유지하도록 보장하고 유지 관리를 더 쉽게 만듭니다.

challenge icon

챌린지

쉬움

산술 연산자 오버로딩을 사용하여 통화 계산을 처리하는 Money 클래스를 만들어 보겠습니다. 일반 숫자를 다룰 때처럼 자연스럽게 금액 값을 다룰 수 있도록 여러 산술 연산자를 구현합니다.

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

  • Money.h: 부동 소수점 정밀도 문제를 피하기 위해 금액을 센트 단위(int)로 저장하는 Money class를 define합니다. class는 다음을 지원해야 합니다.
    • dollars와 cents를 별도의 정수로 받는 Constructor
    • dollar 부분을 반환하는 getter getDollars()
    • cents 부분(0-99)을 반환하는 getter getCents()
    • 새로운 Money 객체를 반환하는 오버로드된 +- 연산자
    • current 객체를 수정하고 해당 객체에 대한 참조를 반환하는 오버로드된 +=-= compound assignment 연산자
    • 항상 cents를 두 자리로 표시하는 형식 $X.YY으로 money를 출력하는 display() method

    lesson에 나온 것처럼 code duplication을 줄이기 위해 기본 연산자(+-)를 compound assignment 연산자를 사용하여 Implement합니다. 모든 산술 연산자는 적절한 경우 const로 표시해야 합니다.

  • main.cpp: 두 개의 money amount를 나타내는 네 개의 정수를 input에서 읽습니다(각 줄에 dollars1, cents1, dollars2, cents1). 두 개의 Money 객체를 Create한 다음 모든 연산자를 시연합니다.
    • "Amount 1: "을 출력한 followed 첫 번째 amount를 displayed합니다.
    • "Amount 2: "를 출력한 followed 두 번째 amount를 displayed합니다.
    • 두 amount를 add하고 "Sum: "을 출력한 followed result를 출력합니다.
    • 첫 번째 amount에서 두 번째 amount를 subtract하고 "Difference: "를 출력한 followed result를 출력합니다.
    • +=를 사용하여 두 번째 amount를 첫 번째 amount에 add한 다음, "After +=: "를 출력한 followed modified 첫 번째 amount를 출력합니다.

display() method에서는 cents가 항상 두 자리로 표시되도록 <iomanip>std::setw(2)std::setfill('0')을 사용합니다(예: $5.07이지 $5.7이 아님).

std::stoi()를 사용하여 input 문자열을 integers로 변환합니다. header file에 header guards를 추가하는 것을 잊지 마세요.

직접 해보기

#include <iostream>
#include <string>
#include "Money.h"

using namespace std;

int main() {
    // 두 금액에 대한 입력을 읽습니다
    string line;
    
    getline(cin, line);
    int dollars1 = stoi(line);
    
    getline(cin, line);
    int cents1 = stoi(line);
    
    getline(cin, line);
    int dollars2 = stoi(line);
    
    getline(cin, line);
    int cents2 = stoi(line);
    
    // TODO: 입력 값으로 두 개의 Money 객체를 생성하세요
    
    // TODO: "Amount 1: " 다음에 표시된 첫 번째 금액을 출력하세요
    
    // TODO: "Amount 2: " 다음에 표시된 두 번째 금액을 출력하세요
    
    // TODO: 두 금액을 더하고 "Sum: " 다음에 결과를 출력하세요
    
    // TODO: 첫 번째에서 두 번째를 빼고 "Difference: " 다음에 결과를 출력하세요
    
    // TODO: +=를 사용하여 두 번째 금액을 첫 번째에 더한 다음, "After +=: " 다음에 수정된 첫 번째 금액을 출력하세요
    
    return 0;
}
quiz icon실력 점검

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

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

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