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 개발 중 컬렉션, 오브젝트 교체 등에서 이 차이를 헷갈리지 않도록 주의하자.
'Unity > 팁' 카테고리의 다른 글
| [Unity] Unity로 멀티 스레드 사용하기 (1) | 2025.08.04 |
|---|---|
| [Unity] 파티클 크기 변경하기 (0) | 2025.07.10 |
| [Unity] Animation Override Controller (0) | 2025.07.04 |
| [Unity] Interface 구현에 Public 선언을 하지 않는 이유 (0) | 2025.05.06 |
| [Unity] 알고 있으면 좋은 세팅 (1) | 2025.05.01 |