도드넷
C# 객체복사 MemberwiseClone - 잠깐 List 는 안된다고? 본문
C# 객체복사 MemberwiseClone
아니 잠깐, List는 복사가 안된다고?
wtf?
C# 에서 객체를
B = A 로 설정하면
A.name = "트와일라잇";
하면
자동으로
B.name = "트와일라잇";
가 된다.
바로 주소(레퍼런스) 복사가 일어나기 때문이다.
편할때도 있고 귀찮을때도 있다.
C# 객체복사 = 연산의 기본값은 언제나 주소(레퍼런스)복사임을 명심하자.
이때 사용하는게 MemberwiseClone 함수를 이용한 Shallowcopy 다.
B = A.ShallowCopy();
해주면
A.name = "트와일라잇"; 해도
B.name 이 자동으로 변하지않는다.
MemberwiseClone를 사용하면
new 를 한후 수많은 프로퍼티를 = = = = = 하면서 노가다로 복사하지 않아도
자동으로 프로퍼티 값만 복사해주는 간단하고 편한 객체 복사 방법이다.
(프로퍼티 추가시에도 수정필요없어서 넘 좋음)
하지만
List 는 복사하지 못한다.
하더라도 주소복사가 일어난다.
즉 다른 프로퍼티들은 정상적으로 레퍼런스가 끊긴 독립적 상태인데
List 타입의 프로퍼티들만 여전히 옛 주인님에게 종속된 형태를 띈다.
!
이게 무슨 말이냐 하면
킹갓꿀 MemberwiseClone 함수를 사용해도
A.좋아하는_음식_목록 = {사과, 배, 오이};
라고 하면
자동으로 B.좋아하는_음식_목록 = {사과, 배, 오이}; 가 되버린다는 말이다.
해법
아예 ShallowCopy 함수에서 새로운 객체를 만들고 거기에서 List를 새로파서 전달한다.
다행히 이렇게 하면 레퍼런스 연결이 끊어짐 -_-;
리스트 레퍼런스 끊는 방법은 단하나다.
= new List<T>
MemberwiseClone 가 편하긴 하지만 List는
그대로 레퍼런스 복사가 일어난다.
고로 만약 ShallowCopy 해야하는 객체에 List 프로퍼티가 있다면
ShallowCopy 함수에 새로운 리스트를 만들어서 반환하도록 수정해야한다.
(ㄹㅇ귀찮;;; List 프로퍼티 하나 추가시 ShallowCopy 코드 고쳐야됨 ㅡㅡ)
'창고 > 게임 개발 [Hidden]' 카테고리의 다른 글
C# enum 인덱스로 접근하기, enum 길이? (Feat. Enum 랜덤뽑기) (0) | 2020.09.03 |
---|---|
모바일 게임 최적화 - 개발에 있어서 매우 주의해야할 사항 (0) | 2020.08.25 |
C# List 알파벳순 정렬, 한글 문자순 정렬 - 생각보다 쉽네? (0) | 2020.08.20 |
유니티 안드로이드 인식, 폰 인식 안될때 - UnityException (0) | 2020.07.30 |
유니티 오브젝트 풀링 테크닉 V2 - Advanced Object Pooling V2 (0) | 2020.07.28 |