NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 17-10. 오버라이드. (The abstract or virtual implementation of an inherited …

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 클래스는 알아봐야 할 내용이 많군요-_-; 클래스 관련해서 10회째 글인데도, 아직 다루어야 할 내용이 남아 있습니다. 그만큼 OOP의 핵심을 이루고 있는게 클래스이기 때문이죠. 오늘은 상속과 밀접한 관계를 가지고 있는 오버라이드에 대해서 알아보겠습니다. 이전 글에서 상속을 다루면서 이 부분도 어느정도 같이 다루었습니다. 다만, 설명하지 않고 그냥 넘어갔었죠.

     

    아직 상속에 대해 읽어보지 않았다면, 아래 링크를 통해 먼저 읽어보는게 좋겠습니다.

    17-6. C# 상속. (Inheritance) ]

     

    override는 Base Class(기본 클래스)에서 상속된 멤버를 재정의 합니다. 당연한 이야기겠지만, 파생 클래스의 재정의된 메서드의 시그니처는 Base Class의 메서드 시그니처와 같아야 합니다. 말 그대로 구현만 다시 정의한다는 의미입니다. 재정의를 할 수 있는 요건은 Virtual, Abstract 또는 override 맴버여야 합니다.

     

    아래 예제를 통해 Base Class의 기능을 확장하거나 수정하는 방법을 배울 수 있습니다.

    using System;
    namespace Overriding
    {
        class 마리오
        {
            public virtual void 초기화()
            {
                Console.WriteLine("달리는 능력 보유!");
            }
        }
     
        class 슈퍼마리오 : 마리오
        {
            public override void 초기화()
            {
                Console.WriteLine("더 빨리 달리는 능력 보유!");
                Console.WriteLine("키가 커져서 방어력이 증가!");
            }
        }
     
        class 라쿤마리오 : 슈퍼마리오
        {
            public override void 초기화()
            {
                base.초기화();
                Console.WriteLine("너구리로 변신하여 비행 능력 추가!");
            }
        }
     
        class 화이트마리오 : 슈퍼마리오
        {
            public override void 초기화()
            {
                base.초기화();
                Console.WriteLine("짱돌 던지기 능력 추가!");
            }
        }
     
        class MainApp
        {
            static void Main(string[] args)
            {
                Console.WriteLine("[ 프롤로그 ]");
                Console.WriteLine("쿠파가 공주를 납치해가고...");
                Console.WriteLine("공주를 구하기 위해 배관공 마리오 형제가 나타납니다.");
                Console.WriteLine();
                Console.WriteLine("게임을 시작합니다.");
                Console.WriteLine();
                마리오 꼬마_마리오 = new 마리오();
                꼬마_마리오.초기화();
                Console.WriteLine();
                Console.WriteLine("가다가 버섯을 먹게 되는데...");
                마리오 슈퍼_마리오 = new 슈퍼마리오();
                슈퍼_마리오.초기화();
                Console.WriteLine();
                Console.WriteLine("가다가 나뭇잎을 먹게 되는데...");
                마리오 라쿤_마리오 = new 라쿤마리오();
                라쿤_마리오.초기화();
                Console.ReadKey();
            }
        }
    }

     

     

    위 예제는 슈퍼마리오라는 콘솔 게임입니다. 모르는 사람이 없을정도로 유명한 게임이죠^^; 위 코드는 마리오라는 기본(Base) 캐릭터와 게임을 진행하면서 업그레이드 되는 캐릭터들로 구성되어 있습니다. 게임을 시작하게 되면 기본으로 설정된 능력을 가진 마리오가 생성됩니다. 여기서 추상화 시킬 수 있는 부분이 있을수도 있으나, 아직 배우지 않은 개념이기에 일반 클래스로 정의하였습니다.

    ※ 추상화에 대해 자세한 내용은 이 후에 알아보게 될 인터페이스와 추상화 부분에서 다루도록 하겠습니다.

     

    게임을 진행하다가 버섯을 먹게되면, 키가 커지면서 슈퍼마리오로 변신하게 됩니다. 달리기가 빨라지고, 다음 업그레이드인 화이트마리오가 될 수 있죠. 물론 이 상태에서 라쿤마리오가 되어 하늘을 날수도 있습니다. 이처럼, 기본 클래스의 맴버를 확장할 때 오버라이드를 사용합니다.

     

    슈퍼마리오와 라쿤마리오를 비교해 봅니다.

        class 슈퍼마리오 : 마리오
        {
            public override void 초기화()
            {
                Console.WriteLine("더 빨리 달리는 능력 보유!");
                Console.WriteLine("키가 커져서 방어력이 증가!");
            }
        }
     
        class 라쿤마리오 : 슈퍼마리오
        {
            public override void 초기화()
            {
                base.초기화();
                Console.WriteLine("너구리로 변신하여 비행 능력 추가!");
            }
        }

     

     

    슈퍼마리오는 마리오의 업그레이드로 달리기가 더 빨라집니다. 따라서, 기존의 달리기 능력은 필요하지 않게 되죠. 그래서 26라인처럼 base.초기화(); 메서드를 호출할 필요가 없게됩니다. 하지만, 라쿤마리오의 경우 슈퍼마리오에서 업그레이드되어 기존 능력은 유지하고 새로운 기능만 추가됩니다.

     

    위 프로그램을 실행하면 아래와 같은 결과를 확인할 수 있습니다.

    EmV6FrY.png

     

     

    이는 실무에서 사용될 때 고객별 등급에 따라 지급되는 이율을 다르게 계산할 때 사용될 수 있습니다. 같은 고객(실제로는 영희와 철수처럼 인스턴스는 다르겠지만...)이라도 골드 맴버쉽과 실버 맴버쉽의 등급에 따라 할인율이 달라져야 합니다. 또는 웨이퍼의 사이즈에 따라 장비의 설정값이 변경되어야 할수도 있습니다. 이런것들은 기본 배이스를 토대로 동작하되 환경에 따라 확장되거나 변경 될수도 있어야 합니다. 이로 인해 OOP의 핵심 개념중에 하나인 다형성을 구현할 수 있게 됩니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.