Bibi's DevLog ๐Ÿค“๐ŸŽ

[TIL - Codesquad] ๋ฏธ์…˜5 - ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋žŒ๋‹ค ํ‘œํ˜„์‹, ํด๋กœ์ €, ์ŠคํŠธ๋ฆผ ๋ณธ๋ฌธ

TIL

[TIL - Codesquad] ๋ฏธ์…˜5 - ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋žŒ๋‹ค ํ‘œํ˜„์‹, ํด๋กœ์ €, ์ŠคํŠธ๋ฆผ

๋น„๋น„ bibi 2021. 1. 18. 21:23

[210118]

๊ตฌ๊ธ€๋ง, ๊ธฐ๋ณธ์„œ, ๊ทธ๋ฃน๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋งŽ์ด ์•Œ๊ฒŒ ๋œ ๋‚ ์ด๋‹ค.
๊ณต๋ถ€๋Š” ์—ด์‹ฌํžˆ ํ•ด์„œ ๋ฟŒ๋“ฏํ•˜๊ธด ํ•œ๋ฐ ๋ฏธ์…˜ ์ง„ํ–‰์ด ์•ˆ ๋˜์–ด์„œ ์ฐœ์ฐœํ•˜๋‹ค.
TIL ์˜ฌ๋ฆฌ๊ณ  ๋ฏธ์…˜ํ’€์ด๋ฅผ ์ข€ ์ƒ๊ฐํ•ด๋ด์•ผ๊ฒ ๋‹ค.

TIL

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

์ˆœ์ˆ˜ํ•จ์ˆ˜์˜ ๊ฐœ๋…

  1. ์ธํ’‹๊ณผ ์•„์›ƒํ’‹์ด ์žˆ๋‹ค.
    (์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฌผ์„)์ธํ’‹์œผ๋กœ ๋ฐ›์•„ ๊ฐ์ž ๋งก์€ ์ž‘์—…์„ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ์•„์›ƒํ’‹์œผ๋กœ ๋‚ด๋ณด๋ƒ„.
    ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋“ค์€ ์ˆœ์„œ๋Œ€๋กœ ์ž์‹ ์—๊ฒŒ ์ฃผ์–ด์ง„ ์ผ๋“ค๋งŒ ํ•œ๋‹ค.

  2. ์™ธ๋ถ€ ํ™˜๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์ฒ ์ €ํžˆ ๋…๋ฆฝ์ ์ด๋‹ค. (์™ธ๋ถ€ ์š”์ธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค)
    ์–ด๋–ค ๊ฐ’์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ์˜ค๋กœ์ง€ ์ฃผ์–ด์ง„ ๊ฐ’๋“ค๋กœ ์ •ํ•ด์ง„ ์ž‘์—…๋งŒ ํ•œ๋‹ค.

  3. (2.๋•๋ถ„์—) ๊ฐ™์€ ์ธํ’‹์ผ ๋•Œ ์–ธ์ œ๋‚˜ ๊ฐ™์€ ์•„์›ƒํ’‹์„ ๋‚ด๋ณด๋‚ธ๋‹ค.

    -๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์—๊ฒŒ๋„ ์•„์›ƒํ’‹ ์™ธ์— ์•„๋ฌด ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ข‹์€ ์ด์œ ?

๋น„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๋ณ€์ˆ˜์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„ ๋” ์•ˆ์ •์ ์ด๋‹ค.
์™ธ๋ถ€์—์„œ ์ฐธ์กฐ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋“ฑ์˜ ์‚ฌ๊ณ (๋ถ€์ž‘์šฉ)๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด๋Ÿฐ ๋ถ€์ž‘์šฉ์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กœ์›Œ ์ฃผ๋ชฉ๋ฐ›๊ฒŒ ๋จ.

๋ถ€์ž‘์šฉ์˜ ์˜๋ฏธ
: ์–ด๋–ค ํ•จ์ˆ˜์˜ ๋™์ž‘์— ์˜ํ•ด, ํ”„๋กœ๊ทธ๋žจ ๋‚ด ํŠน์ • ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํ™ฉ.

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ, ํ•œ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•  ๋•Œ ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ ์“ฐ๋ ˆ๋“œ ๋™์ž‘์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ ๋ คํ•  ์š”์†Œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ณ  ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
->ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•จ์ˆ˜ ๋™์ž‘์— ์˜ํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’ ๋ณ€๊ฒฝ์„ ์›์ฒœ ๋ฐฐ์ œํ•จ์œผ๋กœ์จ ์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๊ทธ ๊ฐ’์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ธ์ž๋กœ ๋ณต์‚ฌํ•ด๊ฐ€์„œ ์ž‘์—…ํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋ฌด๋Ÿฐ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์ด ์•„๋‹ˆ๋‹ค.
๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ง ๋‹ค๋Š” ๋ง์ด ์•„๋‹ˆ๋ผ, ์ ์–ด๋„ ์–ด๋–ค ๋‹จ์œ„์˜ ์ž‘์—…์— ์žˆ์–ด์„œ ๋ถ€์ž‘์šฉ ์—†์ด ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ง ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ์˜ ๋Œ€ํ‘œ ํŠน์ง•

  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์„ ์–ธํ˜•์ด๋‹ค.

    • 'ํ•จ์ˆ˜ํ˜•' ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด์ „๊นŒ์ง€ ํ•˜๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ '๋ช…๋ นํ˜•' ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํ•ด๋‹นํ•œ๋‹ค.

      • ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ : A๋Š” B์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  C๋ผ๋Š” ๊ฐ’์„ ์ฐธ์กฐํ•ด์„œ D๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋ผ.
      • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ : A-B-C-D-E์ž‘์—…์€ F๋ผ๋Š” ๊ฒฐ๊ณผ๋ฌผ๊ณผ ๊ฐ™๋‹ค.
    • ์ˆœ์ˆ˜ํ•จ์ˆ˜๋“ค์€ ์ธํ’‹๋งŒ ๋˜‘๊ฐ™์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ์•„์›ƒํ’‹๋„ ๋˜‘๊ฐ™๋‹ค. (์™ธ๋ถ€๋ณ€์ˆ˜ ์˜ํ–ฅ X)
      -> ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ABCDE์ž‘์—…์— ์ •ํ•ด์ง„ ์ธํ’‹์„ ๋„ฃ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ ์•„์›ƒํ’‹์ด ์‚ฐ์ถœ๋œ๋‹ค๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๋ช…๋ นํ˜•์—์„œ๋Š” ๋ณ€์ˆ˜๋งŒ 'A๋Š” B์ด๋‹ค'๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ํ•จ์ˆ˜๋Š” ํ–‰์œ„ ๊ฐœ๋…์œผ๋กœ๋งŒ ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ.
      ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜•์—์„œ๋Š” ํ•จ์ˆ˜๋„ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์•ผ ํ•œ๋‹ค.
      (ํ•จ์ˆ˜๋ฅผ '๊ฐ’'์˜ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค)

  • ํ•จ์ˆ˜๋„ '๊ฐ’'์ด๋‹ค.

    • ํ•จ์ˆ˜๊ฐ€ '๊ฐ’'์ด๋ผ๊ณ  ํ•ด์„œ ์ˆซ์ž/๋ฌธ์ž์—ด/๊ฐ์ฒด ๊ฐ™์€ ๋ช…ํ™•ํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด ๋„์ถœ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.
    • ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ผ๋Š” ๊ฐ€์ • ํ•˜์—, ๊ฐ™์€ ์ธํ’‹์ผ ๋•Œ ์•„์›ƒํ’‹์ด ์ผ์ •ํ•˜๋ฏ€๋กœ
      '์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ์‚ฐ์ถœํ•  ์ƒํƒœ' ๋ผ๋Š” ๊ฐ’์œผ๋กœ ์ด ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ณ ์ฐจํ•จ์ˆ˜(HOF - Higher Order Function)

    • ํ•จ์ˆ˜๋ฅผ '๊ฐ’'์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜ / ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ '๊ณ ์ฐจํ•จ์ˆ˜(๊ณ ๊ณ„ํ•จ์ˆ˜)'๋ผ๊ณ  ํ•œ๋‹ค.
    • ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋” ์œ ์—ฐํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ์ปค๋ง

    • ์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜์— ์ผ๋ถ€ ์ธ์ž๋งŒ ๋„ฃ์–ด์„œ, ๋‚˜๋จธ์ง€ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ๋‹ค๋ฅธํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•.
  • ํ•จ์ˆ˜ ์ปด๋น„๋„ค์ดํ„ฐ

    • ํ•จ์ˆ˜ํ˜• ์–ธ์–ด / ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ปฌ๋ ‰์…˜ ๋‚ด ์š”์†Œ๋“ค์„ ๋‹ค์–‘ํ•˜๊ฒŒ, ์—ฐ์†์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋„๊ตฌ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. - ์ž๋ฐ” ์ŠคํŠธ๋ฆผ์ฒ˜๋Ÿผ.
    • ์‹ค์ˆ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ ๋ถˆ๊ฐ€ํ”ผํ–ˆ๋˜ for๋ฌธ ๋“ฑ์˜ ์ž‘์—…๋“ค์„, ๋„๊ตฌ๋“ค์„ ์ด์šฉํ•ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. filter, take, map ๋“ฑ..
      • for๋ฌธ ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ ์š”์†Œ๋“ค์€ ์–ด๋–ค ๋ณ€์ˆ˜์˜ ์ƒํƒœ๋ณ€ํ™”(๋ถ€์ž‘์šฉ)์„ ํ•„์š”๋กœ ํ•œ๋‹ค.
        ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€? ์ •๋ฆฌ

  • ๊ฐ€๋ณ€์ ์ธ ์ƒํƒœ๋ฅผ ๋ถˆ๋ณ€ํ•˜๋Š” ์ƒํƒœ(Immutable)๋กœ ๋งŒ๋“ค์–ด side effect๋ฅผ ์—†์•ค๋‹ค.

    • f(x) = y : ํ•จ์ˆ˜ f์— x๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ญ์ƒ y๊ฐ€ ๋‚˜์˜จ๋‹ค.
    • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒํƒœ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค. (์™ธ๋ถ€ ์ƒํƒœ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค)
    • ๋ณ€์ˆ˜๋ณด๋‹ค ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•จ์ˆ˜๋„ ๊ฐ์ฒด์ด๋‹ค : ํ•จ์ˆ˜๋„ 1๊ธ‰ ๊ฐ์ฒดfirst-class citizen์ด๋‹ค.

    • 1๊ธ‰ ๊ฐ์ฒด๋ž€?
      • ์•„๋ž˜ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
        • ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
        • ๊ฐ์ฒด์˜ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.
        • ๊ฐ์ฒด์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ž๋ฐ”์—์„œ๋Š” ์ž๋ฐ”8์ดํ›„ ํ•จ์ˆ˜๋„ 1๊ธ‰ ๊ฐ์ฒด๊ฐ€ ๋˜์—ˆ๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๊ณ , ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ ๋กœ์ง์— ์ง‘์ค‘์‹œํ‚จ๋‹ค.

    • Lambda / Collection / Stream๊ฐ™์€ API๋ฅผ ํ†ตํ•ด ์ง์ ‘์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•จ์œผ๋กœ์จ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.
    • ์ผ์„ ์œ„ํ•œ ์ผ์ด ์ค„์–ด๋“ค์–ด, ์‹ค์ œ ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋™์‹œ์„ฑ ์ž‘์—…์„ ์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค.

    • immutableํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜๋ฉฐ ๋ณดํ˜ธ์žฅ์น˜(lock/unlock)๊ฐ€ ํ•„์š”์—†๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค inner class

  • (์บก์Šํ™” encapsulation์˜ ํ•œ ๋ฐฉ๋ฒ•) ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ์–ด๋–ค ๊ณตํ†ต์  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ๋Š” ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์ „ํ˜€ ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•œ๋‹ค.

์ต๋ช… ํด๋ž˜์Šค Anonymous class๋ž€?

  • ๋‚ด๋ถ€ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด '์ต๋ช… ํด๋ž˜์Šค'๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

  • ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋–„, ์ƒ์„ฑ์ž๋งŒ ํ˜ธ์ถœํ•ด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค.

    • ์›๋ž˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ํด๋ž˜์Šค ๋‚ด์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๊ทธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.(๋ณต์žก)
    • ์ต๋ช… ํด๋ž˜์Šค๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ • ๋‚ด์— ์ต๋ช…ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ต๋ช… ํด๋ž˜์Šค์˜ ์žฅ์ 

  • ๋ฉ”์†Œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.
  • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์™€ ์„ฑ๋Šฅ ํ•˜๋ฝ์„ ๋ฐฉ์ง€ํ•จ.

์ต๋ช… ํด๋ž˜์Šค์˜ ๋‹จ์ 

  • ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

  • ํด๋ž˜์Šค ์ด๋ฆ„๋„, ๊ฐ์ฒด ์ด๋ฆ„๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค/๋ฉ”์†Œ๋“œ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    (๋‚ด๋ถ€ ํด๋ž˜์Šค, ์ต๋ช… ํด๋ž˜์Šค ๋ชจ๋‘ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ผ์ด ์—†์„ ๋•Œ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.)


๋žŒ๋‹ค ํ‘œํ˜„์‹ Lambda expression

  • ์ต๋ช…ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋‚ฎ์€ ๊ฐ€๋…์„ฑ๊ณผ ๋ถˆํŽธํ•จ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•จ.
    • ๋žŒ๋‹คํ‘œํ˜„์‹๊ณผ ์ต๋ช…ํด๋ž˜์Šค๋Š” ์„œ๋กœ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • (์กฐ๊ฑด) ๋žŒ๋‹ค์‹์€ ๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•จ.

๊ธฐ๋Šฅ์  ์ธํ„ฐํŽ˜์ด์Šค Functional Interface
: ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜๋ฏธํ•จ.

๋žŒ๋‹ค ํ‘œํ˜„์‹์˜ ๊ตฌ์„ฑ

(int x, int y) -> x + y

  • ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ชฉ๋ก (int x, int y)
    • ๋„˜๊ฒจ์ง€๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ํƒ€์ž…์ด ์„ ์–ธ๋œ๋‹ค.
  • ํ™”์‚ดํ‘œ ํ† ํฐ Arrow Token ->
    • ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž๋ผ๊ณ ๋„ ํ•œ๋‹ค.
  • ์ฒ˜๋ฆฌ์‹ x + y
    • ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์„ ํ‘œ์‹œํ•œ๋‹ค.

ํด๋กœ์ € closure ๋ž€?

์œ„ํ‚ค๋ฐฑ๊ณผ
ํด๋กœ์ €๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด ํ•จ์ˆ˜(first-class functions)์˜ ๊ฐœ๋…์„ ์ด์šฉํ•˜์—ฌ ์Šค์ฝ”ํ”„์— ๋ฌถ์ธ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ ๊ธฐ์ˆ ์ด๋‹ค.
๊ธฐ๋Šฅ์ƒ์œผ๋กœ, ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•œ ๋ ˆ์ฝ”๋“œ์ด๋ฉฐ, ์Šค์ฝ”ํ”„์˜ ์ธ์ˆ˜factor๋“ค์€ ํด๋กœ์ €๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ •์˜๋œ๋‹ค. ์Šค์ฝ”ํ”„ ๋‚ด์˜ ์˜์—ญ์ด ์†Œ๋ฉธ๋˜์—ˆ์–ด๋„ ๊ทธ์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ๋…๋ฆฝ๋œ ๋ณต์‚ฌ๋ณธ์ธ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ˜ธ๋ˆ…์Šค ์™ˆ..
: ํด๋กœ์ €๋Š” ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๋งŒ๋“ค์–ด์ง€๋Š” record / ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ƒํ™œ์ฝ”๋”ฉ
๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋งฅ๋ฝcontext์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
๋‚ด๋ถ€ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚˜ ์™ธ๋ถ€ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ฉธ๋œ ์ดํ›„์—๋„ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜.
์™ธ๋ถ€ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ๊นŒ์ง€ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค.

[์ž๋ฐ”] ์ŠคํŠธ๋ฆผ stream ์ด๋ž€?

์ฝ”๋”ฉํŒฉํ† ๋ฆฌ ๋ฐ ์ž๋ฐ”๊ธฐ๋ณธ์„œ.

์ŠคํŠธ๋ฆผ์€ Collection์˜ ์ €์žฅ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•ด ๋žŒ๋‹ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ณต์ž์ด๋‹ค.

  • Iterator์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋žŒ๋‹ค์‹์„ ์“ธ ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๋‹ค.

  • ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค.

  • ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋Š” java.util.stream ํŒจํ‚ค์ง€์˜ Stream ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•œ๋‹ค.

  • ๋ฐฐ์—ด์—๋Š” ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ, ๋ฐฐ์—ด์„ Collection์˜ List๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.
    Arrays.asList()๋‚˜ Arrays.stream()์„ ํ™œ์šฉ.

์ŠคํŠธ๋ฆผ์˜ ๊ตฌ์กฐ

list.stream().filter(x -> x>10).count();

  • ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
    : stream(). ๋ฆฌํ„ด ํƒ€์ž…์€ Stream.
    ์ปฌ๋ ‰์…˜์˜ ๋ชฉ๋ก์„ ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜.
    stream()์€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•จ.

    • stream(), parallelStream()
  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ intermediate operation
    : stream()๋ถ€ํ„ฐ ์ข…๋‹จ ์—ฐ์‚ฐ ์ „๊นŒ์ง€ ๋ชจ๋“  ์—ฐ์‚ฐ. ๋ฆฌํ„ด ํƒ€์ž…์€ Stream.
    ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ์ค‘๊ฐœ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•จ.
    ์ค‘๊ฐœ์—ฐ์‚ฐ์—์„œ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ๋ชปํ•จ.
    ๋ฐ˜๋“œ์‹œ ์ค‘๊ฐœ ์—ฐ์‚ฐ์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜ (0๊ฐœ ์ด์ƒ์˜ ์ค‘๊ฐœ์—ฐ์‚ฐ).

    • filter(), map(), flatMap(), distinct(), sorted(), peek(), limit(), skip() ๋“ฑ์ด ์žˆ๋‹ค.
  • ์ข…๋‹จ ์—ฐ์‚ฐ terminal operation
    : ์ŠคํŠธ๋ฆผ์˜ ๋งจ ๋ ์—ฐ์‚ฐ. ๋ฆฌํ„ด ํƒ€์ž…์€ ์ˆซ์ž๊ฐ’ ๋˜๋Š” ๋ชฉ๋กํ˜• ๋ฐ์ดํ„ฐ.
    ์ค‘๊ฐœ ์—ฐ์‚ฐ์—์„œ ์ž‘์—…๋œ ๋‚ด์šฉ์„ ๋ฆฌํ„ดํ•จ.

    • forEach(), reduce(), collect(), toArray(), count() ๋“ฑ์ด ์žˆ๋‹ค.