1. 리플렉션이란?
C#에서 리플렉션은 런타임에 프로그램이 자체 구조를 검사하고 조작할 수 있는 강력한 기능입니다. 리플렉션은 어셈블리의 유형, 클래스, 메서드, 속성 및 기타 멤버에 대한 메타데이터를 얻고 해당 메타데이터를 기반으로 동적 작업을 수행할 수 있는 방법을 제공합니다.
2. 리플렉션의 특징
메타데이터 액세스: 리플렉션을 사용하면 런타임에 프로그램의 유형 및 멤버에 대한 메타데이터 정보에 액세스할 수 있습니다. 메타데이터에는 클래스 이름, 메서드 서명, 속성 이름, 속성 정보 등과 같은 세부 정보가 포함됩니다.
유형 검색: 리플렉션을 사용하면 어셈블리 내에서 유형을 동적으로 검색하고 분석할 수 있습니다. 클래스, 인터페이스, 구조체, 열거형 및 해당 멤버(메서드, 속성, 필드, 이벤트 등)에 대한 정보를 검색할 수 있습니다.
동적 인스턴스화: 리플렉션을 사용하면 컴파일 시점에 유형을 알 수 없는 경우에도 유형의 인스턴스를 동적으로 생성할 수 있습니다. 리플렉션을 사용하여 객체를 인스턴스화하고, 메서드를 호출하고, 프로퍼티에 액세스할 수 있습니다.
멤버 액세스 및 호출: 리플렉션을 사용하면 타입의 멤버(메서드, 프로퍼티, 필드 등)에 동적으로 액세스하고 호출할 수 있습니다. 런타임 정보를 기반으로 메서드 정보를 검색하고, 속성 값을 설정하고, 필드 값을 가져오고, 메서드를 호출할 수 있습니다.
속성 검사: Reflection은 유형, 메서드, 속성 및 기타 멤버와 관련된 속성을 쿼리하고 분석할 수 있는 기능을 제공합니다. 속성 인스턴스를 검색하고, 속성을 검사하고, 속성 메타데이터를 기반으로 작업을 수행할 수 있습니다.
어셈블리 조작: 리플렉션을 사용하면 런타임에 어셈블리를 검사하고 조작할 수 있습니다. 어셈블리를 동적으로 로드하고, 유형을 열거하고, 인스턴스 생성, 메서드 호출, 속성 액세스 등 다양한 작업을 수행할 수 있습니다.
동적 코드 생성: 리플렉션을 사용하면 런타임에 코드를 동적으로 생성할 수 있습니다. 유형을 생성하고, 메서드, 프로퍼티 및 기타 멤버를 동적으로 정의하고, IL(중간 언어) 명령어를 방출하여 코드를 동적으로 빌드하고 실행할 수 있습니다.
동적 메서드 호출: 리플렉션을 사용하면 컴파일 시점에 메서드를 알 수 없는 경우에도 메서드를 동적으로 호출할 수 있습니다. 메서드 정보를 검색하고, 매개변수를 지정하고, 런타임 데이터를 기반으로 메서드를 호출할 수 있습니다.
3. 리플렉션 예제
다음은 리플렉션을 사용하는 방법에 대한 몇 가지 예시입니다:
1. 동적으로 메서드 생성 및 호출. 다음 코드는 메서드를 동적으로 생성하고 호출합니다:
// Create a method delegate
Func<int, int> add = (x, y) => x + y;
// Invoke the method
int result = add(10, 20);
2. 유형 시스템 검사하기. 다음 코드는 Person 클래스의 모든 프로퍼티 이름을 가져옵니다:
// Get the type of the Person class
Type personType = typeof(Person);
// Get the names of all the properties
IEnumerable<string> propertyNames = personType.GetProperties().Select(p => p.Name);
3. 유형 시스템 조작하기. 다음 코드는 Person 클래스를 상속하는 새 유형을 만들고 여기에 새 속성을 추가합니다:
// Create a new type that inherits from Person
Type newType = personType.MakeGenericType(new[] { typeof(string) });
// Add a new property to the new type
PropertyInfo nameProperty = newType.GetProperty("Name");
nameProperty.SetValue(null, "John Doe");
4. 결론
리플렉션은 런타임에 타입 시스템을 검사하고 동적으로 조작하는 데 사용할 수 있는 강력한 도구입니다. 메서드를 동적으로 생성 및 호출하고, 타입 시스템을 검사하고, 타입 시스템을 조작하는 등 다양한 용도로 사용할 수 있습니다. 그러나 리플렉션은 타입 안전을 우회하는 데 사용될 수 있으므로 신중하게 사용하는 것이 중요합니다. 또한 정적 코드에 비해 약간의 성능 오버헤드가 발생한다는 점에 유의해야 합니다. 마지막으로 리플렉션은 성능에 영향을 미칠 수 있고 코드를 더 복잡하고 이해하기 어렵게 만들 수 있으므로 신중하고 신중하게 사용해야 합니다.
'공부 > C#' 카테고리의 다른 글
C#으로 작성된 디자인 패턴 (0) | 2023.06.18 |
---|---|
구조체(Struct)와 클래스(Class)의 개념과 차이 (0) | 2023.06.13 |
람다식(Lambda)이란? (0) | 2023.06.10 |
C#에서 클래스(Class)와 구조체(Struct)의 차이점 (0) | 2023.04.07 |
평면과 구의 충돌을 어떻게 판단하는가? (0) | 2023.03.17 |