3) 델리게이트, 람다 및 LINQ
{
이 부분에서 꽤나 자주 사용되는 문법들이 등장한다고 한다!! 그리고 강의를 들어보니 진짜 잘 활용할수있을것같다!
물론 이해를 완벽하게 했다면 말이다!
델리게이트
{
델리게이트란 메서드를 참조하는 타입이다(??) 이말은 잘 안와닿으니.. 메서드를 변수에 저장 할수 있다는걸로 이해하자..
예제 1:
델리게이트를 선언해준뒤 메소드 두개도 선언, 그리고 메인에서 메소드들을 연결해서 한번에 호출해주는 모습이다.
이걸 이용하면 대화문이라던지 여러가지 방식으로 사용할수 있을것 같다.
예제 2:
다음 예제에서도 무언갈 배울수 있었는데, event함수로 선언한 OnAttack 메소드(이벤트?)를 호출할때
? 물음표를써서 null 조건부 연산자로 만들수 있다는것이다.
OnAttack이 null이라면, 즉 비어있다면 호출하지 않고 비어있지 않다면 그때만 호출하는 방식이다.
이또한 활용 가능성이 있어보인다!
작동방식이 간단하면서도 또 복잡한데... 역순으로 설명하자면 Main 함수에서 enemy.OnAttack += player.HandleDamage 를 통해 적의 공격 이벤트를 플레이어의 데미지 처리 메서드에 추가 해줬고, 적이 Attack을 호출해줄때 Attack 함수 안엔 OnAttack 이벤트가 포함 되있기때문에 그 이벤트에 추가된 HandleDamage가 실행 되는 것이다. 그렇게 damage 데이터를 받아와 10 의 데미지를받게 되었다!
}
람다
{
람다란, 이름 없는 메서드를 말하는 것으로, 말 그대로 메서드의 이름없이 메서드를 만들어줄수 있다고 한다.
호출할 이름이 없으니, 참조만으로 컨트롤 할수 있게된다!
예제1:
using System;
// 델리게이트 선언
delegate void MyDelegate(string message);
class Program
{
static void Main()
{
// 델리게이트 인스턴스 생성 및 람다식 할당
MyDelegate myDelegate = (message) =>
{
Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
};
// 델리게이트 호출
myDelegate("안녕하세요!");
Console.ReadKey();
}
}
예제에선 델리게이트와 함깨활용하는데, 델리게이트를 선언해주고, 그 인스턴스를 생성뒤 람다식을 만들어
델리게이트를 호출하는것만으로 람다 메소드가 실행이 된다.
이렇게 단순한 메서드들은 람다로 만들어 처리하면 용이해진다고 한다.
예제: 게임 시스템
// 델리게이트 선언
public delegate void GameEvent();
// 이벤트 매니저 클래스
public class EventManager
{
// 게임 시작 이벤트
public event GameEvent OnGameStart;
// 게임 종료 이벤트
public event GameEvent OnGameEnd;
// 게임 실행
public void RunGame()
{
// 게임 시작 이벤트 호출
OnGameStart?.Invoke();
// 게임 실행 로직
// 게임 종료 이벤트 호출
OnGameEnd?.Invoke();
}
}
// 게임 메시지 클래스
public class GameMessage
{
public void ShowMessage(string message)
{
Console.WriteLine(message);
}
}
// 게임 실행
static void Main()
{
// 이벤트 매니저 객체 생성
EventManager eventManager = new EventManager();
// 게임 메시지 객체 생성
GameMessage gameMessage = new GameMessage();
// 게임 시작 이벤트에 람다 식으로 메시지 출력 동작 등록
eventManager.OnGameStart += () => gameMessage.ShowMessage("게임이 시작됩니다.");
// 게임 종료 이벤트에 람다 식으로 메시지 출력 동작 등록
eventManager.OnGameEnd += () => gameMessage.ShowMessage("게임이 종료됩니다.");
// 게임 실행
eventManager.RunGame();
}
이벤트 호출에 람다로 메소드를 등록해주고 게임 실행시 자동으로 그 메소드들이 실행이 되도록 해주는 예시이다.
}
Func과 Action
{
Func과 Action 은 델리게이트를 대체하는 미리 정의된 제네릭 형식이라고 한다.
Func는 값을 반환하는 메서드를 나타내는 델리게이트이다.
예를 들어 Func<int, string>은 int를 입력으로 받아 string을 반환한다.
Action은 값을 반환하지 않는 메서드를 나타내는 델리게이트이다.
예를 들어 Action<int, string>은 int와 string을 입력으로 받고, 아무 값도 반환하지 않는다.
이 둘은 미리 정의되어있어 더 안전하므로, 앞으로 더 많이 사용하게 될것이라고 한다.
예제1: Func
Func<int, int, int>로 int값 2개를 가져와 int값을 반환시켜주었고, 반환이 잘 되었기 때문에 x + y = 8이 잘 출력이 되었다.
예제2: Action
Action은 반환값 없이 더 간단히 실행이 된다.
예제3: 게임 활용
// 게임 캐릭터 클래스
class GameCharacter
{
private Action<float> healthChangedCallback;
private float health;
public float Health
{
get { return health; }
set
{
health = value;
healthChangedCallback?.Invoke(health);
}
}
public void SetHealthChangedCallback(Action<float> callback)
{
healthChangedCallback = callback;
}
}
// 게임 캐릭터 생성 및 상태 변경 감지
GameCharacter character = new GameCharacter();
character.SetHealthChangedCallback(health =>
{
if (health <= 0)
{
Console.WriteLine("캐릭터 사망!");
}
});
// 캐릭터의 체력 변경
character.Health = 0;
캐릭터의 체력이 변할때마다 Action을 실행시키는 로직이다!
}
LINQ
{
LINQ(Language Integrated Query)란, 쿼리 언어 확장이라는데,, 데이터를 쿼리하고 조작하는데 사용된다,,,???
그래서 쿼리가 뭔데??
엄,, 정보 검색 요청 이라고 한다,, 예제를 보면 좀더 이해가 될것이다,,
사용구조:
var result = from 변수 in 데이터소스
[where 조건식]
[orderby 정렬식 [, 정렬식...]]
[select 식];
데이터소스 안에 어느 조건식에 있는지 어느 정렬식에 있는지를 특정하고 그걸 골라와 사용하는 방식인것 같다.
아니 이런 꿀기능이? 그러면 무슨무슨 매개변수 안하고 검색해서 값을 찾아올수 있다는 말인가?
근데 강의에선 데이터 리소스를 많이 사용한다고 했으니 남용하면 안되겠다.....
예제:
// 데이터 소스 정의 (컬렉션)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 쿼리 작성 (선언적인 구문)
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
// 쿼리 실행 및 결과 처리
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
리스트로 5개의 숫자들을 만들어주고, 쿼리 선언으로 2의 나머지가 0인, 즉 짝수인 숫자들만 가져오도록 하는 코드이다.
오우 쓋 정말 유용해보인다.
}
}
4) 고급 자료형 및 기능
{
Nullable 형
{
null은 "아무것도 없음" 즉 비어있음을 의미한다. 참조형 변수가 객체를 참조하지 않을때 사용된다고 한다.
그럼 Nullable이란, null값을 가질수 있는 값형에 대한 형식이라고 한다. 즉 비어있어도 괜찮다는 뜻이다.
위에서 서술했듯이 자료형 뒤에? 를 사용해 nullable 형식으로 만들 수 있다
// Nullable 형식 변수 선언
int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;
// 값 할당 및 접근
nullableInt = 10;
int intValue = nullableInt.Value;
// null 값 검사
if (nullableDouble.HasValue)
{
Console.WriteLine("nullableDouble 값: " + nullableDouble.Value);
}
else
{
Console.WriteLine("nullableDouble은 null입니다.");
}
// null 병합 연산자 사용
// nullableInt ?? 0과 같이 사용되며, nullableInt가 null이면 0을 반환합니다.
int nonNullableInt = nullableInt ?? 0;
Console.WriteLine("nonNullableInt 값: " + nonNullableInt);
null값 검사 부분에서 .HasValue라는게 등장하는데, 이것은 변수에 값이 할당되어있는지를 검사하는 방식이라고 한다.
}
문자열 빌더(StringBuilder)
{
문자열 빌더(StringBuilder)는
"A" + "B" + "C" 방식으로 문자열을 조합시켜줄때 데이터가 많이 발생하기 때문에 사용한다고 한다.
Append(), Insert(), Replace(), Remove() 등 다양한 메서드를 제공하여 문자열에 대한 추가, 삽입, 치환, 삭제 작업을 수행할 수 있다고 한다.
StringBuilder sb = new StringBuilder();
// 문자열 추가
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");
// 문자열 삽입
sb.Insert(5, ", ");
// 문자열 치환
sb.Replace("World", "C#");
// 문자열 삭제
sb.Remove(5, 2);
// 완성된 문자열 출력
string result = sb.ToString();
Console.WriteLine(result);
처음에 Append 문자열을 추가해줄떼 "Hello World"가 되었다가,
Insert로 5번째열에 , 를 추가해서 "Hello, World"가 되었고,
Replace로 "World"와 "C#"을 치환하여 "Hello, C#",
Remove로 5번째칸부터 두개를 지워 "HelloC#" 이 되었다!
}
이렇게 여러가지 기능들이 C# 버전이 올라가면서 새로 생기기도 하는데,
새로 기능이 나올때 사용하는 방법을 알아보는것도 좋을것 같다.
}
강의는 여기까지.. 이제 다시 택스트 RPG를 개선할 시간이다.
오늘 많은 진행을 했다. 캐릭터 생성 과정 선택지를 부여해주는 클래스들을 전부 cs파일로 관리 해주기 시작했고,
상점 시스템과 아이템, 그리고 스테이지 진행 로직을 만들기 시작했다.
하지만... 하지만 그 과정을 정리하기엔 머리의 힘이 다 빠졌다!!
그러니 내일 과제를 재출하고 나서 정리를 해보도록 하겠다.
'게임개발 > C#' 카테고리의 다른 글
24-09-26 C# Text RPG 팀프로젝트 00 (0) | 2024.09.26 |
---|---|
24-09-25 Text RPG 구현하기 (3) | 2024.09.25 |
24-09-23 C# 프로그래밍 기초 03 (0) | 2024.09.23 |
24-09-22 C# 프로그래밍 기초 02.7 (0) | 2024.09.22 |
24-09-21 C# 프로그래밍 기초 02.5 (0) | 2024.09.21 |