제로의영역

7.8 상속으로 코드 재활용하기(base키워드) 본문

C#

7.8 상속으로 코드 재활용하기(base키워드)

아이큐제로 2019. 5. 29. 18:02

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

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

 

 (1) 객체지향 프로그래밍의 3대 특성인 은닉성, 상속성, 다형성 중 상속성에 대한 글.

 

 (2) 정의:  기반 클래스(이하 부모클래스)의 데이터및 메소드를 파생클래스(이하 자식클래스)에서 사용할 수 있게 하는 것.(한정자가 private으로 수식된 경우 예외)

 

 (3) 용도: 자식클래스는 부모 클래스로부터 물려 받는 멤버(필드, 메소드, 프로퍼티, 이벤트 등)외에 자기 고유의 메소드와 데이터를 추가해서 사용 가능하기 때문에 부모 클래스의 데이터나 동작(메소드)을 다시 사용하거나 확장, 재정의하여 활용하는데 사용.

 

 (4) 사용법

  1) 자식 클래스의 이름 뒤에 콜론(:)을 붙여주고 상속받을 기반 클래스의 이름을 붙여줌.

 

사용예)

class 기반 클래스

{

   // 멤버 선언 

}

 

class 파생 클래스:기반 클래스        

{

   // 아무 멤버를 선언하지 않아도 기반 클래스의 모든 것을 물려받아 갖게 됨.

   // 단, private로 선언된 멤버는 예외.

}

 

  2) 자식 클래스가 객체를 생성할 때 부모 클래스의 생성자를 호출 후 자식 클래스의 생성자를 호출함.

 

  3) 소멸될 때는 반대의 순서(자식클래스 >> 부모 클래스) 종료자 호출

   - 부모 클래스의 생성자 >> 자식 클래스의 생성자 >> 자식 클래스의 종료자 >> 부모 클래스의 생성자

 

 (5) base 키워드

 

  1) 정의: 해당 키워드를 사용하는 클래스의 부모 클래스를 가리키는 것.

 

  2) 용도: 부모 클래스의 멤버에 접근할 때 사용

 

  3) 사용법: base.+부모 클래스 (this는 자기 자신을 가리키는 키워드로 헷갈리지 말것.)

 

 (6) base()

 

  1) 용도: 부모클래스의 생성자에게 매개변수를 넘겨줄 때 사용.

 

  2) 사용법: 자식클래스의 생성자 뒤에 콜론(:)을 붙여주고 base(매개변수)를 붙여줌.

   사용예)

               자식 클래스 생성자: base(매개변수)

                {

                   // 코드

                }

 

예제)

using System;

namespace ex7_9
{
   class Base
   {
      protected string Name;	//Base 클래스의 변수 선언
      public Base(string Name)	//생성자(한정자+클래스이름(매개변수목록))
      {
         this.Name = Name;	// 생성자의 변수를 클래스의 변수로 선언
         Console.WriteLine($"{this.Name}.Base()"); // 클래스의 변수 값을 출력
      }

      ~Base()	// 파생 클래스 종료자 호출 후 호출
      {
          Console.WriteLine($"{this.Name}.~Base()");	// 클래스의 변수 값을 출력
      }

       public void BaseMethod()	// 메소드
      {
         Console.WriteLine($"{Name}.BaseMethod()");	// 입력된 매개 변수값을 출력
      }	
   }

   class Derived:Base	// Base클래스를 상속받는 Derived 파생클래스
   {
       public Derived(string Name):base(Name)	// Base클래스의 생성자를 호출한 후 Derived 생성자 호출
      {
         Console.WriteLine($"{this.Name}.Derived()"); // Base클래스의 매개변수를 받아서 출력
      }

      ~Derived() // 파생클래스 종료자 
      {
         Console.WriteLine($"{this.Name}.~Derived()"); // Base클래스의 매개변수를 받아서 출력
      }

      public void DerivedMethod() 
      {
         Console.WriteLine($"{Name}.DerivedMethod()"); 
      }
   }

   class Program
   {
      static void Main(string[] args)
      {
         Base a = new Base("a");	// Base 클래스에 a라는 객체 생성, Base클래스의 생성자 호출, 종료자는 클래스가 종료 될 때 마지막으로 호출
         a.BaseMethod();	// BaseMethod() 호출

         Derived b = new Derived("b");	// Base 클래스에 b라는 객체 생성,자 호출 후 Derived 생성자 호출, 종료자는 Derived 종료자>>Base종료자 호출
         b.BaseMethod();	// BaseMethod() 호출
         b.DerivedMethod(); // DerivedMethod() 호출
       } // 종료자 호출
   }
}

출력결과:

 

a.Base()
a.BaseMethod()
b.Base()
b.Derived()
b.BaseMethod()
b.DerivedMethod()
b.~Derived()
b.~Base()
a.~Base()