Programing/C#

C# 프로그래밍의 기초 : 복사(값)와 참조

유니얼 2024. 3. 1. 23:39
728x90

C# 프로그래밍에서 데이터 타입은 크게 값 타입(Value Type)과 참조 타입(Reference Type)으로 구분됩니다. 이 두 타입은 데이터의 저장 방식, 전달 방식, 복사 방식이 서로 다르며, 이러한 차이점을 이해하는 것은 프로그램의 효율성과 안정성을 보장하는 데 필수적입니다.

값 타입(Value Type)

값 타입은 데이터를 직접 저장합니다. 정수형(int), 부동 소수점(float, double), 구조체(struct) 등이 여기에 해당합니다. 값 타입의 변수를 다른 변수에 할당하면 데이터의 복사본이 생성되며, 이는 서로 독립적인 메모리 공간에 저장됩니다. 따라서, 하나의 변수 값을 변경해도 다른 변수에는 영향을 미치지 않습니다.

예시: 값 타입

int a = 10;
int b = a; // 'a'의 값을 'b'에 복사. 'a'와 'b'는 독립적인 메모리 공간을 가짐.
b = 20; // 'b'의 값을 변경해도 'a'에는 영향 없음.
Console.WriteLine(a); // 출력: 10

참조 타입(Reference Type)

참조 타입은 메모리 내의 객체나 데이터 구조를 가리키는 참조(주소)를 저장합니다. 클래스(class), 배열(array), 인터페이스(interface) 등이 참조 타입에 속합니다. 참조 타입의 변수를 다른 변수에 할당하면, 원본 데이터의 주소가 복사되므로 두 변수는 같은 객체나 데이터 구조를 가리키게 됩니다. 이로 인해 한 변수를 통해 객체를 변경하면 다른 변수를 통해서도 변경된 상태를 볼 수 있습니다.

예시: 참조 타입

Car car1 = new Car();
car1.model = "Honda";
Car car2 = car1; // 'car1'의 참조(주소)를 'car2'에 복사. 'car1'과 'car2'는 같은 객체를 가리킴.
car2.model = "Ford"; // 'car2'를 통해 객체의 'model'을 변경하면, 'car1'을 통해서도 변경된 값을 볼 수 있음.
Console.WriteLine(car1.model); // 출력: Ford

전체코드

using System;

class Program
{
    class Car
    {
        public string model;
        public void Drive()
        {
            Console.WriteLine(model + " is driving.");
        }
    }

    static void Main(string[] args)
    {
        // 값 타입 예시
        int a = 10;
        int b = a; // 'a'의 값을 'b'에 복사한다. 'a'와 'b'는 독립적인 메모리 공간을 가진다.
        b = 20; // 'b'의 값을 변경해도 'a'에는 영향을 미치지 않는다.
        Console.WriteLine(a); // 출력: 10

        // 참조 타입 예시
        Car car1 = new Car();
        car1.model = "Honda";
        Car car2 = car1; // 'car1'의 참조(주소)를 'car2'에 복사한다. 'car1'과 'car2'는 같은 객체를 가리킨다.
        car2.model = "Ford"; // 'car2'를 통해 객체의 'model'을 변경하면, 'car1'을 통해서도 변경된 값을 볼 수 있다.
        Console.WriteLine(car1.model); // 출력: Ford
    }
}

 

복사와 참조의 중요성

값 타입과 참조 타입의 이해는 데이터를 어떻게 저장하고, 전달하며, 복사할지 결정하는 데 중요합니다. 특히, 프로그램의 성능 최적화와 메모리 관리 측면에서 중요한 역할을 합니다. 또한, 객체의 상태 변경을 의도한 대로 관리할 수 있도록 해줍니다.

결론

값 타입과 참조 타입은 각각의 사용 사례와 장단점이 있습니다. 프로그램의 요구 사항과 특성에 따라 적절한 타입을 선택하여 사용하는 것이 중요하며, 이를 통해 프로그램의 유연성과 효율성을 높일 수 있습니다. C#과 같은 객체 지향 언어에서 이러한 개념의 정확한 이해는 효과적인 프로그래밍을 위한 기초가 됩니다.

반응형