Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Computer/Computer Science

[System Engineering] (iOS) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ / ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ (feat. swift ์ฝ”๋“œ๋กœ ๋น„๊ตํ•˜๋ฉฐ ์•Œ์•„๋ณด๊ธฐ)

๊ฐ์ž ๐Ÿฅ” 2022. 9. 20. 17:12
๋ฐ˜์‘ํ˜•

์Šคํ„ฐ๋””๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น repository์— ๊ฐ€๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
ํŠนํžˆ close ๋œ PR์„ ๋ณด์‹œ๋ฉด, ์–ด๋–ค ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•˜๊ณ  ์Šคํ„ฐ๋””์›๋“ค๊ณผ ์ด์•ผ๊ธฐ๋‚˜๋ˆด๋Š”์ง€ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 

https://github.com/JulSaMo/CS-start

 

GitHub - JulSaMo/CS-start: ๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ

๐Ÿ“ CS ์ง€์‹ ๋Œ€๋ฐฑ๊ณผ โœจ. Contribute to JulSaMo/CS-start development by creating an account on GitHub.

github.com

 


 

๐ŸŸ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ (Programming Paradigm)

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ด€์ ์œผ ๋ฝ์ ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ธ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ฌด์—‡(what)์„ ํ•  ๊ฒƒ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๊ธฐ๋ณด๋‹ค ์–ด๋–ป๊ฒŒ(How) ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒํƒœ, ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ตฌ๋ฌธ์˜ ๊ด€์ ์—์„œ ์—ฐ์‚ฐ์„ ์„ค๋ช…ํ•œ๋‹ค.
  • ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ์ˆ˜ํ–‰๋˜์–ด์•ผํ•  ์ˆœ์ฐจ์ ์ธ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํฌํ•จํ•˜๋Š” ๋ฐฉ์‹ (C, C++)
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ‘œํ˜„ (C++, Java, C#)

๐Ÿ”ธ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์–ด๋–ป๊ฒŒ ํ• ๊ฑด์ง€(HOW)๋ณด๋‹ค๋Š” ๋ฌด์—‡์„ (WHAT)์„ ํ•  ๊ฑด์ง€ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜๊ณ  ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹ (ํด๋กœ์ €, ํ•˜์Šค์ผˆ, ๋ฆฌ์Šคํ”„)

๐Ÿฆ ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•œ ์„ ์–ธํ˜•๊ณผ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฐจ์ด์ !

<๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ> How ์— ์ง‘์ค‘
- ์ž๋ฆฌ์—์„œ ์ผ์–ด๋‚œ๋‹ค
- ๋ถ€์—Œ์œผ๋กœ ์ด๋™ํ•œ๋‹ค
- ์ปต๊ณผ ๋ฌผ์„ ์ฐพ๋Š”๋‹ค
- ์ปต์— ๋ฌผ์„ ๋ถ€์–ด ๋งˆ์‹ ๋‹ค

<์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ> What์— ์ง‘์ค‘
- ๋ฌผ์„ ์ฐพ์•„ ๋งˆ์…”๋ณด์ž!

๐ŸŸ  ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

 

๐Ÿ”ธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์ดํ•ด

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” n๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. (์•„๋ž˜ process ์ฝ”๋“œ๋Š” ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•œ ์ˆ˜๋„์ฝ”๋“œ์ด๋‹ค.)

process(10, print(num))

์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ช‡ ๋ฒˆ iteration์„ ๋Œ ๊ฒƒ์ธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•˜๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ์žˆ๋‹ค. ์ฆ‰, ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒผ๋‹ค๋Š” ๋œป์ธ๋ฐ, ์ด๋ ‡๊ฒŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” 'ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์›๋ฆฌ, ํ•จ์ˆ˜๋Š” 1๊ธ‰๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค'๋ผ๋Š” ํŠน์ง• ๋•Œ๋ฌธ์ด๋‹ค. (์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋’ค์—์„œ ์ถ”๊ฐ€๋กœ ๋” ์žˆ์–ด์—ผ)

๐Ÿฆ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋‹ค๋ฅธ์ 

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‚ด๋ถ€์˜ ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๋“ฑ์˜ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

 

 

๐Ÿ”ธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•

โœจ ๋ถ€์ˆ˜ํšจ๊ณผ (side Effect)๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ 1๊ธ‰ ๊ฐ์ฒด (first-class object)๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฆ ๋ถ€์ˆ˜ํšจ๊ณผ (Side Effect) ๋ž€

๋ถ€์ˆ˜ํšจ๊ณผ๋ž€, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€ํ™” ๋˜๋Š” ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ
  • ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ œ์ž๋ฆฌ์—์„œ ์ˆ˜์ •ํ•จ
  • ์ฝ˜์†” ๋˜๋Š” I/O๊ฐ€ ๋ฐœ์ƒํ•จ

์ง€๊ธˆ์€ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ž‘ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ํ•จ๊ป˜ ์ดํ•ดํ•ด๋ณด์ž.

๐Ÿฆ ์ˆœ์ˆ˜ํ•จ์ˆ˜ (Pure Function) ๋ž€

์œ„์˜ ๋ถ€์ˆ˜ํšจ๊ณผ๋“ค์„ ์ œ๊ฑฐํ•œ ํ•จ์ˆ˜๋“ค์„ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ด์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ด๋Ÿฌํ•œ ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋‹ค! ์ฆ‰, ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋ฏ€๋กœ, ๋“ค์–ด์˜จ ์ธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์€ ํ•จ์ˆ˜

๐Ÿ’ฌ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

var testName = "hello world"

func getName -> String {
    return testName
}
์œ„ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์ผ๊นŒ? โŒ
- getNameํ•จ์ˆ˜๋Š” ์™ธ๋ถ€์— ์žˆ๋Š” name์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
- name์ด var๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์„œ side-effect๊ฐ€ ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์œ„ ํ•จ์ˆ˜๋ฅผ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

func getName(_ name: String) -> String {
    return name
}
์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ๋ฉด ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋‹ค. โœ…
- ํ•จ์ˆ˜ ์ž์ฒด์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ name์˜ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— 
์™ธ๋ถ€์˜ ์˜ํ–ฅ์„ ์ „ํ˜€ ๋ฐ›์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ•˜์ง€๋งŒ!!! ์œ„์—์„œ var ๋กœ ์„ ์–ธ๋˜์–ด side effect๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ–ˆ์ž–์Œ?

let testName = "hello world"

func getName -> String {
    return testName
}
์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋„ ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋‹ค!! โœ…

๐Ÿ’ฌ ์ˆœ์ˆ˜ํ•จ์ˆ˜์˜ ์žฅ์ ์„ ์•Œ์•„๋ณด์ž

  • ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ๋…๋ฆฝ์ ์ด๋ฉฐ side-effect๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Thread์— ์•ˆ์ „์„ฑ์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. (์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ, I/O์˜ ๊ด€์ ์—์„œ side effect๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „์„ฑ์„ ๋ณด์žฅ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.)
  • Thread์— ์•ˆ์ „์„ฑ์„ ๋ณด์žฅ๋ฐ›์•„ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋ฅผ ๋™๊ธฐํ™”์—†์ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฆ 1๊ธ‰๊ฐ์ฒด (first class object)๋ž€

1๊ธ‰ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ๋“ค์ด 1๊ธ‰๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

- ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
- ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ํ• ๋‹น์— ์‚ฌ์šฉ๋œ ์ด๋ฆ„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณ ์œ ํ•œ ๊ตฌ๋ณ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•จ์ˆ˜๋Š” 1๊ธ‰๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์˜ˆ์ œ์—์„œ ๋ณธ process(10, print(num)) ์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿฆ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ (Referential Transparency)

- ๋™์ผํ•œ ์ธ์ž์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
- ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ํ†ตํ•ด ๊ธฐ์กด์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋œ๋‹ค.

๋ช…๋ นํ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” side effect์˜ ์œ ๋ฌด ์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐ์— ํˆฌ๋ช…ํ•œ์ง€ ์•ˆํ•œ์ง€ ๋‚˜๋ˆ ์ง€๋Š”๋ฐ, ์ฐธ์กฐ์— ํˆฌ๋ช…ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ง ๊ทธ๋Œ€๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ๋„ ์–ด๋– ํ•œ ์ƒํƒœ ๋ณ€ํ™” ์—†์ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ•ญ๋‹น ๋™์ผํ•˜๊ฒŒ(ํˆฌ๋ช…ํ•˜๊ฒŒ) ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ(์˜ˆ์ธก)ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

๐Ÿ”ธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฅ์ ์„ ์•Œ์•„๋ณด์ž!

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

 


 

๐ŸŸ  ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๋กœ ๋น„๊ตํ•ด๋ณด๊ธฐ

doSomething ํ•จ์ˆ˜์™€ doAnotherThing ํ•จ์ˆ˜๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ์น˜์ž.

// โœ… ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
class CommandProgramming {
    func doSomething() {
        print("doSomething")
    }
    
    func doAnotherThing() {
        print("doAnotherThing")
    }
    
    func executeAll() {
        doSomething()
        doAnotherThing()
    }
}

// ํ˜ธ์ถœ
excuteAll()
// โœ… ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
class CommandProgramming {
    func doSomething() {
        print("doSomething")
    }
    
    func doAnotherThing() {
        print("doAnotherThing")
    }
    
    func executeAll(tasks: [() -> Void)) {
        for task in tasks {
            task()
        }
    }
}

// ํ˜ธ์ถœ
excute(tasks: [doAnotherThing, doSomething])

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์•ˆ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰๊ฐ์ฒด ์ด๋ฏ€๋กœ, ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž ๋˜๋Š” ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐจ์ด์ ์„ ํ‘œ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 


 

๐Ÿ“– REFERENCE

https://borabong.tistory.com/5

 

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

์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ’œ ๋ณด๋ผ๋ด‰์ž…๋‹ˆ๋‹ค :) ์˜ค๋Š˜์€ ์Šค์œ„ํ”„ํŠธ ์–ธ์–ด์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž!! ์Šค์œ„ํ”„ํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ๋Œ€

borabong.tistory.com

https://mangkyu.tistory.com/111

 

[ํ”„๋กœ๊ทธ๋ž˜๋ฐ] ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Functional Programming) ์ด๋ž€?

1. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Functional Programming)์— ๋Œ€ํ•œ ์ดํ•ด [ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„(Programming Paradigm) ] ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„(Programming Paradigm)์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ด€์ ์„ ๊ฐ–๊ฒŒ ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ..

mangkyu.tistory.com

https://jinnify.tistory.com/54

 

[Swift] 1. ์ˆœ์ˆ˜ํ•จ์ˆ˜, Pure Function (Functional Programming in Swift)

์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)์— ๊ด€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ Funtional Programming์€ ํ•จ์ˆ˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ Side-Effect๊ฐ€ ์—†๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜

jinnify.tistory.com

 

๋ฐ˜์‘ํ˜•