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();
}
}
}
}
출처
[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 |