연산자 오버로딩
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 = 6method는 public static이어야 하며, 하나 이상의 매개 변수는 포함하는 형식이어야 합니다. 산술 연산자(+, -, *, /), 비교 연산자(==, !=, <, >) 및 단항 연산자(-, !, ++)를 Overload할 수 있습니다.
비교 연산자는 쌍으로 오버로드해야 한다는 점에 유의하세요. ==을 정의하면 !=도 반드시 정의해야 합니다.
코드를 더 직관적으로 만들 수 있을 때, 특히 벡터, 복소수 또는 화폐와 같은 수학적 유형에 operator overloading을 사용하세요. 연산의 의미가 즉시 명확하지 않을 때는 사용하지 마세요.
챌린지
쉬움연산자 오버로딩을 통해 분수를 자연스럽게 다룰 수 있도록 Fraction class를 만들어 보겠습니다. fraction1.Add(fraction2)와 같은 method를 호출하는 대신, 직관적인 fraction1 + fraction2를 작성할 수 있습니다.
코드를 두 개의 파일로 구성합니다:
Fraction.cs: 분자와 분모가 있는 분수를 나타내는Mathnamespace의Fractionclass를 Create합니다. Fraction에는 다음 항목이 있어야 합니다:- 읽기 전용 정수 properties 두 개:
Numerator와Denominator - 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하는 methodGetDisplay()
- 읽기 전용 정수 properties 두 개:
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: True1/2와 2/4가 1*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}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C# 컴파일러