2021. 1. 9. 18:40ใ๐ง๐ป๐ป iOS ๊ฐ๋ฐ/Swift
ํด๋น ๊ธ์ ์ผ๊ณฐ๋์ ์ค์ํํธ ๊ฐ์์ ๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
์ฒ์ ํฌ์คํ ์์ Swift๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด๋ผ๊ณ ์ธ๊ธํ์๋ ๊ฒ ๊ธฐ์ต๋์๋์? ๊ทธ๋งํผ Swift์ ํจ์์ ๋ํด์ ์ ๊ณต๋ถํ๊ณ ๋์ด๊ฐ์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ Swift์ ๊ธฐ์ด์ ์ธ ํจ์, ๊ทธ ํน์ง๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์์ ์์ฃผ ๋ฑ์ฅํ๋ ๊ฐ๋ ์ธ ์ผ๊ธ ๊ฐ์ฒด์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
1. Swift์ ํจ์
Swift์ ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ์ด๋ฆ, ๋งค๊ฐ ๋ณ์ (Prameter), ๋ฐํํ์ (Return Type)๋ฑ์ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
์ด ๋ง์ ์ด ์ธ ๊ฐ์ง ์ค ํ๋๋ง ๋ฌ๋ผ๋ ๋ค๋ฅธ ํจ์๋ผ๋ ์๋ฏธ๊ฒ ์ฃ ?
- Swift์ ํจ์๋ ์ฌ์ ์ ( ์ค๋ฒ๋ผ์ด๋: Override ), ์ค๋ณต ์ ์ ( ์ค๋ฒ๋ก๋: Overload )๋ฅผ ๋ชจ๋ ์ง์ํฉ๋๋ค.
- ํจ์์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ต๋๋ค. ํน์ ํ์ ์ ์ฐ๊ด๋์ด ์ฌ์ฉํ๋ ํจ์๋ฅผ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅผ ๋ฟ์ ๋๋ค.
1. 1. ํจ์ ์ ์
//Swift ํจ์ ์ ์ ๊ธฐ๋ณธํํ
func ํจ์์ด๋ฆ(๋งค๊ฐ๋ณ์...) -> ๋ฐํ ํ์
{
์คํ ๊ตฌ๋ฌธ
return ๋ฐํ ๊ฐ
}
ํจ์๋ฅผ ์ ์ํ๋ ํค์๋๋ func์ด๋ฉฐ ๋ฐํ ํ์ ์ ๋ช ์ํ๊ธฐ ์ํด์ -> ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ๋์ด์ฐ๊ธฐ์ ํญ์ ์ ์ํด์ฃผ์ธ์. ๋ฐํ์ ์ํ ํค์๋๋ ๋ค๋ฅธ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก return์ ๋๋ค.
func helloWorld() -> String {
return "Hello World!"
}
print(helloWorld())
// Hello World!
1. 2. ๋งค๊ฐ๋ณ์ ์ด๋ฆ ๊ณผ ์ ๋ฌ ์ธ์ ๋ ์ด๋ธ
C, C++ ์ธ์ด์๋ ๋ค๋ฅด๊ฒ Swift์์๋ ํจ์์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ํ์ ์์ ์ ์ต๋๋ค. ๋ฆฌํด ํ์ ๋ -> ๋ค๋ก ๋งจ ๋ค์ ์์นํ์ฃ .
( C++ : int sum(int a, int b)์ด์๋ค๋ฉด, Swift : func sum(a: Int, b: Int) -> Int์ ํํ์ ๋๋ค. )
ํท๊ฐ๋ฆฌ์๋ค๋ฉด ์์๋ฅผ ํ๋ฒ ๋ด ์๋ค.
func sumInt(a: Int, b: Int) -> Int {
return a + b
}
var someInt: Int = sumInt(a: 3, b: 4)
print(someInt) // 7
func sayName(name: String) -> Void {
print("์ ์ด๋ฆ์ \(name) ์
๋๋ค.")
return
}
sayName(name: "extramilejin")
// ์ ์ด๋ฆ์ extramilejin ์
๋๋ค.
์ ๋ฌ ์ธ์ ๋ ์ด๋ธ์ ๊ฐ๊ฐ์ ๋งค๊ฐ๋ณ์์ ์ญํ ์ ์ข ๋ ๋ช ํํ ์ค๋ช ํด์ค๋๋ค. ์ ๋ฌ ์ธ์ ๋ ์ด๋ธ์ ๋งค๊ฐ๋ณ์ ํ ์นธ ์์ ์ ์ด ์ง์ ํฉ๋๋ค. ์ ๋ฌ ์ธ์ ๋ ์ด๋ธ์ ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ์ฝ๋๋ฅผ ๋ณผ ๋ ํจ์๋ฅผ ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ๋๋ค.
// ์ ๋ฌ์ธ์ ๋ ์ด๋ธ
func sayHello(from me: String, to friendName: String) -> String {
return "Hello! \(friendName). I'm \(me)."
}
print(sayHello(from: "extramilejin", to: "smith"))
// Hello! smith. I'm extramilejin.
์์ ์์์์ ์ ๋ฌ ์ธ์ ๋ ์ด๋ธ์ from ๊ณผ to ์ ๋๋ค. ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ me์ friendName์ด ๋๊ฒ ์ฃ . ์ด์ฒ๋ผ ๋งค๊ฐ๋ณ์ ์ด๋ฆ ํ์นธ ์์ ์ฐ์ฌ์ ๋งค๊ฐ๋ณ์ ์ญํ ์ ์ค๋ช ํฉ๋๋ค. ํจ์ ํธ์ถ์์๋ ๋งค๊ฐ๋ณ์์ด๋ฆ ๋์ ์ ๋ฌ์ธ์ ๋ ์ด๋ธ๋ก ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค.
๋ํ, ๋๋จธ์ง๋ ๋ค ๊ฐ์ ํจ์์ฌ๋ ์ด ์ ๋ฌ์ธ์ ๋ ์ด๋ธ์ด ๋ค๋ฅด๋ฉด ํจ์์ ์ด๋ฆ์ด ๋ฌ๋ผ์ง๋๋ค. ์ฆ, ์ ๋ฌ์ธ์ ๋ ์ด๋ธ๋ง์ ๋ฐ๊ฟ ์จ์ค๋ ํจ์ ์ค๋ณต ์ ์(์ค๋ฒ๋ก๋)๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
1. 3. ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ๊ณผ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์
๋ค๋ฅธ ์ธ์ด๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Swift์ ํจ์ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค. ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๋ฉด ์ ๋ฌ ์ธ์๋ก ๊ฐ์ด ๋์ด์ค์ง ์์๋ ํจ์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์ ์๋ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ํ์ ๋ค์ = ๋ก ์์ฑํฉ๋๋ค.
func repeatSayHello(from me: String, to friendName: String, repeatCount times: Int = 2) -> Void {
for i in 0..<times {
print("Hello! \(friendName) I'm \(me).")
}
}
repeatSayHello(from: "extramilejin", to: "simson")
// Hello! simson I'm extramilejin.
// Hello! simson I'm extramilejin.
times ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ 2๋ก ์ค์ ํ์ฌ ํธ์ถ ์ ์ ๋ฌํ์ง ์์๋ ์ ์ ์๋ํฉ๋๋ค.
๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ ๋งค๊ฐ๋ณ์๋ก ๋ช ๊ฐ์ ๊ฐ์ด ๋ค์ด์ฌ์ง ๋ชจ๋ฅผ ๋ ์ฌ์ฉํฉ๋๋ค. 0๊ฐ ์ด์์ ๊ฐ์ ์ผ ๋ ์ฌ์ฉํ๋ฏ๋ก 0๊ฐ์ผ ๋, ๊ฐ์ด ๋ค์ด์ค์ง ์์์ ๋๋ ํ์ฉํฉ๋๋ค. ํ์ ๋ค์ ๋ง์นจํ ์ธ ๊ฐ(...)๋ฅผ ์ฐ์ด ๋ช ์ํฉ๋๋ค.
์ค์ํ ์ ์ ํจ์๋ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋๋ง ๊ฐ์ง ์ ์๋ค๋ ์ ์ ๋๋ค.
๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ ์ธ์๋ ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
func sayHelloFriends(from me: String, to friendNames: String...) -> String {
var result: String = ""
for friendName in friendNames {
result += "Hello \(friendName)! "
}
result += "I'm \(me)."
return result
}
print(sayHelloFriends(from: "extramilejin", to: "simson","naruto","duli"))
// Hello simson! Hello naruto! Hello duli! I'm extramilejin.
2. ์ผ๊ธ ๊ฐ์ฒด ( First-Class Citizen )
Swift ๋ฟ๋ง ์๋๋ผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง์ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด ( First-Class Citizen )๋ก ๋ค๋ฃฌ๋ค๋ ์ ์ ๋๋ค.
์ผ๋ฑ๊ธ ์๋ฏผ? ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ์๋ ๋ถ๋ค์ ์์ํ ๊ฐ๋ ์ผ ๊ฒ์ ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ถ์ผ์์ ์ผ๊ธ ๊ฐ์ฒด๊ฐ ๋๊ธฐ ์ํด ๋ฐ๋์ ์ถฉ์กฑํด์ผ ํ 5๊ฐ์ง ์กฐ๊ฑด๋ค์ด ์กด์ฌํฉ๋๋ค.
- ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ ๋ด์ ์ ์์ต๋๋ค.
- ๋ฆฌํด ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ๋ฌ ์ธ์ (Argument)๋ก ์ ๋ฌ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋์ ํ๋กํผํฐ ํ ๋น์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํ ๋นํ ๋ ์ฌ์ฉ๋ ์ด๋ฆ๊ณผ ๊ด๊ณ์์ด ๊ณ ์ ํ ๊ฐ์ฒด๋ก ๊ตฌ๋ณ ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฐ ๊ฒ๋ค์ด ๊ฐ๋ฅํ๋ฉด ์ผ๊ธ ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฅผ ์ ์๊ตฌ๋๋ผ๊ณ ์ดํดํ๊ณ ๋์ด๊ฐ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ช ๊ฐ์ง ๊ฐ๋จํ ์ฝ๋์ ํจ๊ป ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
2. 1. ํจ์๋ฅผ ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ ๋ด์ ์ ์์ต๋๋ค.
func addInt(first a: Int, second b: Int) -> Int {
return a + b
}
var someFunc: (Int, Int) -> Int = addInt
print(someFunc(2,3))
// 5
2. 2. ํจ์๋ฅผ ๋ฆฌํด ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
func addInt(a: Int, b: Int) -> Int {
return a + b
}
func substractInt(a: Int, b: Int) -> Int {
return a - b
}
// ์ ๋ฌ ๋ฐ์ Bool ๊ฐ์ ๋ฐ๋ผ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค.
func chooseMathFuction(toAdd: Bool) -> (Int, Int) -> Int {
return toAdd ? addInt : substractInt
}
var mathFunction: (Int, Int) -> (Int) = chooseMathFuction(toAdd: true)
print(mathFunction(5,3)) // 8
mathFunction = chooseMathFuction(toAdd: false)
print(mathFunction(5,3)) // 2
2. 3. ํจ์๋ฅผ ์ ๋ฌ ์ธ์๋ก ์ ๋ฌ ๊ฐ๋ฅํฉ๋๋ค
func addInt(a: Int, b: Int) -> Int {
return a + b
}
// ๋งค๊ฐ๋ณ์๋ก ํจ์๋ฅผ ์ ๋ฌ ๋ฐ์ต๋๋ค.
func outsideFunc(function: (Int, Int) -> Int) -> Int {
var result: Int = function(3,2)
return result
}
print(outsideFunc(function: addInt))
3. ๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํฌ์คํ ์์ Swift์ ๊ฐ๋จํ ํจ์ ํํ์ ์ผ๊ธ ๊ฐ์ฒด ๊ฐ๋ ์ ๋ํด์ ๊ณต๋ถํด๋ดค์ต๋๋ค. ๋ค์ ํฌ์คํ ์์๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์, ์ค์ฒฉ ํจ์์ ๋ฐํ์ด ์๋ ํจ์ ๋ฑ์ ๋ํด์ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. ๋ถ์กฑํ ๋ถ๋ถ์ด๋ ์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค!
์ฐธ์กฐ: ์ ํ API ๊ฐ์ด๋๋ผ์ธ , ์ ํ ๊ณต์ ๊ฐ๋ฐ ๋ฌธ์ , Swift 5 ํ๋ก๊ทธ๋๋ฐ/ ์ง์์ด ์ผ๊ณฐ