์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
์์ ์ TIL๋ก ์ ๋ฆฌํ๋ Generic์ ๋ํ ๋ด์ฉ์ ๋ธ๋ก๊ทธ์๋ ํฌ์คํ ํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์ฝ์ฅ ํด์์ต๋๋ค ใ ใ
Generic์ ๋ํด Apple์ Swift๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค!
Generic์ด๋?
generic์ ํฌ๊ด์ ์ธ, ํต์นญ์ ์ ๋์ ์ฌ์ ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
๊ทธ๋ ๋ค๋ฉด, Apple์์ ์๊ฐํ๋ generic์ ๋ํด ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
Generic์ด๋ ํ์
์ ์์กดํ์ง ์๋ ๋ฒ์ฉ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
Generic์ ์ฌ์ฉํ๋ฉด ์ค๋ณต์ ํผํ๊ณ , ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Generic์ Swift์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ก, Swift ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ถ๋ถ์ Generic ์ฝ๋๋ก ์์ฑ๋์ด์์ต๋๋ค.
์ค์ ๋ก, Generic์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ธ์ ๋ชปํ๋ค๊ณ ํ๋๋ผ๋ Language Guide ์ ์ฒด์์ Generic์ ์ฌ์ฉํด์์ต๋๋ค.
๊ทธ ์๋ก, Swift์ Array์ Dictionary๋ ๋ชจ๋ Generic ์ปฌ๋ ์
์
๋๋ค. (ํ์
์ ๋ํ ์ ํ์์ด Array๋ Dictionary๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.)
Generic Function (์ ๋ค๋ฆญ ํจ์)
Apple์์ ์ ๊ณตํ๋ ์์ ๋ฅผ ํตํด Generic์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let tempA = a
a = b
b = tempA
}
์์ ํจ์๋ ๋ ์ ์์ ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋(swap) ํจ์์
๋๋ค.
์ด ํจ์๋ก ๋ค์ด์ค๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ชจ๋ Intํ์ผ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํ๋ผ๋ฏธํฐ ํ์
์ด Int๊ฐ ์๋ Double์ด๋ ๋ค๋ฅธ ํ์
์ด๋ผ๋ฉด? ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ํ๋ฉด Swift๋ ํ์
์ ๋ฏผ๊ฐํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์
๋๋ค!
๋ง์ฝ Int๊ฐ ์๋ ๋ค๋ฅธ ํ์ ์ ๋ํด์ swapํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let tempA = a
a = b
b = tempA
}
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let tempA = a
a = b
b = tempA
}
์์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ ํ์
์ ๋ฐ๊ฟ ํ์์ ๋ฐ๋ผ ํจ์๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด ์ฃผ๋ฉด ๋์ง๋ง..
์ด ๊ณผ์ ์ด ๋๋ฌด๋ ๋ฒ๊ฑฐ๋กญ๊ฒ ์ฃ ..? ์ด๋ ๊ฒ ํ์
์ ์ ํ์ ๋์ง ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก Generic์
๋๋ค!
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let tempA = a
a = b
b = tempA
}
์์ ๊ฐ์ด ๊บฝ์ (<>)๋ฅผ ์ด์ฉํด์ ์์ ํ์
์ฒ๋ผ ์ฌ์ฉํ ์ด๋ฆ(์์ ์์ ์์ T)์ ์ ์ธํด์ฃผ๋ฉด,
๊ทธ ๋ค๋ก ํด๋น ์ด๋ฆ(T)์ ํ์
์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ด T๋ฅผ Type Parameter๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, T๋ผ๋ ์๋ก์ด ํ์์ด ์์ฑ๋๋ ๊ฒ์ด ์๋๋ผ,
์ค์ ํจ์๊ฐ ํธ์ถ๋ ๋ ํด๋น ๋งค๊ฐ๋ณ์์ ํ์
์ผ๋ก ๋์ฒด๋๋ placeholder์ด๊ธฐ ๋๋ฌธ์ Swift๋ "T"๋ผ๋ ์ค์ ํ์
์ ์ฐพ์ง ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ T๋ง๊ณ ๋ค๋ฅธ ํ์
์ด๋ฆ๋ ๋ค ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค!
+ ํ์
ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์ด๋ค ์ด๋ฆ์ด๋ ์์ ๋กญ๊ฒ ์ ์ธ ๊ฐ๋ฅํ์ง๋ง,
๋ณดํต ๊ฐ๋
์ฑ์ ์ํด T๋ V ๊ฐ์ ๋จ์ผ ๋ฌธ์, ํน์ Upper Camel Case๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค!
var someInt = 1
var anotherInt = 2
swapTwoValues(&someInt, &anotherInt) // ํจ์ ํธ์ถ ์ T๋ Int ํ์
์ผ๋ก ๊ฒฐ์ ๋จ
var someString = "Hi"
var anotherString = "Bye"
swapTwoValues(&someString, &anotherString) // ํจ์ ํธ์ถ ์ T๋ String ํ์
์ผ๋ก
์์ ๊ฐ์ด ์ ๋ค๋ฆญ์ผ๋ก ์ ์ธํ ํจ์๋
์ด๋ ๊ฒ ์ค์ ํจ์๋ฅผ ํธ์ถํ ๋, Type Parameter์ธ T์ ํ์
์ด ๊ฒฐ์ ๋ฉ๋๋ค!
swapTwoValues(&someInt, &anotherString) // Cannot convert value of type 'String' to expected argument type 'Int'
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์์ ๊ฐ์ด ์๋ก ๋ค๋ฅธ ํ์
์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์๋ํ๋ฉด ์์์ ํจ์ ์ ์ ์ ํ๋ผ๋ฏธํฐ a์ b ๋๋ค ๊ฐ์ ํ์
ํ๋ผ๋ฏธํฐ์ธ T๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์
๋๋ค!
์ด๋ ๊ฒ ์๋ก ๋ค๋ฅธ ํ์
์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ฉด, ์ฒซ ๋ฒ์งธ someInt๋ฅผ ํตํด ํ์
ํ๋ผ๋ฏธํฐ T๊ฐ Int๋ก ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์,
๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ anotherString์ ํ์
์ด Int๊ฐ ์๋๋ผ๋ฉฐ ์๋ฌ๊ฐ ๋๋ ๊ฒ์
๋๋ค!
func swapTwoValues<One, Two> { ... }
ํ์ ํ๋ผ๋ฏธํฐ๋ ,๋ฅผ ์ด์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ ์ธํด์ค ์๋ ์์ต๋๋ค!
์ด๋ ๊ฒ ์ ๋ค๋ฆญ ํจ์๋ฅผ ์ ์ด์ฉํ๋ฉด ๋๊ฐ์ ๋ด์ฉ์ ํจ์๋ฅผ ์ค๋ฒ๋ก๋ฉ ํ ํ์๊ฐ ์์ด ์ฝ๋ ์ค๋ณต์ ํผํ๊ณ ์ ์ฐํ๊ฒ ์ฝ๋๋ฅผ ์งค ์ ์์ต๋๋ค!
Generic Type (์ ๋ค๋ฆญ ํ์ )
์ ๋ค๋ฆญ์ ํจ์์๋ง ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋ผ,
๊ตฌ์กฐ์ฒด, ํด๋์ค, ์ด๊ฑฐํ ํ์
์๋ ์ ์ธํ ์ ์๋๋ฐ, ์ด๊ฒ์ ์ ๋ค๋ฆญ ํ์
(Generic Type) ์ด๋ผ๊ณ ํฉ๋๋ค!
๋ง์ฝ Stack์ ์ ๋ค๋ฆญ์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด,
struct Stack<T> {
let items: [T] = []
mutating func push(_ item: T) { ... }
mutating func pop() -> T { ... }
}
์ด๋ ๊ฒ ์ ๋ค๋ฆญ ํ์ ์ผ๋ก Stack์ ์ ์ธํ ์ ์์ต๋๋ค. (ํด๋์ค, ์ด๊ฑฐํ ๋ํ ๊ฐ๋ฅํฉ๋๋ค)
์ ๋ค๋ฆญ ํ์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋
let stack1: Stack<Int> = .init()
let stack2 = Stack<Int>.init()
์ด๋ ๊ฒ ์ ์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก <>๋ฅผ ํตํด ์ด๋ค ํ์
์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง๋ฅผ ๋ช
์ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ ์ ์ธ ํ์ ์ด๋๊ฐ ์ต์ํ๋ฐ..์ด๋์ ๋ดค๋๋ฉด..!!
var integers: Array<Int> = [Int]()
์ด๋ฐ ์์ผ๋ก ๋ฐฐ์ด์ ์์ฑํด์ค ๋ ํ์ ์ ๋ช ์ํด์ฃผ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ <> ์์ ๋ฃ์ด์ฃผ์์ต๋๋ค!
์ฌ์ค์ Swift์ Array๋ ์ ๋ค๋ฆญ ํ์ ์ด์๋ค์!
Generic์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ธ์ ๋ชปํ๋ค๊ณ ํ๋๋ผ๋ Language Guide ์ ์ฒด์์ Generic์ ์ฌ์ฉํด์์ต๋๋ค.
์ด๊ฒ ์๋ฐ ๋ป์ด์๋ ๊ฒ..!
[์ฐธ๊ณ ์๋ฃ]
'๐ iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Optional (1) | 2023.11.22 |
---|---|
[Swift] ์ ๋ ฌ ๋ฉ์๋ ์ ๋ณตํ๊ธฐ (sort(), sorted()) (0) | 2023.10.23 |
[Swift] ํ๋กํผํฐ(Properties) - ํ์ ํ๋กํผํฐ (0) | 2023.04.02 |
[Swift] ํ๋กํผํฐ(Properties) - ํ๋กํผํฐ ์ต์ ๋ฒ (0) | 2023.04.02 |
[Swift] ํ๋กํผํฐ(Properties) - ์ ์ฅ ํ๋กํผํฐ, ์ฐ์ฐ ํ๋กํผํฐ (2) | 2023.04.01 |