본문 바로가기
Engine/Unity3D

C# 프로퍼티에서 주의할 점

by 황금표정 2019. 7. 9.

원래는 C#에서의 문제이지만 유니티에서 주로 C#을 사용하니 이쪽에 적어둡니다.

예전에 유니티로 처음 작업했을 때도 겪었던 문제인데 C#의 프로퍼티 기능을 처음 써보면서 생겼던 문제입니다.

프로퍼티는 set, get 함수를 자동으로 만들어주는 C#의 편리한 기능인데 보통 아래와 같은 형태입니다.

public int Index
{
    get;
    set;
}

일반적으론 이렇지만 set, get, 함수는 확장할 수 있습니다.

private int _Index;
public int Index
{
    get
    {
        return _Index;
    }

    set
    {
        _Index = value;
    }
}

그런데 여기서 중요한 게..

private int _Index;
public int Index
{
    get
    {
        return Index; // 이 부분
    }
    set
    {
        _Index = value;
    }
}

주석한 부분에서 엄청난 문제가 발생할 수 있습니다. 차이점은 private 변수로 선언한 _Index을 리턴하는 것이 아닌 프로퍼티 Index 자신을 리턴 시키는 것입니다.
만약 위와 같이 한다면 실제로 동작하는 것은 Inddex를 리턴하려고 Index의 get을 호출하고 그 get안에서 다시 Index을 리턴하려 하고 하니 get 호출되는 무한 루프가 되어버립니다.

 

컴파일에서는 해당사항은 잡히지가 않습니다. 그래서 유니티상에서 실행할 때는 멀쩡하게 잘되는 상황이 되고 저 코드를 호출했을 경우 크래시 리포트가 남지 않는 형태로 앱 또는 에디터가 다운되어버립니다. 로그 한 줄도 남지 않죠..

 

저는 해당 에러로 이틀을 소모했습니다. 이틀이나 걸린 이유는 이전에 작업한 코드를 다른 프로젝트에 다시 작업하게 되면서 해당 부분을 리팩터링 하다가 실수를 저지른 것이었죠. 아마 저 부분만 작업했다면 원인은 금방 파악했을거예요

 

이런 에러 사항이 있었다고 기억하고자 기록차 남깁니다.

반응형