C# 클래스 확장: 상속, 오버라이딩, 추상 클래스, 인터페이스

C# 클래스 확장: 상속, 오버라이딩, 추상 클래스, 인터페이스

이번 글에서는 C#의 상속을 통한 클래스 확장 방법과 다형성에 대해 알아보겠습니다. 객체 지향 프로그래밍에서 중요한 개념인 상속과 다형성은 코드의 재사용성과 확장성을 향상시키는 데 큰 역할을 합니다.

1. 상속의 기본 개념

상속은 객체 지향 프로그래밍에서 한 클래스의 속성과 메서드를 다른 클래스가 물려받는 기능을 의미합니다. 이를 통해 기존의 코드 재사용성을 높이고, 클래스 간의 계층적 관계를 표현할 수 있습니다.

// 기본 클래스 (Base Class)
class Animal
{
    // 공용 메서드
    public void Eat()
    {
        Console.WriteLine("The animal eats.");
    }
}

// Dog 클래스는 Animal 클래스를 상속받는 파생 클래스
class Dog : Animal
{
    // Dog 클래스만의 특정 메서드
    public void Bark()
    {
        Console.WriteLine("The dog barks.");
    }
}

▶ 위 코드에서 Dog 클래스는 Animal 클래스를 상속받아 Eat 메서드를 사용할 수 있습니다.

2. 오버라이딩과 다형성

오버라이딩은 상속받은 메서드를 파생 클래스에서 재정의하는 것을 의미합니다. 다형성은 하나의 인터페이스나 클래스가 여러 형태로 동작할 수 있게 하는 기능입니다. 오버라이딩은 다형성의 중요한 부분입니다.

// 기본 클래스 (Base Class)
class Animal
{
    // 가상 메서드: 파생 클래스에서 오버라이드 가능
    public virtual void Speak()
    {
        Console.WriteLine("The animal speaks.");
    }
}

// Dog 클래스는 Animal 클래스를 상속받음
class Dog : Animal
{
    // Speak 메서드를 오버라이드하여 개 특성에 맞게 재정의
    public override void Speak()
    {
        Console.WriteLine("The dog barks.");
    }
}

// Cat 클래스는 Animal 클래스를 상속받음
class Cat : Animal
{
    // Speak 메서드를 오버라이드하여 고양이 특성에 맞게 재정의
    public override void Speak()
    {
        Console.WriteLine("The cat meows.");
    }
}

▶ 위 코드에서 Animal 클래스의 Speak 메서드는 virtual 키워드를 사용하여 오버라이딩될 수 있음을 나타냅니다. Dog와 Cat 클래스에서는 Speak 메서드를 오버라이드하여 각각의 동물의 소리를 출력합니다.

3. 추상 클래스와 인터페이스의 이해

추상 클래스는 인스턴스화 될 수 없는 클래스를 의미합니다. 이 클래스는 기본 구현을 제공하면서 파생 클래스에서 반드시 구현되어야 하는 메서드를 정의할 수 있습니다. 인터페이스는 구현을 가지지 않은 메서드와 속성만 정의할 수 있는 타입입니다.

// 추상 클래스: 인스턴스화할 수 없으며 파생 클래스에게 구현을 강제함
abstract class AbstractAnimal
{
    // 추상 메서드: 본체가 없으며 파생 클래스에서 반드시 구현해야 함
    public abstract void Speak();
}

// Lion 클래스는 추상 클래스 AbstractAnimal을 상속받음
class Lion : AbstractAnimal
{
    // 추상 메서드 Speak의 구현
    public override void Speak()
    {
        Console.WriteLine("The lion roars.");
    }
}

// 인터페이스: 계약의 역할을 함. 클래스는 여러 인터페이스를 구현할 수 있음
interface IEatable
{
    // 인터페이스의 메서드는 본체가 없으며 구현 클래스에서 반드시 구현해야 함
    void Eat();
}

// Horse 클래스는 IEatable 인터페이스를 구현함
class Horse : IEatable
{
    // IEatable 인터페이스의 Eat 메서드 구현
    public void Eat()
    {
        Console.WriteLine("The horse eats grass.");
    }
}

▶ 위 코드에서 AbstractAnimal은 추상 클래스로, Speak 메서드는 파생 클래스에서 반드시 구현되어야 합니다. Horse 클래스는 IEatable 인터페이스를 구현하며, Eat 메서드를 정의합니다.

▶ 상속과 다형성은 C# 프로그래밍의 중심적인 개념 중 하나입니다. 이를 잘 이해하고 활용하면 코드의 유연성과 재사용성을 크게 향상시킬 수 있습니다.

참고자료

함께 보면 좋은 이전 게시글

위로 스크롤