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 ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ„ด์€ ์„ ์–ธ์  ์„ฑ์งˆ์ด ์žˆ์œผ๋ฏ€๋กœ ์ƒ์„ฑ์ž ๋“ฑ์—์„œ ์ฒ˜๋ฆฌ๋˜์–ด ์ดํ›„ ๋Œ€์ฒด๋กœ ์ฒด์ธ์ด ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.