분명히 모든 변수를 초기화를 했는데 계속 NullReferenceException가 떴다.
원인을 찾아보자 하다가 TryLoad때문이라는 것을 알게되었다.
Try 사용시 null 조심!
아래와 같이 inventory리스트를 먼저 초기화했다고 가정해보자
void Main()
{
List<Item> inventory = new List<Item>();
if (TryLoad(out SaveData saveData, out List<Item> list))
{
inventory = list;
}
}
inventory도 미리 new List<Item>()으로 초기화했으니까 null 에러가 날 일이 없다고 생각하겠지만 실제로는 TryLoad() 함수 내부에서 이 값을 null로 덮어씌워졌기 때문에 이후 코드에서 inventory를 참조하게 되면 NullReferenceException이 발생하게 된다.
TryLoad 함수 내부를 들여다보자
bool TryLoad(out SaveData data, out List<Item> inventory)
{
if (!File.Exists("save.json"))
{
data = null; // 실패 한 경우 null로 세팅
inventory = null;
return false;
}
// 파일이 있다면 로딩
data = LoadSaveData();
inventory = LoadInventory();
return true;
}
파일이 없거나 데이터가 유효하지 않은 경우에는 null을 대입하고 false를 반환한다. 이때 주의해야할 점은 out으로 받은 변수는 함수 안에서 무조건 값을 할당 받는데 그 값이 null일 수도 있다는 것이다.
즉 Main() 함수에서 미리 초기화한 inventory = new List<Item>()는 TryLoad()가 실패했을 때 inventory = null로 덮어 씌워지기 때문에 초기화가 무의미해져 버리는 것이다.
Try패턴(TryParse, TryLoad 등) 주의 사항
1. out으로 받은 값 실패시 값 꼭 확인 → null일수도 있음!
2. 초기화했더라도 Try 함수가 그 값을 덮어쓰기 때문에 안전하지 않다. → 실패했을때는 new로 다시 초기화해줘야한다.
결론
Try 함수는 안전하지만 null 관리까지 신경쓰는 것이 좋다. 참조형 (out List, out Class)등을 사용할 때는 성공/실패 여부에 따라 null 체크와 조건 분기를 필수로 해주는 것이 좋다.
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# - 클래스 상속과 다이아몬드 상속 문제 (0) | 2025.07.03 |
---|---|
C# - 정수 입력 받을때 Parse보다는 TryParse를 사용해서 예외처리까지 확실히! (0) | 2025.04.24 |
C# - 상태 패턴(State Pattern) (0) | 2024.05.07 |
C# - 전략 패턴(Strategy Pattern) (0) | 2024.05.07 |
C# - SOLID 원칙 (0) | 2024.05.06 |
댓글