본문 바로가기
Programming/C#

C# 값 복사와 참조 복사 데이터 전송의 기본 개념

by Dev_카페인 2024. 6. 9.
반응형

[C#] 값 복사와 참조 복사: 데이터 전송의 기본 개념

안녕하세요! 이번 포스트에서는 C#의 값 복사와 참조 복사에 대해 알아보겠습니다. 이 두 개념은 데이터가 어떻게 전달되고 저장되는지를 이해하는 데 매우 중요합니다. 이를 통해 코드의 동작을 예측하고 버그를 피할 수 있습니다.

값 형식(Value Types)과 참조 형식(Reference Types)

C#에서는 데이터 타입이 값 형식과 참조 형식으로 나뉩니다.

  • 값 형식: 변수에 실제 데이터 값을 저장합니다. 기본 데이터 타입(int, double, char, struct 등)은 모두 값 형식입니다.
  • 참조 형식: 변수에 데이터가 저장된 메모리 주소를 저장합니다. 객체, 배열, 문자열 등은 참조 형식입니다.

값 복사 (Value Copy)

값 형식 변수를 다른 변수에 할당하면 실제 데이터가 복사됩니다. 즉, 두 변수는 독립적인 값을 갖습니다.

 
int a = 10;
int b = a; // b에 a의 값이 복사됩니다.
b = 20;

Console.WriteLine(a); // 10
Console.WriteLine(b); // 20

참조 복사 (Reference Copy)

참조 형식 변수를 다른 변수에 할당하면 데이터의 메모리 주소가 복사됩니다. 즉, 두 변수는 동일한 객체를 참조하게 됩니다.

class Person
{
    public string Name;
}

Person person1 = new Person { Name = "Alice" };
Person person2 = person1; // person2는 person1과 동일한 객체를 참조합니다.
person2.Name = "Bob";

Console.WriteLine(person1.Name); // Bob
Console.WriteLine(person2.Name); // Bob

위 예시에서 person1과 person2는 동일한 Person 객체를 참조합니다. 따라서 person2의 Name을 변경하면 person1의 Name도 변경됩니다.

값 복사와 참조 복사의 차이점

  • 값 복사: 실제 데이터를 복사하여 두 변수 간의 독립성을 유지합니다.
  • 참조 복사: 데이터의 메모리 주소를 복사하여 두 변수가 동일한 객체를 참조하게 합니다.

복사 생성자와 얕은 복사 (Shallow Copy)

얕은 복사는 객체의 필드 값을 새로운 객체에 복사합니다. 이 경우, 객체 내부의 참조 형식 필드는 여전히 동일한 객체를 참조합니다.

class Person
{
    public string Name;
    public Address Address;
}

class Address
{
    public string City;
}

Person person1 = new Person { Name = "Alice", Address = new Address { City = "New York" } };
Person person2 = (Person)person1.MemberwiseClone(); // 얕은 복사
person2.Name = "Bob";
person2.Address.City = "Los Angeles";

Console.WriteLine(person1.Name); // Alice
Console.WriteLine(person1.Address.City); // Los Angeles

위 예시에서 person2는 person1의 얕은 복사본입니다. person2의 Name을 변경해도 person1의 Name에는 영향을 미치지 않지만, Address 필드의 City는 동일한 객체를 참조하므로 person1과 person2 모두 변경됩니다.

깊은 복사 (Deep Copy)

깊은 복사는 객체와 객체가 참조하는 모든 객체를 재귀적으로 복사하여 완전히 독립적인 복사본을 생성합니다.

class Person
{
    public string Name;
    public Address Address;

    public Person DeepCopy()
    {
        Person other = (Person)this.MemberwiseClone();
        other.Address = new Address { City = this.Address.City };
        return other;
    }
}

Person person1 = new Person { Name = "Alice", Address = new Address { City = "New York" } };
Person person2 = person1.DeepCopy();
person2.Name = "Bob";
person2.Address.City = "Los Angeles";

Console.WriteLine(person1.Name); // Alice
Console.WriteLine(person1.Address.City); // New York

위 예시에서 person2는 person1의 깊은 복사본입니다. 따라서 person2의 Address 필드를 변경해도 person1의 Address에는 영향을 미치지 않습니다.

마치며

이번 포스트에서는 C#의 값 복사와 참조 복사에 대해 알아보았습니다. 이러한 개념을 이해하면 객체와 데이터를 더 효과적으로 다룰 수 있으며, 코드의 동작을 정확히 예측할 수 있습니다. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!

반응형