[TIL] C# - Refelction

MINO·2024년 7월 15일
post-thumbnail

2024-07-15


Reflection

.NET 프레임워크에서 제공하는 기능으로,
실행 중인 프로그램이 자신의 구조와 동작을 검사하고 수정할 수 있게 해주는 기능이다.

테스트 및 디버그 목적으로 사용하지만, 단점도 존재하므로 상황에 맞게 사용해주어야 한다.


Object

C# 의 Object 클래스는 모든 데이터 타입의 부모(조상)이다.
따라서, Object 클래스에 존재하는 ToString(), Equals(), GetType(), GetHashCode(), ReferenceEquals() 메서드를 사용할 수 있다.

이 중, GetType() 메서드를 통해 Type 이라는 데이터 타입의 객체를 반환하여
데이터 타입 및 네임스페이스를 알 수 있다.

장점

  • 동적 타입 처리 : 실행 시간에 타입 정보를 가져와 동적으로 처리할 수 있다.
    • 이를 통해 유연성 있는 프로그램 구현이 가능
  • 코드 재사용성 향상 : 코드를 일반화하여 재사용성을 높일 수 있다.
  • 플러그인 시스템 구현 : 리플렉션을 통해 새로운 기능을 동적으로 로드할 수 있다.
  • 디버깅 및 테스트 지원 : 리플렉션을 통해 객체의 내부 구조를 검사할 수 있어 디버깅과 테스트에 사용된다.

단점

  • 성능 저하 : 동적 타입 처리를 수행하므로 성능이 저하될 수 있다.
  • 내부 노출 : 클래스의 메서드와 필드를 접근할 수 있어 객체 지향 프로그래밍의 특징인 추상화를 위반한다.

실습

using System;
using System.Reflection;

public class Character
{
    public int Level { get; set; }
    public void PrintClassName()
    {
        // TODO: 리플렉션을 사용하여 클래스의 이름을 출력하는 코드 작성
        Console.WriteLine($"Class Name: {GetType().Name}");
        //
    }
}

public class Warrior : Character
{
}

public class Mage : Character
{
}

public class Archer : Character
{
}

class Program
{
    static void Main(string[] args)
    {
        Warrior warrior = new Warrior();
        Mage mage = new Mage();
        Archer archer = new Archer();

        // 리플렉션을 사용하여 클래스 이름 출력
        warrior.PrintClassName();
        mage.PrintClassName();
        archer.PrintClassName();
    }
}

TIL 마무리

디버깅이나 런타임에 알 수 없는 객체의 동작을 분석할 때 사용할 수 있는
리플렉션 기능에 대해 알아보았다.

아직까진 써 본 적이 없지만,
나중에 디버깅이 잘 되지 않을 때, 해당 기능을 사용해볼 수 있을 것 같다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글