16. Reflection & Attribute

 

- 객체 정보를 데이터화

: 프로그램 실행 중에 형식 이름, 프로퍼티 목록, 메소드 목록, 필드, 이벤트 목록 등 읽을 수 있다

 

- 리플렉션 다형성

: 읽어들인 형식의 인스턴스를 만들고 프로퍼티나 필드에 값을 할당하고, 메소드를 호출할 수 있다

 

- 리플렉션 내보내기

: 프로그램 실행 중에 새로운 형식을 만들어낼 수 있다

 

- 에트리뷰트

: 리플렉션 값 사용

16.1. Object.GetType()

: 객체의 메타데이터를 리턴한다.

 

- Object 클래스

: Object는 모든 데이터 형식의 조상

: 즉, 모든 Type 은 Object 형식이다.

 

- Object 클래스의 메서드

: 반드시 인스턴스 필요(클래스 X)

: Object.Equals( )

: Object.GetHashCode( )

: Object.GetType( )

: Object.ReferenceEquals( )

: Object.ToString( )

 

- Object.GetType( )

: Type information return

: 형식 이름, 소속된 어셈블리 이름, 프로퍼티 목록, 메소드 목록, 필드 목록, 이벤트 목록, 인터페이스의 목록 등

 

- System.Type

: 리턴된 Type Information 을 담는다.

- System.Reflection.BindingFlags 열거형

: public 항목만 조회, 비(非) public 항목만 조회, static 항목만 조회 등

16.2. 리플랙션 동적 생성

: 리플렉션으로 인스턴스를 만들고, 프로퍼티와 필드에 값을 할당하고, 메소드를 호출하는 방법

- 객체 생성

: System. Activator.CreateInstance( )

- 프로퍼티 가져오기

: PropertyInfo.SetValue(), : PropertyInfo.GetValue()

: Type.GetProperties( ): 모든 프로퍼티를 PropertyInfo 배열 저장

: Type.GetProperty("Name"): Name 에 해당하는 프로퍼티를 PropertyInfo 변수 저장

- 메서드 호출

: MethodInfo.Invoke(Instance, Arguments)

- 형식 내보내기

: System.reflection.Emit

: *~Builder와 ILGenerator

 

- 동적 생성 순서

.NET 프로그램의 계층 구조

① AssemblyBuilder를 이용해서 어셈블리를 만듭니다.

② ModuleBuilder를 이용해서 ①에서 생성한 어셈블리 안에 모듈을 만들어 넣습니다.

③ ②에서 생성한 모듈 안에 TypeBuilder로 클래스(형식)를 만들어 넣습니다.

④ ③에서 생성한 클래스 안에 메소드(MethodBuilder 이용)나 프로퍼티(PropertyBuilder 이용)를 만들어 넣 습니다.

⑤ ④에서 생성한 것이 메소드라면, ILGenerator를 이용해서 메소드 안에 CPU가 실행할 IL 명령들을 넣습니다.

16.3. Attribute

- 코드에 대한 부가 정보를 기록하고 읽을 수 있는 기능

 

- 주석

: 사람이 작성, 사람이 읽음

 

- 애트리뷰트

: 사람이 작성, 컴퓨터가 읽음

 

- Caller Information Attribute

: C# 5.0 버전

 

- 사용자 정의 에트리뷰트

: .NET - Obsolete, DLL(Dynamic Link Library) 호출 - [DLLImport], 조건부-[Conditional] 등

: 부가 정보이지 핵심 내용이 아니다

: 애트리뷰트도 하나의 클래스다

 

- System.AttributeUsage

: 애트리뷰트의 애트리뷰트

17. Dynamic

: dynamic 형식은 검사를 하는 시점이 프로그램 실행 중이다

 

17.1. Duck Timing

 

: 인터페이스, 추상과 동일한 기능

: 상속 관계를 이용하지 않기에 프로그램의 동작 부분만 수정 후 사용 가능

 

 

17.2. COM .NET dynamic

- COM(Component Object Model)

17.3. 동적 언어와 상호 운용

: C# 코드에서 직접 파이썬이나 루비 코드를 실행하고 그 결과를 받아볼 수 있다

: DLR(Dynamic Language Runtime): 동적 언어 실행 플랫폼 (JSP, Servlet 느낌)

: DLR API를 기반으로 구현된 동적 언어라도 호스팅(Hosting) 가능

: 미리 형식 검사를 할 수 없는 동적 형식 언어에서 만들어진 객체를 C#의 dynamic 형식이 받는다

 

- DLR 제공 클래스

 

 

 

ubiquitous4g