관리 메뉴

도드넷

C# 객체복사 MemberwiseClone - 잠깐 List 는 안된다고? 본문

창고/게임 개발 [Hidden]

C# 객체복사 MemberwiseClone - 잠깐 List 는 안된다고?

도드! 2020. 8. 21. 15:03




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 코드 고쳐야됨 ㅡㅡ)










반응형
Comments