제로의영역

7.10 오버라이딩과 다형성 본문

C#

7.10 오버라이딩과 다형성

아이큐제로 2019. 6. 3. 18:28

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

(1) 다형성의 정의: 객체(데이터와 메소드)가 여러 형태를 가지는 것.

 

(2) 용도: 부모 클래스의 객체를 활용하면서 추가적으로 새로운 객체로 활용하기 위해서 사용.

 

(3) 사용법

  1) 오버라이딩(재정의) 해줌: 오버로딩(하나의 메소드 이름에 여러 개의 구현을 올리는 것)과 헷갈리네요. 

  2) 오버라이딩을 할 메소드를 virtual 키워드로 한정 해줌

     // 헉! 메소드는 '한정자+반환형식+메소드 이름(매개변수목록)'만 있는 줄 알았는데 이렇게 되면 '한정자+한정자

       (vtirtual)+반환형식+메소드이름(매개변수목록)'이 됨. 길어졌다. ㅜㅜ 젠장!

class ArmorSuite
{
	public virtual void Initialize()
    {
    	Console.WriteLine("Armored");
    }
}

위의 코드로 ArmorSuite를 개발. (추후 업그레이드 가능성을 위해 virtual 키워드로 한정해줌)

 

3) 오버라이딩을 하는 측에서는 부모 클래스에 선언되어 있던 메소드를 재정의하고 있음을 컴파일러에게 알려야 하므

    로 override로 한정해줘야 함. 

 * private(내부에서만 접근이 가능하고 파생클래스에서는 접근이 불가능한 한정자)으로 선언한 메소드는 오버라이딩 할 수 없음.

class IronMan:ArmorSuite
{
	public override void Initialize()
    {
    	base.Initialize();
        Console.WriteLine("Repulsor Rays Armed");
    }
}

class WarMachine:ArmorSuite
{
	public override void Initialize()
    {
    	base.Initialize();
        Console.WriteLine("Double-Barrel Cannons Armed");
        Console.WriteLine("Micro-Rocket Launcher Armed");
    }
}

 IronMan과 WarMachine은 override로 한정된 메소드를 통해 부모클래스 ArmorSuite의 virtual로 한정된 메소드를 재정의하여 사용하여 각각의 용도에 맞는 ArmorSuite로 사용함.

 

  예제)

using System;

namespace ex7_11
{
    class ArmorSuite
    {
        public virtual void Initialize()                        //응용이 되는 메소드: virtual을 보고 파악
        {
            Console.WriteLine("Armored");
        }
    }
    class IronMan:ArmorSuite                                    //ArmorSuite를 상속받은 자식클래스
    {
        public override void Initialize()                       //virtual로 한정된 메소드를 변형하는 메소드override를 보고 파악
        {
            base.Initialize();                                  // 부모클래스(ArmorSuite)의 Initialize()호출 
            Console.WriteLine("Repulsor Rays Armed");
        }
    }
    class WarMachine:ArmorSuite                                 //ArmorSuite를 상속받은 자식클래스
    {
        public override void Initialize()                       //virtual로 한정된 메소드를 변형하는 메소드override를 보고 파악
        {
            base.Initialize();                                  // 부모클래스(ArmorSuite)의 Initialize()호출 
            Console.WriteLine("Double-Barrel Cannons Armed");
            Console.WriteLine("Micro-Rocket Lanucher Armed");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Creating ArmorSuite...");
            ArmorSuite armorsuite = new ArmorSuite();           //armorsuite 생성
            armorsuite.Initialize();                            //ArmorSuite클래스의 Initialize() 호출

            Console.WriteLine("\nCreating IronMan...");
            ArmorSuite ironman = new IronMan();                 //ironman 생성
            ironman.Initialize();                               //IronMan클래스의 Initialize()호출

            Console.WriteLine("\nCreatin WarMachine...");       
            ArmorSuite warmachine = new WarMachine();           //warmachine 생성
            warmachine.Initialize();                            //WarMachine클래스의 Initialize()호출
        }
    }
}

출력 결과:

Creating ArmorSuite...
Armored

 

Creating IronMan...
Armored
Repulsor Rays Armed

 

Creatin WarMachine...
Armored
Double-Barrel Cannons Armed
Micro-Rocket Lanucher Armed