본문 바로가기

ETC Programmings

[C#] 클래스 상속에 관해서..

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
객체지향 프로그래밍에서 가장 빠지지 말아야 할 것들중에 하나가 이 상속이라는 개념이다. 상속을 처음 배울때 이런 질문을 받았다.

세상에서 가장 빨리 부자가 되는 법이 무엇이냐?

그 당시에는 몰랐지만 답은 상속이었다. 부모가 가진 그대로를 물려 받으면 가장 쉽게 부자가 되고.. 반면에 가장 쉽게 채무자가 되기도 하지만.. 어쨌거나.. 객체지향에서의 상속은 아주 강력한 기능을 수행하기도 하고 문제를 발생시키기도 한다. 더욱이 재미있는 것은 재사용성을 극대화가기 위해서 재사용성이 떨어지는 행동을 만들기도 하고 또 그렇기 때문에 보완을 위한 다른 것들이 있기도 하고..

여튼 상속은 아주 강력한 기능을 가지고 있는데 상속을 통해서 기대할 수 있는 결과는 다음과 같다.

- 코드의 손쉬운 재사용
- 다형성 활용



- Animal Class
  1. public class Animal   
  2.     {   
  3.         private string name;   
  4.         private string sound;   
  5.   
  6.         public Animal()   
  7.         {   
  8.             this.name = "동물";   
  9.         }   
  10.   
  11.         public string Name   
  12.         {   
  13.             get { return name; }   
  14.             set { name = value; }   
  15.         }   
  16.         public string Sound   
  17.         {   
  18.             get { return sound; }   
  19.             set { sound = value; }   
  20.         }   
  21.   
  22.         public void doWeeping()   
  23.         {   
  24.             Console.WriteLine("{0} : {1} 하고 울어댑니다.", name, sound);   
  25.         }   
  26.   
  27.         public virtual void greeting()   
  28.         {   
  29.             Console.WriteLine("반가워요~");   
  30.         }   
  31.     }  

- Dog Class

  1. public class Dog : Animal   
  2.    {   
  3.        public Dog()   
  4.        {   
  5.            this.Name = "개";   
  6.            this.Sound = "멍멍";   
  7.        }   
  8.   
  9.        public override void greeting()   
  10.        {   
  11.            Console.WriteLine("방가방가~ (꼬리를 흔들며)");   
  12.        }   
  13.    }  


- Cat Class

  1. public class Cat : Animal   
  2.     {   
  3.         public Cat()   
  4.         {   
  5.             this.Name = "고양이";   
  6.             this.Sound = "야옹야옹";   
  7.         }   
  8.   
  9.         public override void greeting()   
  10.         {   
  11.             Console.WriteLine("방가방가요 (머리를 비비며)");   
  12.         }   
  13.     }  

- 실행코드

  1. class Program   
  2.     {   
  3.         static void Main(string[] args)   
  4.         {   
  5.             string seperator = "============================================================================";   
  6.             Animal ani1 = new Animal();   
  7.             Animal ani2 = new Dog();   
  8.             Animal ani3 = new Cat();   
  9.   
  10.             ani1.doWeeping();   
  11.             ani1.greeting();   
  12.             Console.WriteLine(seperator);   
  13.             ani2.doWeeping();   
  14.             ani2.greeting();   
  15.             Console.WriteLine(seperator);   
  16.             ani3.doWeeping();   
  17.             ani3.greeting();   
  18.   
  19.             // 포함의 관계   
  20.             // 형변환 ( 상식의 문제)   
  21.             // 다형성은 뭘 말하고 싶은 것일까?   
  22.   
  23.             Console.WriteLine(seperator);   
  24.             Console.WriteLine(seperator);   
  25.   
  26.             Dog dog = new Dog();   
  27.             Cat cat = new Cat();   
  28.   
  29.             Console.WriteLine(seperator);   
  30.             dog.doWeeping();   
  31.             dog.greeting();   
  32.             Console.WriteLine(seperator);   
  33.             cat.doWeeping();   
  34.             cat.greeting();   
  35.         }   
  36.     }  

- 결과



Animal 이라는 클래스를 Cat과 Dog 라는 클래스가 상속을 받았으며 저중 greetings() 라는 메소드를 오버라이드 하여 부모클래스인 Animal 클래스와 같은 메소드이나 다른 동작을 하도록 재정의 하는 것을 말한다. 그러면서 설명되어지는 부분이 HAS 와 IS의 관계다. 두 클래스 사이에 상속이라는 관계게 되면 상속을 받은 클래스가 상속을 해준 클래스의 파생 클래스로서 자식 클래스는 부모 클래스 이다. 라는 IS 관계가 성립이 된다. 이 때문에 실행코드 6 ~ 8 번째 줄의 실행 코드가 컴파일이 가능하며 다형성의 전형적인 예시가 될 수 있다.

Animal 객체, Cat 객체, Dog 객체 모두다 Animal 객체로 표현될 수 있기 떄문에 실행 클래스의 6~8번 줄 소스코드 처럼 컴파일이 가능하다. 궁격적으로 모두 같은 클래스가 작동하는 것처럼 보이나. 실제 구체화된 클래스들의 저마다 메소드를 정의하여서 쓸 수 있다.

이처럼 상속을 통하여 좋은 것은 취하고 나쁜 것을 버릴 수 있는 도움을 받았다.