본문 바로가기
Unity/c#

6. C# 값 복사와 참조 복사

by RongBee 2023. 9. 8.

C#의 모든 자료형은 값 또는 참조 두 가지로 분류된다.

 

static void Main(string[] args)
{ 
    int a = 10;
}

static void Main(string[] args)
{
    Random rand = new Random();
}

 

a 10
rand 0x01
객체 rand의 주소 0x01

 

이렇게 int, float 등 기본 자료형은 값, 클래스로 만들어진 인스턴스(객체)는 참조

 

메서드의 매개변수로 값과 참조 전달 시 큰 차이가 발생한다.

 

class Program
{
    static void Change(int input)
    {
        input = 20;
    }
    
    static void Main(string[] args)
    {
        int a = 10;
        Change(a);
        Console.WriteLine(a);
    }
}

 

이렇게 a에 10이 들어있고, Change 함수에 a를 매개변수로 넘기면 10이라는 값이 나온다.

 

즉 원본 a의 값이 변경되지 않았다.

 

하지만 클래스를 통한 참조 형식은 다르다.

 

class Program
    {
        class Test
        {
            public int value = 10;
        }
        static void Change(Test input)
        {
            input.value = 20;
        }
        static void Main(string[] args)
        {
            Test test = new Test();
            test.value = 10;
            Change(test);

            Console.WriteLine(test.value);

        }
    }

 

이 코드의 출력 결과는 20이 나온다.

 

test라는 인스턴스를 생성하여 test 클래스의 필드의 멤버변수를 10이라고 한 후 Change 변수에 

 

test 인스턴스를 참조하여 value가 20이 된다.

 

즉  Change 함수의  input변수는 메인 함수의 test인스턴스와 같은 공간을 가리킨다.

 

이렇게 값의 복사와 참조에 따라 원본의 결과가 달라지기도 그래도 되기도 한다.

 

static void Main(string[] args)
{
    Test testA = new Test();
    Test testB = testA;

    testA.value = 10;
    testB.value = 20;

    Console.WriteLine(testA.value);
}

 

이런 식으로 간단하게 값을 참조할 수 있다.

 

 

댓글