[C#] 리플렉션(Reflection)

JanMatny·2024년 10월 31일
0

C#

목록 보기
7/15

리플렉션(Reflection)

리플렉션을 배우기 앞서 간단하게 프로세스 구조를 먼저 설명하겠다.

프로세스 구조

  • AppDomain : 프로세스 내부에 독립적인 실행환경을 제공해서 서로 충돌하지 않도록 보호한다.
  • 모듈 : 어셈블리 내의 코드 및 데이터 단위, 하나의 모듈을 하나의 EXE 또는 DLL 파일을 나타낸다.
    • 모듈은 파일이라고 생각하면 편하다. [ 파일 단위 ]

AppDomain - Modules(모듈)

  • GetAssemblies() : GetAssemblies()를 호출하면 해당 AppDomain이 가지고 있는 어셈블리들을 전부 다 가져올 수 있다.
  • GetModules() : GetModules()`를 하면 해당 어셈블리가 가지고 있는 모듈을 가지고 올 수 있다.

BindingFlag

검색할 때 검색 조건, 검색 동작을 제외하는 플래그.

Flags

1. Public : public으로 선언된 맴버들을 검색
2. NonPublic : private, protected 등 비공개 맴버 검색
3. Instance : 인스턴스 맴버 공개
4. Static : 정적(static) 맴버 검색
5. DeclaredOnly : 상속받은 맴버 제외, 해당 클래스에서
6. IgnoreCase : 맴버 이름 대소문자 구분없이 검색


리플렉션(Reflection)

리플렉션(Reflection)은 코드에서 타입의 정보를 동적으로 조회하고 조작할 수 있는 기능이다.
이 기능들을 사용하여 런타임에 클래스, 메소드, 속성 등과 같은 메타데이터를 확인하고, 객체를 생성하거나 메서드를 호출하는 등의 작업을 수행할 수 있다.

리플렉션의 주요 구성 요소

  1. Assembly(어셈블리) : 어셈블리는 .NET에서 코드의 배포 단위이다. 리플렉션을 통해 어셈블리의 정보를 조회할 수 있다.
  2. Type : 클래스, 인터페이스, 열거형 등과 같은 타입에 대한 정보를 담고 있다. Type 클래스를 사용하여 타입의 메서드, 속성, 필드 등을 조회할 수 있다.
  3. MemberInfo : 필드, 메서드, 속성 등 타입의 맴버에 대한 정보를 제공한다.
  4. MethodInfo : 메서드에 대한 정보를 제공한다. -> 메서드의 이름, 반환 타입, 매개 변수 등의 정보를 얻을 수 있다.
  5. PropertyInfo : 속성에 대한 정보를 제공한다.

리플렉션의 장점과 단점

장점

  • 동적 타입 확인 및 객체 생성이 가능하다
  • 플러그인 아키텍쳐와 같은 유연한 설계 가능하다

단점

  • 성능 저하 : 리플렉션은 정적 타입보다 느리다
  • 컴파일 타임 오류를 런타임 오류로 만들 수 있다

결론

리플렉션은 C#에서 매우 좋은 도구이지만, 사용 시 성능과 유지 보수성을 고려해야 하기에 필요한 경우에만 사용하는 것을 추천한다.


자주 쓰는 메서드(Method)

1. GetConstructors()

  • 설명 : 생성자 목록 반환
  • 반환 타입 : Constructioninfo[]

2. GetEvents()

  • 설명 : 이벤트 목록 반환
  • 반환 타입 : EventInfo[]

3. GetFields()

  • 설명 : 필드 목록 반환
  • 반환 타입 : FieldInfo[]

4. GetGenericArguments()

  • 설명 : 형식 매개변수 목록 반환
  • 반환 타입 : Type[]

5. GetInterfaces()

  • 설명 : 인터페이스 목록 반환
  • 반환 타입 : Type[]

6. GetMembers()

  • 설명 : 맴버 목록 반환
  • 반환 타입 : MemberInfo[]

7. GetMethods()

  • 설명 : 메소드 목록 반환
  • 반환 타입 : MethodInfo[]

8. GetNestedTypes()

  • 설명 : 내장 형식(중첩 클래스) 목록 반환
  • 반환 타입 : Type[]

9. GetProperties()

  • 설명 : 프로퍼티 목록 반환
  • 반환 타입 : PropertyInfo[]

그 외의 메서드
GetType() : 런타임에 인스턴스 자료형(타입)을 가져올 때 사용
Type.GetType() : 런타임에 문자열로 타입 정보를 가지고 온다
어셈블리 전체를 대상으로 찾음, 문자열에 전체 네임스페이스 포함

profile
코딩 공부용 벨로그

0개의 댓글