구조체와 클래스의 복사

강성원·2023년 11월 29일
0

C# 끄적끄적

목록 보기
3/11
post-thumbnail

구조체와 클래스는 복사에서 차이가 나타난다.

구조체는 원본 구조체를 복사할 경우 깊은 복사가 되며,
클래스는 얕은 복사로 같은 대상을 참조하게 된다.

구조체 복사

이처럼 구조체를 복사하면 복사된 변수의 값을 바꿔도 원본에는 아무 일도 일어나지 않는다.

왜 깊은 구조체는 깊은 복사가 디폴트로 되게 했을까?


클래스 복사

얕은 복사


참조형 변수는 힙에 올라가있는 객체를 가리키고 있다.

위와 같이 복사를 하면 힙 영역에 올라간 객체의 주소를 복사할 뿐이다.

힙 영역에 올라간 객체를 두 변수가 같이 바라보고 있는 것이다.

복사된 참조자를 통해 값을 바꾸면 원본 참조자를 통해 보았을 때 바뀐 객체가 보일 수 밖에 없다.

깊은 복사

해결책은 깊은 복사를 진행하는 것.
여느 언어들 처럼 깊은 복사를 담당하는 메서드를 만들어주자.
똑같은 내용을 가진 새로운 객체를 반환해주는 Clone 메서드를 선언한다.
그리고 호출해주면 같은 내용을 가진 새로운 객체를 가지게 되고 깊은 복사가 잘 되는 것을 알 수 있다.


클래스의 깊은 복사, 얕은 복사는 C++과 다를 것이 없는 듯 하다.


잡설

  • 클래스를 참조하는 변수는 애초에 힙 영역에 있는 주소를 담은 참조형이라서 ref니 out같은 키워드가 필요가 없다.
    C++때 공부한 것 잘 기억하자. new 키워드는 힙 영역에 새로 할당해서 주소를 반환해주는 녀석이다. (C#에서 구조체는 제외다.)
profile
개발은삼순이발

0개의 댓글