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) 클래스
생성자를 만들어서 각각의 클래스에 맞게 기능을 변경하는 뜻 일까요..?
저는 이렇게 작성했습니다.
주석 구문으로 설명해놨습니다.
---* 생각해보니 이 코드는 생성자를 따로 만든 이유가 없어지네요.. 흠
고민좀 해봐야겠습니다..