1.리플렉션의 정의
C#에서 리플렉션(Reflection)은 실행 중인 프로그램에서 현재 타입(Type)에 대한 정보를 가져오거나 조작할 수 있는 기능을 제공합니다. 즉, C# 코드에서 작성한 클래스나 구조체 등의 타입(Type) 정보를 프로그램 실행 중에 얻을 수 있으며, 이를 이용하여 인스턴스 생성, 메소드 호출 등 다양한 작업을 수행할 수 있습니다.
2.왜 쓰는거지 ?
코드에서 작성한 클래스, 구조체, 메소드, 필드, 프로퍼티, 이벤트 등의 정보를 가져올 수 있습니다. 또한, 가져온 정보를 이용하여 인스턴스를 생성하거나 메소드를 호출할 수도 있습니다. 이렇게 가져온 정보를 이용하여 프로그램을 동적으로 조작하는 기능을 제공하므로, 유연한 프로그래밍이 가능
3.주의점
리플렉션을 이용할 때는 코드의 안전성을 고려해야 합니다. 리플렉션을 사용하면 실행 시간에 타입 정보를 가져와서 동적으로 조작할 수 있기 때문에, 컴파일러가 검사하지 않는 오류가 발생할 가능성이 있습니다. 따라서, 잘못된 타입 정보를 가져오지 않도록 주의
4.관련문서(Type 종류)
https://learn.microsoft.com/ko-kr/dotnet/api/system.type?redirectedfrom=MSDN&view=net-7.0
5.문법과 예제코드
using System;
using System.Reflection;
class ExampleClass
{
public ExampleClass()
{
Console.WriteLine("Example Class!!");
}
}
class Program
{
static void Main(string[] args)
{
Type exampleType = typeof(ExampleClass); //클래스의 타입을 가져온다.
ConstructorInfo constructor = exampleType.GetConstructor(Type.EmptyTypes);
object instance = constructor.Invoke(new object[] {});
}
}
위 예제에서는 ExampleClass라는 클래스를 만들고, Program 클래스에서 해당 클래스를 리플렉션으로 생성하는 방법을 보여준다. Type 클래스의 GetConstructor 메소드를 사용하여 생성자 정보를 가져와서, Invoke 메소드를 사용하여 객체를 생성하고 이렇게 생성된 객체는 object 타입으로 반환되므로, 필요에 따라 다른 타입으로 캐스팅하여 사용이 가능하다.
6.리플렉션 단점 리플렉션은 런타임에 타입 정보를 가져와서 처리하기 때문에 일반적인 코드 실행보다 느리다. 그 이유는 런타임에 타입 정보를 가져와야 하므로 컴파일 타임에 이미 체크되었던 타입 검사를 런타임에 다시 수행하기 때문입니다. 따라서 리플렉션을 사용할 때는 반드시 필요한 경우에만 사용하는 것이 좋다.
7.에트리뷰트
C#에서 Attribute(에트리뷰트)는 클래스, 메서드, 프로퍼티 등과 같은 .NET Framework 요소에 추가 정보를 제공하는 방법이다.
- 코드 분석 도구에서 분석에 활용
- 런타임에 코드 동작을 변경
- 소스 코드 생성기에서 소스 코드를 생성하는데 활용
- 일반적인 메타데이터로 사용
등에서 사용한다고 한다.
예제
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class MyAttribute : System.Attribute
{
//Attribute가 선언될 때 전달받을 수 있는 인자들을 정의
public MyAttribute(string name, int id)
{
this.Name = name;
this.Id = id;
}
//Attribute의 속성값들을 정의
public string Name { get; set; }
public int Id { get; set; }
}
[My("myName", 1)]
public class MyClass
{
//...
}
정도만 알아두려고 한다. 에트리뷰트는 솔직히 게임 만들면서는 그렇게까지 쓸 일은 없다고 본다. 필요할 때 다시 찾아보려고 한다.
'프로그래밍 언어 > c#' 카테고리의 다른 글
C# 6.0 정리 (1) | 2023.04.24 |
---|---|
C# abstract class, Interface (0) | 2023.04.24 |
c# 유니티에서 코루틴(Coroutine)이란 ? (0) | 2023.04.23 |
c# using문은 무엇인가 (0) | 2023.04.23 |
c# 스레드 :: 비동기 프로그래밍 기초 (1) | 2023.04.21 |