C#에서는 매우 유용하면서도 강력한 기능인 어트리뷰트와 리플렉션이 있습니다.
이 2개의 기능은 C#을 베이스로 하는 게임엔진인 유니티에서 매우 유용하게 사용되고 있으며,
특히 리플렉션의 경우, 데이터에 대한 안정성을 높여주는 만큼 C++ 베이스인 언리얼 엔진에서도 사용하는 기능입니다.
따라서 이번 포스트에서는 이 2개의 기능에 대해 알아보고 사용예제 역시 한번 알아보겠습니다.
1) 간단한 정리
어트리뷰트와 리플렉션에 대해 본격적으로 배우기 전에 간단하게 정리를 해보겠습니다.
두 기능 모두 런타임과 관련이 있는 기능입니다.
리플렉션은 런타임 중에 클래스의 정보와 같은 데이터를 뜯어볼 수 있는 기능을 의미합니다.
이는 데이터의 안정성 면에서 매우 중요한데, 런타임 중에 발생할 수 있는 여러 문제에 대해 대응할 수 있게끔 해줍니다.
어트리뷰트는 일반적인 주석과 다르게 런타임에서 컴퓨터에 의해 읽어지는 주석을 의미합니다.
// 로 이뤄지는 주석은 컴퓨터에 의해 읽어지지 않지만, 어트리뷰트는 컴퓨터에 의해 읽어져 의미있는 정보로 사용됩니다.
유니티에서 사용하는 Header나 Range 같은 지시자들이 어트리뷰트에 해당됩니다.
이때 유니티에서와는 다르게 C#에서는 어트리뷰트를 사용하기 위해서는 반드시 정의를 해줘야 하는 불편함이 있습니다.
그러나
다른 작업자에게 유의미한 정보를 전달할 수 있고 컴퓨터에게도 정보를 줄 수 있으므로 실보다 득이 많은 기능입니다.
그렇다면 실제 예제를 통해 어트리뷰트와 리플렉션이 어떻게 사용되는지 한번 알아보겠습니다.
2) 예제
어트리뷰트를 사용하기 위해 어트리뷰트를 정의하였습니다.
다음으로 어트리뷰트가 적용되고 리플렉션을 통해 살펴볼 클래스를 보겠습니다.
다음으로 main 함수입니다.
main함수의 길이가 길어 2개의 사진으로 분리하였습니다.
위와 같이 구성되었으며 DataBox 클래스에 대한 리플렉션 플래그를 설정하여 주석에 적힌 데이터를 가져올 수 있습니다.
가져온 데이터들을 리스트 fields에 저장하였고 fields를 순회하며 해당 데이터들을 훑어보겠습니다.
최종적으로 출력하는 코드는 조건문으로 분기하였습니다.
Tooltip 타입 어트리뷰트가 없다면 어트리뷰트 없이, 있다면 어트리뷰트의 내용을 포함하여 출력합니다.
최종적으로 출력되는 정보는 위와 같습니다.
리플렉션과 어트리뷰트는 설계자에게 많은 도움을 줍니다.
안정성과 안전성 뿐만이 아닌 데이터에 실시간으로 접근할 수 있다는 점에서 매우 유용한 기능입니다.