Learning
When: 1학년 26일
How:
저번에 Object 클래스의 메서드를 공부하다가 MemberwiseClone() 메서드가 객체의 얕은 복사본을 반환한다는 것을 알았습니다. 그런데 MyClass b = a; 이 코드와 얕은 복사본을 대입하는 것과 헷갈렸기 때문에 제대로 알기 위해 공부하게 되었습니다.
Understanding:
- 설명 : 아래의 코드를
클래스는 참조 형식이기 때문에 아래의 코드처럼 m2의 필드를 바꾸면 m1의 필드도 바뀌는데,
정확히 말하면 m2와 m1이 같이 참조하고 있는 객체가 바뀐 것이기 때문에 이런 상황이 생깁니다.
지금 쓴 m2 = m1; 이라는 코드가 얕은 복사를 하는 코드입니다. 위의 int 타입의 변수가 복사되어 b를 바꿔도
a는 변하지 않는, 즉 값이 2개 생긴 복사가 깊은 복사이고,
하나의 값을 2개의 변수가 참조하게 되는 복사가 얕은 복사입니다.
int a = 1;
int b = a;
b = 10;
Console.WriteLine(a); // 1 출력 (깊은 복사)
MyClass m1 = new MyClass("Hello");
MyClass m2 = m1;
m2.str = "Bye";
Console.WriteLine(m1.str); // Bye 출력 (얕은 복사)
- MemberwiseClone() 메서드
MemberwiseClone() 메서드는 새로운 객체를 만드는데, 그 객체의 필드를 호출한 객체와 같게 합니다.
즉 참조만 복사하는 얕은 복사와 다르게, MemberwiseClone()은 객체를 새로 만들기 때문에
이 객체의 값을 변경해도 호출한 객체의 필드는 그대로입니다. 하지만 여기서 참조 형식의 필드는 얘기가 다른데,
객체를 새로 만들고 그 필드를 같게 할 때, 필드의 스택에 있는 값을 그대로 새로 만든 객체에 붙여 넣기 하는
방식이기 때문에 참조 형식의 필드를 새로 만들지는 않습니다. 말이 좀 어렵지만 결론만 말씀드리면
MemverwiseClone() 메서드로 만든 객체의 int형 변수를 바꾸면 호출한 객체의 변수는 변하지 않지만,
참조 형식의 필드를 바꾸면 호출한 객체의 필드에도 영향이 갑니다. 그리고 이렇게 새로운 객체를 만들어 필드를
그대로 붙여 넣기 하는 것 또한 얕은 복사라고 부릅니다.
Result: 저도 둘 다 얕은 복사라고 부를 줄을 몰랐는데, 계속 검색을 해봐도 "얕은 복사는 참조를 복사하는 방식이다.
라는 말과 "MemberwiseClone() 메서드는 얕은 복사를 하는 메서드이다." 라는 말이 나와서 참 헷갈렸습니다.
'C#' 카테고리의 다른 글
| [C#] 패턴 매칭 (프로퍼티, 괄호) (0) | 2025.08.28 |
|---|---|
| [C#] 패턴 매칭 (형식, 선언, 상수) (1) | 2025.08.28 |
| [C#] object 타입 (0) | 2025.08.25 |
| [C#] 튜플 (0) | 2025.08.24 |
| [C#] 식 본문 멤버 (0) | 2025.08.23 |