Menu
Coddy logo textTech

연산자 오버로딩

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

연산자 오버로딩을 사용하면 사용자 지정 클래스에서 +, - 또는 ==와 같은 연산자가 어떻게 동작할지 정의할 수 있습니다. point1.Add(point2)와 같은 method를 호출하는 대신, 더 자연스러운 point1 + point2를 작성할 수 있습니다.

연산자를 Overload하려면 operator 키워드를 사용하여 특수한 정적 method를 만듭니다:

public class Vector
{
    public int X { get; }
    public int Y { get; }
    
    public Vector(int x, int y)
    {
        X = x;
        Y = y;
    }
    
    public static Vector operator +(Vector a, Vector b)
    {
        return new Vector(a.X + b.X, a.Y + b.Y);
    }
}

이제 벡터를 자연스럽게 더할 수 있습니다:

Vector v1 = new Vector(3, 4);
Vector v2 = new Vector(1, 2);
Vector v3 = v1 + v2;  // X = 4, Y = 6

method는 public static이어야 하며, 하나 이상의 매개 변수는 포함하는 형식이어야 합니다. 산술 연산자(+, -, *, /), 비교 연산자(==, !=, <, >) 및 단항 연산자(-, !, ++)를 Overload할 수 있습니다.

비교 연산자는 쌍으로 오버로드해야 한다는 점에 유의하세요. ==을 정의하면 !=도 반드시 정의해야 합니다.

코드를 더 직관적으로 만들 수 있을 때, 특히 벡터, 복소수 또는 화폐와 같은 수학적 유형에 operator overloading을 사용하세요. 연산의 의미가 즉시 명확하지 않을 때는 사용하지 마세요.

challenge icon

챌린지

쉬움

연산자 오버로딩을 통해 분수를 자연스럽게 다룰 수 있도록 Fraction class를 만들어 보겠습니다. fraction1.Add(fraction2)와 같은 method를 호출하는 대신, 직관적인 fraction1 + fraction2를 작성할 수 있습니다.

코드를 두 개의 파일로 구성합니다:

  • Fraction.cs: 분자와 분모가 있는 분수를 나타내는 Math namespace의 Fraction class를 Create합니다. Fraction에는 다음 항목이 있어야 합니다:
    • 읽기 전용 정수 properties 두 개: NumeratorDenominator
    • numerator와 denominator를 (해당 순서로) accepts하는 constructor
    • 다음 Formula를 사용하여 두 fractions를 더하는 overloaded + operator: (a/b) + (c/d) = (a*d + c*b) / (b*d)
    • 두 fractions를 multiply하는 overloaded * operator: (a/b) * (c/d) = (a*c) / (b*d)
    • 두 fractions가 equal하면 true를 return하는 overloaded == operator (비교하려면 cross-multiply: a*d == c*b)
    • ==를 overload할 때 required인 overloaded != operator. 이 operator는 ==의 반대 결과를 return합니다
    • fraction을 "{Numerator}/{Denominator}" format의 string으로 return하는 method GetDisplay()
  • Program.cs: Main 파일에서 input values를 사용하여 두 fractions를 Create합니다. 두 fractions를 add하고, multiply하고, equal한지 확인하여 overloaded operators를 시연합니다. operators가 자연스럽게 작동하는 모습을 보여 주도록 결과를 Print합니다.

네 개의 inputs를 받습니다:

  • 첫 번째 fraction의 numerator (정수)
  • 첫 번째 fraction의 denominator (정수)
  • 두 번째 fraction의 numerator (정수)
  • 두 번째 fraction의 denominator (정수)

다음 format으로 output을 Print합니다:

Fraction 1: {GetDisplay()}
Fraction 2: {GetDisplay()}
Sum: {GetDisplay()}
Product: {GetDisplay()}
Are equal: {True/False}

예를 들어 inputs가 1, 2, 2, 4라면 output은 다음과 같아야 합니다:

Fraction 1: 1/2
Fraction 2: 2/4
Sum: 8/8
Product: 2/8
Are equal: True

1/22/41*4 == 2*2이므로 equal로 인식되는 것을 확인하세요. Sum과 product는 simplification 없이 계산됩니다. 이 challenge에서는 괜찮습니다. 이제 익숙한 operators를 사용하여 fractions를 얼마나 자연스럽게 다룰 수 있는지가 핵심입니다!

직접 해보기

using System;
using Math;

class Program
{
    public static void Main(string[] args)
    {
        // 첫 번째 분수 입력 읽기
        int num1 = Convert.ToInt32(Console.ReadLine());
        int den1 = Convert.ToInt32(Console.ReadLine());
        
        // 두 번째 분수 입력 읽기
        int num2 = Convert.ToInt32(Console.ReadLine());
        int den2 = Convert.ToInt32(Console.ReadLine());
        
        // TODO: 입력 값을 사용하여 두 개의 Fraction 객체 생성
        
        // TODO: 오버로드된 + 연산자를 사용하여 분수 더하기
        
        // TODO: 오버로드된 * 연산자를 사용하여 분수 곱하기
        
        // TODO: 오버로드된 == 연산자를 사용하여 동등성 확인
        
        // TODO: 필요한 형식으로 출력 인쇄:
        // Fraction 1: {GetDisplay()}
        // Fraction 2: {GetDisplay()}
        // Sum: {GetDisplay()}
        // Product: {GetDisplay()}
        // Are equal: {True/False}
    }
}
quiz icon실력 점검

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

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

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