posted by 방랑군 2012. 1. 19. 00:27

실행 중에 클래스나 객체의 타입 정보를 조사하는 기능이다.


타입 정보는 보통 컴파일 중에만 사용되며 컴파일러에 의해 기계어로 바뀌고 나면 사라지는 것이 일반적이나 C#은 컴파일된 결과 코드뿐만 아니라 타입에 대한 메타 데이터를 실행 파일에 같이 기록해 놓기 때문에 실행중에도 정보를 조사할 수 있다.


이 기능을 사용하면 실행 중에 다른 모듈에 선언된 인스턴스를 생성할 수 있고 메서드를 호출할 수도 있다.

Type 클래스에서 제공되는 정보로부터 모든 멤버의 정보를 알아낼 수 있기 때문에 실행 중에 클래스 선언문을 통해 복원할 수도 있을 것이다.

 

특정 클래스나 객체의 타입 정보를 조사하고 싶을 때에는 Type 객체를 얻어야 하는데 다음의 세가지 방법으로 얻는다.
------------------------------------------------

// 런타임 시 지정된 이름으로 접근하는 방법

1) Type p = Type.GetType("Top");

 

// 클래스 타입으로 접근하는 방법

2) Type p = tyoeof("Top");

 

// 객체로 접근하는 방법

3) Type p = Top.GetType()

 

Top t = (Top)Activator.CreateInstance(p);

------------------------------------------------

 

// Top 형의 타입에 해당하는 클래스 정보를 Type 형의 객체로 얻어낸다.

// 이 객체 안에 Top 형에 관련된 모든 타입 정보가 들어있다고 보면 된다.

// CLR의 도움 없이 사용자가 직접 핸들하여 객체를 생성하는 것이 된다.

//

// 어셈블리 내에 들어있는 클래스의 타입 정보를 핸들하는 클래스를 Type 클래스라 할 수 있다.

 

  Type 클래스 : 클래스의 정보를 관리하는 클래스라 정의내릴 수 있다.

 

  다음의 예제 코드는, Type 클래스를 이용하여 특정 클래스의 정보를 출력한다.

//////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Reflection;

namespace ReflectionTest1
{
    public class ReflectionTest
    {
        public int temp = 1000;
        public void PrintShow()
        { }

        static void Main(string[] args)
        {
            try
            {
                Type t = Type.GetType("ReflectionTest1.ReflectionTest");

                Console.WriteLine("기본 클래스 타입");
                Console.WriteLine(t.BaseType);

 

                Console.WriteLine("\n생성자 목록");
                ConstructorInfo[] cList = t.GetConstructors();
                foreach (ConstructorInfo c in cList)
                    Console.WriteLine(c);

 

                Console.WriteLine("\n함수 목록");
                MethodInfo[] mList = t.GetMethods();
                foreach (MethodInfo m in mList)
                    Console.WriteLine(m);

 

                Console.WriteLine("\n변수 목록");
                FieldInfo[] fList = t.GetFields();
                foreach (FieldInfo f in fList)
                    Console.WriteLine(f);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

//////////////////////////////////////////////

 

리플렉션을 사용하지 않은 보통의 경우 우리가 작성한 프로그램은 CLR 내에서 실행되는 프로그램이다.

 

리플렉션을 사용하면 우리는 실행되는 프로그램이 아닌 실행시켜 주는 프로그램까지 만들어낼 수 있다.

 

즉, 미들웨어급 프로그램을 만들어낼 수 있다.

 

출처 : 소설같은 c#

 

## 책에는 리플렉션을 활용한 리플렉션 프로그래밍 기법이 소개되어 있습니다.

'강좌 > C#' 카테고리의 다른 글

[C#] Template Method 패턴  (0) 2012.01.19
[C#] Singleton 패턴이 적용된 File 로거  (0) 2012.01.19
[C#] 소멸자 (de-constructor, finalizer)  (0) 2012.01.18
Thread vs ThreadPool  (0) 2012.01.18
마샬링 (Marshaling)  (0) 2012.01.18