컴포넌트 패턴 질문드립니다

안녕하세요! 강좌 잘 보고있습니다.
Component 패턴이 그냥 Class 로 객체지향적으로 분리하는거랑 무슨 차이가 있을까요?
제 입장에선 사진처럼 따로따로 class 로 분리해서 짜는게 너무 당연해보여서.. 디자인패턴으로까지 정리된 이유를 모르겠습니다.
제가 해당 내용에 대해 잘 이해하지 못한다고 생각해 질문드립니다 ㅠㅠ
답변 3
7
안녕하세요,
우선 OOP 관점에서 클래스를 설계할 때,
상속을 이용할 것인지 아니면 부품(component)을 이용할 것인지 선택하게 됩니다.
대부분 Is-A 관계가 성리하면 상속을, Has-A 관계가 성립하면 Component로 만드는게 정석인데요.
예를 들면 "오크는 몬스터다 (Orc Is-A Monster)" 관계가 성립하니, 오크는 Monster를 상속받는게 타당하고,
"플레이어는 인벤토리를 갖고 있다 (Player Has-A Inventory)" 관계가 성립하니,
Player 클래스 안에 Inventory를 Component로 만드는 쪽이 좋습니다.
말씀대로 Component 패턴은 그냥 "기능들을 부품화 해서, 코드의 의존성을 줄이고 재활용성을 높인다"는 것이 핵심입니다.
그리고 사실 OOP에서는 이미 Component를 자연스럽게 사용을 하고 있는 것도 맞습니다.
그러니 어떻게 보면 Component의 상위 범위에 OOP가 있다고 볼 수도 있겠네요.
위의 예제에서 Animation, Skill, Physics는 정말로 다른 기능들이니
별도의 class로 빼서 관리하는 것이 매우 자연스럽지만,
경우에 따라서는 과연 Component로 빼는게 좋을지? 애매모호 한 경우도 있습니다.
예를 들면 입력을 받는 InputComponent, 이동을 관리하는 MovementComponent를 굳이 따로 파는게 좋을까요?
유니티 사용 문서에는 대부분 Update문 안에 KeyBoard의 키와 비교를 하고,
역시나 키 입력 값에 따라서 직접 좌표를 이동해버리는 경우가 많은데
이렇게 하더라도 뭐 딱히 문제가 있진 않습니다.
다만 이렇게 할 경우 Update문 안에 입력/이동과 관련된 코드들이 종속적으로 묶이게 되므로 (tightly coupled)
코드의 유연성이 떨어지게 되겠죠.
InputComponent, MovementComponent를 따로 파서 관리를 하게 될 경우,
코드의 종속성도 끊어주는 장점도 있는데다가, 코드의 유연성도 훨씬 더 좋아집니다.
예를 들어 갑자기 마우스 입력 기반으로 바꾸고 싶다면
InputComponent 인터페이스를 상속받은 MouseInputComponent로 대체하면 그만이고,
물리 영향을 받아 이동하도록 급히 바꾸고 싶다면
역시나 MovementComponent 인터페이스를 상속받은 PhysicsMovementComponent를 이용해서
부품을 갈아끼면 그만이죠.
결론적으로 OOP는 [객체 관점에서의 관리]에 초점이 맞춰졌다면,
Component 패턴의 철학 자체는 [기능의 부품화]에 맞춰져 있으니 약간 뉘앙스가 다르긴 합니다.
UI 기능 관련 질문이 있습니다!
0
37
2
픽셀 좌표 스크린 좌표
0
33
0
전체적으로 코드 읽는게 굉장히 오래 걸리네요...
0
74
2
카메라 #2 수업 캐릭터 쓰러짐 해결
0
84
1
플레이어 움직임이 끝날때, 기울어짐 현상
0
83
1
Input 적용과 관련하여 질문 있습니다.
0
75
1
디버그 불가.. Unity에 연결 불가
0
82
1
달리기 애니메이션 에러
0
89
2
오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다
0
66
1
GetKey 오류
0
110
2
에셋을 어디에 올려두신지 알 수 있나요?
0
107
1
재귀호출? 오류나는데 왜 이래요 ?
0
169
6
Animation blending 파라미터 계산
0
68
1
newPos와 to지점이 겹쳐져야 하는거 아닌가요?
0
97
3
오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다
0
88
2
질문있습니다
0
143
2
아 이거 소스코드 같은거 없나요?
0
142
3
질문 드립니다. string.IsNullOrEmpty(name)
0
87
2
@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?
0
136
2
유니티6 NavMesh 안되는분들
1
176
1
Unity6 Unity-Chan Material 마젠타 문제 해결법
7
528
1
GetComponent<Poolable> 질문드립니다.
0
102
2
UI 불러오지 못함
0
119
2
UI 자동화 #1 - Util.cs의 FindChild함수에서 component.name에 컴포넌트 이름이 뜹니다.
0
155
2





