TIL_2025_02_27 virtual, overrive, abstract

김효중·2025년 2월 27일

가상 함수 virtual

virtual이란?

부모 클래스에서 선언 된 가상함수를 자식 클래스에서 재정의(override)할 수 있도록 한다.
이때 반드시 기본 구현이 있어야 한다.
자식 클래스는 필요에 따라 해당 클래스를 재정의(override)할 수 있다.

예시 코드

class Parent 
{
    public virtual void ShowMessage() {
        Console.WriteLine("Parent 클래스의 ShowMessage");
    }
}

class Child : Parent 
{
    public override void ShowMessage() { // 부모 메서드 재정의
        Console.WriteLine("Child 클래스의 ShowMessage");
    }
}
class Program 
{
    static void Main() {
        Parent obj1 = new Parent();
        obj1.ShowMessage(); // "Parent 클래스의 ShowMessage"

        Parent obj2 = new Child();
        obj2.ShowMessage(); // "Child 클래스의 ShowMessage"
    }
}

언제 사용하나?

다형성를 활용하여 부모 타입을 통해 자식 클래스의 기능을 호출 할 수 있으며 기존 코드를 수정하지 않고 기능 확장이 가능하다. 즉 같은 부모 클래스로 묶으면서 자식들의 고유의 기능을 쓸 때 사용한다.

재정의(override)

override란?

부모 클래스에서 virtual 또는 abstract 메서드를 재정의(Override)하는 키워드이다.
부모 클래스의 동작을 유지하면서도, 자식 클래스에서 새로운 동작을 적용할 수 있다.

예시

class Parent 
{
    public virtual void Print() {
        Console.WriteLine("부모 클래스 Print()");
    }
}

class Child : Parent 
{
    public override void Print() { // 부모 메서드 재정의
        Console.WriteLine("자식 클래스 Print()");
    }
}

언제 사용하나?

기본의 부모 코드(virtual, abstract)를 변경하지 않고 새로운 기능을 추가할 수 있다.
상속을 전제한 코드 또는 base.Print()를 통해 부모에서 구현한 코드 역시 호출할 때 사용할 수 있다.

추상클래스, 추상 메서드 abstract

추상화란?

abstract 를 통해 선언 되며 선언만 되고 구현되지 않은 함수와 클래스이다.
추상 메서드를 쓰기 위해서는 클래스는 추상 클래스여야만 한다.
또한 추상 메서드는 반드시 자식에서 구현되어야 한다.

예시 코드

abstract class Animal 
{
    public abstract void MakeSound(); // 추상 메서드 (구현 X)
}

class Dog : Animal 
{
    public override void MakeSound() { // 반드시 구현해야 함
        Console.WriteLine("멍멍!");
    }
}

class Program 
{
    static void Main() {
        Animal myDog = new Dog();
        myDog.MakeSound(); // "멍멍!"
    }
}

언제 사용하는가?

다형성을 사용할 경우 강제적인 구조를 제공하여, 상속받은 클래스가 반드시 특정 기능을 구현하도록 유도할 때 사용한다.

결론

즉 다형성을 이용한 상속 관계를 구현하고자 한다면 부모에는 virtual, abstract을 가지고 있어야한다.

그러면서 자식은 override를 통해 자신의 함수를 구현하는데
이때 virtual은 부모만 존재 할 수 있으며 자식은 구현하지 않을 수 있다.
abstract는 부모는 선언만 하고 구현은 할 수 없고 클래스로 abstract로 선언하야한다.
그리고 자식에서 무조건 함수 구현을 해야한다.

profile
도전하는 개발자

0개의 댓글