2024-04-26

이재형·2024년 4월 26일
0

배운 내용

1. 람다 ( () => {} )

delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성 및 람다식 할당
        MyDelegate myDelegate = (message) =>
        {
            Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
        };

        // 델리게이트 호출
        myDelegate("안녕하세요!");

        Console.ReadKey();
    }
}
  1. 반환이 없고 string message 매개변수를 받는 델리게이트를 선언을 함
  2. Main에서 해당 델리게이트를 생성하고 받을 매개변수를(message)를 이용한 식을 => 으로 가리키고 {}안에 해당 코드 입력
  3. 해당 델리게이트를 실행하면 람다식을 할당한 내용이 호출이 된다.

정리

1. 메서드를 생성하지 않고도 델리게이트에 추가가 가능하므로 효율적이다.
2. 하지만 람다식으로 델리게이트에 할당을 하면 제거를 할 수 없기 때문에 제거를 해야하는 상황이 생기는 경우 람다식보다는 메서드로 추가하는 것이 좋다.


1-2. Event

// 델리게이트 선언
public delegate void GameEvent();

// 이벤트 매니저 클래스
public class EventManager
{
    // 게임 시작 이벤트
    public event GameEvent OnGameStart;

    // 게임 종료 이벤트
    public event GameEvent OnGameEnd;

    // 게임 실행
    public void RunGame()
    {
        // 게임 시작 이벤트 호출
        OnGameStart?.Invoke();

        // 게임 실행 로직

        // 게임 종료 이벤트 호출
        OnGameEnd?.Invoke();
    }
}
  1. event로 생성했기 때문에 다른 클래스로 실행이 불가능
  2. 그렇기 때문에 RunGame()메서드를 실행하여 event로 지정한 델리게이트를 사용함

정리

1. 델리게이트를 다른 클래스에서 사용하지 못하게 할 수있음 (캡슐화)
2. 그렇기 때문에 다른 메서드를 불러와서 사용하는 프로퍼티 기능으로 사용가능

2. Func, Action

2-1 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);
  1. Add라는 메서드에 매개변수로 int x, int y로 지정하여 선언한다.
  2. Func에 제네릭 매개변수로 <int, int, int>와 해당 변수 명 addFunc를 생성하여 Add를 값을 받는다.

아래 예시: 메서드를 생략하고 실행할 때 처음 생성할 때 Add를 +=말고 =로 초기화를 시켜준 다음 사용 함

// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;

addFunc += Multiply; // addFunc에 Multiply를 추가
addFunc += Subtract; // addFunc에 Subtract를 추가

int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);

```cs
// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
    Console.WriteLine(message);
}

2-2 Action

// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");
  1. Action에 제네릭 매개변수 string타입인 printAction에 PrintMessage를 호출함
    printAction("Hello, World!")를 사용하여 PrintMessage에 해당 매개변수를 사용하여 수행한다.

정리:

1. Func와 Action의 공통점은 정의가 미리 되어있는 델리게이트를 대체하는데 사용이 된다.
2. 둘의 차이점은 Func는 마지막 제네릭 형식의 매개변수 타입으로 반환하고 Action은 반환은 하지 않는데 있다.
3. Func의 경우에는 제네릭 형식의 마지막 매개변수가 반환 타입이므로 사용할 메서드의 매개변수의 수가 다르다고 헷갈리는 경우가 있을 수 있으므로 주의해야함
4. 실행하고 값을 int result = addFunc(3, 5);받을때 최근에 실행한 값으로 들어가기 때문에 인지 해야함
5. 처음 실행할 때는 해당 Func, Action의 값을 추가할 때 값을 초기화를 해줘야한다. (생성하자마자 +=를 해버리면 안된다.)
6. 둘 다 null를 +=로 추가해도 메서드가 삭제되거나 초기화가 되지 않음 물론 = null를 해버리면 해당 델리게이트에 추가된 메서드들이 모두 초기화되니 인지해야함


2-3 람다식 vs 메서드 형식

시작: 두 가지의 방법으로 해본 결과 공통점과 차이점이 있는데 알아보자

공통점:

1. 각자의 방법으로 델리게이트에 추가하여 관리 할 수 있다.

차이점:

람다식:
1. 델리게이트에 추가 할 때 메서드를 직접 호출하여 변경 할 수 있다.
2. 메서드를 따로 생성하지 않고 바로 사용이 가능하다.

메서드형식:
1. 메서드를 그대로 저장하여 사용하므로 재사용이 편함
2. 메서드의 정의와 호출하는 위치가 다르기 때문에 파악하기 힘들다.

추가로 중요점:

Func과 Action과는 다르게 delegate를 직접 사용하고 있다고 해서 delegate를 생성하고 초기화를 해줄 필요가 없다. (delegate는 생성시 반환 타입과 매개변수 타입을 지정하고 생성하기 때문이다.)

3. Linq

// 데이터 소스 정의 (컬렉션)
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);
}
  1. 리스트를 생성하여 타입에 맞게 추가를 함
  2. 리스트에 있는 각 요소를 선택해서 2로 나눈 값이 0이라면 num으로 변경
  3. num을 var타입 evenNumbers로 초기화함
  4. evenNumbers를 foreach로 요소를 1개씩 console.WriteLone(num)으로 출력함

Linq 틀

var result = from 변수 in 데이터소스
             [where 조건식]
             [orderby 정렬식 [, 정렬식...]]
             [select 식];

정리

1. (from 요소 in 데이터)를 사용하여 해당 데이터에 있는 요소를 foreach처럼 꺼낼 수 있음
2. (where 요소 조건)는 요소에서 조건을 걸어서 요소를 골라냄
3. (orderby 정렬식) 오름차순 또는 내림차순으로 어떤 정렬을 할지 선택
4. (select 요소) 모든 과정을 걸친 요소


4. StringBuilder

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);
  1. StringBuilder인 생성자인 sb변수를 만든다.
  2. sb.Append("Hello");를 하여 해당 변수에 String형 Hello를 추가한다.
  3. sb.Insert(5, ", "); 해당 문자열 위치에 ", "를 추가한다.
  4. sb.Replace("world", "C#"); "World"라는 문자를 찾고 해당 문자를 "C#"으로 변환시킨다.
  5. sb.Remove(5, 2); 해당 문자열 5번에서 문자 범위 2만큼 제거한다.

정리

  1. 변경할 string타입인 변수가 있을 때 활용을 하면 좋을 것 같다.
  2. 변수.Append("문자")는 해당 변수에 매개변수에 들어간 변수를 추가하는 기능
  3. 변수.Insert(순서, "문자"); 변수의 문자를 해당 순서로 추가하는 기능
  4. 변수.Replace("문자1", "문자2"); 변수에 문자1를 검색해서 찾으면 문자2로 변경하는 기능
  5. 변수.Remove(순서, 범위); 1번째 매개변수 순서에서 2번째 매개변수 범위만큼 삭제하는 기능

profile
한국사람

0개의 댓글