์ค๋ ์ ๋ฆฌํ ๋ด์ฉ์ ์ผ๊ธ ๊ฐ์ฒด์ ๊ดํด์์ด๋ค.
์์ด๋ก๋ First Class Citizen
๋ผ๊ณ ํ๋๋ฐ,
์ด๋ ํ๊ทธ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ์๊ฐํ์.
์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ฒด๋ค์ ๋ํด์
โ๋๋ ์ผ๊ธ๊ฐ์ฒด์ผโ ๋ผ๊ณ ํ๊ทธ๋ฅผ ๋ถ์ฌ์ค๋ค๊ณ ์๊ฐํ๋ฉด ์ข๋ค.
Citizen ๋์ object, type, value ๋ฑ๋ฑ ๋ค์ํ๊ฒ ๋ถ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
์ผ๊ธ ๊ฐ์ฒด์ ์กฐ๊ฑด
์ฒซ์งธ, ๋ณ์ ๋๋ ์์๋ก ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
๋์งธ, ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ ์งธ, ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ฑ ์ฝ์์ ๋ ๋ค์๋ ์๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก Int
๋ Class
๋ฑ๋ฑ ์ฒ๋ผ ๋ง์ด ์ฌ์ฉํ๋๊ฑฐ๋ค? ์ถ์๋ค.
๊ทธ๋์ ์ด ๋ง์ด ๋ณธ ์๋ฃํ๋ค ๊ฐ์ง๊ณค ๋ฐ๋ก ์ผ๊ธ ๊ฐ์ฒด๋ ์ฃผ์ ๋ก ํฌ์คํ ์ด ๋์ง ์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ ์ง๋ง ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ ๊ฒ์ ๋ํ ๊ธ์ ๋์ณ๋ ๊น?
๋น์ฐํ์ง ์๊ธฐ ๋๋ฌธ์ด๊ฒ ์ง?
๊ทธ๊ฒ ๊ฐ๋ฅํ ์ธ์ด๊ฐ ์๊ณ ์๋ ์ธ์ด๋ค์ด ์๋๋ฐ,
์ค์ํํธ๋ ์ด๋ฅผ ๋ง์กฑํ๊ธฐ๋๋ฌธ์ ํฌ์คํ ๋ค์ด ๋ง์ด ๋๋๋ณด๋ค.
๋ํ, ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด๋ก์จ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ฉด
๊ทธ ์ธ์ด๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
๋ผ๊ณ ๋ ๋ถ๋ฅผ ์ ์๋ค
๋ง์กฑ์ ํ๋ค๋๊ฑด ์์์ผ๋ ์ด๋ป๊ฒ ์ฐ์ผ ์ ์๋์ง ๋ณด์.
์ฒซ์งธ, ๋ณ์ ๋๋ ์์๋ก ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
์ฐ์ , ์ผ๋ฐ์ ์ธ ํจ์๋ฅผ ๋ณด์.
func hellowFunction() -> String {
return "์๋
?"
}
์ด๋ ๊ฒ ์๊ฒผ๋ค.
์ด๊ฒ์ ์ฌ์ฉ
ํ ๋ ์ด๋ ๊ฒ ์ด๋ค.
let a = hellowFunction()
๊ทธ๋ฌ๋ฉด a
์๋ Return
๊ฐ์ธ "์๋
?"
์ด ์ ์ฅ๋๋ค.
์ด๊ฒ์ ์ฌ์ฉ์ด๋ค. ์ฌ์ฉ์ ํฌ์ธํธ๋ ํจ์๋ช
+ ์๊ดํธ
์ด๋ค.
๋ค์ ์๊ดํธ ๋ถ๋ถ์ด ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ๋ค.
๊ทธ๋ ๋ค๋ฉด ํ ๋น์ ๊ฐ๋จํ๋ค. ์ฌ์ฉ์ ์๋ฏธํ๋ ์๊ดํธ๋ฅผ ์ ๊ฑฐํด์ฃผ๋ฉด ๋๋ค.
let b = hellowFunction
a
์ b
์ ๋ํด ์ถ๋ ฅ์ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์จ๋ค.
print(a)
print(b)
---- ์ฝ์์ฐฝ
์๋
?
(Function)
์์ฃผ ์น์ ํ๊ฒ โb๋ ํจ์์ผโ ๋ผ๊ณ ๋งํด์ค๋ค.
๊ทธ๋ผ, ์ด๊ฒ์ ๋ค์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด?
์์ ๋งํ๋ ์๊ดํธ
๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ํ๋ฒ 3๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด ์ถ๋ ฅ์ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
let a = hellowFunction()
let b = hellowFunction
let c = b()
print(a)
print(b)
print(c)
---- ์ฝ์์ฐฝ
์๋
?
(Function)
์๋
?
๋์งธ, ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํจ์์ ์ ๋ ฅ ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๋ง์ด๋๊น, ์๊ธด๊ฑด ์ด๋ ๊ฒ ์๊ฒผ๋ค.
func useParameter(function: ()->()) {
// ์ฌ์ฉ์ ์ด๋ป๊ฒ? ์๊ดํธ ๋ถ์ฌ์!
function()
}
๋ณดํต ๊ฐ์์ผ๋ฉด String
, Int
๊ฐ์ ๊ฒ๋ค์ด ๋ค์ด ๊ฐ ์๋ฆฌ์
ํจ์ ๋ท๋ถ๋ถ์ ๋ถ์๋งํ ๊ฒ๋ค์ด ๋งค๊ฐ๋ณ์๋ก์ ๋ค์ด๊ฐ์๋ค.
์ฌ์ฉ๋ฒ์ ์ฃผ์๊ณผ ๊ฐ์ด ์๊ดํธ ๋ถ์ฌ์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ ๊ฑฐ๊ณ
์ด ํจ์์ ํธ์ถ์ ๋ํด์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
useParameter(function: hellowFunction)
hellowFunction
์ ๋ถ๋ช
ํ ํจ์
์๊ณ , ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ useParameter
ํจ์์์ ๋ฐ์ ํจ์๋ฅผ ์ฌ์ฉ ํ๊ธฐ๋๋ฌธ์
์ฝ์์ฐฝ์ ์ญ์๋ "์๋
?"
์ด ์ฐํ๊ฒ ๋๋ค.
์ด ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋๋์ฒด ์ธ์ ์ฐ๊ฒ ๋ ์ง๋ฅผ ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข๋ค.
ํจ์๋ผ๋ ๊ฒ์ ๊ฒฐ๊ตญ์ ํ๋์ ๋ก์ง์ด๋ค.
ํจ์ ๋ด์์ ์ด๋ค ์ถ๊ฐ์ ์ธ ๋ก์ง์ ํ๊ณ ์ถ์๋, ํจ์๋ฅผ ์ธ์๋ก์จ ๋ฐ์ผ๋ฉด ์ข๋ค.
๋จ์ํ๊ฒ ์๊ฐํด์ โ๊ทธ๋ฅ,,, ์ถ๊ฐ์ ์ผ๋ก ์ฐ๊ณ ์ถ์ผ๋ฉด ํจ์์์ ํธ์ถํ๋ฉด ๋์๋?โ
๋ผ๊ณ ์๊ฐ์ด ๋ค์๋ค๋ฉด, ์ด๋ ๊ฒ ์๊ฐํด๋ณด์
ํจ์A๋ด์์ ํน์ ํจ์๋ช B์ ๋ฃ์ด๋ฒ๋ฆฐ๋ค๋ฉด, ํจ์A๋ ํจ์B์ ๋ง์ถคํ์ด ๋์ด๋ฒ๋ฆฐ๋ค.
์ฆ, ๋ค๋ฅธ ํจ์ C,D,E ๋์์ ๋ํด์๋ ์ ์ฐํ๊ฒ ๋์ฒ ํ ์ ์๋ค๋ ์ ์ด ๋งค๋ ฅ ํฌ์ธํธ!
์ด๋ถ๋ถ์ SOLID ์์น์ค
OCP
๋ฅผ ๋ ์ฌ๋ฆฌ๊ฒ ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค.
ํ์ฅ์๋ ์ด๋ ค(open)์๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ(closed)์๋๋ก ํด๋ผ!!
์ ์งธ, ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๊ณ ๋ฏผ์ ํด๋ณด์๋ค.
func returnFunction() -> ()->() {
return hellowFunction
}
์ด๋ผ ํ๊ณ ๋! ์ด๋ผ ํ๋ฉด ๋๋ฌด ์ฑ์ ์์ ๊ฑฐ ๊ฐ์๋ค.
๊ทธ๋์ ํจ์ ๋๊ฐ ์ค๋น
// 1. ๋ํ๊ธฐ
func add(x: Int, y: Int) -> Int {
return x + y
}
// 2. ๋นผ๊ธฐ
func sub(x: Int, y: Int) -> Int {
return x - y
}
ํ๋๋ ๋ํ๊ธฐ ํ๋ ํจ์, ํ๋๋ ๋นผ๊ธฐํ๋ ํจ์๋ค.
๊ณตํต์ ์ ๋๊ฐ์ Int
์ธ์๋ฅผ ๋ฐ๊ณ ํ๋์ Int
๋ก ๋ฆฌํด์ ํด์ค๋ค.
์ ์ด์ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ณด์
func getFunction(operation: String) -> (Int,Int) -> Int {
switch operation {
case "+":
return add
case "-":
return sub
default:
fatalError()
}
}
์์์ฃผ ๊ฐ๋จํ๋ค +
๋ฅผ ์ธ์๋ก ๋ฃ์ผ๋ฉด ๋ํ๊ธฐ ํจ์๋ฅผ ๋ฑ๊ณ -
๋ฅผ ์ธ์๋ก ๋ฃ์ผ๋ฉด ๋นผ๊ธฐ ํจ์๋ฅผ ๋ฑ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
var cal = getFunction(operation: "+")
print(cal(1,2))
cal = getFunction(operation: "-")
print(cal(5,1))
--- ์ฝ์์ฐฝ
3
4
์ด๋ ๊ฒํ๊ฒ ๋๋ฉด ๋ ๊ฐ
์ ์ธ์๋ก ๋ฐ๊ณ ํ๋์ ๊ฐ
์ ๋ฑ์ด์ฃผ๋ ํจ์๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
ํ๋์ ํจ์๋ช ์ ๊ฐ๊ณ ์์ง๋ง ์๋ก ๋ค๋ฅธ ์ญํ ์ ํ๋ค.
์์๋ก ๊ณ์ฐ๊ธฐ์ +
, -
์ ๊ฐ์ ๋ฒํผ์ด ๋๋ ธ์ ๋,
๋์ํ๋ ํจ์๋ฅผ ๋ฑ์ด์ฃผ๊ฒํ๊ณ ,
์ค์ ๋ก ์ฐ์ฐ์ ํ ๋๋ ํ๊ฐ์ง ํจ์ ํ์ ์ ๋ณ์๋ก ๋๋ ค์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค.
์ ๋ง์กฑ์ค๋ฐ ์์ ์ผ
์๊ฐํ๊ณ ๋ณด๋ ์ด๋์ ๋ณธ ์์ ๊ฐ๊ธฐ๋ํ๊ณ ,, ๊ณต์ ๋ฌธ์์ ์์๋..
๋ง๋ฌด๋ฆฌ
์๋ฌดํผ ์ด๋ ๊ฒํด์ ์ผ๊ธ ๊ฐ์ฒด์ ๋ํด์ ์์๋ณด์๋ค.
์ฌ์ค 3๊ฐ์ง ์กฐ๊ฑด์ธ์๋ ๋์๋ค. ๋ฐํ์์ ์์ฑ์ด ๊ฐ๋ฅํด์ผํ๋ค๋๋, ๋น๊ต ์ฐ์ฐ์ด ๊ฐ๋ฅํด์ผํ๋ค๋๋,,,
๊ทผ๋ฐ ๋ฐํ์์ ์กฐ๊ฑด์ ์ํค์๋ ๋์์ง๋ง ๊ทธ๋ฐ ์กฐ๊ฑด์ ๋งํ๊ธฐ๋ ํ๋ค!
๋ผ๊ณ ํด์ ์ ์ธ ์์ผฐ๊ณ ,
๋น๊ต ์ฐ์ฐ ๊ฐ์ ๊ฒฝ์ฐ Swift์์ ๊ถ์ฅ๋์ง ์๋๋ค๊ณ ํ์ฌ์ ์ ์ธํ์๋ค.
์ฌ์ค ์ด๊ฒ์ด ๋๋ฅผ ๋ ํท๊ฐ๋ฆฌ๊ฒ ๋ง๋ ๊ฑด ํด๋ก์ ๋๋ฌธ์ด๋ผ
๋ค์ ํฌ์คํ ์ ํด๋ก์ ๋ฅผ ํ๊ณ
๊ทธ ๋ค์ ํฌ์คํ ์ ํด๋ก์ ์ ์ผ๊ธ๊ฐ์ฒด๋ก ํด์ผ๊ฒ ๋ค.
๋.