개발자 최승준
리플렉션(Reflection) - 기본 개념 본문
리플렉션(Reflection) 이란?
실무에서 코드 리뷰를 할때, 리플렉션을 사용한 코드가 여러번 등장했었습니다.
저는 대략적인 개념은 알고 있었지만, 코드 리뷰를 하려면 정확하게 리플렉션에 대해서 알아봐야겠다는 생각이 들었습니다.
이번 기회에 리플렉션에 대해서 깊게 알아보죠.
Reflect - 반사하다, 비추다
reflect는 반사 또는 비추는 느낌의 뜻을 가지고 있는 영어단어입니다.
거울에 사물을 비치면 그 모습을 반사해서 보여줍니다.
프로그래밍에서의 리플렉션은 거울에 비치듯이 프로그램이 자신을 들여다보고 분석할 수 있는 능력을 의미합니다.
하지만, 이렇게만 비유를 들었을 때는 이해하기 어려운게 맞습니다.
조금 더 코드의 본질적인 영역으로 들어가봅시다.
리플렉션은 런타임에 존재하는 할당된 객체나 값을 통해,
그것들을 만들어낸 코드의 구조(타입 정보)를 역으로 찾아가는 과정입니다.
일반적인 코드 실행에서는 설계도(타입 정보)를 통해 실제 건물(객체나 값)을 만들어내지만,
리플렉션에서는 반대로 실제 건물을 통해 설계도를 이해하는 과정과 같습니다.
짧게 요약을 해봤습니다.
위에서 말한 '일반적인 코드 실행' 흐름에 대해서 먼저 생각을 해봅시다.
public class Building {
public int Floors { get; set; }
public string Address { get; set; }
}
Building 이라는 간단한 클래스를 하나 선언했습니다.
층과 주소에 대한 멤버변수를 가지고 있습니다.
Building myBuilding = new Building {
Floors = 10,
Address = "Seoul, Gangnam"
};
위에서 선언한 클래스를 통해 myBuilding 이라는 Building 인스턴스를 만들었습니다.
이렇게 생성된 인스턴스 객체는 메모리에 할당이 되겠죠.
자연스러운 흐름입니다.
이번엔 그렇다면 리플렉션에 해당하는 '코드의 구조(타입 정보)를 역으로 찾아가는 과정'을 작성해봅시다.
Type buildingType = myBuilding.GetType();
이전에 생성한 myBuilding에 대한 타입 정보를 얻습니다.
PropertyInfo floorsProperty = buildingType.GetProperty("Floors");
얻은 Building 타입에 대해서 Floors 에 대한 속성을 가져옵니다.
이렇게 가져온 속성 정보는 PropertyInfo 타입입니다.
int floors = (int)floorsProperty.GetValue(myBuilding);
Console.WriteLine(floors); // 10 출력
우리는 Building 타입에 대한 Floors 속성 정보를 알고있습니다.
이를 통해 myBuilding에서 Building의 Floors에 대한 실제 값을 가져옵니다.
즉, myBuilding(실제 건물) 로 부터 Building에 대한 타입 정보(설계도) 를 통해서 실제 저장된 값, 10층이라는 정보를 얻어낼 수 있었습니다.
여기까지 이해가 되었을까요?
- 그런데 왜 '반사'라는 개념을 통해 거울에 비쳐서 본다는 설명이 존재할까요?
이를 위해 먼저 C#, .NET 에서 내부적으로 어떤 동작이 일어나는지 이어서 알아봅시다.
메타데이터, 리플렉션 API, CLR 등의 키워드가 등장합니다.
- 그리고 요약에서 런타임이라는 말이 사용되었습니다.
왜 런타임이 중요한지도 이어서 알아봅시다.
'프로그래밍' 카테고리의 다른 글
[C++] 포인터와 레퍼런스(참조)의 차이점 (0) | 2023.05.30 |
---|