본문 바로가기
유니티 공부/C# 문법

C# - Try패턴(TryLoad,TryParse등)에서 out 사용시 null을 조심하자!

by 코딩하는 돼징 2025. 4. 24.
반응형

 분명히 모든 변수를 초기화를 했는데 계속 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 체크와 조건 분기를 필수로 해주는 것이 좋다.

 

반응형

댓글