본문 바로가기

로그라이크

리팩토링 - 플레이어와 몬스터의 상위 추상 Character 클래스 만들기

이전 장에서 우리는 프리팹을 이용해 플레이어와 몬스터에 공통으로 쓰일 ObjectView를 만들어 보았습니다. 하지만 그 과정 중 우리는 ObjectView를 플레이어와 몬스터에게 각각 추가 해주어야 했고, SetPosition함수도 각각 수정해 주어야 했습니다. 이렇게 공통점이 많은 클래스를 각각 만들어 관리하게 된다면 공통 기능에 대한 수정이 필요한 경우 양쪽 클래스 모두를 수정해줘야 한다는 불편함이 따라 옵니다. 여기에서 우리에게 필요한 것은 '추상화'와 '상속'입니다. 공통 기능을 상위 클래스 작성하여 상속을 통해 각 하위 클래스에서 사용할수 있도록 하고, 각 클래스 별 필요한 기능들에 대해서는 하위 클래스에서 개별적으로 정의 합니다. 이렇게 작성된 코드들을 보다 유지 보수가 편리하도록 변경하는 작업을 '리펙토링'이라고 부릅니다.


이번 장에서는 플레이어와 몬스터 클래스를 리팩토링하여 앞으로 닥칠 변경 사항들에 대해 보다 유연하게 대처할 수 있는 구조를 만들어 보도록하겠습니다. 처음 부터 완성되어 있는 설계와 코드는 없습니다. 물론 축적된 경험에 의해 필요를 미리 예상하여 시행 착오 없이 유연성 있는 코드를 처음 부터 작성하는 것이 가능하긴 합니다. 하지만 시행 착오도 하나의 배움의 과정이라고 생각합니다. 이 포스팅에서는 필요한 클래스를 별다른 설계 없이 먼저 작성해보고 추후 그 코드를 수정하여 보다 가독성이 높고 변경에 대해 편리하게 대응할 수 있는 구조로 변경해 나가는 방식으로 진행 될 것입니다.


먼저 플레이어와 몬스터의 속성을 살펴 보도록 하겠습니다.

  • 플레이어 - 위치, HP, 스테미너, 공격력, 방어력, 속도, 디스플레이 정보, 레벨, 경험치
  • 몬스터 - 위치, HP, 스테미너, 공격력, 방어력, 속도, 디스플레이 정보,몬스터 이름

공통 속성으로는 위치, 가시거리, HP, 스테미너, 공격력, 방어력, 속도가 있고 각각의 개별 속성으로는 레벨, 경험치, 몬스터의 이름 정도가 있습니다. 그리고 더 살펴보면 SetPosition함수도 플레이어와 몬스터가 동일한 역할을 합니다. 그럼 공통 속성을 정의하고 있는 Character 클래스를 정의해보도록 하겠습니다.

<Character.cs>

이제는 Player 클래스와 MonsterData 클래스가 Character 클래스의 속성들을 상속 받게 합니다. 부모 클래스로 부터 상속 받는 속성들을 자식 클래스에서 지워 줍니다.

<Player.cs>

<MonsterData.cs>

위 두 클래스에서 멤버 변수들의 많은 부분과 SetPosition 함수가 삭제 되었습니다. 남아 있는 부분들은 각 자식 클래스에만 필요한 부분, 예를 들면 플레이어와 몬스터의 디스플레이 정보를 셋팅하는 부분, 몬스터의 고정 정보를 참조하는 변수 부분, 플레이어의 이동에 관련된 부분만 남아 있습니다. 코드의 많은 부분이 재사용 가능하도록 변경 되었고 앞으로 두 클래스에 공통적인 변경이 필요한 경우 두 클래스에 각각 수정을 할 필요 없이 Character 클래스 하나만을 수정함으로써 두 클래스 모두에게 영향을 줄 수 있습니다.


유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!