본문 바로가기

C#

리플렉션 Reflection (1)

728x90

리플렉션 Reflection

리플렉션은 프로그램이 동적으로 소스 코드를 해석할 수 있게 하는 기술이다.

Activity나 Service 같이 특정 이름 규칙으로 클래스를 작성하면 개발자가 코드로 객체를 생성하거나 연결하지 않아도, 프로그램 내에 등록되고 사용할 수 있었던 마법의 원리는 프레임워크가 리플렉션 기술을 사용해 클래스의 이름을 바탕으로 클래스를 생성/관리/제거해주기 때문입니다. 객체를 프레임워크가 관리해주기 때문입니다. 객체를 프레임워크가 관리해주니가, 개발자는 프레임워크에게 요청하면 언제 어디서나 안정적으로 원하는 클래스를 얻을 수 있습니다. 즉 개발자는 클래스로 객체를 생성하는거나, 객체를 사용할 수 있게 준비하는 일정 부분을 프레임워크에게 믿고 맡길 수 있게 됩니다.

public class BaseViewModel : MvxViewModel
{
    protected readonly IMvxMessenger _messengerService;

    // 프레임워크는 리플렉션 기술로 BaseViewModel 클래스 생성자 정보를 읽고, 
    // 이 클래스를 객체로 만들기 위해서는
    // IMvxMessenger 클래스가 필요하다는걸 프레임워크는 이해하게 됩니다.
    public BaseViewModel(IMvxMessenger messengerService)
    {
        _messengerService = messengerService;
    }
}

만약 어디서나 BaseViewModel 클래스를 사용하고 싶다면 아래와 같이 프레임워크에게 요청하면, 프레임워크가 BaseViewModel의 생성자를 읽고 알아서 만들어서 개발자에게 전달해줍니다.

// 리플렉션 기술로 이해한 클래스 정보에 따라 객체를 생성합니다.
var viewModel = Mvx.IoCProvider.IoCConstruct<BaseViewModel>();

이처럼 프로그램이 실행되는 동안 클래스의 소스 코드를 읽고 클래스가 생성될 때나 사용될 때 필요한 객체를 내부적으로 결정해주는 의존성 주입(DI; Dependency Injection) 기술은 리플렉션 기술로 구현되어 있습니다. 이러한 기술이 프레임워크에 적용됨에 따라 개발자는 프레임워크가 관리하는 클래스를 사용할 때 클래스 타입만 전달해주면, 프레임워크가 알아서 객체를 만들어 개발자가 사용할 수 있도록 준비합니다.

 

이와 같이 프레임워크가 작동하는 내부적인 원리를 이해하기 위해서는 리플렉션 기술에 대해 이해하고 있어야만 합니다. 프레임워크는 개발자의 편의를 위해 실제 내부 구현이 어떻게 이루어지는지 숨기고 있습니다. 따라서 개발자는 프레임워크로 어떻게 필요한 것을 얻을지, 또 현재 사용하는 프레임워크와 잘 맞는 설계는 무엇일지 결정하려면 프레임워크의 설계 규칙을 이해하고 있어야 합니다.

 

[출처]

https://ibocon.tistory.com/184

728x90