TIL

C# 델리게이트 종류

박민혁_kog 2023. 8. 17. 20:58

델리게이트란?

  • 델리게이트(delegate)는 메서드를 참조하는 타입입니다
  • 델리게이트를 이용하면 메서드를 매개변수로 전달하거나 변수에 할당할 수 있습니다.
delegate int Calculate(int x, int y);

static int Add(int x, int y)
{
    return x + y;
}

class Program
{
    static void Main()
    {
        // 메서드 등록
        Calculate calc = Add;

        // 델리게이트 사용
        int result = calc(3, 5);  //calc 를 add처럼 사용
        Console.WriteLine("결과: " + result);
    }
}

 

델리게이트 event 사용 예시

  • event는 할당연산자( = )를 사용할 수 없으며, 클래스 외부에서는 직접 이벤트를 호출할 수 없다.
// 델리게이트 선언
public delegate void EnemyAttackHandler(float damage);

// 적 클래스
public class Enemy
{
    // 공격 이벤트
    public event EnemyAttackHandler OnAttack;

    // 적의 공격 메서드
    public void Attack(float damage)
    {
        // 이벤트 호출
        OnAttack?.Invoke(damage); // onattck?. == ?. 은 앞이 널값일시 실행하지 않음
				// null 조건부 연산자
				// null 참조가 아닌 경우에만 멤버에 접근하거나 메서드를 호출
    }
}

람다 ( Lambda )

  • 람다(lambda)는 익명 메서드를 만드는 방법입니다.
  • 람다를 사용하면 메서드의 이름 없이 메서드를 만들 수 있습니다.
  • 람다는 델리게이트를 사용하여 변수에 할당하거나, 메서드의 매개변수로 전달할 수 있습니다.
//형식
(parameter_list) => expression


//사용 예시
Calculate calc = (x, y) => 
{	
		return x + y;
};

Calculate calc = (x, y) => x + y;

 

 

Func과 Action

  • 델리게이트를 대체하는 미리 정의된 제네릭 형식
  • Func는 값을 반환하는 메서드를 나타내는 델리게이트입니다. 마지막 제네릭 형식 매개변수반환 타입을 나타냅니다. 예를 들어, Func<int, string>는 nt를 입력으로 받아 string을 반환하는 메서드를 나타냅니다.
// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
    return x + y;
}

// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;  // 인트 2개를 받아 인트로 반환
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);
  • Action은 값을 반환하지 않는 메서드를 나타내는 델리게이트입니다. Action은 매개변수를 받아들이지만, 반환 타입이 없습니다. 예를 들어, Action<int, string>은 **int**와 **string**을 입력으로 받고, 아무런 값을 반환하지 않는 메서드를 나타냅니다.
// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
    Console.WriteLine(message);
}
Action<string> printAction = PrintMessage; //스트링을 받고 반환하지 않음 
printAction("Hello, World!");

 

LINQ (Language Integrated Query)

  • .NET 프레임워크에서 제공되는 쿼리 언어 확장
  • 데이터 소스(예: 컬렉션, 데이터베이스, XML 문서 등)에서 데이터를 쿼리하고 조작하는데 사용됩니다.
  • 데이터베이스 쿼리와 유사한 방식으로 데이터를 필터링, 정렬, 그룹화, 조인 등 다양한 작업을 수행할 수 있습니다.
  • LINQ는 객체, 데이터베이스, XML 문서 등 다양한 데이터 소스를 지원합니다.
var result = from 변수 in 데이터소스 // 데이터소스 로 부터 변수 만들기
             [where 조건식]            // 가져오는 조건
             [orderby 정렬식 [, 정렬식...]]  // 정렬 
             [select 식];   //데이터 저장 


- **`var`** 키워드는 결과 값의 자료형을 자동으로 추론합니다.
- **`from`** 절에서는 데이터 소스를 지정합니다.
- **`where`** 절은 선택적으로 사용하며, 조건식을 지정하여 데이터를 필터링합니다.
- **`orderby`** 절은 선택적으로 사용하며, 정렬 방식을 지정합니다.
- **`select`** 절은 선택적으로 사용하며, 조회할 데이터를 지정합니다

EX
// 데이터 소스 정의 (컬렉션)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 쿼리 작성 (선언적인 구문)
var evenNumbers = from num in numbers  // num이라는 변수를 만들고 numbers로부터 가져옴
                  where num % 2 == 0   //2 로 나눠서 0인경우(짝수)만 가져옴
                  select num;          // num에 저장

// 쿼리 실행 및 결과 처리
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

 

 

Nullable 형

null = "아무것도 없음"을 의미한다.

Nullable

  • 값형 변수에 null 값을 지정할 수 있는 방법을 제공
  • 형식은 ? 연산자를 사용하여 선언됩니다. 예를 들어, int?는 int 형식에 null을 할당할 수 있는 Nullable<int> 형식을 나타냅니다.
// Nullable 형식 변수 선언 null값도 값형도 가능
int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;

// 값 할당 및 접근
nullableInt = 10;                   //변수 값할당하듯 가능
int intValue = nullableInt.Value;   // .value로 할당 가능 2가지 가능

// null 값 검사
if (nullableDouble.HasValue) //해즈밸류 = 값을 가지고 있나요? 현재는 가지고 있음
{
    Console.WriteLine("nullableDouble 값: " + nullableDouble.Value);
}
else
{
    Console.WriteLine("nullableDouble은 null입니다."); // 값이없을때 
}

// null 병합 연산자 사용
// nullableInt ?? 0과 같이 사용되며, nullableInt가 null이면 0을 반환합니다.
int nonNullableInt = nullableInt ?? 0;//앞에 있는 널에이블 값이 null이면 뒤에 값 널이 아니라면 널에이블값 사용
Console.WriteLine("nonNullableInt 값: " + nonNullableInt);

문자열 빌더 (StringBuilder)

사용이유 = 문자열 "a" + "b" + "c" 를할때 메모리는 a , b , a+b , c , a+b+c 를 메모리에 저장함 =쓸때없이 많음

이런경우를 줄여줌(3번내용)

  1. 문자열 조작 - Append(), Insert(), Replace(), Remove() 등 다양한 메서드를 제공하여 문자열에 대한 추가, 삽입, 치환, 삭제 작업을 수행할 수 있습니다.
  2. 가변성 - 내부 버퍼를 사용하여 문자열 조작.
  3. 효율적인 메모리 관리 문자열 조작 시 StringBuilder는 내부 버퍼를 사용하여 문자열을 조작하므로, 반복적인 문자열 조작 작업이 발생해도 메모리 할당 및 해제 오버헤드가 크게 감소합니다.

주요 메서드

  • Append: 문자열을 뒤에 추가합니다.
  • Insert: 문자열을 지정한 위치에 삽입합니다.
  • Remove: 지정한 위치에서 문자열을 제거합니다.
  • Replace: 문자열의 일부를 다른 문자열로 대체합니다.
  • Clear: StringBuilder의 내용을 모두 지웁니다.
StringBuilder sb = new StringBuilder();

// 문자열 추가
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");

// 현재 "Hello World"

// 문자열 삽입
sb.Insert(5, ", ");

// 현재 "Hello, World"

// 문자열 치환
sb.Replace("World", "C#");

// 현재 "Hello, C#"

// 문자열 삭제
sb.Remove(5, 2); // 5번째부터 2개 쉼표와 띄어스기

// 현재 "HelloC#"


// 완성된 문자열 출력
string result = sb.ToString();
Console.WriteLine(result);