얕은 복사 ( Shallow Copy ) vs 깊은 복사 ( Deep Copy )
얕은 복사 ( Shallow Copy )
객체의 필드 값만 복사하고 , 참조형 필드가 가리키는 객체는 복사하지 않는다
원본과 복사본이 같은 참조형 객체를 공유하게 된다
▼예시 코드
class Person
{
public string Name;
public Address Addr;
}
class Address
{
public string City;
}
Person p1 = new Person { Name = "HoChan", Addr = new Address { City = "Seoul" } };
Person p2 = p1; // 얕은 복사
p2.Addr.City = "Incheon";
Console.WriteLine(p1.Addr.City); // 결과: InCheon
- 복사본의 참조형 필드를 변경하면 원본에도 반영된다.
깊은 복사 ( Deep Copy )
객체의 모든 필드 ( 값형 + 참조형 ) 을 새로 복사하여 원본과 독립적인 객체를 생성한다
원본 수정 시 복사본에 영향을 주지 않는다
▼예시 코드
class Person
{
public string Name;
public Address Addr;
public Person DeepCopy()
{
return new Person
{
Name = this.Name,
Addr = new Address { City = this.Addr.City }
};
}
}
- 내부의 참조형까지 새로 만들어주는 점이 핵심이다.
주의사항
- 얕은 복사를 사용할 때 , 참조형 필드가 많으면 원본 - 복사본 간의 의도치 않는 데이터 공유가 발생할 수 있다
- 깊은 복사는 안전하지만 성능 비용이 높다 ( 복사 대상이 많을수록 메모리 / 시간 낭비 )
- IClonealbe 인터페이스의 Clone( ) 구현 시 , 어떤 복사 ( 얕은 / 깊은 ) 인지 명시해야 한다.
정리
얕은 복사는 주소를 공유하고 , 깊은 복사는 객체 자체를 복제한다