티스토리 뷰

자, 어제 정리한 Activator.CreateInstance()에서 살짝 눈을 돌려 보자.

var typeValue = Type.GetType(typeName); // typeName을 타입으로 변경

/* 인자 없이 생성 */
var typeClass = Activator.CreateInstance(typeValue);
var typeClass = Activator.CreateInstance(typeValue, Object[]); // 인자 전달하며 생성

자, 어제는 여기서 아래쪽을 설명했었다.

 

그러면 이번에는 위쪽을 보자. Type.GetType(typeName);이라는 문구가 보일 것이다.

이는 typeName에 해당하는 타입, 즉 변수형을 반환하는 함수다.

여기서 처음 보는 사람도 있을 거고, 이에 대한 지식 없이 쓰던 사람도 있을 것이다.

[본인은 전자에 해당했었다.]

그러면 이 기회를 빌어서 한번 정리해 보도록 하자.


리플렉션이란?

[참고 URL: https://learn.microsoft.com/ko-kr/dotnet/csharp/advanced-topics/reflection-and-attributes/]

리플렉션(Reflection)의 사전적인 의미는 반사다.

이것 만으로는 리플렉션의 기능과 용도에 대해서 알기는 힘들 것이다.

그러니, '우리'를 기준으로 정리 해 보자.

 

우리 자신이 자신의 얼굴을 살펴보기 위해서는 무엇을 해야할까.

답은 간단하게 나온다. 거울을 통해서 '반사된' 자신을 살펴야 한다.

리플렉션의 역할 또한 이것이다. 마치 우리가 '거울에 반사된' 자신을 보듯이, 프로그램에게도 거울을 쥐어주는 것이다.

 

즉, 정리하자면 프로그램으로 하여금 자신의 정보를 살펴볼 수 있도록 하는 기능이라는 말이 된다.

이를 통해서 보통은 컴파일이나 빌드 타임에만 활용되고 런타임에는 접근할 수 없는 요소들을 런타임에서 접근할수 있게 되는 것.

 

다만, 프로그램 사전 작업으로 작동되는 데에는 이유가 있는 법.

리플렉션은 전체적으로 무거운 연산이기 때문에 필요한 때에만 쓰는 것이 좋다.


리플렉션의 종류

그렇다면, 리플렉션으로 알아낼 수 있는 요소에는 무엇이 있을까.

꽤나 방대한 양을 지원하지만, 본문에서는 자주 사용함직한 것들 만 추려서 정리하겠다.

[모든 항목은 Type.~~(typeName) 과 type.~~() 양쪽으로 사용이 가능하다.]

[단, type.~~()의 경우에는 type에 반드시 자료형이 들어가야한다.]

  • Type.GetType(typeName): 목표 클래스의 변수형을 반환한다.
  • Type.GetFields(typeName): 목표 클래스의 모든 필드(변수)를 배열으로 반환한다.
  • Type.GetConstructors(typeName): 목표 클래스의 모든 생성자를 배열으로 반환한다.
  • Type.GetInterface(typeName): 목표 클래스의 모든 인터페이스를 배열으로 반환한다.
  • Type.GetMethods(typeName): 목표 클래스의 모든 메서드(함수)를 배열으로 반환한다.

이외에도 매우 다양한 종류의 리플렉션이 존재한다.


SetValue()

상단에서 관련 정보를 Get해온 것을 알 수 있다. 그렇다면 Set도 가능하지 않겠는가.

그럴 때 쓰는 함수가 SetValue()다.

 

사용법은 간단하다.

상술한 Get 함수들으로 받아온 정보를 변수에 저장한 다음, 해당 변수를 기반으로 SerValue(value)를 사용하면 끝.

 

다만, 이를 사용하기 위해서는 상술한 Get 함수들을 이용해서 가져온 정보가 필요해서 리플렉션에 의한 부하가 발생하는데다, SetValue()가 변수의 보호 수준이나 그런 걸 모두 무시하고 값을 매겨버리기 때문에, 꼭 필요한 경우가 아니라면 사용하지 않는 것이 더 좋다.


번외. typeof()도 리플렉션인가?

typeof()가 해당 타입의 세부 정보를 반환하는 것은 맞으나, '동적으로 검사'하지는 않는다.

즉, typeof()에는 반드시 '변수형'이 들어가야하며, 그와 동시에 이 함수의 처리는 컴파일 시점에 수행한다.

그렇기 때문에 typeof()는 리플렉션이 아니다. 런타임 성능에 영향을 끼치는 정도도 적다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함