공부/C#

리플렉션(Reflection)이란?

셩잇님 2023. 6. 10. 18:33
반응형

 

 

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. 결론

리플렉션은 런타임에 타입 시스템을 검사하고 동적으로 조작하는 데 사용할 수 있는 강력한 도구입니다. 메서드를 동적으로 생성 및 호출하고, 타입 시스템을 검사하고, 타입 시스템을 조작하는 등 다양한 용도로 사용할 수 있습니다. 그러나 리플렉션은 타입 안전을 우회하는 데 사용될 수 있으므로 신중하게 사용하는 것이 중요합니다. 또한 정적 코드에 비해 약간의 성능 오버헤드가 발생한다는 점에 유의해야 합니다. 마지막으로 리플렉션은 성능에 영향을 미칠 수 있고 코드를 더 복잡하고 이해하기 어렵게 만들 수 있으므로 신중하고 신중하게 사용해야 합니다.

 

 

반응형