본문 바로가기
우아한 코딩

virtual 메서드의 overriding과 Interface의 구현을 구분하자

by 피크인사이트 2024. 4. 7.
반응형

프로그램 개발 시 클래스 간의 관계를 정의할 경우, Interface의 구현과 가상(virtual) 메서드의 재정의(overriding)는 종종 혼동되는 개념입니다.

이 둘의 차이점과 각각의 사용 사례를 구분하여 살펴보겠습니다.

<virtual 메서드의 overriding과 Interface의 구현>

 

1. Interface의 구현

 

인터페이스(Interface)는 클래스가 특정 기능을 지원한다는 것을 나타내는 역할을 합니다.

클래스가 Interface를 구현하면 해당 Interface가 정의한 모든 메서드를 반드시 구현해야 합니다.

이것은 클래스 간의 강력한 결합을 피하고, 유연성과 확장성을 제공합니다.

interface IPlayable
{
    void Play();
}

class MusicPlayer : IPlayable
{
    public void Play()
    {
        Console.WriteLine("Music is playing.");
    }
}

 

위의 예시에서는 IPlayable 인터페이스를 정의하고, MusicPlayer 클래스가 이를 구현하여 Play 메서드를 구현하고 있습니다.

 

2. virtual 메서드의 overriding

가상 메서드는 부모 클래스에서 정의되고, 하위 클래스에서도 재정의할 수 있는 메서드입니다.

부모 클래스에서 virtual 키워드를 사용하여 가상 메서드를 정의하고, 하위 클래스에서 override 키워드를 사용하여 해당 메서드를 재정의합니다.

이것은 클래스 간의 계층적인 관계를 나타내며, 다형성을 구현할 수 있습니다.

 

//오버라이딩

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound.");
    }
}
//오버라이딩

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks.");
    }
}

 

위의 예시에서는 Animal 클래스에 MakeSound 메서드를 virtual로 정의하고, Dog 클래스에서 이를 재정의하여 강아지가 짖는 소리를 만들도록 합니다.

 

3. Interface의 구현 예시

Interface를 사용하여 여러 클래스가 공통된 동작을 구현하는 예시를 살펴보겠습니다.

interface IShape
{
    double CalculateArea();
}

class Circle : IShape
{
    public double Radius { get; set; }
    
   //원넓이
    public double CalculateArea()
    {
        return Math.PI * Radius * Radius;
    }
}

class Rectangle : IShape
{
    public double Width { get; set; }
    public double Height { get; set; }
    
    // 사각형 넓이
    public double CalculateArea()
    {
        return Width * Height;
    }
}

 

위의 예시에서는 IShape 인터페이스를 정의하고, Circle 클래스와 Rectangle 클래스가 이를 구현하여 각 도형의 넓이를 계산하는 기능을 제공하고 있습니다.

 

4. virtual 메서드의 overriding 예시

부모 클래스에서 가상 메서드를 먼저 정의하고, 하위 클래스에서 다시 해당 메서드를 재정의하는 예시를 살펴보겠습니다.

class Animal
{
   // 부모 MakeSound()
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound."); //출력
    }
}

class Dog : Animal
{
    // 하위 MakeSound()
    public override void MakeSound()
    {
        Console.WriteLine("barks."); //출력
    }
}

 

위의 예시에서는 Animal 클래스에 MakeSound 메서드를 virtual로 정의하고, Dog 클래스에서 이를 재정의하여 강아지가 짖는 소리를 만들도록 합니다.


마무리

이와 같이 Interface의 구현과 virtual 메서드의 overriding은 클래스 간의 관계를 다르게 표현하며, 각각의 사용 사례를 구분하여 적절히 활용해야 하겠습니다.

 

 
EFFECTIVE C#
-
저자
빌 와그너
출판
한빛미디어
출판일
2007.01.10

 

반응형