텍스트 Rpg - C#
C#으로 만드는 텍스트 Rpg (7)
게임만드는학생
2025. 2. 6. 01:35
미션 6: 리플렉션을 활용한 동적 속성 접근
- 목표: 리플렉션을 활용해 클래스의 정보를 탐색하고 동적으로 조작한다.
- 미션:
- Player 클래스의 모든 프로퍼티와 값을 출력하는 리플렉션 코드를 작성해라.
- 리플렉션을 활용해 Player 클래스의 체력 값을 동적으로 수정하는 코드를 작성해라.
미션6을 해결했다.
리플렉션이라는 기능을 사용해보는 것에 초점을 맞췄다. 그래서 텍스트 rpg에 필요한 기능이라기보다는
리플렉션을 사용해볼 함수를 하나 만들었다.
이 리플렉션이라는 기능이 툴을 만들 때 아주 유용하게 사용되고 유니티에서는 플러그인이나 이벤트 시스템 좀 더 유연한 옵저버패턴을 만드는데 사용된다는데 아직 잘 모르겠다.
우선 리플렉션이란 컴파일타임이 아닌 런타임에 클래스의 프로퍼티, 필드, 함수 등이 뭐가 있는지 접근할 수 있는 기능이다.
예를들어 player 라는 클래스에 있는 변수 이름, 타입 등을 알아내고 사용할 수 있는 것이다. 또 객체를 넘겨주면 값 변경, 읽어오기도 가능하다.
public void PrintPropertyValueByReflection(Player player)
{
Type type = typeof(Player);
Console.WriteLine("=== Properties ===");
var properties = type.GetProperties();
foreach (var property in properties)
{
object value = property.GetValue(player); // ✅ 프로퍼티 값을 가져오기 위해 `GetValue(player)` 사용
Console.WriteLine($"{property.PropertyType} {property.Name} = {value}");
if(property.Name=="Hp")
{
property.SetValue(player, 30);
}
}
Console.WriteLine("=== Fields ===");
var fields = type.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
foreach (var field in fields)
{
object value = field.GetValue(player); // ✅ 필드 값을 가져오기 위해 `GetValue(player)` 사용
Console.WriteLine($"{field.FieldType} {field.Name} = {value}");
}
}
Player 클래스에 만든 함수이다.
먼저 Type 이라는 변수에 Player 클래스를 담으면 type 변수로 다 접근이 가능하다.
GetProperties 함수는 모든 프로퍼티를 다 읽어온다.
for문을 돌고 각 프로퍼티에 대해서 GetValue함수를 통해 객체를 넘겨주면 그 객체의 해당프로퍼티의 값을 반환해준다.
그리고 사용가능하다. Field도 마찬가지인 매커니즘이다.
그리고 SetValue를 통해 값 변경도 가능하다.