• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

리스트의 복사에 관해 궁금한게 있는데요

22.10.05 15:42 작성 조회수 202

1

안녕하세요 루키스님. 강의 잘보고 있습니다.

보다가 의문점이 드는게 있어서요.

 

public List<Item> item = new List<Item>();

 

이런 리스트가 하나 있다고 했을때

Item items = item[0];

이렇게 할 경우 이게 얕은복사인가요? 아니면 참조에 해당되는건가요?

저 상태에서 items 를 수정하니 원래 리스트에 있던 item[0] 의 값도 같이 바뀌더라구요.

얕은복사 = 참조 처럼 제가 알고 있는데 다른건지..

그래서 이걸 객체? 를 새로 생성하는 걸로 다르게 해볼려고

public Item DeepCopyitem()

{

Item copy = new Item();

copy = item [0];

 

return copy;

}

return이 함수에게 값을 반환하는거니까 이렇게 하면 새롭게 생성이 될줄 알았는데 여전히 copy가 원래 있던 리스트의 값을 같이 수정해버리는겁니다..

 

그래서 그 후에는 아예

 

public Item DeepCopyitem()

{

Item copy = new Item();

copy.값 = item [0].값;

copy.값2 = item [0].값2;

copy.값3 = item [0].값3;

copy.값4 = item [0].값4;

copy.값5 = item [0].값5;

 

return copy;

}

이런식으로 하니까 그제야 원본에 있던 리스트 값이 수정이 되질 않더라구요..

근데 값이 막 수백개씩 되는데도 저렇게 하는게 맞는건지..?

저게 깊은복사가 맞는건지..?

검색을 해봐도 이렇다할 정보가 나오질 않아서 헷갈립니다..

제가 복사나 참조 개념을 헷갈리는걸까요?
또, 저런식으로 노가다..처럼 값을 넣어서 새롭게 객체를 만드는게 맞는 방법인가요?

 

답변 1

답변을 작성해보세요.

1

기본적으로 struct = 복사 , class = 참조입니다.
Item이 class라면, item[0] 즉 Item 또한 참조값으로
이리저리 넘기고 있으니 원본을 건드리는 것이죠.

그리고 굳이 아이템 값을 새로 '복사'해서 다시 작업할 특별한 기획이 없다면,
오히려 참조를 기반으로 건드리는 것도 성능상 나쁠 이유가 없습니다.

sehan님의 프로필

sehan

질문자

2022.10.05

답변 감사합니다.

Item 은 클래스로 구현해서 연습했었는데요.

 

그 안에는 Hp 나 중첩갯수를 기록하는 거 정도만 넣어놨습니다.

답변을 보니까 하나 더 궁금한게 생겨서요!

 

만약 게임을 만들어서 아이템을 구현하게 되면

물약 하나에 같은 물약 10개가 중첩이 되었고, 이걸 창고에 보관했을 경우

인벤토리에 새로 물약이 들어오면 당연히 10개는 창고에 보관했으니 인벤토리에 물약은 1개가 있어야하는데

클래스로 Item을 만들어서 참조하게 되면 ? 물약이 11개로 인식이 되잖아요? (물약의 중첩을 기억하는 것 역시 리스트에 값으로서 있다 했을시)

 

그러면 이런 경우는 클래스로 아이템을 만들기보다 struct 로 아이템을 만드는 게 맞는건가요?

아니면 제가 했던 무식한 방법인 값을 하나씩 다 복사해서 새롭게 만드는게 맞는건가요? 그래야만 물약이 각각 두개 (창고 하나, 인벤토리 하나) 존재하니까?

그게 아니라면 이런것도 뭔가 참조방식으로 하는게 맞는건가요?

보통은 아이템 별로 templateID를 두고
데이터시트에 맞게 아이템을 생성하는 코드를 만들어둡니다.
item에는 stackCount를 두고 10개, 11개 등 개수를 세면서
같은 애들은 아이템 횟수를 병합하는 식으로 작업하구요.
창고/인벤에 따라 아이템이 분리되는 경우에는 동일한 templateID에 해당하는
아이템을 다시 만든 다음 넣어주면 되겠죠.

struct/class는 뭐로 해도 사실 크게 상관없지만
전체적인 작업을 고려하면 class로 해서 참조값을 건드리는 (stackCount 증감)이 편하겠죠.

sehan님의 프로필

sehan

질문자

2022.10.05

와...정말 감사합니다!!!

모든게 한번에 이해가 되네요!!!!!!

마지막으로

창고/인벤에 따라 아이템이 분리되는 경우에는 동일한 templateID에 해당하는
아이템을 다시 만든 다음 넣어주면 되겠죠.

이부분은 제가 했던것처럼 일일이 값을 넣어주는 식으로 새로운 객체(아이템)를 만드는 것도 맞는 방법일까요?

Item copy = new Item();
copy.값 = item [0].값;

이런 느낌이긴 하되 어차피 '값' 부분은 하드코딩 하면 안 되고
데이터 파일 (excel, json, xml ..)로 빼서 파싱하는 형태로 만들어줘야 합니다.

sehan님의 프로필

sehan

질문자

2022.10.05

마지막까지 친절하고 상세한 답변과 조언 정말 감사드립니다!!!