C# delegate - slog

C# delegate slog

C#의 delegate에 λŒ€ν•΄ κ³ μ°°ν•˜κ³  λ‹€μ–‘ν•œ 사둀에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…λ‹ˆλ‹€.

delegateλž€?

C#의 delegateλŠ” λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜μ΄λ©°, μ°Έμ‘°ν˜• λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— nullλ˜λŠ” λ©”μ†Œλ“œ μ°Έμ‘°κ°€ λ‹΄κΈΈ 수 있으며, 컴파일 νƒ€μž„ λ•Œ 인자 및 λ°˜ν™˜ ν˜•μ„ κ²€μ‚¬ν•©λ‹ˆλ‹€.

delegateλŠ” λ‹€μŒ 처럼 μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

delegate λ°˜ν™˜ν˜• λ”œλ¦¬κ²Œμ΄νŠΈλͺ…(인자1, 인자2, ..);

이 delegate ν˜•μ— λ‹΄κΈΈ 수 μžˆλŠ” λ©”μ†Œλ“œλŠ” 인자 νƒ€μž… 일치 및 개수 일치, λ°˜ν™˜ν˜• 일치이면 μ–΄λ–€ λ©”μ†Œλ“œμ΄λ˜ λ©λ‹ˆλ‹€. λ”κ΅°λ‹€λ‚˜, λ©”μ†Œλ“œκ°€ 정적 λ©”μ†Œλ“œμ΄λ˜ μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œμ΄λ˜ μƒκ΄€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ κ·Έ ν™œμš©μ„±μ΄ ν½λ‹ˆλ‹€.

delegate ν™œμš©μ‚¬λ‘€

LINQ - μž…λ ₯ -> 좜λ ₯μ—μ„œ 좜λ ₯의 κ°’ κ²°μ •

LINQλ₯Ό μ’…μ’… μ‚¬μš©ν•˜μ‹  뢄듀이라면, μ•Œκ²Œ λͺ¨λ₯΄κ²Œ 이미 delegateλ₯Ό μ‚¬μš©μ€‘μž…λ‹ˆλ‹€.
delegateν˜•μ€ κ°’μ²˜λŸΌ μ·¨κΈ‰λ˜μ§€λ§Œ λ©”μ†Œλ“œμ²˜λŸΌ 원할 λ•Œ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이게 λžŒλ‹€ ν˜•μ‹κ³Ό 잘 κ²°ν•©ν•˜μ—¬ LINQμ—μ„œ μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ°€λ Ή,

var result = list.Where(x => x.IsValid).OrderBy(x => x.Number);

일 λ•Œ, x => x.IsValue와 x => x.NumberλŠ” λžŒλ‹€λ‘œ ν‘œν˜„λ˜μ—ˆμœΌλ©°, λžŒλ‹€λŠ” λ©”μ†Œλ“œμ΄κ³ , λ©”μ†Œλ“œκΈ° λ•Œλ¬Έμ— delegate ν˜•κ³Ό νƒ€μž…λ§Œ λ§žλ‹€λ©΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. x => x.IsValidλŠ” ν˜•μ‹ μœ μΆ”μ— λ”°λΌμ„œ Func<bool>이고 Funcκ°€ delegateμ΄λ―€λ‘œ λ°”λ‘œ μ΄λ ‡κ²Œ μ“Έ 수 있게 λ©λ‹ˆλ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ x => x.Numberκ°€ ν˜•μ‹μœ μΆ”μ— μ˜ν•΄μ„œ Func<int>κ°€ λ©λ‹ˆλ‹€.
μž¬λ―ΈμžˆλŠ” 것은 이 두 λžŒλ‹€κ°€ μ‹€ν–‰ν•  수 μžˆλŠ” λ©”μ†Œλ“œμ™€ κ°™μœΌλ―€λ‘œ, 적절히 Whereλ©”μ†Œλ“œμ™€ OrderByλ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ ν•„μš”μ— 따라 ν˜ΈμΆœλ©λ‹ˆλ‹€. 그러면 λ‚΄κ°€ ν•„μš”κ°„ κ²°κ³Ό κ°’λ§Œ μ·¨ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μ‘°νšŒν•˜λŠ” λŒ€μƒμ΄ 무엇이든 상관없이 μ›ν•˜λŠ” 비ꡐ λ˜λŠ” 정렬등을 ν•  수 있게 λ©λ‹ˆλ‹€.


λ³€κ²½λ˜λŠ” κ°’ 좔적

또 μˆ˜μ‹œλ‘œ λ³€ν•  수 μžˆλŠ” 값을 원할 λ•Œ μ·¨ν•˜κ³  싢은데, λ©”μ†Œλ“œ 인자둜 값을 λ„˜κ²¨λ²„λ¦¬λ©΄ κ·Έ 값이 κ²°μ • λ˜λ―€λ‘œ 값이 변경될 λ•Œλ§ˆλ‹€ Update등이 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ 변경값을 μ μš©ν•΄μ•Ό ν•˜λŠ”λ° λ²ˆκ±°λ‘­μŠ΅λ‹ˆλ‹€.

λ§Œμ•½, info.X 값이 μ’…μ’… λ³€ν•˜λŠ” 값이라면,
longProcess(info.X)λ₯Ό ν•˜λŠ” λŒ€μ‹ , longProcess(() => info.X) λ₯Ό ν–ˆμ„ λ•Œ info.X값이 λ³€ν•˜λŠ” μ‘±μ‘± longProcessλ©”μ†Œλ“œμ—μ„œ μ΅œμ’… 값을 μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

μ’‹μ•„μš” 1

μ½”λ“œ μ‹€ν–‰ νŒŒμ΄ν”„λΌμΈ

delegateν˜•μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œ λΈ”λŸ­μ„ κ°’μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆμ–΄μ„œ λ°°μ—΄ 등에 담을 수 있게 λ©λ‹ˆλ‹€.
즉, μ½”λ“œμ˜ 흐름을 체인의 쑰합에 따라 λ™μ μœΌλ‘œ μ œμ–΄ν•  수 있게 λ©λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• μ–Έμ–΄

ν•¨μˆ˜ν˜• μ–Έμ–΄μ—μ„œλŠ” λ™μΌν•œ μž…λ ₯값에 μ˜ν•΄ λ™μΌν•œ 결과값이 λ‚˜μ˜€λ„λ‘ ν•˜λŠ”κ²Œ μ€‘μš”ν•©λ‹ˆλ‹€. 이런 λ©”μ†Œλ“œλ₯Ό 적절히 μ‘°ν•©ν•  수 μžˆλ‹€λ©΄, λ‹¨μœ„κ²€μ¦μ„ κΈ°κ³„μ μœΌλ‘œ ν•  수 μžˆμœΌλ―€λ‘œ, μ½”λ“œ μœ μ§€λ³΄μˆ˜ μΈ‘λ©΄μ—μ„œ μž₯점이 λ˜λŠ”κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.
C#μ—μ„œλŠ” C# 9.0λΆ€ν„° var func = static (int value) => value + 5;의 ν˜•νƒœλ‘œ 정적 λžŒλ‹€λ₯Ό 톡해 이λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

Fluent νŒ¨ν„΄μ— μ‚¬μš©

Fluent νŒ¨ν„΄ λ˜λŠ” Fluent μΈν„°νŽ˜μ΄μŠ€ νŒ¨ν„΄μ„ μ΄μš©ν•˜λ©΄ μ½”λ“œμƒμœΌλ‘œ 이런 체인을 μ§κ΄€μ μœΌλ‘œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 체인은 λŸ°νƒ€μž„ μ‹œ μƒμ„±λ˜μ§€λ§Œ, Fluent μΈν„°νŽ˜μ΄μŠ€ νŒ¨ν„΄μ€ 선언적 μ„±μ§ˆμ΄ μžˆμœΌλ―€λ‘œ μƒμ„±μž λ“±μ—μ„œ μ²˜λ¦¬λ˜μ–΄ 이후 λŒ€μ²΄λ‘œ 체인이 λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.