p.50 Q1. SimUDuck에 로켓 추가하기 #1
Replies: 4 comments 3 replies
-
|
조금 더 구체화시켜서 생각하자면 다음과 같은 의문들이 있었음.
등등을 생각했지만 다음 페이지에 어느정도 정답이 나와주긴 함... |
Beta Was this translation helpful? Give feedback.
-
|
일단 위의 다이어그램처럼 구현을 어떻게 할 수 있을지 생각하면서 아래 코드를 작성해봤습니다. 그리고 출력 결과로는 상속 클래스의 fly()가 호출되었습니다. 이와 관련해서 이해가 어렵다면 여기 를 참고해보시면 될 것 같아요. 요약하자면, 클래스가 인터페이스보다 상속의 우선순위가 높아 클래스의 메서드가 호출된다고 합니다. 결국 이렇게 구현하게 되면 2번의 우려하던 상황이 발생하게 되는데, 저는 여기서 문제를 해결하기 위해 두 가지 관점으로 접근해보았습니다.
결국 책의 뒷부분에 나오는 것처럼 오리의 나는 행동을 동적으로 관리할 수 있게 된다면, 그냥 난다 or 로켓으로 난다 처럼 여러 동작 중 하나를 선택하는 구현이 가능하게 되니 제일 나은 정답이라고 생각합니다 ㅋㅋ... 하지만 그걸 배재하고 고민한다면 저는 위의 두가지 접근을 시도하지 않을까 싶어요! |
Beta Was this translation helpful? Give feedback.
-
|
오리로서도 날고 싶고, 로켓으로도 날고 싶은 오리. 하지만 자바는 다중 상속을 지원하지 않기 때문에, 두 클래스를 동시에 상속받을 수는 없었다. 그렇다면 둘 다 인터페이스로 구현하면 어떨까? 그런데 이렇게 되면 결국 한 시점에 하나의 fly() 동작만 가질 수 있게 된다. 그래서 이 상황을 어떻게 해결할 수 있을까 고민해봤는데, 크게 두 가지 방식이 있다고 생각했다. 결국 여러 개의 상태를 동시에 가지고 날 수 있어야 한다면, 가장 간단하게는 필드를 계속 추가하는 방식이 있고, 반면, 하나의 상태만 가지면 충분한 경우라면, FlyBehavior를 타입으로 하는 필드를 하나 두고, setFlyBehavior()를 통해 전략을 교체하는 방식이 가장 단순하고 효과적인 접근이라고 생각한다. 제 생각을 적었던걸 GPT쌤으로 흐름만 잡았습니다! |
Beta Was this translation helpful? Give feedback.
-
1번이나 2번 중 옳은 방법이 있다고 생각하기 보다는 1번은 유연한 상황, 2번은 특수개체가 중요한 상황에서 사용되는 것이 적절하다고 생각됩니다. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
해당 문제에서는 "Fly"라는 동작을 인터페이스로 분리하고, 해당 인터페이스를 상속하는 또다른 Fly 인터페이스들을 작성하고 있음.
그 상태에서 Rocket을 통해 나는 방법도 새로 클래스를 만들면 된다고 나와있지만, 다음과 같은 경우는 어떻게 하는가 의문이 생겼기에 공유.
상상도는 다음과 같음

이를 p.50까지의 방법을 생각하면 다음과 같이 된다고 예상.

허나 오리로서도 날고 싶고 로켓으로도 날고 싶은 오리는 "fly()"가 충돌하지 않는가?
디스커션 기능을 익힐 겸, 첫 글도 적어볼 겸 작성.
Beta Was this translation helpful? Give feedback.
All reactions