본문 바로가기
Programming/C#

C# 상속(Inheritance) 객체지향 프로그래밍의 핵심 개념

by Dev_카페인 2024. 6. 9.
반응형

[C#] 상속 (Inheritance)  : 객체지향 프로그래밍의 핵심 개념

안녕하세요! 이번 포스트에서는 C#의 상속(Inheritance)에 대해 자세히 알아보겠습니다. 상속은 객체지향 프로그래밍의 중요한 개념 중 하나로, 코드의 재사용성과 유연성을 크게 향상시킵니다.

상속이란 무엇인가요?

상속은 기존 클래스(부모 클래스 또는 기본 클래스)의 특성과 기능을 새로운 클래스(자식 클래스 또는 파생 클래스)에 물려주는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 계층 구조를 통해 관련 클래스를 체계적으로 관리할 수 있습니다.

상속의 기본 문법

C#에서 상속을 구현하는 기본 문법은 다음과 같습니다. 부모 클래스는 BaseClass이고, 자식 클래스는 DerivedClass입니다.

public class BaseClass
{
    public void BaseMethod()
    {
        Console.WriteLine("Base method");
    }
}

public class DerivedClass : BaseClass
{
    public void DerivedMethod()
    {
        Console.WriteLine("Derived method");
    }
}

위 예시에서 DerivedClass는 BaseClass를 상속받습니다. 따라서 DerivedClass는 BaseClass의 BaseMethod를 호출할 수 있습니다.

상속의 예시

public class Animal
{
    public string Name { get; set; }

    public void Eat()
    {
        Console.WriteLine($"{Name} is eating.");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{Name} is barking.");
    }
}

public class Cat : Animal
{
    public void Meow()
    {
        Console.WriteLine($"{Name} is meowing.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog { Name = "Buddy" };
        dog.Eat(); // Base class method
        dog.Bark(); // Derived class method

        Cat cat = new Cat { Name = "Whiskers" };
        cat.Eat(); // Base class method
        cat.Meow(); // Derived class method
    }
}

위 예시에서 Dog와 Cat 클래스는 Animal 클래스를 상속받습니다. 따라서 Dog와 Cat 객체는 Animal 클래스의 Eat 메서드를 호출할 수 있습니다.

상속의 이점

  1. 코드 재사용성: 부모 클래스의 코드를 자식 클래스에서 재사용할 수 있습니다.
  2. 유지보수성: 공통 기능을 부모 클래스에 정의하면, 해당 기능을 변경할 때 자식 클래스에서 일일이 수정할 필요가 없습니다.
  3. 계층 구조: 관련 있는 클래스를 체계적으로 관리할 수 있습니다.

상속의 종류

단일 상속

C#에서는 단일 상속만 지원합니다. 즉, 한 클래스는 하나의 부모 클래스만 가질 수 있습니다.

public class A
{
}

public class B : A
{
}

다중 상속 (지원되지 않음)

C#에서는 다중 상속을 지원하지 않습니다. 그러나 인터페이스를 통해 이를 우회할 수 있습니다.

상속과 접근제한자

부모 클래스의 멤버는 접근제한자에 따라 자식 클래스에서 접근할 수 있습니다.

  • public: 모든 클래스에서 접근 가능
  • protected: 부모 클래스와 자식 클래스에서 접근 가능
  • private: 부모 클래스 내에서만 접근 가능
  • internal: 동일한 어셈블리 내에서 접근 가능
  • protected internal: 동일한 어셈블리 내 또는 자식 클래스에서 접근 가능
  • private protected: 동일한 어셈블리 내에서 상속받은 자식 클래스에서만 접근 가능
public class BaseClass
{
    public int PublicField;
    protected int ProtectedField;
    private int PrivateField;
}

public class DerivedClass : BaseClass
{
    public void AccessFields()
    {
        PublicField = 1; // 접근 가능
        ProtectedField = 2; // 접근 가능
        // PrivateField = 3; // 접근 불가
    }
}

메서드 오버라이딩 (Method Overriding)

자식 클래스는 부모 클래스의 메서드를 재정의(오버라이딩)할 수 있습니다. 이를 위해 부모 클래스의 메서드는 virtual 키워드로 선언되고, 자식 클래스의 메서드는 override 키워드로 선언됩니다.

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Animal sound");
    }
}

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

class Program
{
    static void Main(string[] args)
    {
        Animal animal = new Animal();
        animal.Speak(); // Animal sound

        Dog dog = new Dog();
        dog.Speak(); // Bark
    }
}

추상 클래스와 인터페이스

상속을 사용할 때 자주 활용되는 개념으로 추상 클래스와 인터페이스가 있습니다.

추상 클래스

추상 클래스는 인스턴스화할 수 없으며, 자식 클래스에서 구현해야 하는 추상 메서드를 포함할 수 있습니다.

public abstract class Animal
{
    public abstract void Speak();
}

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

인터페이스

인터페이스는 클래스가 구현해야 하는 메서드와 속성의 집합을 정의합니다. 다중 상속을 지원하지 않는 C#에서 다중 상속의 유사한 기능을 제공합니다.

public interface IFlyable
{
    void Fly();
}

public class Bird : IFlyable
{
    public void Fly()
    {
        Console.WriteLine("Flying");
    }
}

마치며

이번 포스트에서는 C#의 상속에 대해 알아보았습니다. 상속은 객체지향 프로그래밍의 핵심 개념으로, 코드의 재사용성과 유지보수성을 높여줍니다. 상속을 효과적으로 활용하면 복잡한 프로그램을 더 체계적으로 관리할 수 있습니다. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!

반응형