[C#] 7. OOP 다형성(Polymorphism) - Virtual 가상함수 & Override 오버라이딩

    반응형

    [C#] 7. OOP 다형성(Polymorphism) - Virtual 가상함수 & Override 오버라이딩

     

    [목차]

    1. 다형성(Polymorphism)이란?
    2. Virtual 가상함수 & Override 오버라이드

    * 개인적인 공부 기록용으로 작성한 글이기에, 잘못된 내용이 있을 수 있습니다.


    #1 다형성(Polymorphism) 이란 ?

    다형성객체지향(OOP)의 3대 속성 중 하나로, poly(하나 이상) morph(형태) 가 합성된 그리스어 에서 유래 되었습니다.

    예를 들어, Player 의 특성을 상속받는 Knight , Mage 자식 클래스 들이 있다고 가정해 보겠습니다.

    Player 부모 클래스에는 공격을 수행하는 Attack() 함수가 존재하고, Knight, Mage 자식 클래스에도 공격을 수행하는 Attack() 함수가 존재합니다.

    Main() 함수 부에서 Knight와 Mage 객체를 생성해 준 뒤, Attack() 함수를 실행해 보도록 하겠습니다.

            class Player
            {
                public void Attack()
                {
                    Console.WriteLine("Attack!");
                }
            }
    
            class Knight : Player
            {
                public void Attack()
                {
                    Console.WriteLine("Knight Attack!");
                }
            }
    
            class Mage : Player
            {
                public void Attack()
                {
                    Console.WriteLine("Mage Attack!");
                }
            }
    
            static void Main(string[] args)
            {
                Knight knight = new Knight();
                Mage mage = new Mage();
                knight.Attack();
                mage.Attack();
            }
    [실행결과]
    Knight Attack!
    Mage Attack!

    knight 객체와 mage 객체에 정의된 Attack() 함수가 호출됩니다.

    그런데 만약 다음과 같은 Player(부모) 객체를 인자로 받는 함수가 있다고 생각해 봅시다.

            static void Fight(Player player)
            {
                player.Attack();
            }

    Fight 함수에 knight 객체를 보낸 뒤, 함수를 실행해 보도록 하겠습니다.

            static void Fight(Player player)
            {
                player.Attack();
            }
    
            static void Main(string[] args)
            {
                Knight knight = new Knight();
                Fight(knight);
            }
    [실행결과]
    Attack!

    Fight 함수에 파라미터로 보낸 객체가 Knight(자식) 클래스의 객체 임에도 불구하고, Player(부모) 클래스의 함수가 호출됩니다.

    이를 해결하기 위해서, C#은 virtual 가상함수override 오버라이드 라는 기능을 제공합니다.


    #2. Virtual 가상함수 & Override 오버라이드

    사용방법은 간단합니다. 부모 클래스의 함수에는 virtual 키워드를 붙여주고, 자식 클래스의 함수에는 override 키워드를 붙여줍니다.

            class Player
            {
                public virtual void Attack()
                {
                    Console.WriteLine("Attack!");
                }
            }
    
            class Knight : Player
            {
                public override void Attack()
                {
                    Console.WriteLine("Knight Attack!");
                }
            }

    다음으로, Fight()함수에 Knight 객체를 보내고 함수를 실행해 보도록 하겠습니다.

            static void Fight(Player player)
            {
                player.Attack();
            }
    
            static void Main(string[] args)
            {
                Knight knight = new Knight();
                Fight(knight);
            }
    [실행결과] Knight Attack!

    부모(Player)의 Attack 함수가 아닌, 자식(Knight)의 Attack 함수가 호출됩니다.


    반응형

    댓글

    Designed by JB FACTORY