본문 바로가기

.NET/C#

Class(4)

728x90
반응형

클래스 그 4번째 시간이네요. 오늘 상속으로 인해서 일어날 수 있는 다형성에 대해서 알아보려고 합니다.

혹시 "다형성?? 그게 뭐야?" 라고 하시는 분들이 있으신가요? 휴~!!다행...괜히 쌩쇼하면 그렇잖아요 ㅎㅎ

다형성이란 상속을 통해서 클래스를 한 개 이상의 형식으로 사용할 수 있게 해주는 개념, 즉 클래스를 고유한 자체 형식이나 임의의 기본 형식을 사용할 수 있고 클래스가 인터페이스를 구현하는 경우 인터페이스 형식으로 사용할 수 있는데 그것을 다형성이라고 합니다. C#에서 모든 형식은 다형성을 지니고 있지요.

Class(3)에서 말했던 override, new에 대한 내용도 다형성을 설명하는 중요한 개념이고 할 수 있습니다.

다형성 공부하다가 살짝 졸았다는 ㅜㅜ(금세 30분이 지나간 ㅎㄷㄷ)

우선 간단한 은행 관련 프로그램(과연 맞는지 모르겠네요)을 만들어서 테스트 해보고 다형성을 한번 실제로 써서 사용하도록 해보겠습니다.

우선 다음과 같은 클래스를 만들어보죠.

    1 class BankAccount

    2 {

    3     private int nextAccountNo = 1;

    4     private int accountNo;

    5     public int AccountNo

    6     {

    7         get { return accountNo; }

    8     }

    9     private string owner;

   10     public string Owner

   11     {

   12         get { return owner; }

   13     }

   14     protected double balance;

   15     public double Balance

   16     {

   17         get { return balance; }

   18     }

   19     protected BankAccount()

   20     {

   21         accountNo = nextAccountNo;

   22         nextAccountNo++;

   23     }

   24     public BankAccount(string owner, double balance)

   25     {

   26         this.owner = owner;

   27         this.balance = balance;

   28     }

   29     public bool Withdraw(double amount)

   30     {

   31         if (amount > 0 && balance >= amount)

   32         {

   33             balance = balance - amount;

   34             return true;

   35         }

   36         else

   37             return false;

   38     }

   39     public bool Deposit(double amount)

   40     {

   41         if (amount > 0)

   42         {

   43             balance = balance + amount;

   44             return true;

   45         }

   46         else

   47             return false;

   48     }

   49     public string GetAccountInfo()

   50     {

   51         return "계좌번호 : " + accountNo + "\n" + "예금주 : " + owner + "\n" + "잔액 : " + balance;

   52     }

   53 }
나름 은행 프로그램이라고 만든 클래스가 저거인데요...계좌 번호는 디폴트로 정해져 있고 생시에 소유자와 잔액을 받게 되어있습니다. 그리고 입금과 출금에 대한 메소드도 정의되어 있고요
메인이란 놈도 구현 해봐야겠지요.

    1 class Program

    2 {

    3     static void Main(string[] args)

    4     {

    5         BankAccount ba = new BankAccount("원민", 500000);

    6         Console.WriteLine(ba.GetAccountInfo());

    7         ba.Deposit(100000);

    8         Console.WriteLine(ba.GetAccountInfo());

    9         ba.Withdraw(200000);

   10         Console.WriteLine(ba.GetAccountInfo());

   11     }

   12 }
메인에서는 BankAccount 클래스의 객체를 생성하지요 그때 "원민", 500000을 넣어주고 그리고 출금과 입금을 각각 해주는걸 볼수가 있습니다. 결과화면은 다음과 같지요~

지금까지는 일반적인 객체 생성하여 사용하는 것 뿐이었죠. 아마 이런생각 가지신분 있을지도 모르겠네요. "이거는 다아는거잖아. 너만 몰랐던거고!!" 라고요 ㅜㅜ
네. 그래서 이제 저 위의 클래스를 가지고 상속으로 통해 다형성의 예제를 봐보도록 하겠습니다. 이넘의 다형성의 예제가 뭔가 궁금하신분은 끝까지 봐주세요 ^ㅡ^

은행 계좌에는 아주많은 종류의 계좌들이 있지요. 위에서 만들어본 클래스는 그져 입출금만을 가지고 있는 클래스이죠 계좌의 기본적인 정보만을 입력할 수 있는 것들이요. 그래서 이제 계좌의 종류를 몇개 나눠서 해보려고 합니다. 간단히 CMA계좌와 일명 마이너스 통장으로 불리는 녀석을 가지고 테스트 해보겠습니다. (계좌에 대한 정확한 정보는 없는지라 대충만...해보겠습니다 ㅜㅜ)

CMA의 경우는 다른 계좌들과 달리 이자의 개념이 있고요 마이너스 통장은 통장의 돈이 없어도, 즉 마이너스가 되어도 어느 선까지는 돈을 쓸수가 있다는것인데요 이것을 BankAccount 클래스를 상속받아 재사용하도록 하겠습니다.

BankAccount클래스가 정의 되어 있는 곳에 두개의 클래스를 정의합니다.

    1 class SavingAccount : BankAccount

    2 {

    3     private bool isCMA;

    4     public bool IsCMA

    5     {

    6         get { return IsCMA; }

    7         set { IsCMA = value; }

    8     }

    9     public SavingAccount(string owner, double balance, bool isCMA)

   10         : base(owner, balance)

   11     {

   12         this.isCMA = isCMA;

   13     }

   14     public bool Deposit(double amount)

   15     {

   16         if (amount > 0)

   17         {

   18             balance = balance + amount;

   19             if (isCMA)

   20                 balance = balance + (amount * 0.001);

   21             return true;

   22         }

   23         else

   24             return false;

   25     }

   26     public string GetAccountInfo()

   27     {

   28         return base.GetAccountInfo() + "\n" + "CMA : " + isCMA;

   29     }

   30 }

   31 

   32 class MinusAccount : BankAccount

   33 {

   34     private double limit;

   35     public double Limit

   36     {

   37         get { return limit; }

   38         set { limit = value; }

   39     }

   40     public MinusAccount(string owner, double balance, double limit)

   41         : base(owner, balance)

   42     {

   43         this.limit = limit;

   44     }

   45     public bool WithDraw(double amount)

   46     {

   47         if (amount > 0 && balance - amount >= limit)

   48         {

   49             balance = balance - amount;

   50             return true;

   51         }

   52         else

   53             return false;

   54     }

   55     public string GetAccountInfo()

   56     {

   57         return base.GetAccountInfo() + "\n" + "Limit : " + limit;

   58     }

   59 }

둘다 BankAccount를 상속 받고 약간의 수정을 한 것을 볼 수 있지요. 메인에서는 각 클래스를 호출해서 약간의 입금및 출금을 해보겠습니다.

    1 class Program

    2 {

    3     static void Main(string[] args)

    4     {

    5         MinusAccount ma = new MinusAccount("빚쟁이", 1000000, -1000000);

    6         Console.WriteLine(ma.GetAccountInfo());

    7         Console.WriteLine();

    8         SavingAccount sa = new SavingAccount("알부자", 1000000, true);

    9         Console.WriteLine(sa.GetAccountInfo());

   10         Console.WriteLine();

   11         ma.WithDraw(2000000);

   12         Console.WriteLine(ma.GetAccountInfo());

   13         Console.WriteLine();

   14         sa.Deposit(1000000);

   15         Console.WriteLine(sa.GetAccountInfo());

   16     }

   17 }

빚쟁이님은 -1000000 한도의 마이너스 통장, 알부자 님은 cma 통장인 걸 볼 수 있지요 각각 입금 및 출금을 시킨 화면은 다음과 같습니다.


이렇게 하나의 공통요소를 가진 클래스에서 파생되어지는 자식 클래스가 만들어 질수 있지요. 많은 클래스를 만들었는데 그때 공통요소가 있을때 그 공통 요소만 빼내어 클래스를 만들고 그 클래스를 자식들로 하여금 상속시킬 수도 있고 미리 공통요소를 클래스화 시켜놓은 상태에서 파생시킬 수도 있습니다.

음...다형성에 대해서는 이쯤에서 마출려고 하는데요. 내용이 많이 부족해서 이해가 되셨을려나 모르겠습니다.

암튼 이글을 읽어주신분들께 정말 감사드립니다~

감사합니다!

728x90
반응형

'.NET > C#' 카테고리의 다른 글

Interface  (0) 2009.12.18
Class(5)  (0) 2009.12.18
형변환에 대해서...  (0) 2009.12.18
System.Object 클래스 상속  (3) 2009.12.18
Property의 get, set 에 대한 간단한 정리  (0) 2009.12.18
Class(3)  (0) 2009.12.17
Class(2)  (0) 2009.12.16
Class(1)  (0) 2009.12.16
C# enum, struct  (0) 2009.12.16
C# Array 에 대해서...  (2) 2009.12.16