본문 바로가기
프로그래밍/C#

C# 상속 관련 키워드 정리

by bantomak 2023. 2. 27.
반응형

상속 관련 키워드

  • 일반 클래스 (class)
  • 추상 클래스 (abstract class)
  • 인터페이스 (interface)

 

일반 클래스의 경우

class Animal
{
    public void Speak()
    {
        Console.WriteLine("I`m Animal.");
    }
}

class Dog : Animal
{
    public void Speak() // CS0108
    {
        Console.WriteLine("I`m Dog.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var dog = new Dog();
        dog.Speak();            // I`m Dog.
        ((Animal)dog).Speak();  // I`m Animal.
    }
}

 

Speak() 함수를 virtual로 선언한 이후에 override한 경우 출력값이 변경되었습니다.

class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("I`m Animal.");
    }
}

class Dog : Animal
{
    public override void Speak() // CS0108
    {
        Console.WriteLine("I`m Dog.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var dog = new Dog();
        dog.Speak();            // I`m Dog.
        ((Animal)dog).Speak();  // I`m Dog.
    }
}

 

class에 abstract 키워드를 추가하였다. 이를 추상 클래스라고 부른다.

abstract class Animal // abstract 키워드 추가
{
    public abstract void Walk(); // 선언만 가능

    public virtual void Speak()
    {
        Console.WriteLine("I`m Animal.");
    }
}

class Dog : Animal
{
    public override void Walk() // 무조건 구현되어야함
    {
        Console.WriteLine("Walk.");
    }

    public override void Speak()
    {
        Console.WriteLine("I`m Dog.");
    }
}

class Program
{
    static void Main(string[] args)
    {
    	//var animal = new Animal(); // Error 추상 형식은 인스턴스화 할 수 없다.
    
        var dog = new Dog();
        dog.Speak();            // I`m Dog.
        ((Animal)dog).Speak();  // I`m Dog.
    }
}

 

Interface를 통해서 구현한 경우

interface IAnimal
{
    // 접근 지정자 public으로 고정
    void Eat()
    {
        Console.WriteLine("Eat something.");
    }

    void Bark(); // abstract 키워드가 없어도 하위 클래스에서 구현해야한다.

    abstract void Walk();

    abstract void Run();

    //virtual void Fly(); virtual 키워드 입력 불가

    virtual void Speak()
    {
        Console.WriteLine("I`m Animal.");
    }
}

class Dog : IAnimal
{
    public void Bark()
    {
        Console.WriteLine("Bark.");
    }

    public void Walk()
    {
        Console.WriteLine("Walk.");
    }

    public void Run() // override 키워드 입력 불가
    {
        Console.WriteLine("Run.");
    }

    /*
    public override void Run() // override 키워드 입력 불가
    {
        Console.WriteLine("Run.");
    }
    */

    public void Speak()
    {
        Console.WriteLine("I`m Dog.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var dog = new Dog();
        dog.Speak();             // I`m Dog.
        ((IAnimal)dog).Speak();  // I`m Dog.
    }
}

 

인터페이스를 사용하는 이유

  • 다중 상속이 가능하다.
  • 클래스 간에 느슨한 결합이 가능하다.

댓글