์คํฐ๋๋ฅผ ์ด์ํ๊ณ ์์ต๋๋ค. ํด๋น repository์ ๊ฐ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ณด์ค ์ ์์ต๋๋ค!
ํนํ close ๋ PR์ ๋ณด์๋ฉด, ์ด๋ค ๋ถ๋ถ์ ๋ํด์ ๊ณ ๋ฏผํ๊ณ ์คํฐ๋์๋ค๊ณผ ์ด์ผ๊ธฐ๋๋ด๋์ง ๋ณด์ค ์ ์์ต๋๋ค
https://github.com/JulSaMo/CS-start
๐ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ (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
https://mangkyu.tistory.com/111
https://jinnify.tistory.com/54