2025.12.31

박민재 (Daype)·2025년 12월 31일

오늘의 구현 목표 : 오브젝트 풀링 방식을 이용하여 몬스터 객체 다뤄보기

구현설계 : 생성단계에서 미리 몬스터들을 생성하고 몬스터에게 Active 상태를 부여해서
true일때 실체생성 능력치할당을 하고 false가 될경우 사망한것으로판정 실제론 파괴되지않음
몬스터를 초기화

본격구현 :

기존 코드에서는 생성자에서 능력치를 부여해준다. 하지만 이렇게되면 생성자는 객체가 생성될때 호출이되기 때문에 매번 몬스터를 파괴하고 새로 만들어주어야한다 우리는 지정된 레벨까지 같은 몬스터지만 능력치만 다른 케이스 이기 때문에 생성자에서 해주던 작업을 분류해주기로했다.

몬스터 객체는 점점 늘어날 수 있지만 모든 몬스터가 spawn 과 die는 필요함으로 인터페이스에 구현을 먼저해주고 자식클래스에서 오버라이딩 해줄것이다.


이후 생성자에서 필요한건 몬스터의 이름이기때문에 이름만 초기화해주고 플레이어 캐릭터의 상태에따라 능력치가 변화하기때문에 spawn 함수가 호출될때마다 몬스터의 상태를 체크하여 죽어있는 상태라면 부활시키고 능력치를 해당기준으로 재할당 시킨다. 이후 몬스터를 살아있는 형태로 바꾸어준다. 이렇게 구현할경우 예상한대로 오브젝트 자체는 파괴되지않고 지속적으로 사용 미사용 상태변화단계가 될것이다. 이후 제대로 작동하는지 확인을 위해 테스트를 해야한다.

구현부에 이러한 형태로 monster 클래스 타입의 벡터를 만든다음 해당 클래스를 상속받는 자식클래스들을 생성해서 한꺼번에 관리를 하려고 했으나, 이과정에서 Monster 클래스는 추상클래스이기때문에 인스턴스화가 안되는 오류에 마주쳤다. 이후 해결방법을 모색하기위해 튜터님을 찾아갖고 튜터님께서 포인터,인스턴스,인스턴싱 키워드 3개를 힌트로 주셨다. 힌트를 얻은다음에 해당내용으로 검색을 해보니 추상클래스는 인스턴스화가 안되지만 포인터로 가르키는것은 가능하다라는 사실을 깨달았다. 이후,
벡터의 타입을 클래스포인터형식으로 바꾼다음 몬스터 포인터 클래스를 생성해 각 자식클래스들을 동적할당 해주었다 이렇게 한다음에 벡터에 푸쉬를 해주니 오류가 생기지 않았고 이어서

랜덤 함수를 이용해 객체를 랜덤으로 생성이 가능했다.



해당결과처럼 랜덤으로 나오는것을 확인할 수 있었다.

이어서 해당내용으로 랜덤으로 나온 몬스터를 게임매니저 클래스로 전달을 해주어야하는데
다른클래스로 전달해주기 위해서 몬스터스포너 클래스를 생성해서 전달해주는방법으로 구현할예정이다.
예상 구현그림은 해당 멤버함수를 가진 스포너 클래스가있고, 게임매니저 클래스의 몬스터 생성 함수에서 스포너의 spawn 함수를 호출하게되면 랜덤을 돌려서 나온 최종 몬스터의 정보를 전달만 하는 그림이다. 이렇게 구현을할경우 결속력을 낮게 할 수 있을거같다. 이후 함수 내부를 구현하기위해 cpp 파일에서 작성해주는데 cpp 파일을 작성하는도중 문득 생각이들었다. 사용해야하는 클래스가 겹치거나 동일할경우 필요한 헤더파일을 헤더에서선언을해야할까 cpp에서 선언해야할까 정해진 규칙이있을까? 문득 생각이들어 헤더파일을 선언하는 규칙이있는지 튜터님께 도움을 받았는데 실제로 현업이나 실무에서도 위와 같은 상황이벌어질경우 순환참조가 발생할 수 있기때문에 되도록이면 참조해야하는 헤더파일 같은경우, 가능한 cpp에서 구현을 하고, 헤더파일에서 상속을하거나, 변수로 사용하는 등 직접적인 해당헤더의 값이 필요할경우 어쩔 수 없이 선언해서 사용하는것으로 알려져있다고 가르쳐 주셨다. 그렇다면, <>로 들어가는 헤더파일도 마찬가지일까 라는 생각이들어 해당내용은 직접 검색을해보았는데, <>같은경우는 라이브러리 참조이기때문에 순환참조가 발생할수없어서 신경쓰지않는다는 사실을 알아내었다. 다시 돌아와서 이러한 이유때문에 보통 필요한내용을 전방선언을 해서 사용한다는 사실도 알았는데 전방선언은 class name* 타입으로 클래스내에 멤버변수로 선언하게되면 헤더파일이 없더라도 있는것처럼 만들어서 사용하겠다는 뜻이된다. 이후 cpp파일에서 헤더파일을 선언해서 내부구현을 해주면 순환참조해결 컴파일속도향상 같은 이점도 챙겨올 수 있는것이다.

해당 내용을 바탕으로 cpp파일을 구현했다.

이제 또다른 몬스터 객체가 생겨난다고하더라도 cpp파일에 추가해주기만하면 게임매니저에서는 수정이 필요없는 결속력은 낮지만 응집도가 높은 케이스가 탄생했다고 생각한다.

테스트를 해보기위해 임시적으로 게임매니저를 구현해주었다.


마찬가지로 전방선언을 이용하여 헤더파일 순환참조를 방지해주었고

메인구현부에서 게임매니저를 소환해 값을 넘겨주게 되면

랜덤으로 몬스터가 랜덤 능력치를 지닌체로 스폰이 된다. -완료-

0개의 댓글