산술 연산자 오버로드
사용자 지정 형식에 +, -, *를 정의합니다.
산술 연산자 오버로드은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
산술 연산자를 오버로드하는 이유
연산자 오버로드를 사용하면 사용자 형식에서 +, -, *와 같은 익숙한 기호를 사용할 수 있습니다. 벡터, 화폐 또는 복소수와 같은 값 형식에서는 메서드 호출이 아니라 수학식처럼 코드가 읽히게 됩니다.
연산자 + 구문
오버로드된 연산자는 이름이 기호 앞에 operator가 붙은 public static 메서드로 선언합니다. 매개변수 중 하나 이상은 이를 포함하는 형식이어야 합니다.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var sum = new Vector2(1, 2) + new Vector2(3, 4);
Console.WriteLine(sum);
}
}뺄셈과 곱셈
같은 형식에서 여러 연산자를 오버로드할 수 있습니다. 여기서는 벡터에 뺄셈과 스칼라 곱셈을 추가합니다.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a, Vector2 b)
=> new Vector2(a.X - b.X, a.Y - b.Y);
public static Vector2 operator *(Vector2 a, int k)
=> new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var v = new Vector2(5, 6) - new Vector2(2, 1);
Console.WriteLine(v);
Console.WriteLine(new Vector2(2, 3) * 4);
}
}연산자는 항상 정적
오버로드된 연산자는 반드시 static이어야 합니다. 숨겨진 this를 대상으로 작동하지 않고, 피연산자를 명시적 매개변수로 전달받습니다. 컴파일러가 기호를 메서드에 연결합니다.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal amount) { Amount = amount; }
public static Money operator +(Money a, Money b)
=> new Money(a.Amount + b.Amount);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var total = new Money(10.5m) + new Money(4.25m);
Console.WriteLine(total);
}
}단항 연산자
부호 반전과 같은 단항 연산자는 피연산자 하나를 받습니다. 매개변수 하나를 사용해 operator -를 오버로드하면 -v와 같은 식을 지원할 수 있습니다.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a)
=> new Vector2(-a.X, -a.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
Console.WriteLine(-new Vector2(3, -7));
}
}서로 다른 형식의 피연산자
피연산자 하나는 다른 형식일 수 있습니다. 두 순서를 모두 제공하면 사용자가 어느 방향으로든 식을 자연스럽게 작성할 수 있습니다.
using System;
public struct Temperature
{
public double Celsius;
public Temperature(double c) { Celsius = c; }
public static Temperature operator +(Temperature t, double delta)
=> new Temperature(t.Celsius + delta);
public static Temperature operator +(double delta, Temperature t)
=> new Temperature(t.Celsius + delta);
public override string ToString() => Celsius + "C";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Temperature(20) + 5);
Console.WriteLine(5 + new Temperature(20));
}
}새 값 반환
산술 연산자는 피연산자를 변경해서는 안 됩니다. 새로운 값을 계산해 반환하고 원본은 변경하지 않아야 하며, 이는 int와 같습니다.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var a = new Vector2(1, 1);
var b = new Vector2(2, 2);
var c = a + b;
Console.WriteLine("a unchanged: " + a);
Console.WriteLine("result: " + c);
}
}산술 연산 연결
각 연산자가 같은 형식을 반환하므로 식을 자연스럽게 연결할 수 있고 일반적인 우선순위와 결합 규칙을 따릅니다.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b) => new Vector2(a.X + b.X, a.Y + b.Y);
public static Vector2 operator *(Vector2 a, int k) => new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var result = new Vector2(1, 1) + new Vector2(2, 2) * 3;
Console.WriteLine(result);
}
}클래스의 연산자
연산자 오버로드는 구조체뿐 아니라 클래스에서도 작동합니다. null에 주의하십시오. 클래스 피연산자는 null일 수 있으므로 필요하면 보호 처리해야 합니다.
using System;
public class Complex
{
public double Re, Im;
public Complex(double re, double im) { Re = re; Im = im; }
public static Complex operator +(Complex a, Complex b)
=> new Complex(a.Re + b.Re, a.Im + b.Im);
public override string ToString() => Re + " + " + Im + "i";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Complex(1, 2) + new Complex(3, 4));
}
}완전한 숫자 형식
여기서는 덧셈을 지원하는 작은 분수 형식을 살펴봅니다. 연산자 오버로드를 사용하면 도메인 형식이 기본 제공 숫자처럼 동작하게 만들 수 있습니다.
using System;
public struct Fraction
{
public int Num, Den;
public Fraction(int num, int den) { Num = num; Den = den; }
public static Fraction operator +(Fraction a, Fraction b)
=> new Fraction(a.Num * b.Den + b.Num * a.Den, a.Den * b.Den);
public override string ToString() => Num + "/" + Den;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Fraction(1, 2) + new Fraction(1, 3));
}
}직접 해 보기
화폐와 유사한 구조체에 덧셈과 스칼라 곱셈을 제공한 다음, 일반적인 산술식처럼 읽히는 식을 만들어 보십시오.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal a) { Amount = a; }
public static Money operator +(Money a, Money b) => new Money(a.Amount + b.Amount);
public static Money operator *(Money a, int qty) => new Money(a.Amount * qty);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var price = new Money(4.50m);
var total = price * 3 + new Money(2.00m);
Console.WriteLine(total);
}
}빠른 확인
오버로드된 연산자의 선언 형식을 떠올려 보십시오.
정리
산술 연산자를 오버로드하면 값 형식이 수학식처럼 읽힙니다.
operator키워드와 함께public static으로 선언하십시오.- 매개변수 중 하나 이상은 이를 포함하는 형식이어야 합니다.
- 새 값을 반환하고 피연산자는 절대 변경하지 마십시오.
- 서로 다른 형식의 산술 연산에서는 두 피연산자 순서를 모두 제공하십시오.
자주 묻는 질문
“산술 연산자 오버로드” 강의는 무료인가요?
네 — “산술 연산자 오버로드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“산술 연산자 오버로드”에서 뭘 배우나요?
사용자 지정 형식에 +, -, *를 정의합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“산술 연산자 오버로드” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 산술 연산자 오버로드
- 비교 연산자 오버로드
- 사용자 정의 변환
- 연산자 오버로드 모범 사례