김김김의 게임개발
  • C# #16 델리게이트, 람다, LINQ, 고급 자료형 및 기능
    2023년 08월 24일 21시 28분 54초에 업로드 된 글입니다.
    작성자: noun06

    델리게이트(Delegate)

    • 델리게이트는 메서드 참조하는 타입이다. 변수에 메서드를 할당하여 해당 메서드를 참조할 수 있다. 
    • 델리게이트는 여러 개의 메서드를 동시에 호출할 수도 있으며 클래스 내에서 발생하는 특정한 상황을 다루는 매커니즘인 이벤트(Event)의 처리를 위해서도 사용된다.
    //기본 선언 구조
    delegate 반환 형식 델리게이트명(파라미터);
    // 델리게이트 선언
    public delegate void EnemyAttackHandler(float damage);
    
    // 적 클래스
    public class Enemy
    {
        // 공격 이벤트
        public event EnemyAttackHandler OnAttack;
    
        // 적의 공격 메서드
        public void Attack(float damage)
        {
            // 이벤트 호출
            OnAttack?.Invoke(damage);
            // null 조건부 연산자
            // null 참조가 아닌 경우에만 멤버에 접근하거나 메서드를 호출
        }
    }
    
    // 플레이어 클래스
    public class Player
    {
        // 플레이어가 받은 데미지 처리 메서드
        public void HandleDamage(float damage)
        {
            // 플레이어의 체력 감소 등의 처리 로직
            Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage);
        }
    }
    
    // 게임 실행
    static void Main()
    {
        // 적 객체 생성
        Enemy enemy = new Enemy();
    
        // 플레이어 객체 생성
        Player player = new Player();
    
        // 플레이어의 데미지 처리 메서드를 적의 공격 이벤트에 추가
        enemy.OnAttack += player.HandleDamage;
    
        // 적의 공격
        enemy.Attack(10.0f);
    }

     

    람다(Lambda)

    • 람다는 표현식을 사용하여 익명 메서드를 정의하는 기능이다. 주로 델리게이트와 함께 사용되며 변수에 할당하거나 메서드의 매개변수로 전달할 수 있다. 
    //람다식의 기본 구조
    
    (parameters) => expression
    //parameters: 람다 메서드의 파라미터 목록
    //expression: 람다 메서드의 본문, 파라미터를 통해 계산 수행 후 결과 반환
    using System;
    
    // 델리게이트 선언
    delegate void MyDelegate(string message);
    
    class Program
    {
        static void Main()
        {
            // 델리게이트 인스턴스 생성 및 람다식 할당
            MyDelegate myDelegate = (message) =>
            {
                Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
            };
    
            // 델리게이트 호출
            myDelegate("안녕하세요!");
    
            Console.ReadKey();
        }
    }

     

    Func과 Action

    • Func는 반환값이 있는 메서드를 나타내는 델리게이트 형식이다. 제네릭 형식으로 정의되며 반환타입과 파라미터 타입을 지정하여 사용한다. 마지막 제네릭 형식 매개변수가 반환타입을 나타낸다.
    // Func를 사용하여 두 개의 정수를 더하는 메서드
    int Add(int x, int y)
    {
        return x + y;
    }
    
    // Func를 이용한 메서드 호출
    Func<int, int, int> addFunc = Add; //두개의 정수를 받아 정수를 반환
    int result = addFunc(3, 5);
    Console.WriteLine("결과: " + result);

     

    • Action은 반환값이 없는 메서드를 나타내는 델리게이트 형식이다. 제네릭 형식으로 정의되며 파라미터 형식을 지정하여 사용한다. 반환타입이 없기 때문에 매개변수를 받아들이지만 return문을 사용할 수 없다.
    // Action을 사용하여 문자열을 출력하는 메서드
    void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }
    
    // Action을 이용한 메서드 호출
    Action<string> printAction = PrintMessage;
    printAction("Hello, World!");

     

    LINQ(Language Integrated Query)

    • 쿼리(Query)는 데이터베이스나 다른 저장소에서 원하는 데이터를 검색하거나 조작하기 위한 요청을 의미.
    • LINQ는 닷넷 프레임워크에서 제공되는 쿼리 언어 확장. 
    • 컬렉션, XML, 데이터베이스 등에서 데이터 소스를 쿼리하고 조작하는데 사용됨.
    • 데이터베이스 쿼리와 유사한 방식으로 데이터의 필터링, 정렬, 그룹화, 조인 등 다양한 작업의 수행이 가능함.
    //기본 구조
    var result = from 변수 in 데이터소스
                 [where 조건식]
                 [orderby 정렬식 [, 정렬식...]]
                 [select 식];
                 
    //var 키워드는 결과값의 자료형을 자동으로 추론
    //from 절에서 데이터 소스 지정
    //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);
    }

     

    • 다음은 LINQ에서 사용되는 일부 주요 연산자들임. 
    • Where: 조건을 기반으로 데이터 필터링, 특정 조건을 만족하는 데이터만 선택하여 반환.
    • Select: 데이터 소스에서 특정한 열을 선택하여 새로운 형태의 데이터 생성.
    • OrderBy/OrderByDesending: 데이터를 오름차순 혹은 내림차순으로 정렬.
    • GroupBy: 데이터를 그룹화하여 그룹별로 요약 정보 생성.
    • Join: 두 개 이상의 데이터 소스를 조인하여 관련된 데이터 결합.
    • Concat: 두 개의 시퀀스를 연결하여 새로운 시퀀스 생성.
    • Skip/Take: 데이터를 건너뛰거나 일부만 선택하여 반환.
    • Aggregate: 시퀀스의 모든 요소를 하나의 값으로 집계.
    • Distinct: 중복된 요소를 제거한 고유한 요소만 선택.
    • Any / All: 조건에 맞는 요소가 존재하는지 확인하거나 모든 요소가 조건을 만족하는지 확인.
    • Count: 시퀀스의 요소 개수를 계산.
    • Zip: 두 개의 시퀀스에서 각 요소를 조합하여 새로운 시퀀스 생성.
    • 시퀀스는(Sequence)는 데이터의 일련의 순서 있는 요소를 의미하며 LINQ에서는 배열, 컬렉션, 데이터의 모음 등을 말함.

     

    Nullable 형

    • null은 아무것도 없음을 의미하며 참조형 변수가 어떠한 객체를 참조하지 않을 때 사용된다.
    • nullable 형식은 값 형식 변수에 null 값을 할당할 수 있도록 해주는 기능이다. 주로 값형 변수가 null인지 아닌지를 확인하고 처리할 때 유용하다.
    // Nullable 형식 변수 선언
    int? nullableInt = null; //Nullable<int> nullableInt
    double? nullableDouble = 3.14;
    bool? nullableBool = true;
    
    // 값 할당 및 접근
    nullableInt = 10;
    int intValue = nullableInt.Value;
    
    // null 값 검사
    //HasValue를 통해 값이 있는지 여부를 확인하고 Value를 통해 해당 값을 가져올 수 있음.
    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 조건부 연산자
    // nullableInt가 null이면 text도 null
    string text = nullableInt?.Tostring();

     

    문자열 빌더(String Builder)

    • 문자열을 효율적으로 생성하고 조작하기 위한 클래스로 가변성과 효율적인 메모리 관리가 가능하다는 특징을 가지고 있다.
    //문자열 빌더 생성
    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: 문자열을 빌더에 추가한다.
    • Insert: 문자열을 특정 위치에 삽입한다.
    • Remove: 문자열의 특정 범위를 삭제한다.
    • Replace: 문자열의 일부를 다른 문자열로 대체한다.
    • Clear: 문자열 빌더의 내용을 모두 지운다.
    • ToString: 문자열 빌더의 내용을 문자열로 변환하여 반환한다.
    • Capacity: 빌더의 내부 버퍼 크기를 설정하거나 가져온다.(큰 문자열 성능 최적화)
    • Length: 빌더의 현재 문자열 길이를 가져오거나 설정한다.

     

     

    'C#' 카테고리의 다른 글

    C# #19 정렬 알고리즘  (0) 2023.08.26
    C# #17 TextRPG - 턴제 전투  (0) 2023.08.25
    C# #15 인터페이스, 열거형, 예외 처리, 값형과 참조형  (0) 2023.08.24
    C# #14 블랙잭  (0) 2023.08.23
    C# #13 알고리즘 기초 3  (0) 2023.08.23
    댓글