내일배움캠프/TIL

내일배움캠프 15일차 TIL - 얕은 복사, 깊은 복사

서보훈 2024. 10. 4. 20:56

팀 프로젝트 발표후, 실수한 부분을 눈치채고 기록합니다.

 

 

상점에서 아이템을 구매하면 인벤토리 클래스에서 AddItem 함수를 호출하고, 상점 아이템의 정보를 넘겨줍니다.

 

인벤토리에서는 아이템 정보를 받고, 받아준 아이템을 인벤토리 배열에 추가하게 됩니다.

 

이 경우, 문제가 하나 발생하게되는데, 인벤토리에 들어오는 아이템이 기존 생성되있던 아이템 클래스 객체를 참조한다는것 입니다.

 

상점의 아이템 정보는 아이템 데이터베이스 클래스에서 생성된 객체를 참조하고, 상점은 이 객체를 참조하여 자신의 판매 아이템 리스트에 저장하게 됩니다.

상점에서는 아이템의 기본 정보를 보여주는 역할을 하기 때문에 큰 문제가 없지만, 플레이어가 상점에서 아이템을 구매하면 문제가 발생합니다.

 

플레이어가 아이템을 구매하고 플레이어 인벤토리에 들어간 아이템은 아이템 데이터베이스의 객체의 정보를 사용하게 됩니다.

이 경우, 인벤토리의 아이템 정보가 변경될경우, 아이템 데이터베이스의 정보가 변경되는 문제가 발생합니다.

 

이러한경우를 얕은 복사라고 하며 객체의 정보를 참조하여 사용하는형태 입니다.

 

이런경우를 방지하기 위해 깊은 복사를 사용해줄 필요가 있습니다.

깊은 복사의 경우, 아이템 의 객체를 복제하여 별개의 객체를 생성한 후, 넘겨주는 방식입니다.

이 경우 아이템 데이터베이스 리스트의 아이템1과 인벤토리의 아이템 1은 같은 정보를 가지고 있지만, 객체가 다르기 때문에 서로의 정보에 영향을 주지 못하게 됩니다.

 

따라서 상점에서 아이템을 구매시, 아이템 객체 자체를 복제하여 넘겨줄 필요가 있습니다.

단, 이경우 현재 아이템은 IItem 인터페이스로 만들어져있으며, 타입에 따라 하위 클래스로 나누어둔 상태입니다.

그렇기 때문에 아이템 타입에 따라서 아이템 클래스를 나누고, 그 정보를 따로 저장해줄 필요가 있습니다.

 

이 부분을 해결하기 위해서 생성자를 통해 만들어주는 아이템 정보를 모두 IItem 인터페이스로 만드는등의 수정이 필요해 보입니다.