반응형
참조 형식 변수의 전달
클래스 형식의 지역 변수를 메서드의 매개 변수로 전달하는 상황을 생각해 보자
우리는 해당 메서드에서 매개 변수로 전달된 클래스의 필드를 변경할 수 있다.
그리고 변경된 정보는 지역 변수에 그대로 수정되어 있는 상태이다.
그런데 어떤 이유로 인해 메서드로 전달받은 클래스의 참조를 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에 잘 나와있다.
메서드 변수로 전달된 참조는 참조에 대한 액세스를 전달할 뿐 실제 참조 주소값 그 자체는 아니라는 것이다.
다시 말해 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#] 배열/리스트/스팬 비교 (Array/List/Span) (0) | 2023.12.26 |
---|