메서드의 이름, 반환 타입, 매개변수의 수, 매개변수의 타입을 비교하면 두 메서드가 동일한지 비교가 가능하다.
이렇게 메서드의 동일성 여부를 확인하는 기준을 메서드 시그니처라고 한다.
부모 클래스의 가상(Virtual) 또는 추상(Abstract) 메서드를 재정의할 수 있으며, 반드시 메서드 시그니처가 동일해야 한다.
만약 단순히 이름만 같은 다른 메서드를 정의할 경우 new 키워드를 사용하면 된다.
모든 클래스는 Object 클래스를 상속받기 때문에 Object에서 제공하는 가상 메서드를 오버라이드하여 재정의할 수 있다.
public class Object
{
public virtual bool Equals(object obj);
public virtual int GetHashCode();
public virtual string ToString();
}
여기서 Equals와 GetHashCode의 경우 가급적이면 묶어서 재정의하는 것이 좋다.
Equals의 결과가 true라는 것은 두 객체가 동일하다는 것이므로 동일한 고유값(hash)을 가져야 한다.
하지만 참조 형식의 데이터를 대상으로 재정의할 경우, 멤버값이 같아 Equals가 true라도 객체가 달라 고유값이 다를 수 있다.
객체 내에서 메서드를 재정의하는 것이며, 메서드의 이름이 같고 매개변수의 수나 타입이 달라야 한다.
C#은 다양한 연산자 오버로딩을 지원한다.
아래와 같은 문법으로 재정의할 수 있다.
public static [반환 타입] operator [연산자]([타입1] [변수명1]...)
{
}
오버로딩이 가능한 연산자는
1. 모든 단항 연산자(+, -, !, ~, ++, --, true, false)
2. 모든 이항 연산자(+, -, *, /, %, &, |, ^, <<, >>) (이를 재정의하면 자동으로 +=와 같은 복합 대입 연산자도 재정의된다.)
3. 모든 비교 연산자(==, !=, <, >, <=, >=) (단 반드시 쌍으로 재정의해야 한다.)
오버로딩이 불가능한 연산자는
1. 논리 연산자(&&, ||)
2. 형변환 연산자((Type)x)
3. 이외 기타 연산자
형변환 연산자의 경우 재정의가 불가능하지만 대체 정의는 가능하다.
implicit으로 재정의할 경우 암시적, 명시적 형변환 모두 가능하고
explicit으로 재정의할 경우 명시적 형변환만 가능하다.
implicit 예시
class Dog
{
string name;
public Dog(string name)
{
this.name = name;
}
public static implicit operator Cat(Dog dog)
{
return new Cat(dog.name);
}
}
class Cat
{
string name;
public Cat(string name)
{
this.name=name;
}
public override string ToString()
{
return name;
}
}
Dog dog = new Dog("Puppy");
Cat cat0 = dog;
Cat cat1 = (Cat)dog;
Console.WriteLine(cat0.ToString()); // Puppy
explicit 예시
class Dog
{
string name;
public Dog(string name)
{
this.name = name;
}
public static explicit operator Cat(Dog dog)
{
return new Cat(dog.name);
}
}
class Cat
{
string name;
public Cat(string name)
{
this.name=name;
}
public override string ToString()
{
return name;
}
}
Dog dog = new Dog("Puppy");
Cat cat0 = dog; // 암시적 형변환이 불가능하기 때문에 컴파일 에러가 발생한다.
Cat cat1 = (Cat)dog;
Console.WriteLine(cat0.ToString());
참고 자료
시작하세요! C# 10 프로그래밍 - 정성태
Microsoft 공식 문서 - Operator overloading - predefined unary, arithmetic, equality and comparison operators