이번에 멀티 레이어드 상태 머신 강의를 수강 하면서 정말 이해가 안돼서 5번은 돌려봤습니다. 개념적으로 익숙하지 않고 스스로가 아닌 남이 만든 코드를 이해 하는게 낯설기도 하여 이런 상황을 맞닥뜨린 것 같습니다. 그래서 강사님에게 묻고 싶은 내용은 강사님은 다른 사람이 만든 코드를 볼 때 어떤 방식으로 접근하여 코드를 이해하고 분석하는지 입니다. 질문 내용 자체가 강의 내용과 직접적으로 연관도 없다 싶고 , 또 명확한 정답이 있다고 보기에도 어려운 질문이라 생각해서 가벼운 마음으로 답변 달아주셨으면 해서 고민있어요 카테고리에 질문 남겨봅니다.
코드 분석방법에 대해 묻고싶은게 있습니다.
최성호
작성일
24.04.17 20:18
조회수
244
댓글 1
수강해주셔서 감사합니다.
여러 본 돌려보시는게 정말로 정상이시구요, 보통 게임 인공지능을 공부할 때 가장 먼저 보게 되는게 기본적인 형태의 StateMachine인데, 기본 형태도 많은 학생들이 정말 어려워합니다. 저도 학부생 땐 어려워서 여러 번 반복해서 보고, 예제를 직접 만들어보고 했습니다 .
코드 분석은 옛날에도 정말 많이 했고, 지금도 괜찮은 오픈 소스나 에셋들의 코드를 자주 분석하는 편입니다. 제가 옛날에 코드 분석을 하거나 알고리즘, 로직 공부를 할 땐 변수 하나, 하나, 코드 한 줄, 한 줄 모두 눈에 새겼습니다. 전체 코드를 외울려고한거죠. 지금와서 보면 정말 미련하고 짓이고 분석과 공부를 매우 힘들게 만드는 행동이였습니다. 수 천 줄의 코드를 한 줄, 한 줄 눈에 새기는건 매우 오랜 시간이 걸리는데다 양이 많다보니 사람을 지치게 만듭니다. 거기다 변수와 함수는 그저 그 코드를 작성한 프로그래머가 어떤 기능을 구현하는데 필요하다고 판단해서 작성한 것일 뿐, 언제든지 지우거나 바뀔 수 있는 것이기 때문에 외운다는 것 자체가 의미 없는 일이죠. 코드를 분석하거나 알고리즘을 공부하실 때는 2가지만 이해하시면 됩니다.
1. 어떤 로직으로 돌아가는가?
2. 이 변수가 왜 필요한가?
작성되어있는 함수와 변수를 달달 외우듯이 빠삭하게 알 필요가 전혀없습니다. 로직을 이해한다면 내가 코드를 안 외우고 있어도 코드를 작성할 수 있고, 더 나아가서 "로직을 이렇게 수정하면 더 낫지않나?"와 같이 개선도 가능합니다. 마찬가지로 변수도 왜 필요한지만 알고 있으면, 필요에 의해 변수를 만들면 될뿐이고 "로직을 이렇게 수정하면 이 변수는 필요없겠는데?"처럼 개선도 가능합니다.
위 얘기에 근거하여 저는 코드를 분석할 때 로직을 이해하는데 중점을 둡니다. 예를 들어, 제가 스테이트 머신 강의를 보고 코드를 분석한다면(주석이 없다는 가정하에) 다음과 같이 행동할겁니다.
1. StateMachine의 핵심인 Update 함수를 확인
2. "currentStateDatasByLayer 변수가 뭐지?" => 선언으로 이동
3. "이름을 보니 레이어별로 현재 실행중인 State의 Data인가보네"
4. StateData Class로 이동
5. "안에 Layer 번호와 State, Transition들이 있구나"
6. State Class로 이동
7. "Property들이 있고, 재정의할 수 있는 가상 함수들이 있네. 가상 함수들을 재정의해서 동작시키나 보다." => Property들은 대강 슥 둘러보면 됩니다. 자세한건 나중에 사용하는 Code가 나왔을 때 다시 봅니다.
8. StateData로 돌아와서 Transition Class로 이동
9. "아마 IsTransferable이 true가 되면 fromState에서 ToState로 전이되는거겠지? 근데 Command는 뭐지? 나중에 확인해봐야겠다."
10. 앞선 내용으로 'Transition의 조건을 만족하면 A State에서 B State로 전이가 되는거구나'를 이해
10. 다시 Update 함수로 복귀
12. "다음 줄 anyTranstions는 뭐지? 선언을 보니까 Layer에 할당되어있는 Transition들인데 이게 뭐야?"
13. 참조 보기를 통해 값이 설정되는 부분을 확인 => 봐도 한 눈에 파악이 안되니 일단 넘김
12. 다음 줄 TryTransition 함수를 확인
13. "인자로 들어온 Transitions를 foreach문으로 도네."
14. 첫번째 if문 확인
15. "TransitionCommand가 뭔지 정확히 모르겠지만 여기에 무슨 값이 할당되어 있거나, 전이 조건을 만족하지 못하면 넘어가는구나"
16. 두번째 if문은 내용 그대로 이해
17. ChangeState 함수 확인
18. "stateDatasByLayer가 뭐지? currentStateDatasByLayer가 있으니까 이건 Layer에 있는 모든 StateData를 담고 있나보다."
19. 참조 보기를 통해 값이 설정되는 부분을 확인 => AddState 함수
20. "아, 추가되는 State의 Type을 Key 값으로 StateData가 만들어져서 stateDatasByLayer에 추가되는구나"
21. ChangeState 함수로 복귀
22. "그래서 인자로 받은 State의 Type을 Key 값으로 넣는구나! 해당 State를 가진 StateData를 찾아오려고~" => 로직의 일부를 이해
23. 그 다음 ChangeState 함수를 확인
24. "이전 State의 Exit 함수를 실행하고, 다음 State의 Enter 함수를 실행하고."
25. "결국은 'Transition 중에 Command가 없고, 조건이 맞는 Transition이 있으면 해당 Transition이 가진 ToState로 전이한다'는거네."
26. Update 함수로 복귀
27. "결론은 뭔지 모를 anyTransitions와 currentStateData의 Transitions 중 전이한게 있으면 continue로 넘어가는거구나."
28. "continue로 안넘어가면 현재 State의 Update 함수를 실행하네"
29. "종합하면 State가 Update를 하다 전이 조건이 맞으면 전이를 하는데, 전이할 때 현재 State는 Exit 함수를 호출하고 다음 State는 Enter 함수를 호출하는구나."
30. "아까 State는 AddState에서 추가하는걸 봤는데 Transition은 어디서 추가하는거야?"
31. StateData의 Transitions를 참조 보기하여 Transition을 추가하는 MakeTransition 함수로 이동
32. "아 이렇게 Transition이 추가되는구만"
33. "아까 이해가 안된 anyTransition을 설정하는 부분도 다시 봐야겠다."
34. "이제 이해가 되네, 얘는 현재 State가 뭐든 간에 일단 무조건 먼저 확인하는 Transition들이구나"
이렇게해서 기본적인 로직을 대강 파악합니다. 다음은 예제 코드가 있으면 예제 코드를 하나씩 정의 보기하면서 이해를 해가면 됩니다.
예를 들어 TestStateMachine을 본다면 AddStates 함수가 어디서 실행되는지 확인하고, 안에 있는 AddState 함수의 정의를 다시 한번 보면, "아! Setup에서 아까 본 변수들에 State들이 등록이 되는구나"라는걸 이해할 수 있습니다. MakeTransitions도 마찬가지입니다. 똑같은 방법으로 Test Code를 보면 알지 못했던 TransitionCommand의 사용 방법도 알게 될겁니다.
예제 코드가 없다면 Setup 함수부터해서 아래로 안본 함수들을 보면서 어떤 역활을 하는지, 어떤 로직으로 움직이는지를 Update 함수를 볼 때와 똑같이 파악합니다.
다 파악이 되면 전체 로직이 어떻게 흐르는지 코드를 따라가보면서 한번 정리를 합니다.
다음 파악한 로직을 직접 구현해보고, 생각이 안나면 다시 참고한 코드를 보고, 다시 로직을 이해하고 직접 구현해보고를 반복해서 숙달시킵니다.
내가 AssetStore에서 구매한 InventorySystem이 어떻게 구현됐는지 알고싶다 하시면 똑같은 방식으로 로직을 파악하시면 됩니다. Inventory에서 가장 중요한 Add 함수를 보면서 로직을 이해하고, 뭔지 모를 변수가 있으면 참조 보기를 통해 해당 변수가 설정되는 부분을 보고, Item Class가 어떤 식으로 만들어져있는지 변수와 프로퍼티를 슥 훓어보고. 예제 코드를 정의 보기하면서 전체 로직을 이해하고. 핵심을 먼저 파악한 뒤 부가적인 것들을 보는거죠.
지금은 아직 훈련이 안되셔서 로직을 파악하시는데 시간이 오래걸리고 힘드시겠지만, 충분히 훈련이 되시고 로직 작성에 대한 지식이 늘어나시면, 슥 보면서 "음~이런 느낌이구만"식으로 로직을 빠르게 파악할 수 있게 되실겁니다.
실무로 가시면 주구장창 봐야하는게 타인의 코드이기 때문에 로직을 파악하는 훈련을 해두시면 실무에서 큰 도움이 되실겁니다.
감사합니다.
답글
최성호
2024.04.18정말 정성스러운 답변 감사드립니다.
코드 분석의 디테일한 순서와 함께 설명해주시니 실제로 이런 느낌으로 시작하는구나 하고 희미하게나마 알 수 있었습니다. 또한, 부족한 제 실력에 대해 위로가 되고 동기부여가 됐습니다.
다시 한 번 정성스러운 답변에 감사드립니다.