본문 바로가기

개인공부/C#

[C#] 상속(Inheritance)

 

■ 상속(Inheritance) :

 - 상속은 부모가 자식에게 재산 혹은 권리 등을 물려주는 것으로 부모 클래스의 기능을 자식 클래스가 상속받아 사용하는 것

 - 특정 기능을 제공하는 부모클래스를 정의하고 자식 클래스는 해당 기능을 상속하거나 재정의 할 수 있다

 - derived class는 2개 이상의 base class를 가질 수 없다

 - base class에서 정의된 private 멤버는 상속 받을 수 없다

 - 부모 클래스 = 기준 클래스(base class)

 - 자식 클래스 = 파생 클래스(derived class)

 

■ Example

class Parents
{
    public int Num = 100;
    public void PrintNum()
    {
        Console.WriteLine($"Num은 {Num} 입니다.");
    }
}

class Child : Parents
{
    public string Name = "memoo";
    public void PrintName()
    {
        Console.WriteLine($"Name은 {Name} 입니다.");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Child child = new Child();
        child.PrintNum();
        child.PrintName();
    }
}

 

Example 결과

 

■ 재정의(Override) : 

 - 재정의는 base class로 부터 상속받은 기능을 다시 정의하는 것

 - 재정의 하려면 base class에서는 virtual 키워드, derived class에서는 override 키워드를 사용

 - virtual 키워드를 사용하지 않고 override하게 되면 Error 발생

Parents에서 virtual을 사용하지 않아 override 사용시 Error

 

Hello Method 정상적으로 override

 

■ Method 숨기기 :

 - base class의 method는 숨기고, derived class의 method만 표시

 - derived class에서 new 키워드 사용

child class의 Hello Method에 new 키워드 사용

 

■ override 봉인 :

 - override하면 문제가 될 수 있는 경우 상속을 제한

 - virtual method를 override한 method에 sealed 키워드 사용

sealed 키워드로 Hello method의 재정의 봉인

 

■ this, base : 

 - this는 자기 자신을 의미, this()는 자신의 생성자 의미

 - base는 상속 받은 base class를 의미, base()는 base class의 생성자 의미

 

■ Example

class Animal
{
    public void Sound() 
    {
        Console.WriteLine("[Animal] 동물 소리");
    }
}

class Dog : Animal
{
    public void Sound()
    {
        Console.WriteLine("[Dog] 멍멍");
    }
}
class Bird : Animal
{
    public void Sound()
    {
        Console.WriteLine("[Bird] 짹짹");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Animal animal = new Animal();
        Dog bella = new Dog();
        animal = bella;             // 업캐스팅(upcasting)
        animal.Sound();
            
        Dog molly = (Dog)animal;    // 다운캐스팅(downcasting)
        molly.Sound();

        Bird tory = (Bird)animal;   // System.InvalidCastException 발생
        tory.Sound();            
    }
}

 

Example 결과

 

 

■ 다형성(Polymorphism) :

 - 하나의 객체가 여러 형태를 가지는 것

 - 업캐스팅(upcasting) : 자식 클래스의 객체를 부모 클래스의 객체로 변환

 - 다운캐스팅(downcastring) : 부모 클래스의 객체를 자식 클래스의 객체로 변환

 

■ Example

class Animal
{
}

class Dog : Animal
{
}

class Bird : Animal
{
}

class Program
{
    static void Main(string[] args)
    {
        Animal animal = new Animal();
        Console.WriteLine($"[animal] : {animal.GetType()}");

        Dog bella = new Dog();
        animal = bella;             // 업캐스팅(upcasting)            
        Console.WriteLine($"[animal] upcasting : {animal.GetType()}");

        Dog molly = (Dog)animal;    // 다운캐스팅(downcasting)
        Console.WriteLine($"[molly] downcasting : {animal.GetType()}");

        Bird tory = (Bird)animal;   // System.InvalidCastException 발생
        Console.WriteLine($"[molly] downcasting : {animal.GetType()}");
    }
}

 

Dog -> Animal의 업캐스팅, Animal -> Dog 다운캐스팅 정상 동작, Animal -> bird의 다운캐스팅 InvalidCastException 발생

 

■ InvalidCastException :

 - IncalidCastException은 객체의 필드 혹은 메서드의 구조가 다를 수 있기 때문에 발생

 - 위 Example에서 animal객체에 bella객체(Dog)를 업캐스팅하여 정상적으로 처리

 - animal 객체는 molly객체(Dog)의 정보가 담겨 있기 때문에 정상적으로 다운캐스팅 가능

 - animal 객체는 molly객체(Dog)의 정보를 담고 있기 때문에 tory객체(Bird)로 다운캐스팅 할 때는 IncalidCastException이 발생

 

bella는 Dog이기 때문에 동일한 Dog 형식의 molly로는 다운캐스팅이 가능하지만 Bird형식의 tory는 InvalidCastException 발생