내일배움캠프 62일차 TIL : 중간점검 전 버그픽스

woollim·2024년 12월 19일
0

내일배움캠프TIL

목록 보기
55/65
post-thumbnail

■ 개요

○ 오늘 계획

  • 비석 심기
  • 보스는 피격트리거 없앰(테이크데미지 함수 오버라이드)
  • 죽고나서 슬쩍 움직이는거 없앰
  • 피피티 작성


■ C# 리플렉션 심화 복습

○ 개념

  • 프로그램 실행 중에 타입에 대한 정보를 동적으로 검색하고 조작할 수 있는 기능을 제공함
  • 이를 통해 클래스, 메서드, 속성 등 객체의 메타데이터에 접근하고, 객체의 구성 요소를 런타임에 수정하거나 호출할 수 있음
  • 리플렉션은 주로 동적으로 플러그인 시스템을 구현하거나, 타입을 알 수 없는 객체와 상호작용할 때 유용하게 사용함

○ 리플렉션의 주요 기능

1. 타입 정보 가져오기

  • 리플렉션을 사용하여 클래스나 구조체 등의 타입 정보를 동적으로 가져올 수 있음
  • 이를 통해 해당 타입의 이름, 네임스페이스, 상속 관계 등을 알 수 있음
Type type = typeof(MyClass);
Console.WriteLine(type.Name);  // MyClass
Console.WriteLine(type.Namespace);  // MyNamespace

2. 객체 생성

  • 리플렉션을 사용하여 런타임에 객체를 생성할 수 있음
  • Activator.CreateInstance를 사용하여 타입의 인스턴스를 동적으로 생성할 수 있음
Type type = typeof(MyClass);
object instance = Activator.CreateInstance(type);

3. 메서드 호출

  • 리플렉션을 통해 객체의 메서드를 동적으로 호출할 수 있음
  • MethodInfo를 사용하여 메서드 정보를 얻고, Invoke 메서드를 사용하여 메서드를 실행할 수 있음
Type type = typeof(MyClass);
MethodInfo method = type.GetMethod("MyMethod");
object result = method.Invoke(instance, new object[] { parameter });

4. 속성 및 필드 접근

  • 리플렉션을 통해 클래스의 속성(Property)이나 필드(Field)의 값을 읽거나 쓸 수 있음
  • PropertyInfo나 FieldInfo를 사용하여 해당 정보를 얻고 값을 설정하거나 가져올 수 있음
PropertyInfo property = type.GetProperty("MyProperty");
property.SetValue(instance, newValue);  // 값 설정
object value = property.GetValue(instance);  // 값 가져오기

5. 어셈블리 정보 가져오기

  • 리플렉션을 사용하여 어셈블리(assembly)의 메타데이터를 가져올 수 있음
  • 어셈블리에서 제공하는 타입이나 리소스를 동적으로 조회할 수 있음
Assembly assembly = Assembly.GetExecutingAssembly();
Type[] types = assembly.GetTypes();

○ 리플렉션 사용예시

using System;
using System.Reflection;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public void Greet()
    {
        Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
    }
}

public class ReflectionExample
{
    public static void Main()
    {
        // Person 클래스의 타입 정보 얻기
        Type personType = typeof(Person);

        // Person 객체 생성
        object personInstance = Activator.CreateInstance(personType);

        // 속성 설정
        PropertyInfo nameProperty = personType.GetProperty("Name");
        nameProperty.SetValue(personInstance, "John");

        PropertyInfo ageProperty = personType.GetProperty("Age");
        ageProperty.SetValue(personInstance, 30);

        // 메서드 호출
        MethodInfo greetMethod = personType.GetMethod("Greet");
        greetMethod.Invoke(personInstance, null);
    }
}

○ 리플렉션의 단점

  • 성능 저하
    • 리플렉션은 컴파일 타임에 결정되는 타입 정보와 달리 런타임에 메타데이터를 조회하므로 성능에 영향을 미칠 수 있음
    • 반복적인 리플렉션 호출은 성능 저하를 초래할 수 있음
  • 타입 안전성 부족
    • 리플렉션을 사용하면 컴파일 타임에 오류를 발견하기 어려운 코드가 실행될 수 있음
    • 이는 런타임 오류를 초래할 수 있으므로, 사용할 때 주의가 필요함
  • 보안 문제
    • 리플렉션을 통해 비공개 메서드나 속성에 접근할 수 있기 때문에 보안상의 문제가 발생할 수 있음
    • 이러한 이유로 리플렉션을 사용하는 경우 보안 권한을 제한하는 것이 중요할 수 있음

0개의 댓글