[C# 객체지향] 다형성_메서드 오버라이드

eunjin lee·2022년 6월 22일
0

C# 9.0 프로그래밍

목록 보기
6/50

타입에 상관 없이 인스턴스에 따른 동작을 실행시키고 싶을 때 다형성을 활용한다.



1. 오버라이드 되지 않은 메서드

  • ✍ 샘플 코드
    class Program
    {
        static void Main(string[] args)
        {
            Animal a1 = new Animal();
            a1.Cry();
            Dog d = new Dog();  
            d.Cry();    
            Cat c = new Cat();
            c.Cry();

            Animal a2 = new Dog();
            a2.Cry();   
        }


    }

    class Animal
    {
        public void Cry()
        {
            Console.WriteLine("Cry.");
        }
    }

    class Dog : Animal 
    {    
        public void Cry()
        {
            Console.WriteLine("Bow-wow");
        }
    }

    class Cat : Animal
    {
        public void Cry()
        {
            Console.WriteLine("Mew-mew");
        }
    }

컴파일 경고가 발생한다. 자식 클래스에서 override 키워드를 추가하거나 new 키워드를 추가할 것을 추천한다.

  • ✅ 결과
    Cry.
    Bow-wow
    Mew-mew
    Cry.

부모 타입으로 자식 인스턴스를 생성 시, 부모의 Cry()가 호출되었다.


2. override로 다형성 적용하기

  • 예약어 virtual을 사용하여 부모 클래스의 메서드를 가상 메서드로 바꾼다.
  • 예약어 override를 사용하여 자식 클래스의 메서드에 명시적으로 다형성을 적용한다.
  • ✍ 샘플 코드
    class Animal
    {
        virtual public void Cry()
        {
            Console.WriteLine("Cry.");
        }
    }

    class Dog : Animal 
    {    
        override public void Cry()
        {
            Console.WriteLine("Bow-wow");
        }
    }

    class Cat : Animal
    {
        override public void Cry()
        {
            Console.WriteLine("Mew-mew");
        }
    }
  • ✅ 결과
    Cry.
    Bow-wow
    Mew-mew
    Bow-wow

부모 타입으로 자식 인스턴스 생성 시, 자식의 Cry()가 호출되었다.


3. new로 override하지 않을 것을 명시하기

  • 자식 클래스의 메서드에 다형성을 적용하고 싶지 않고, 단순히 같은 이름의 독립적인 메서드일 때 예약어 new를 사용한다.
  • ✍ 샘플 코드
    class Dog : Animal 
    {    
        new public void Cry()
        {
            Console.WriteLine("Bow-wow");
        }
    }
  • ✅ 결과
    Cry.
    Bow-wow
    Mew-mew
    Cry.

0개의 댓글