brunch

You can make anything
by writing

C.S.Lewis

[코딩삼국지] #10 징병과 모병

들어가는 글: 우와! 드디어 10번째 글입니다. 

깃헙 링크: https://github.com/yudong80/coding-samguk/commit/43e0fad70fea0d1f4c50bb617bd4bca49261d7aa 


1. 징병과 모병 기능 


오늘은 군사를 모으는 기능을 구현합니다. 

징병은 군역이 있는 시민들을 병사로 징집하는 것이며, 

모병은 돈을 주고 용병을 고용하는 것입니다. 


징병과 모병 기능


당연히 모병이 비싸겠죠? 


징병의 경우 실험을 해보니, 

1) 무력이 중요함 (최대 2명의 장수, 무력 최대 200) 

2) 최대 징병수는 15,000명 

3) 병사 1명당 금 0.1 , 군량 1이 필요 

4) 실제 징병수는 100이하에서 올림 (예, 계산후 14,150명 => 14,200명) 


모병의 경우 

1) 매력이 중요함 (최대 2명의 장수, 매력 최대 200) 

2) 최대 모병수는 15,000명 

3) 병사 1명당 금 0.4 , 군량 2이 필요 => 엄청 비쌈!! 

4) 실제 모병수는 100이하에서 버림 (예, 계산후 8,750명 => 8,700명) 


2. 구현 방법 


한마디로 징병과 모병은 로직은 같고 필요한 변수만 다른 구조입니다. 

결국 병사를 모으는 것이니까요. 


파일: coding.samguk.Province.java 

메서드: requestDraftArmy() , draftArmy() 

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/Province.java 


왜 2개로 나누었을까요? 

1) requestDraftArmy()는 무력과 지방의 자원을 고려한 최대 징병수를 반환합니다. 

2) draftArmy()는 실제로 징병하고 필요한 지원을 소모합니다. 


한편 모병의 경우도 비슷합니다. 위의 두 코드와 모양이 비슷합니다. 

파일: coding.samguk.Province.java 

메서드: requestRaiseArmy() , raiseArmy() 

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/Province.java 


보시면 새로운 클래스 이름이 보입니다. 

바로 GeneralUtils 와 ArmyUtils 클래스에 대해 알아봅니다. 


3. GeneralUtils 코딩 


Province와 General 클래스가 자꾸 커집니다. 

한 클래스는 응집력을 높이기 위해 관련성이 강한 것들로 잘 분산해두어야 합니다. 

클래스가 필요이상 커지면 가독성이 떨어지고 오류의 가능성이 늘어납니다. 


GeneralUtils 클래스는 General 클래스를 보좌하는 유틸리티 클래스입니다. 

현재는 static 메서드들만 포함하고 있습니다. 


파일: coding.samguk.GeneralUtils.java

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/GeneralUtils.java


첫번째는 총 전투력을 , 두번째는 총 매력을 계산하여 반환합니다. 

물론 이 메서드들이 Genera.java 클래스에 있어도 됩니다. 

그런데 왜 분리할까요? 잘 생각해보세요. 


4. ArmyUtils 코딩 


같은 방식으로 군대 관련 유틸리티 클래스를 만들었습니다. 

파일: coding.samguk.ArmyUtils.java

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/ArmyUtils.java


이 클래스는 꽤 기므로 세 부분으로 나눠서 봅니다. 


1) 상수 선언 


2) 징병 / 모병 주요 로직 

3) 보조 로직 : 올림 / 버림 관련 


5. 테스트 코딩 


위 로직이 정상동작하는지 확인합니다. 

파일: coding.samguk.AppTest.java 

깃헙 링크: https://github.com/yudong80/coding-samguk/blob/main/V0/src/coding/samguk/AppTest.java



FIXME는 왜 붙어 있을까요? 

>> 테스트 코드를 급하게 짜다보니 초기화하는 부분을 빼먹었는데요.. 

(이게 싱글턴 클래스여서..) 일단 테스트는 무조건 PASS 해야 하므로 

ProvinceNet.forceInitialize() 메서드를 만들었습니다. 

>> 나중에 고칠 예정입니다 ^^;; 


남아있는 TODO 들 


6. 테스트 결과 


테스트는 항상 PASS 해야 합니다. 


음.. 설명이 넘 부족한거 같은데 

다음에는 좀더 적어볼께요 ^_^ 


감사합니다. 

2021.8.31

매거진의 이전글 [코딩삼국지] #9 나머지 테스트 케이스
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari