Q : 이것이 c# 이다. p300 | 인터페이스를 활용한 클래스 다중 상속

2020. 5. 6. 03:01잡다한 게시물/Q&A

반응형

답변이.. 늦었습니다!!

(엄청나게!!)

 

항상 열심히 공부하시는 모습에 저도 자극받네요..!

일정이 있어서 아침에 답변해야지 했는데

이렇게 늦게 작성합니다!

 


더보기

[비타민 퀴즈 8 - 2]

여기에 인터페이스 둘(IFlyable, IRunnable)과 이 두 인터페이스를 각각 상속하는 두 개의

클래스 (Plane, Car), 그리고 두 인터페이스를 동시에 상속 (다중 상속)하는 하나의 클래스

(Flyingar)가 있습니다. 이들을 이용해서 인터페이스 다중 상속과 포함 기법을 이용해서 클래

스 다중 상속을 흉내 내 보세요.

 

우선 코드 전문입니다.

 

 

문제와 코드를 보면

 

지문 1.

 

지문 2.

 

지문 3.

 

지문 4.

지문 그대로 인터페이스를 활용하여 불가능한

클래스의 다중 상속을 하는 문제입니다.

 

*포함 기법을 이용하라는 지문이 있는데

'피드백' 문단에서 설명하겠습니다.

 

여기서 보셔야 될 껀

 

IRunnable 인터페이스 형식으로 선언된 runnable에

FlyingCar 클래스 형식으로 생성된 flyCar가 대입이 된다는 거죠.

 

* '참조'는 가능하다는 뜻입니다.

 

flyCar는 2개의 인터페이스(IRunnable, IFlyable)를 상속받고 있으므로

가능한 일입니다.

 

즉, 같은 인터페이스를 상속받고 있는 클래스라면 대입이 가능하여

이런 식으로도 활용이 가능한 거죠.


 

자~ 그래서 어떻게 인터페이스를 활용하나요?

사실 저도 많이 이용해 본 경험이 없어서...

 

1. 다중 상속

2. 제약

3. 유연한 작성

 

* 1. 번 부분은 설명드린 거 같아서 패스하고

 

2. 번 부분

'IRun'처럼 인터페이스는 'I'를 명시해줘야 됩니다. (규칙..!)

그리고 클래스에 인터페이스를 상속하면 꼭! 선언을 해야 하는 제약이 있죠.

 

즉, 어느 클래스든 IRun을 상속받는 다면 그 클래스는 IRun의 기능을 

꼭 사용하고 있다는 뜻입니다.

 

어느 클래스를 다 읽어 보지 않아도 인터페이스의 제약 기능으로

그 기능이 꼭 들어가 있구나를 짐작할 수 있죠.

 

3. 번 부분

인터페이스 한개만 만들어 놓으면 어느 프로그래머가 와도

같은 이름으로 각자의 기능을 넣게되죠.

 

class로 이 기능을 넣는다면

1. 1개의 클래스만 상속가능 (더 많은 기능 상속 불가)

2. 최초로 작성이 되있어야됨 (작성된 코드안에서만 수정 가능)

 

이러한 단점이 생기겠죠!

 

* 추가로!

 

 

인터페이스는 생성자를 사용할 수 없지만 배열로는 사용이 가능합니다.

물론 생성된 Enemy와 Player는 IAttack 인터페이스를 상속 받고 있어야 하죠.


피드백

 

방법은 다양하여 질문자님이 보내주신 것도 틀린 건 아니지만

 

아마 '포함 기법'을 활용하라는 지문 때문에 작성하신 거 같습니다.

 

p297에 예시처럼 중복되는 함수, 변수명이 있을 경우(죽음의 다이아몬드)

포함 기법을 활용하여 내가 넘겨줄 함수, 변수를 지정하는 목적이

'포함 기법'입니다.

 

이러한 경우가 있다면

 

* 만약 클래스의 다중 상속이 허용된다는 가정이면..

이러한 문제가 발생합니다.

이 때문에 C#, Java에서는 클래스의 다중 상속을 제한하고 있습니다.

 

예시(p298)에서는 이 경우를

물려받고 싶은 기능을 정하여 선언해 넣는 것이죠.

 


끝으로..

 

인터페이스는 사실 저도 많이 써본 경험이 없습니다.

저도 공부중인 터라... 허허

 

많은 예시와 설명을 못드려서 죄송합니다 ㅜ

큰 장점인 다중 상속, 제약 부분만 알아도

크게 부족한 부분은 없을 꺼라 생각합니다.

 

도움이 되었으면 좋겠네요

 

: )

 


추가

아마 다른 클래스를 만들어 사용하는 거 같습니다

(MyVehicle, MyVehicle2) 클래스

 

생성자를 만들어서 각각의 클래스에 맞게 기능을 변경하는 뜻 일까요..?

 

 

저는 이렇게 작성했습니다.

주석 구문으로 설명해놨습니다.

 

---* 생각해보니 이 코드는 생성자를 따로 만든 이유가 없어지네요.. 흠

고민좀 해봐야겠습니다..

반응형