해결된 질문
작성
·
88
답변 2
3
김철준님 안녕하세요.
Player 내부에 WorldMap이 위치하는게 어색한 이유와 Game 안에 포함되는게 더 낫다고 생각하시는 이유를 적어 주시면 좀 더 정확한 답변을 드릴 수 있을 것 같습니다.
더 자세한 답변은 위 내용을 적어주시면 드리기로 하고 우선 대략적으로 답변드릴게요.
어떤 구조를 선택할 것인지는 응집도나 결합도와 같은 측면을 트레이드오프해서 그 중에서 합리적인 안을 선택해야 합니다.
말씀하신 안이 아래 그림의 (A)인지 (B)인지 정확하게 몰라서 둘 모두를 기준으로 답변드릴게요.
현재의 텍스트 어드벤처 게임은 Player를 기준으로 특정한 액션을 수행하고 있습니다.
(A)안
이 구조로 설계하면 Game이 Player와 WorldMap을 조율해서 Player의 동작을 처리해야 합니다. 따라서 Game에 Player를 처리하는 로직이 위치하게 되어 응집도가 낮아지게 됩니다. 추가로 Game이 WorldMap과 Player 모두를 알아야 하기 때문에 Game의 결합도가 높아지게 됩니다.
(B)안
이 구조로 설계하면 Player를 처리하기 위해 WorldMap을 거쳐야 합니다.
따라서 Player만 필요한 로직의 경우에도 WorldMap에 Player로의 위임 로직을 추가해야 합니다.
따라서 WorldMap의 응집도가 낮아지게 됩니다.
또한 Player는 처리를 위해 WorldMap의 정보가 필요하기 때문에 양방향 연관 관계가 추가하거나 WorldMap의 데이터를 전달해야 하기 때문에 결합도가 높아지거나 코드가 복잡해지게 됩니다.
위 이유로 Player가 WorldMap을 참조하도록 구성했습니다.
제가 드린 답변이 생각하신 이슈와 상관이 없다면 어색하다고 느끼신 이유와 Game에 포함시켰을 때 더 개선된다고 생각하시는 부분을 남겨 주시면 더 자세히 답변 드릴게요.
네 어떤 의미로 하신 말씀인지 이해했습니다.
해당 관점에서 설명드리면 현재 구조는 플레이어 안에 월드맵이 포함된다는 의미가 아니라 플레이어가 월드맵을 알고 있다는 의미를 내포합니다.
예를 들어 이머커스 예제로 많이 사용되는 아래 그림에서 주문이 사용자를 포함하는게 아니라 주문이 사용자를 알고 있는 것으로 해석하는 것과 동일한 경우라고 보시면 됩니다.
답변이 되었는지 모르겠네요. 🙂
아하 클래스 내의 필드라고 해서 모두 소유의 개념은 아닌 것이군요! 답변 감사합니다. 소유의 개념일 때와 정보를 아는 것의 차이는 어디서 구분할 수 있을까요?? 참조변수인 것과 원시값 변수 차이로 구분할까요??
참조변수라고 하더라도 포함(정확하게는 합성인 composition)과 알고 있음(정확하게는 연관관계인 assoication) 두 가지 모두로 구현 가능합니다.
두 가지는 개념 관점과 구현 관점에서 유지보수성 측면에서 더 나은 쪽으로 개발자가 선택하면 됩니다(이 부분은 상대적으로 복잡한 내용이라 뒤이어 나올 강의들 중 하나에서 좀 더 자세히 다뤄볼 예정입니다).
앞에서 WorldMap이 Player에 의존하는 것보다 Player가 WorldMap에 의존하는게 유지보수성 측면에서 더 좋다는 결정까지 했다고 가정하겠습니다.
개념 관점
첫 질문에서 말씀하신 것처럼 의미적으로 Player가 WorldMap을 포함한다는 개념보다는 Player가 WorldMap을 알고 있다는 쪽이 더 자연스럽습니다.
여기에서도 Player가 WorldMap을 포함하는 것보다는 독립적인 두 요소가 서로 알고 있다고 해석하는게 코드를 이해하기에 용이하겠죠.
하지만 개념 관점에서의 의미는 설계를 시작할 때의 참고 용도로만 생각하셔도 좋고 더 중요한 것은 구현 관점입니다.
구현 관점
구현 관점에서는 개발자가 두 객체의 생명주기에 걸쳐 어떤 식으로 관계를 구현했는지에 따라 달라집니다.
합성 관계로 구현할 경우 WorldMap의 생명주기는 Player에게 종속되어야 합니다. WorldMap은 Player가 생성될 때 생성되고, Player가 제거될 때 함께 제거되어야 합니다.
또한 Player와 WorldMap은 제약조건을 함께 공유하는 것이 필요하며 상태 변경 및 로직 처리 시에 강하게 결합되어 있습니다.
사실 강의에서 사용하는 예제는 코드 크기가 작기 때문에 두드러지지는 않지만 크기가 커지면 Player와 WorldMap을 독립적인 요소로 처리할 수 밖에 없게 됩니다.
따라서 합성 보디는 연관관계로 구현해야 합니다.
답변이 되었는지 모르겠네요. 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
김철준님, 객체지향 설계에서 클래스나 객체의 책임이 어디에 위치해야 하는지는 항상 고민할 부분입니다. 특히 worldmap
이 player
내부에 있는 것보다 game
에 위치하는 것이 더 적절할지에 대해 고민하시는 것 같습니다.
객체지향 설계에서 중요한 원칙 중 하나는 책임의 적절한 할당입니다. player
는 개별적인 행동이나 상태 정보를 주로 가지는 반면, worldmap
또는 game
은 전체적인 게임의 상태나 환경을 관리하는 역할이 더 적합합니다. 따라서 game
객체가 게임의 전반적인 상태를 관리하면서 worldmap
을 관할하는 것이 강한 응집도를 유지하고 낮은 결합도를 유지하는 데 도움이 될 수 있습니다.
이와 관련하여 참고할 수 있는 기존 질문과 답변을 추천드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
그간 설명하신 내용으로는 플레이어 안에 월드맵이 있는 것이 맞지만 전체 맵 크기를 초기화하는 역할까지 하는 월드맵을 플레이어가 가지고 있다는 게 일반적인 게임을 생각할 때 어색하다는 의견이었습니다!