본문 바로가기
dev, tech/Windows P

[펌] 4_17 base 키워드

by 구띵 2006. 1. 16.

 

 

아버지클래스로부터상속을받았다면아버지클래스의모든것은아들클래스것이됩니다.그래서아들클래스에서는아버지것도것이요,것도것이되니this라는키워드를사용해서아버지의멤버에접근할있습니다.물론아버지의public이나protected접근지정자를사용하는멤버에만접근할있습니다.이것은너무나당연한상속개념입니다.

 

아버지클래스를상속받고아들클래스에서메서드를재정의한,아들클래스내부에서메서드를호출한다면,무조건아들의재정의메서드가호출됩니다.재정의자체는아버지의메서드를무시하고있기때문입니다.그런데아들입장에서본다면아들은자신의재정의된메서드와아버지의무시당한메서드2개가존재합니다.아들입장에서아버지의메서드를호출하고자한다면어떻게할까요?

 

base.상위클래스멤버

자신이재정의한아버지의메서드를호출할있게만큼아버지클래스는너그러울까요?물론이죠.우리의아버지들처럼.무시당한아버지클래스의메서드를호출하는방법이바로base참조변수를이용하는것입니다. basethis같은원리로동작됩니다.그래서base자체는디자인타임에아버지를참조하는유일한참조변수입니다.

 

&

NewSon.cs

Übase.상위클래스멤버

using System;

public class NewFather {

     publicvirtualvoid OverrideFunc(){

               Console.WriteLine("아버지의함수");

     }

}

public class NewSon : NewFather {

     publicoverridevoid OverrideFunc(){

               Console.WriteLine("아들의재정의함수");

     }

     public void TestFunc() {

               base.OverrideFunc();//NewFather메서드호출

     }

       public static voidMain() {

           NewSon ns = new NewSon();

           ns.OverrideFunc();

           ns.TestFunc();

     }

}

C:\C#Example\04>csc NewSon.cs

C:\C#Example\04>NewSon

아들의재정의함수

아버지의함수

 

위의예제에서아버지클래스의메서드는아들클래스에도같은이름으로존재하기때문에,아들입장에서,,아들의클래스내부에서는아버지의무시한메서드를호출할방법이없습니다.아들클래스내부에서아버지클래스의메서드를사용하고싶다면base라는키워드를사용하면되는것입니다.

 

Base키워드를사용한

 public void TestFunc(){

    base.OverrideFunc();

}                                           

 

TestFunc()메서드에서base이용하여아버지의메서드를호출하고있습니다.자신의메서드와아버지의메서드를구분하기위해서이것을사용하는것이지별다른것은없습니다.

 

상위클래스의생성자를호출하는base()

상속을받았을경우아버지클래스의생성자가매개변수를가지고있다면어떻게될까요?생각해보면어쨌든아버지클래스의생성자가호출후에아들의생성자가호출되는것은당연한일입니다.그렇다면아들이상속을받았을경우아버지의생성자의매개변수는누가넣어있을까요?아버지의생성자의매개변수를넣어주지않아도아버지의생성자가호출가능할까요?이것은불가능합니다.무조건적으로,절대적으로,생성자에매개변수가존재한다면생성자의매개변수의형과개수를맞추어주어야만호출가능합니다.상속을아들클래스가받아버린상태라면아들은아버지의생성자에게매개변수를넣어줄의무있을것입니다.이것을무시한다면아들은만들어질없습니다.

 

&

BaseSon.cs

Ü상위클래스의생성자를호출하는base()

using System;

public class BaseFather {

     private string name;

     public BaseFather(string name) {

           this.name = name;        

           Console.WriteLine("BaseSon : {0}", name);

     }

}

public class BaseSon : BaseFather {

     public BaseSon(string str) : base(str){

                          

     }

       public static voidMain() {

           BaseSon s = new BaseSon("Base Test Problem");

     }

}

C:\C#Example\04>csc BaseSon.cs

C:\C#Example\04>BaseSon

BaseSon : Base Test Problem

 

아버지클래스의생성자가매개변수를가지고있다면아들입장에서는아버지의생성자의매개변수를넣어주어야의무가있습니다.base키워드를사용합니다.이것은아들이아버지를상속받았기때문이며자동으로아들이생성될아버지의생성자를호출하기때문입니다.

 

1base()

n                디자인타임에아버지를참조하는유일한참조변수이다

n                무시당한아버지클래스의메서드를사용하고싶을사용한다.

n                아버지생성자에매개변수가존재한다면생성자의매개변수의형과개수를맞추어주어야만호출가능하다

n                아버지생성자의매개변수타입이달라호출해없을사용한다.

n                생성자내에서아버지생성자를호출하기위해사용한다

 

▣ base키워드의정리

q               파생클래스생성자의매개변수가있고기본클래스생성자의매개변수가없을

n                  base없이사용가능

q               파생클래스생성자의매개변수가없고기본클래스생성자의매개변수가있을

n                  base써도사용불가

q               파생클래스생성자매개변수가있고기본클래스생성자의매개변수가있을

n                  base써야가능

q               기본클래스와파생클래스생성자매개변수가없을

n                  base없어도가능


댓글