프로그래밍 학습/C#

volatile 한정자와 접근 한정자(access modifier) 확인하기

cocodv1 2023. 12. 26. 13:08
  • System.Reflection : 메타데이터를 검사하여 관리 코드에서 어셈블리, 모듈, 멤버, 매개 변수 및 기타 엔터티에 대한 정보를 검색하는 형식이 포함 된 네임스페이스입니다.
  • 메타데이터: 데이터에 대한 데이터, 데이터에 관한 구조화된 데이터라는 의미입니다.

volatile 한정자

  • 해당 변수가 컴파일러 최적화에 의해 재배치되지 않도록 지정, 해당 변수를 항상 메모리에서 읽거나 쓰도록 보장

접근 한정자 확인하기

class Program
{
    private int number = 3;
    public string word = "Test";
    protected double primeNumber = 0.1;
    public static void Main(string[] args)
    {
        Program pg = new Program();

        // 접근 한정자를 확인
        FieldInfo fieldInfo = pg.GetType().GetField("number", BindingFlags.NonPublic | BindingFlags.Instance);
        DisplayAccessModifier(fieldInfo);

        fieldInfo = pg.GetType().GetField("word", BindingFlags.NonPublic | BindingFlags.Instance);
        DisplayAccessModifier(fieldInfo);

        fieldInfo = pg.GetType().GetField("primeNumber", BindingFlags.NonPublic | BindingFlags.Instance);
        DisplayAccessModifier(fieldInfo);

    }

    static void DisplayAccessModifier(FieldInfo fieldInfo)
    {
        if (fieldInfo != null)
        {
            Console.WriteLine($"변수명: {fieldInfo.Name}");
            Console.WriteLine($"접근 한정자: {GetAccessModifier(fieldInfo)}");
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine("정보를 찾을 수 없습니다.");
        }
    }

    static string GetAccessModifier(FieldInfo fieldInfo)
    {
        if (fieldInfo.IsPrivate) 
        {
            return "private";
        }
        else if (fieldInfo.IsPublic)
        {
            return "public";
        }
        else if (fieldInfo.IsFamily)
        {
            return "protected";
        }
        else
        {
            return "unknown";
        }
    }
}

 

 

⁉️ 위 코드에서 public은 구분하지 못하는 문제가 발생하는데

이유는 BindingFlags에 Public이 따로 존재하기 때문이다.

 

public string word를 확인하는 코드에 BindingFlags.Public만 추가하면 간단히 해결된다.

 

fieldInfo = pg.GetType().GetField("word", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            DisplayAccessModifier(fieldInfo);