[C#] Override와 Overload

송칭·2024년 9월 25일
0

Override

매서드를 제정의하는 것으로 부모 클래스에서 특정 메서드를 상속받는 자식 클래스가 이를 덮어씌우는 것이다. 부모 클래스의 메서드에 virtual 또는 abstract 키워드가 있어야 자식 클래스에서 override를 사용할 수 있다.

virtual과 abstract는 둘 다 메서드의 재정의를 위해 사용되지만 그 사용 방식과 목적에서 차이가 있다.

virtual

부모 클래스에서 기본 구현이 제공되지만, 자식 클래스에서 재정의할 수 있는 메서드를 만들 때 사용하는데, 부모 클래스에서 이미 구현이 되어 있으므로 자식 클래스에서 재정의하지 않아도 된다.
즉 자식 클래스는 이 메서드를 재정의할 수도 있고, 그대로 사용할 수도 있는 것이다.

class Parent
{
    public virtual void PrintMessage()
    {
        Console.WriteLine("부모 메시지");
    }
    
    public virtual void TalkAdrress()
    {
        Console.WriteLine("우리 집 주소 : ㅇㅇㅇㅇㅇ");
    }
}

class Child : Parent
{
    public override void PrintMessage()
    {
        Console.WriteLine("자식 메시지");
    }
}

Parent obj = new Child();
obj.PrintMessage(); // 출력: "자식 메시지"

참고로, 부모 클래스의 virtual 키워드를 제거하고 자식 클래스에서 new 키워드를 사용하여도 override와 유사하게 부모 클래스의 메서드를 덮어쓰는 것처럼 만들 수 있다.
하지만 이는 override와는 작동 방식과 목적이 다르다.

class Parent
{
    public void PrintMessage()
    {
        Console.WriteLine("부모 메시지");
    }
}

class Child : Parent
{
    public new void PrintMessage()
    {
        Console.WriteLine("자식 메시지");
    }
}

Parent obj = new Child();
obj.PrintMessage(); // 출력은 "부모 메시지"

여기서는 부모 클래스의 참조(Parent obj = new Child();)를 사용했을 때, 자식 클래스의 PrintMessage가 아닌 부모 클래스의 메서드가 호출된다.
이 상황에서는 자식의 메서드는 부모의 메서드를 덮어쓰지 않고 별도의 메서드로 존재한다.

abstract

부모 클래스에서 메서드의 선언만 제공하고 구현은 제공하지 않으며, 자식 클래스에서 반드시 재정의해야한다. 구현체가 없기 때문에 메서드 본문을 가질 수 없으므로 자식 클래스는 이 메서드를 반드시 재정의해야만 한다.

abstract 메서드를 가지는 클래스는 반드시 abstract 클래스여야한다. 또한 abstract 클래스는 직접 인스턴스를 만들 수 없다.

abstract class Parent
{
    public abstract void PrintMessage();
}

class Child : Parent
{
    public override void PrintMessage()
    {
        Console.WriteLine("자식 메시지");
    }
}

Parent obj = new Child();
obj.PrintMessage(); // 출력은 "자식 메시지"

Overload

같은 클래스 내에서 동일한 이름을 가진 메서드를 매개변수의 타입, 개수, 순서가 다르게 정의하는 것이다. 메서드 이름은 동일하지만, 매개변수가 다를 때 메서드를 여러 개 정의할 수 있다. 반환 타입은 다를 수 있지만, 오버로딩은 주로 매개변수 목록의 차이로 구분된다.

class SampleAdds
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public float Add(float a, float b)
    {
        return a + b;
    }

    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
}
profile
게임 클라이언트

0개의 댓글