DataDefinition 클래스에서 아이템, 몬스터 등 전반적인 정보를 초기화 해두고
필요할 때 받아와 사용 중이다.
앞으로 진행할 작업상 아이템을 중복으로 소유할 수 있다.
이를 고려해서 아이템도 1개만 존재하지 않고 여러 개를 구매할 수 있도록 변경했다.
인벤토리에 동일한 장비가 여러 개 있을 때 그 아이템 중 하나를 착용하면
동일한 아이템 모두를 착용한 것처럼 표시가 된다.
착용한 아이템은 DataDefinition에 Items 배열에 저장된 객체이다.
관리를 효율적으로 하기 위해서 Items 배열에 아이템마다 하나씩 만들어둔 것이다.
이제 상점에서 이 하나의 아이템을 참조해서 플레이어에게 넘겨준다.
원리로 따지자면 플레이어는 하나의 아이템에 대해 여러 번의 참조를 진행하는 것이다.
그러니 아이템 착용 여부에서 특정 아이템과 착용 중인 아이템이 동일한 지 비교할 때
모두 True가 나올 수 밖에 없다.
해결책으로 생각한 것은 복제본을 만드는 것이다.
하나를 참조했다면 구매나 획득 시, 그 아이템을 복제해서 인벤토리에 넣어주면 된다.
복제를 위해서 ICopyable 인터페이스를 만들어 상속해주었다.
이렇게 만든 Copy 함수는 자기 자신의 데이터를 반영한 복제본을 반환해줄 것이다.
드디어 빛을 발하는구나 디자인패턴
신나게 객체 복사를 구현하고 나니 드는 생각이 있었다.
아... new 해줬는데... 이거 파괴해야하나?
이거 C#이라서 그냥 둬도 될 거 같은데... GC가 어찌해주지 않나...?
이러고 그냥 넘어가면 언젠가 반드시 큰 문제로 다가온다.
그래서 간단하게 구글링을 해보았다.
new로 만들어진 객체들은 메모리 자원을 할당받아 계속 공간을 차지하고 있다.
만약 누구도 이 아이템을 참조하지 않는다면?
C, C++에서 이는 메모리 누수의 원인이 된다.
사용이 끝난 객체는 반드시 delete 해주는 이유가 이것이다.
하지만 C#에서는 GC가 메모리를 관리해주기 때문에 비교적 덜 번거롭다.
아무도 참조하지 않는 객체는 GC가 특정 상황이 되면 제거한다.
일반적인 객체들은 GC가 자동 관리한다.
이번 프로젝트에서는 참조 관리만 잘해준다면 따로 삭제할 필요가 없다.
단, 파일, DB, 네트워크 등은 별도로 Dispose 과정을 거쳐야한다.
https://dhshin94.tistory.com/135
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL
이 TIL보고 드는 생각은 저희 팀도 아이템 중복 소유 이슈가 발생할 것 같다는 느낌적인 느낌이 드네요