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번내용)
- 문자열 조작 - Append(), Insert(), Replace(), Remove() 등 다양한 메서드를 제공하여 문자열에 대한 추가, 삽입, 치환, 삭제 작업을 수행할 수 있습니다.
- 가변성 - 내부 버퍼를 사용하여 문자열 조작.
- 효율적인 메모리 관리 문자열 조작 시 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);