[C#] Override와 Overload

송칭·2024년 9월 25일

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개의 댓글