본문 바로가기

C# 프로그래밍/코드 레벨업

[C#] 참조 변수를 매개변수로 전달했을 때 null로 변경할 수 없는 이유

반응형

참조 형식 변수의 전달

클래스 형식의 지역 변수를 메서드의 매개 변수로 전달하는 상황을 생각해 보자

우리는 해당 메서드에서 매개 변수로 전달된 클래스의 필드를 변경할 수 있다.

그리고 변경된 정보는 지역 변수에 그대로 수정되어 있는 상태이다.

 

그런데 어떤 이유로 인해 메서드로 전달받은 클래스의 참조를 null로 한다면 어떻게 될까?

 

public class Example : MonoBehaviour
{
    Test test1 = new Test();

    void Start()
    {
        SetNull(test1);
        Debug.Log(test1);
    }

    public void SetNull(Test test)
    {
        test = null;
    }
}

public class Test
{
    public string Name { get; set; }
}

 

결과는 그 클래스는 null이 되지 않는다. (물론 매개 변수 자체는 null이 된다.)

간단하게 생각하면 test1은 SetNull을 통해 null이 되어야 할 것 같지만, 로그를 찍어보면 객체는 여전히 존재한다.

그 이유가 무엇일까?


Null이 되지 않는 이유

정확한 이유는 MSDN에 잘 나와있다.

MSDN 설명

 

메서드 변수로 전달된 참조는 참조에 대한 액세스를 전달할 뿐 실제 참조 주소값 그 자체는 아니라는 것이다.

다시 말해 test1 자체를 전달하는 것이 아닌, test1의 주소에 대한 포인터를 전달하는 것이다.

따라서 주소값의 포인터를 null로 변경할 뿐 실제 test1은 null이 되지 않는다.

 

참고 문서

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/method-parameters

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/methods

 

메서드 - C# 프로그래밍 가이드 - C#

C#의 메서드는 일련의 문을 포함하는 코드 블록입니다. 프로그램은 메서드를 호출하고 인수를 지정하여 문을 실행합니다.

learn.microsoft.com

 

반응형