[C#] 오버라이드(Override)와 오버로드(Overload)

Running boy·2023년 8월 6일
0

컴퓨터 공학

목록 보기
8/36

메서드 시그니처(Method Signature)

메서드의 이름, 반환 타입, 매개변수의 수, 매개변수의 타입을 비교하면 두 메서드가 동일한지 비교가 가능하다.

이렇게 메서드의 동일성 여부를 확인하는 기준을 메서드 시그니처라고 한다.


오버라이드(Override)

부모 클래스의 가상(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라도 객체가 달라 고유값이 다를 수 있다.


오버로드(Overload)

객체 내에서 메서드를 재정의하는 것이며, 메서드의 이름이 같고 매개변수의 수나 타입이 달라야 한다.


연산자 오버로딩(Operator Overloading)

C#은 다양한 연산자 오버로딩을 지원한다.

아래와 같은 문법으로 재정의할 수 있다.

public static [반환 타입] operator [연산자]([타입1] [변수명1]...)
{
    
}

오버로딩이 가능한 연산자는
1. 모든 단항 연산자(+, -, !, ~, ++, --, true, false)
2. 모든 이항 연산자(+, -, *, /, %, &, |, ^, <<, >>) (이를 재정의하면 자동으로 +=와 같은 복합 대입 연산자도 재정의된다.)
3. 모든 비교 연산자(==, !=, <, >, <=, >=) (단 반드시 쌍으로 재정의해야 한다.)

오버로딩이 불가능한 연산자는
1. 논리 연산자(&&, ||)
2. 형변환 연산자((Type)x)
3. 이외 기타 연산자


implicit/explicit

형변환 연산자의 경우 재정의가 불가능하지만 대체 정의는 가능하다.

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

profile
Runner's high를 목표로

0개의 댓글