[Unity] C# 접근 한정자 + 인스펙터에서 변수 확인하기 (Debug Mode)

2022. 2. 15. 23:30Game Development/Unity

 

C#의 접근 한정자(Access Modifier)

 

찾아보니, C#은 대략 다음과 같이 6개 종류 정도의 접근한정자(Access Modifier)가 있는 것 같다.

public class Test : MonoBehaviour           // 유니티에서 작성함
{
    public float publicVar;
    private float privateVar;
    protected float protectedVar;
    internal float internalVar;
    protected internal float ptItVar;
    private protected float prprVar;
}

 

.NET C# 가이드 문서를 보면 다음과 같이 설명이 되어 있다.

여기서 "동일한 어셈블리 내에 있는" 이런 문장은 같은 프로젝트 파일 내에 있다라고 이해해도 좋을 것 같다.

/*  물론 정확하진 않지만 이해를 돕기 위해  */

 

  • public  :  동일한 어셈블리 내 또는 다른 어셈블리에서도 접근이 가능
  • private  :  같은 클래스 또는 구조체 내부에서만 접근 가능
  • protected  :  같은 클래스 또는 해당 클래스의 자식 클래스에서만 접근 가능
  • internal  :  동일한 어셈블리 내에서만 접근 가능
  • protected internal  :  동일한 어셈블리 내 또는 다른 어셈블리에서 해당 클래스의 자식 클래스에서 접근 가능
  • privateprotected :  같은 클래스 내 또는 자식 클래스에서 접근 가능

 

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

 

  • 네임스페이스 내부에서 선언된 클래스, 구조체, 인터페이스의 디폴트 한정자는 internal
    • 인터페이스의 멤버는 public이 기본값이다.
    • enum의 멤버는 항상 public이며, 어떤 접근 한정자도 사용할 수 없다.
  • 클래스와 구조체의 멤버에 대한 디폴트 한정자는 private
  • 델리게이트는 클래스나 구조체처럼 동작하기 때문에 네임스페이스에서 직접 선언 시엔 internal, 그 안에 있는 클래스 같은 곳에 선언될 시에는 private
  • 자식 클래스는 기본적으로 부모 클래스보다 높은 수준의 접근 제한을 걸 수 없다.
    • 예를 들어, internal로 선언한 부모 클래스의 자식 클래스는 public으로 선언할 수 없음

 

 

Unity의 인스펙터에서 변수 값 확인하기

 

  • Unity에서는 클래스 내부의 public으로 선언된 변수들을 인스펙터 창에서 확인이 가능하며 값 변경도 가능하다.
  • 따라서, 디버깅할 때 굉장히 유용하다.
  • 하지만 그 외 나머지 private, protected 등으로 선언된 변수는 인스펙터에 나타나지 않는다.

public 멤버만 나타난다.

 

이런 제한된 변수들을 인스펙터에서도 확인할 수 있는 방법이 있다.

 

 

Unity 디버그 모드 활용하기

 

인스펙터에서 디버그 모드로 변경을 하면 숨겨진 내부 변수들까지 확인이 가능하다. 단, 수정은 안 된다.

 

디버그 모드 적용 전
디버그 모드 적용 후

 

 

[SerializeField] 애트리뷰트 사용하기

 

[SerializeField] 애트리뷰트를 사용하면 private, protected 멤버도 인스펙터에서 접근할 수 있게 된다.

접근 한정자의 효력도 유지되고, 인스펙터에서도 접근이 가능하기 때문에 이 방법을 추천한다.

public class Test : MonoBehaviour
{
    [SerializeField]
    private float privateVar;

    [SerializeField]
    protected float protectedVar;
}

 

 

애트리뷰트에 대한 공부를 아직 못했기 때문에 이런 것이 있구나란 것만 알아뒀다.

나중에 공부해봐야지!

 

 

728x90
반응형