fkdl0048 / Mentoring-Project

development mentoring
3 stars 0 forks source link

온라인 멘토링, 2024-04-15 [23:00] 39회차 #121

Closed fkdl0048 closed 6 months ago

fkdl0048 commented 6 months ago

객체지향 관련 질문

상속과 인터페이스 합성의 형태

간단하게 게임을 구성할 때 아이템이 맵에 등장하고, 아이템을 플레이어가 E를 눌러 획득 가능하다고 한다는 예시입니다.

1번 예시

이 예제에서 공통된 아이템 특성에 관련된 값을 가진 ItemBase가 존재하고 이를 상속 받은 각각의 ItemWeapon, ItemPotion, ItemScroll이 있다. 공통된 ItemBase에는 플레이어가 상호작용을 하면 실행하는 IInteraction 인터페이스가 존재하여 각각의 아이템이 이를 개별적으로 구현한다.

2번 예시

공통된 아이템 속성을 담는 Struct나 클래스, 레코드, 유니티로는 SO를 가진 개별적인 Item을 따로 만들어서 ItemWeapon, ItemPotion, ItemScroll에서 각각 합성 구조로 들고 있게 한다. 이후 각각 IInteraction를 상속받아서 개별적으로 구현한다.

두 가지의 경우 개발과정에서 다양하게 나올 것 같은 예제라고 생각됩니다. 특정 상황에서 뭐가 더 유리한지 같이 이야기 해보면 재밌을 것 같습니다.

이런 일종의 균형잡기 질문도 편하게 해도 되는지..?

아이템 사용과 레이어

다른 애플리케이션도 그러하듯, 모놀로식 아키텍처나 어떤 아키텍처도 고수준과 저수준으로 아래로는 직접 참조 반대 방향은 인터페이스의 참조형태가 좋다고 이해하고 있습니다. 예를 들어 게임에서 캐릭터나 게임 매니저는 가장 높은 레이어를 가지고, 아래 단계에는 UI나 아이템, 애니메이션 등을 가지고 있고 그 아래로는 데이터 등이 있을 것 같습니다.

만약 상자의 아이템을 먹는다와 같은 로직이 존재할 때, 가장 먼저 떠오르는 로직은 캐릭터는 "IInteraction과 같은 인터페이스를 통해 E키를 눌렀을 때 overlap되는 오브젝트 중 해당 인터페이스를 구현한 객체라면 Interaction한다"와 같은 기능이 구성될 것 같습니다.

여기서 생각해볼 수 있는게, 만약 해당 오브젝트가 캐릭터의 손에 무기를 장착하는 오브젝트일 경우(무기 오브젝트라고 칭함) 생각해볼 수 있는게, 무기 오브젝트의 Interaction메서드는 다시 캐릭터를 참조해야 하는 문제가 생기는 것 같습니다. 이를 가장 간단하게 해결하는 방법은 캐릭터 쪽에 무기를 장착하는 클래스나 메서드를 정의하고 인터페이스 매개변수로 이를 넘겨주고 해당 로직에서 불러서 사용하는 방법이 떠오르는데, 이 경우 위에서 말한 레이어 계층에서 역참조가 생기게 되고, 아이템이라는 2단계에서 1단계의 메모리를 점유하게 되는 문제가 생길 것 같습니다.

그럼 두 번째로 생각해볼 수 있는게, "캐릭터에서 무기 장착과 관련된 인터페이스를 정의하고 이를 Interaction을 받은 무기 오브젝트가 캐스팅을 통해 호출한다"가 있을 것 같은데, 캐스팅 하는 과정에서나 두번 왔다 갔다의 과정도 있고 의존성은 줄어들지만, 복잡해보이긴 합니다.

그럼 결국 세번째로 생각해볼 수 있는게, 캐릭터에서 각각의 아이템에 대한 대응되는 메서드를 생성해두고, 캐릭터에서 참조가 아닌 오브젝트마다 overlap을 검사하여 캐릭터가 감지되면 인터페이스를 통해 자신의 타입을 넘겨주고 이를 캐릭터가 받아서 각각의 메서드를 호출한다와 같은 시나리오도 있을 것 같습니다..

뭔가 알아가면 알아갈수록 더 고민할 부분이 많이 생기는 것 같네요.. 그렇지만 확실히 시야는 넓어진 기분이 들긴 합니다.

상속을 사용하는 경우

읽다보니 상속을 사용해도 좋은 경우를 떠올릴 때 LSP를 위반하지 않는 한에서 타입 계층의 다형성을 나타내기 위해 사용할 수는 있겠다는 생각이 듭니다. 만약 합성의 형태로 몬스터를 만들었을 때, 단순 Enum값으로 몬스터의 형태를 구분하기 보다. 이름이 주는 컨텍스트로 타입을 더욱 추상화하여 나타내고자 할때?

예를 들어 오우거라는 몬스터에서 단순 타입의 변화가 필요한 깊이가 1정도로만 내려간다면 활용성이 있을 것 같다는 생각이 듭니다.

이에 대해서도 상속을 사용하지 않는 것이 좋을 수 있는지 논의해보면 좋을 것 같습니다.

믹스인에 대한 추가적인 논의

11장 마지막 부분에 믹스인이라는 새로운 기술? 기능? 이 나오는데, 저번 논의 때 멘토님이 말씀해주신 기억이 납니다. 상속과 합성의 각 장점만 모아둔 기능인 것 같다고 느껴지는데, 이게 과연 언어적인 차원에서 지원을 왜 안해주는지? 지원해준다면 어떻게 활용될지? 믹스인에 대한 좀 더 이해가 필요해서 논의해보고 싶습니다.

ETC

시간이 남는다면 논의하지 못한 저번 논의 주제들을 말해보면 좋을 것 같습니다.

fkdl0048 commented 6 months ago