본문 바로가기

C#/기본 문법

C# Reflection(리플렉션)

C# Reflection과 Attribute 정리

1️⃣ Reflection (리플렉션)

사전적 의미

  • Reflection : 자기 성찰, 반영
  • 즉, 자기 자신을 돌아보고 분석한다는 의미를 가집니다.

C#에서의 의미

프로그램이 런타임에 자기 자신의 구조를 분석하는 기술

 

리플렉션을 사용하면 다음과 같은 정보에 접근할 수 있습니다.

  • 타입(Type)
  • 필드(Field)
  • 메서드(Method)
  • 프로퍼티(Property)
  • 어트리뷰트(Attribute)
Type type = typeof(Player);
FieldInfo[] fields = type.GetFields();

비유로 이해하기

Reflection은 X-Ray처럼 객체 내부를 들여다보는 기술

 

일반적인 코드에서는 알 수 없는
객체 내부 구조를 실행 중에 확인할 수 있습니다.


2️⃣ Attribute (어트리뷰트)

사전적 의미

  • Attribute : 속성, 특성

어떤 대상이 가지는 부가적인 정보를 의미합니다.


C#에서의 의미

코드에 메타데이터(추가 정보)를 부여하는 문법

 

어트리뷰트는 다음 대상에 붙일 수 있습니다.

  • 클래스
  • 필드
  • 메서드
  • 프로퍼티
[Obsolete]
public void OldMethod() { }

⚠️ 중요한 점은

어트리뷰트는 그 자체로 동작하지 않는다는 것입니다.


3️⃣ Reflection과 Attribute의 관계

Reflection과 Attribute는 단독으로도 사용되지만,
함께 사용될 때 진짜 의미를 가집니다.

Attribute  →  정보(표식)
Reflection →  그 정보를 읽는 도구
if (field.IsDefined(typeof(SerializeField), false))
{
    // 어트리뷰트 기반 처리
}

Unity의 [SerializeField], [ContextMenu] 같은 기능도
이 구조를 기반으로 동작합니다.


정리

  • Reflection : 프로그램이 자기 자신을 분석하는 기술
  • Attribute : 코드에 붙이는 속성(메타데이터)
  • 두 개념은 함께 사용될 때 강력해진다

한 줄 요약

Reflection은 코드를 들여다보는 도구이고,
Attribute는 들여다볼 정보를 코드에 표시하는 방법이다.

 

 

 

 

 

 

 

전체 코드


 

using System;
using System.Reflection;

namespace Rookiss_CSharp
{
    // https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1?srsltid=AfmBOopkXVxKs-MQPYZkTjEYW-yIDMO5xP7l5hQq0hQasUWhobvyKO6N
    // 61강 Reflection(리플렉션)

    // Reflection : X-Ray처럼 객체 내부를 들여다보는 기술
    // 리플렉션을 활용하면 런타임에 클래스가 갖고 있는 정보(필드, 메서드 등)를 분석할 수 있음
    // 유니티에서는 Reflection과 Serialization을 사용하여 Inspector에서 에디터 및 플레이 중에 필드 정보와 값을 표시하고 값을 수정할 수 있음
    // 그러나 언리얼엔진에서는 C++에 표준 Reflection이 없기 때문에 UHT와 매크로 기반의 자체 Reflection 시스템을 사용하여 빌드 타임에 메타데이터를 생성하고 에디터/런타임에서 활용함

    // Attribute : 컴퓨터가 런타임에 체크할 수 있는 주석임

    // Reflection, Attribute => 툴을 개발 할때 특히 유용

    class Important : Attribute
    {
        string message;

        // 생성자
        public Important(string message) { this.message = message; }
    }

    class Program
    {
        class Monster
        {
            // [Important]
            // public int hp;

            // 인자 받는 타입이면 () 안에 인자 넣어주면 됨
            [Important("Very Important")]
            public int hp;

            protected int attack;
            private float speed;

            void Attack() { }
        }

        static void Main(string[] args)
        {
            Monster monster = new Monster();

            // C#에서 나오는 개체들은 모두 object에서 파생되어 GetType()이 존재함
            // Object 클래스에는 밑에 함수들이 존재함
            // Equals(Object objA, Object objB);
            // ReferenceEquals(Object objA, Object objB);
            // Equals(Object obj);
            // GetHashCode();
            // GetType();
            // ToString();
            // MemberwiseClone();

            // 클래스명, 맴버변수, 함수 정보 등 모든 정보를 가지고 있음
            Type type = monster.GetType();
            FieldInfo[] fields = type.GetFields(BindingFlags.Public 
                | BindingFlags.NonPublic
                | BindingFlags.Static
                | BindingFlags.Instance);
            
            foreach (FieldInfo field in fields)
            {
                string access = "protected";
                if (field.IsPublic)
                    access = "public";
                else if (field.IsPrivate)
                    access = "private";

                // single => float
                Console.WriteLine($"{access} {field.FieldType.Name} {field.Name}"); // ex) protected Int32 attack

                // field에 attribute 설정한 정보 확인 가능
                /*
                [Important("Very Important")]
                public int hp;
                */
                var attributes = field.GetCustomAttributes();
            }
        }
    }
}

 

 

 

 

 

 

 


 

 

 

출처


https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1?srsltid=AfmBOopkXVxKs-MQPYZkTjEYW-yIDMO5xP7l5hQq0hQasUWhobvyKO6N

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문| Rookiss - 인프런 강

현재 평점 4.9점 수강생 6,987명인 강의를 만나보세요. 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요

www.inflearn.com

61강 Reflection(리플렉션)

 

'C# > 기본 문법' 카테고리의 다른 글

C# Nullable(널러블)  (1) 2025.12.14
C# Exception(예외처리)  (0) 2025.12.14
C# lambda(람다)  (0) 2025.12.14
C# Event(이벤트)  (0) 2025.12.14
C# Delegate(대리자)  (0) 2025.12.14