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
๋ฉ์๋์์ ์ต์ข
๊ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.