2009년 10월 9일 금요일

상속 관계에서의 생성자, base키워드

간단하게 상속 관계의 예제를 보도록 하겠습니다.

펼쳐두기..


 

위의 예제는 간단한 상속 관계를 표현한 예제입니다. 뭔가 이상한 점을 발견 하셨나요?

발견하셨다면... 열심히 공부하신 분이거나... 실력이 뛰어나신 분입니다. ^^;

언뜻 보기에는 아무런 문제가 없어 보입니다.

그러나 아주 중요한 부분이 틀렸습니다. 바로 상속 관계에서의 생성자 구현 부분입니다.

Beginner클래스의 개체를 하나 생성했죠? 그런데 컴파일러는

'Programmer' 메서드에 대한 오버로드는 '0'개의 인수를 사용하지 않습니다.

라고 에러 메세지를 보여 줍니다. 이상 합니다. 그쵸? 개체는 Beginerr개체를 생성한 것이고

생성자를 명시 하지 않으면 기본적으로 기본 생성자가 만들어집니다.

여기까지는 강좌를 통해서 배웠습니다.

하지만 자식 클래스가 부모 클래스를 상속 받으면 기본적으로 부모 클래스의 생성자를 호출합니다.

그래서 자식 클래스에서는 아래와 같은 코드가 빠졌던 것 입니다.

 

public Beginerr () : base() {}

 

여기서 base키워드는 부모 클래스를 뜻합니다. 저러한 형태의 생성자는 생성자 강좌에서

보았습니다. 그렇죠? 저 구문이 빠졌지만 기본적으로 기본 생성자가 만들어진다고 가정하에

코드를 역추적 해보겠습니다. Beginner개체를 생성합니다. 그럼 Beginner생성자가 호출이 될테고

Beginner클래스의 생성자를 보면 부모 클래스의 생성자를 호출합니다.

그리고 부모 클래스를 보면... 생성자를 오버로딩 했습니다. 그러면 !! 기본 생성자는 자동으로

만들어지지 않죠? 그래서 에러가 발생하였던 것 입니다. 이해가 되시나요?

만약에 base부분을 뺐다 하더라도 자식 클래스는 부모 클래스의 생성자를 호출하는 의무를 지닙

니다. 그러면 어떻게 해야 할까요? 부모 클래스의 생성자에 맞게 코드를 변경해야 합니다.

 

펼쳐두기..

 

이렇게요. Beginerr 생성자에서 보시면 string형 s를 인자로 받구요. 그 인자를 base 즉, 부모 클래

스의 생성자를 호출하며 넣어줍니다. 그러면 부모 클래스 Programmer클래스에서는 마리 라는

문자열을 인자로 받아서 자신 개체에 값을 할당하겠죠?

정리를 해보면, 자식 클래스는 부모 클래스의 생성자를 호출하는 의무가 있다.

해서 자식 클래스에서 생성자를 선언하지 않고 기본 생성자로 사용할 경우

 

public Beginerr () : base() {}

 

이런 코드가 빠져있다는 것을 주의 깊게 생각해야 한다.

 

출처 : http://cafe.naver.com/headstudy.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=664

 

// 나는.. base가 빠졌다는 것을 알았지만... 하하하;;(돌멩이 피할 준비중..)

// 물론 최근에.. 공부하던중에 저런 에러를 보았기에 가능했던 사실..

댓글 없음:

댓글 쓰기