객체지향 설계에 대한 질문
253
작성한 질문수 1
안녕하세요, 9강 델리게이트 까지 들은 현재,
제가 객체지향 설계에 대해 잘 이해를 한 것인지 잘 모르겠고 궁금한 것이 생겨서 질문 남깁니다.
9강에서 인터페이스를 사용해서 느슨한 결합으로 구현하는 것을 설명해주셨었습니다.
강의에서 인터페이스를 구현할 때, 인터페이스를 사용해서 함수를 호출하기 위해서는 특정 클래스를 Cast하여 확인하고 호출했었습니다.
그러면 예를 들어 캐릭터에서 아이템 사용 인터페이스를 사용한다고 해도 아이템 클래스 헤더를 include를 해야하는 상황이 발생하는데
이 경우에는 인터페이스를 사용했음에도 결합? 의존이 발생한 것이라고 봐야할까요?
그리고 델리게이트 강의에서 중간에서 연결과 활동을 관리하는 주체 클래스가 필요하다고 하셨는데 이 클래스의 경우에는 모든 클래스를 include하여 사용하게 되는데 강한결합을 따지지 않나요?
그리고 강의를 따라가며 이해한 걸로 예시를 들어보았는데 제가 제대로 이해하고 있는 것인지 궁금합니다...
좀 길지만 혹시 한번 봐주신다면 정말 감사하겠습니다
===============================================================
<6강 리플렉션 2>
게임에서 다양한 아이템이 있습니다.
아이템이라는 클래스를 만들어서 상속시켜 구현을 합니다.
아이템 클래스에는 Use라는 가상 함수를 두고 이를 오버라이드 해서 각 아이템의 사용 시 효과를 구현합니다.
<7강 인터페이스>
사용가능한 아이템이 있고 패시브 효과를 가진 아이템이 있을 수 있기 때문에 Use라는 함수를 UsableItemInterface 등의 인터페이스로 구현하여 상속시켜 구현합니다.
<8강 컴포지션>
포함관계를 사용하여 복잡한 기능을 클래스를 쉽게 구현합니다.
캐릭터 클래스에 아이템 클래스를 include하여 생성하여 아이템의 기능을 사용할 수 있게 합니다.
<9강 델리게이트>
include 된다면 강한 결합이기 때문에 안좋은 설계 방법이며 인터페이스를 활용하여 구현하여 느슨한 결합을 유지할 수 있습니다.
예를 들어 아이템 자체를 include하기 보다는 아이템 사용 함수를 구현한 인터페이스에 의존하게 하여 해당 인터페이스를 구현한다면 다양한 종류의 아이템을 직접 캐릭터에 include하여 변경할 필요없이 사용이 가능하게 됩니다.
하지만 매번 인터페이스를 만드는 것이 불편할 수 있으므로 델리게이트를 쓰면 편하고 안정적으로 관리가 가능합니다.
캐릭터와 아이템의 의존을 없애기 위해 연결과 활동 주체 클래스를 만듭니다.
주체 클래스에서 캐릭터와 아이템을 include하고 캐릭터에 onUse라는 델리게이트를 만들고 이게 호출되면 아이템의 Use가 호출되도록 bind합니다.
그러면 캐릭터와 아이템이 의존하지 않고도 사용할 수 있게 되었습니다.
===============================================================
답변 1
0
강한 결합이라고 #include가 한 번도 안된다는 의미는 아닙니다.
예를 들어 장착이라는 어떤 추상적 행동이 있을 때, 이의 include는 필요합니다.
하지만 장착이라는 행동을 지원하는 아이템이나 무기, 악세사리의 실제 클래스의 선언과 정의에 대한 #include는 필요치 않다는 것이 핵심이겠지요.
0
답변 감사합니다.
제가 궁금했던 부분이 바로 이 부분이기도 한데,
인터페이스 강의에서
DoLesson을 정의한 인터페이스를 사용하기 위하여 이의 include를 하였습니다. 하지만 더 나아가서 구현하였는지 확인하는 Cast 과정에서 Person 클래스의 include 또한 필요하였습니다. 결국 Person과의 결합이 발생했다고 생각하는데 이정도의 결합은 괜찮다는 것일까요?
확실한 개념 정립이 쉽지 않아서 다소 질문이 난해합니다... 양해부탁드립니다 ㅠ
저는 저 노란색 미리보기 창이 안뜹니다
0
22
1
강의중에 사용하는 ppt 수업 자료
0
37
1
GetName(), SetName() 함수의 오버로딩 관련 문제 문의드립니다.
0
40
1
언리얼 공부 방법에 대해서 질문드립니다.
0
74
1
컴포지션을 위한 컴포넌트 생성에 관해 질문드립니다.
0
84
2
if (NameProp) 은 if (NameProp != nullptr)이랑 같은 의미인가요?
0
96
2
언리얼 계정 로그인 불가 문제
0
119
2
가비지컬렉션 주기를 짧게 유지하면 어떤 이슈가있을까요?
0
75
2
11강 TArray TSet 에 대해서 질문있습니다.
0
72
1
Unreal 연동 후 Visual Studio 빌드오류 제발 살려주십쇼
0
367
3
언리얼에서 제공하는 스마트 포인터 라이브러리 사용
0
75
2
FGCObject 상속 받은 객체에서 Uobject 삭제를 원할 때
0
81
2
게임 내 인벤토리 데이터를 관리 할 경우, TArray / TSet 무엇이 올바를까요?
0
75
2
8강 컴포지션 중 궁금한 것이 있습니다.
0
56
2
헤더 파일 분리 방법
0
85
2
언리얼 엔진 깃 설치
0
89
2
FObjectInitializer 를 사용한 생성자.
0
96
2
언리얼엔진 에서 새로운 클래스를 생성하면
0
75
2
GetName이 이미있는데용?
0
113
2
TObjectPtr 과 일반 포인터에 대한 용도 질문
0
105
2
UPROPERTY() 다음 라인에서 세미콜론이 입력되지 않습니다.
0
164
1
[18:50] 패키지 저장 시 이미 패키지가 있으면 로딩을 다 하고 저장하는 것이 좋은 이유가 궁금합니다
0
140
2
NonPropStudent가 GC이후 invalid된 이유
0
78
2
[44:22] 커스텀 구조체에서 GetTypeHash() 와 operator== 를 오버로딩 하는 이유에 대한 질문
0
108
2





