아버지클래스로부터상속을받았다면아버지클래스의모든것은아들클래스것이됩니다.그래서아들클래스에서는아버지것도내것이요,내것도내것이되니this라는키워드를사용해서아버지의멤버에접근할수있습니다.물론아버지의public이나protected접근지정자를사용하는멤버에만접근할수있습니다.이것은너무나당연한상속개념입니다.
아버지클래스를상속받고아들클래스에서메서드를재정의한후,아들클래스내부에서그메서드를호출한다면,무조건아들의재정의메서드가호출됩니다.재정의자체는아버지의메서드를무시하고있기때문입니다.그런데아들입장에서본다면아들은자신의재정의된메서드와아버지의무시당한메서드2개가존재합니다.아들입장에서아버지의메서드를호출하고자한다면어떻게할까요?
base.상위클래스멤버
자신이재정의한아버지의메서드를호출할수있게할만큼아버지클래스는너그러울까요?물론이죠.우리의아버지들처럼.무시당한아버지클래스의메서드를호출하는방법이바로base참조변수를이용하는것입니다. base는this와같은원리로동작됩니다.그래서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 void 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 void 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없어도가능 |
'dev, tech > Windows P' 카테고리의 다른 글
[펌] 4_16 생성자를 호출하는 this() (0) | 2006.01.16 |
---|---|
[펌] 4_13 this 키워드 (0) | 2006.01.16 |
클래스의 생성자 실행 순서 (0) | 2006.01.16 |
클래스에 대한 깊은 이해 - 접근 권한 / 상속 권한 (0) | 2006.01.16 |
다형성 (0) | 2006.01.16 |
댓글