Unity/팁

[Unity] 참조 타입의 매개 변수 전달

turbulence93 2025. 7. 23. 21:56

1. 문제 상황

C#에서 참조 타입을 메서드 인자로 넘길 때,

  • 내부 값이 변경되는 건 적용되는데
  • 참조 자체를 바꾸면 원본에는 적용되지 않는 이유가 헷갈렸음.
void ReplaceList(ref List<int> list)
{
    void ModifyList(List<int> list)
{
    list.Add(10);           //원본 리스트에 반영됌
    list = new List<int>(); //원본 리스트와 무관함
}
}

 


2. 원인 분석

  • C#에서 **참조 타입도 기본적으로 값 전달(pass-by-value)**이다.
  • 즉, 메서드로 전달될 때는 참조값(주소)이 복사되어 전달됨.
  • list → 주소 값을 전달 → 내부 값은 접근 가능
    • 참조된 객체의 내부 값을 변경하는 것은 주소에 접근하는 것이기 때문에 내부 값을 변경이 적용됌
  • list → list를 덮어 씌움 → 참조 주소가 변경 됌
    • 주소 자체가 변경됐기 때문에 원본과의 연결이 끊어짐

3. 해결 방법

  • 참조 자체를 변경하고 싶을 때는 ref 키워드를 사용해야 한다.
void ReplaceList(ref List<int> list)
{
    list = new List<int> { 99 }; // 원본 참조 자체가 바뀜
}

4. 개인적인 생각
 

참조 타입이라고 해서 항상 "원본이 바뀐다"고 생각하면 안 된다는 걸 확실히 알게 됐다.
참조값도 결국 값으로 전달되므로, 원본에 반영하고 싶다면 ref나 out을 써야 함을 다시 한 번 체감했다.
특히 Unity 개발 중 컬렉션, 오브젝트 교체 등에서 이 차이를 헷갈리지 않도록 주의하자.