๐ก ์ฉ์ด ์ ๋ฆฌ
concrete type ๊ตฌ์ฒดํ์
opaque type ๋ถํฌ๋ช ํ์
underlying type ๊ธฐ๋ฐํ์
existential type ์ค์กดํ์
type erasure ํ์ ์ด๋ ์ด์
boilerplate code ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋
Swift 5.7์์์ ์ ๋ค๋ฆญ
์ ๋ค๋ฆญ์ Swift์์ ์ถ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ธฐ๋ณธ์ ์ธ ํด. ์ฝ๋๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋๋ฐ ๋งค์ฐ ์ค์.
<T> where T: Idea
- ์ ๋ค๋ฆญ์ ํน์ ํ์ ์ ์ธ๋ถ์ฌํญ์ ์ถ์ํํ๋๋ฐ ์ฌ์ฉ
- ์ค๋ณต๋๋ ๊ตฌํ์ด ์๋ ์ค๋ฒ๋ก๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์๋ค๋ฉด ์ผ๋ฐํํด์ผํ ๋
- ๊ตฌ์ฒด ํ์ ์ผ๋ก ์์ํด์ ํ์ํ ๋ ์ผ๋ฐํ ํ๊ธฐ
๋คํ์ฑ Polymorphism
๋คํ์ฑ์ ๋ค๋ฅธ ๊ตฌ์ฒด ํ์ ์์ ํ๋์ ์ฝ๋๊ฐ ๋ค๋ฅด๊ฒ ๋์ํ๋๋ก ์ฝ๋๋ฅผ ์ถ์ํํ๋ ๊ฒ
image by codegym
๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- ์ ๋ํน ๋คํ์ฑ ad-hoc polymorphism
- ์ธ์ ํ์ (&๊ฐฏ์)์ ๋ฐ๋ผ ๊ฐ์ ํจ์ ํธ์ถ์ด์ด๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ
- ํจ์ ์ค๋ฒ๋ก๋ฉ
- ์ด๊ฒ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ ์ ์๋. ์๋ก์ด ํ์ ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์ถ๊ฐ์ ์ธ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ํ์. ๊ฒฐ๊ตญ repetitive implementation ์ด ๋จ.
- ์๋ธํ์
๋คํ์ฑ subtype polymorphism
- ์ํผํ์ ์์์ ๋์ํ๋ ์ฝ๋๋ ๋ฐํ์ ๋ ์ฌ์ฉํ๋ ํน์ ์๋ธํ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์์.
- ์ฆ, ์๋ธํด๋์ฑ. ํด๋์ค๊ฐ ์ํผํด๋์ค์ ๋ฉ์๋๋ฅผ override
- ๋งค๊ฐ๋ณ์ ๋คํ์ฑ parametric polymorphism - ์ ๋ค๋ฆญ์ ์ฌ์ฉ
- ์ ๋ค๋ฆญ ์ฝ๋๋ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ์ฌ ํ๋์ ์ฝ๋๊ฐ ๋ค๋ฅธ ํ์ ๋ค๊ณผ ๋์ํ ์ ์๊ฒ ํ๋ฉฐ ๊ตฌ์ฒดํ์ ์์ฒด๊ฐ ์ธ์๋ก์ ์ฌ์ฉ๋จ.
ํ๋กํ ์ฝ protocol
- ๊ธฐ๋ฅ์ ํํํ๋ ์ธํฐํ์ด์ค
- ๊ตฌํ๋๋ ์ธ๋ถ์ฌํญ์์ ์์ด๋์ด๋ฅผ ๋ถ๋ฆฌํ ๊ฒ
- ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์ ์ ๊ธฐ๋ฅ์ ๋ํ๋ด๋ ์ถ์ํ ๋๊ตฌ
- ๊ฐ ๊ธฐ๋ฅ์ ํ๋กํ ์ฝ ์๊ตฌ์ฌํญ์ ๋ํ๋
์ฐ๊ดํ์ associatedtype
- ๊ตฌ์ฒดํ์ ์ ํ๋ ์ด์คํ๋
- ์ฐ๊ดํ์ ์ ํ๋กํ ์ฝ์ ์ค์ํ๋ ํน์ ํ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง
๋ถํฌ๋ช ํ์ opaque type vs. ๊ธฐ๋ฐ ํ์ underlying type
๋ถํฌ๋ช ํ์
- some Tea
- <T: Tea>
- ์ถ์ํ์ ์ผ๋ก ํน์ ๊ตฌ์ฒด ํ์ ์ ํ๋ ์ด์คํ๋๋ฅผ ๋ํ๋
- ์ธํ๊ณผ ์์์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์
๊ธฐ๋ฐํ์
- ํน์ ๊ตฌ์ฒด ํ์ ์ผ๋ก ๋ถํฌ๋ช ํ์ ์ผ๋ก ๋์ฒด๋จ
- ๊ฐ์ ์ฌ์ฉํ๋ ์ ๋ค๋ฆญ ์ฝ๋๋ ๊ฐ์ ์ ๊ทผํ ๋๋ง๋ค ๋์ผํ ๊ธฐ๋ฐ ํ์ ์ ๋ฐ๋ ๊ฒ์ด ๋ณด์ฅ๋จ.
์ ๋ค๋ฆญ ์ธํฐํ์ด์ค ์์ฑ ํ (protocols or not)
some
~ Swift 5.6 (AS - IS)
func feed<A>(_ cat: C) where C: Cat
// ๋๋ func feed<C: Cat>(_ cat: C)
Swift 5.7 ~ (TO - BE)
func feed(_ cat: some Cat)
- ํฌ๋กํ ์ฝ์ ์ค์ํ๋ ์ถ์ํ์ Cat์ ์ด๋ ๊ฒ ์์ฑํ ์ ์๋ค. some Cat
- ์์ ์๋ ์ ์๋ค์ ๋ชจ๋ ์๋ํ์ง๋ง, 5.7 ์ดํ์ ์ ๋ฒ์ ์ด ์ข ๋ ๊ฐ๋ ์ฑ๊ณผ ์ด๋ ์ฑ์ด ์ข๋ค.
- some ํค์๋๋ ๋งค๊ฐ๋ณ์, result ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. 5.6 ์ด์ ์๋ ํ๋กํผํฐ ํ์ ๊ณผ ๋ฆฌํด ํ์ ์ผ๋ก๋ง ์ฌ์ฉํ ์ ์์๋ค.
- some ์ ๊ธฐ๋ฐํ์ ์ด ๋ณ๊ฒฝ๋์ง ์์.
any
any๋ Swift 5.7 ์ด์์์ ์ฌ์ฉํ ์ ์๋ค.
- ํ๋กํ ์ฝ ํ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ํ๋กํ ์ฝ์ ์์ ํ์ ์ ํํํด์ผ ํ ๊ฒฝ์ฐ, any ๋ฅผ ์ฌ์ฉํ๋ค.
- any ๋ ๋ฐํ์ ์์ ๊ธฐ๋ฐ ํ์ ์ด ๋ณ๊ฒฝ๋ ์ ์์.
- any X ๋ ๋จ์ผ ์คํํฑ ํ์ ์ผ๋ก X ๋ฅผ ์ค์ํ๋ ๊ตฌ์ฒดํ์ ์ ๋์ ์ผ๋ก ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ฐ ํ์ ๊ณผ ํจ๊ป ์๋ธํ์ ๋คํ์ฑ์ ์ฌ์ฉํ ์ ์๋ค.
- any ์ ํ์ํ ์ ์ฐํ ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ๊ธฐ ์ํด์ any X ํ์
์ ๋ฉ๋ชจ๋ฆฌ ์์์ ํน๋ณํ ํํ๋ฐฉ์์ ๊ฐ์ง๊ณ ์์.
- ์ด ํํ๋ฐฉ์์ ๊ณ ์ ๋ ์์๋ก ์๊ฐํ์๋,
- ๊ตฌ์ฒด ํ์ ์ ์์ ์์ ๋ค์ด๊ฐ ์ ์๋ ๊ฒฝ์ฐ, ์์ ์์ ์ ์ฅ์ด ๋๋ค.
- ๋ค์ด๊ฐ ์ ์๋ ๊ฒฝ์ฐ ์ธ์คํด์ค์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ค.
- ์ด ํํ๋ฐฉ์์ ๊ณ ์ ๋ ์์๋ก ์๊ฐํ์๋,
- ๊ตฌ์ฒดํ์ X ๋ฅผ ๋์ ์ผ๋ก ์ ์ฅํ๋ ์คํํฑ ํ์ any X ๋ ์ค์กดํ์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๋ค๋ฅธ ์ฝํฌ๋ฆฌํธ ํ์ ์ ๋์ผํ ํํ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ์ ๋ต์ ํ์ ์ด๋ ์ด์ (type erasure) ๋ผ๊ณ ํ๋ค.
- ๊ตฌ์ฒดํ์ ์ ์ปดํ์ผ ํ์์ ์ง์์ง๋ฉฐ, ์ค์ง ๋ฐํ์์์๋ง ์ ์ ์์.
- ํ์ ์ด๋ ์ด์๋ X ๋ฅผ ์ค์ํ๋ ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค ๊ฐ์ ํ์ ๋ ๋ฒจ ๊ตฌ๋ถ์ ์ ๊ฑฐํ๊ณ , ์ด๋ฅผ ํตํด์ ๋ค๋ฅธ ๋์ ํ์ ์ ๋์ผํ ์ ์ ํ์ ์ผ๋ก ์ํธ ๊ตํํ๋ ์์ผ๋ก ๊ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ํจ.
some vs. any
- ์ปดํ์ผ๋ฌ๋ ๊ธฐ๋ฐ ๊ฐ์ ์ธ๋ฐ์ฑํด์ some X ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ก ๋๊ฒจ์ค์ผ๋ก์จ any X ์ ์ธ์คํด์ค๋ฅผ some X ๋ก ๋ณํํ ์ ์๋ค.
- Swift 5.7~some any
๊ณ ์ ๋ ๊ตฌ์ฒดํ์ ์ ๊ฐ์ง๊ณ ์๋ค ์์์ ๊ตฌ์ฒดํ์ ์ ๊ฐ์ง๊ณ ์๋ค. ํ์ ๊ด๊ณ๋ฅผ ๋ณด์ฅ ํ์ ๊ด๊ณ๋ฅผ ์ญ์
- Swift 5.7~some any
๐ฆฎ ์์ฝ
- ๊ธฐ๋ณธ์ ์ผ๋ก some ์ฌ์ฉํ๊ธฐ
- ์์ ๊ฐ์ ์ ์ฅํด์ผํ๋ ๊ฒฝ์ฐ any ๋ก ๋ณ๊ฒฝ. ์ฌ๊ธฐ์ ์์์ ๊ฐ์ ์์์ ๊ตฌ์ฒดํ์ ์ธ์คํด์ค๋ฅผ ๋ปํจ.
์์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ์ ์ด๋ ์ด์์ ๋งฅ๋ฝ์ ํ๊ณ(semantic limitations) ์ ๋๋ ๋น์ฉ์, ์ค์ง ์ ์ฅ๊ณต๊ฐ์ ์ ์ฐ์ฑ์ด ํ์ํ ๋๋ง ์ง๋ถํ ์ ์์. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ ๋ let ์ ์ฐ๋ค๊ฐ ๊ฐ ๋ณ๊ฒฝ์ด ํ์ํ ๋ var ๋ก ๋ฐ๊พธ๋ ๊ฒ๊ณผ ๋์ผํ ์ ๊ทผ ๋ฐฉ์.
๐ฅ ๋ถ๋ก
ํ์ ์ด๋ ์ด์๋
์ ๋ค๋ฆญ ์ ํ์ ์ง์ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํ์ ์ด๋ ์ด์๋ ์์ ๋กญ๊ฒ ์ ๋ฌ๋ ์ ์๋, ์ ์ฝ๋์ง ์์ ๋ ผ-์ ๋ค๋ฆญ ํ์ ์์ ์ ์ฝ๋ ์ ๋ค๋ฆญ ํ์ ์ ์ถ์ํํ๋ ํ๋ก์ธ์ค.
๋ง์ฝ ํ์ ์ ์ ์ ์๋ ๊ฐ์ฒด์ ํน์ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ๋๋ค๋ฉด (aka. ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด)
ํ์ ์ ์ ์ ์๋ค๋ฉด ๊ฐ์ฒด๊ฐ ๊ณต๊ฐํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ โ
ํ์ง๋ง, ์๋ก ๋ค๋ฅธ ํ์ ๋ค์ด ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด ๋ ๊ฒ์ ์ฝ์ํด๋๋ค๋ฉด → ํ๋กํ ์ฝ
์ ํ์ ์ ๋ณด๋ฅผ ์ง์์ผํ ๊น?
์ค์ํํธ๋ ๋ฉํฐ ํจ๋ฌํ์ ์ธ์ด๋ก ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด์งํฅ/ํจ์์งํฅ/์ ๋ค๋ฆญ์งํฅ/ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ ๋ด์์ ๊ตฌ์กฐ๋ฅผ ์ง๋๋กํจ. ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋จ์ ์ฃผ์ถง๋์, ์์๊ณผ ๊ฐ์ด ๋์ ๊ฒฐํฉ๋๋ฅผ ์ง์ํ๋ค. ๊ทธ๋ฌ๋ ์ด ํจํด์ ๋ฐ๋ฅด๋ฉด ์๋์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ง๋๊ฒ ๋ ๊ฒ.
์ด ์ปดํ์ผ๋ฌ ์๋ฌ๋ ์ค์ํํธ์ ํ๋กํ ์ฝ ์ฐ๊ด ํ์ ๊ณผ ์ ๋ค๋ฆญ ์ ์ฝ์กฐ๊ฑด์ ๋ชจ๋ ์ฐธ์กฐํ๋ค. ์ด ์๋ฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ์ต์ข ์ ์ผ๋ก๋ ํ์ ์ด๋ ์ด์ ํจํด์ ์ ์ฉํ ๊ฒ.
์ด ์๋ฌ๋ ์ฐ๊ด๊ฐ์ด ์๋ ํ๋กํ ์ฝ์ ํจ์์ ์ธ์๋ก์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ์ฒด์ ์ฝ๋ ์ ์ผ๋ก์ ์ฌ์ฉํ ๋ ๋ฐ์.
protocol Cat {
associatedtype CatType
var power: String { get }
func eat() -> Int
func weight(of cat: CatType) -> Double
}
var cats: [Cat] = [cat1, cat2, ... ]
var totalWeight: Int = 0
for c in cats {
totalWeight += c.weight(of: < ??? >)
}
์ฐ๊ดํ์ ์ ๊ฐ์ง ํ๋กํ ์ฝ์ ๊ตฌ์ฒดํ์ ์ผ๋ก ํ์ฉํ๋ค์ ์ณ๋ ์ด ์ฐ๊ด ํ์ ์ด ๊ตฌ์ฒด์ ์ผ๋ก ๊ฒฐ์ ๋์ด์ผ ํ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋จ. ์ค์ํํธ๋ type-safeํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ํ๋กํ ์ฝ์ ๊ธฐ๋ฐํ์ ์ ์๊ณ ์์ด๋ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ํ ์ ์๋ค๋ฉด ๋์ํ์ง ์์.
Swift 5.6 ์ด์ ์์๋
5.6 ์ด์ ์์๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ด ๊ฐ์ฒด๋ค์ ์ ์ฝ์๊ณ ์์ ํ์ง ์์ “Any” ๋ฐ๋ฆฌ์์ด์ ์์ ๋ฃ์ด๋ .
class CatSequence {
let value: Any
init<T: Sequence>(_ sequence: T) {
self.value = sequence
}
}
์ด ํ๋ก์ธ์ค๋ฅผ ‘ํ์ ์ด๋ ์ด์’๋ผ๊ณ ํ๋ค.
์ค์ํํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ด๋ฌํ ๊ฐ์ฒด๋ค์ด ๋ง์ด ํฌํจ์ด ๋์ด ์๋ค. ํ์ ์ด๋ ์ด์๋ฅผ ์ด์ฉํด ์์กด์ฑ ์ฃผ์ ๋ ์ด๋ฃจ์ด์ง. (์ฐธ๊ณ ๋ก ์ด๋ Swift 5.6 ์ด์ ์ ์ด์ผ๊ธฐ)
Swift 5.7 ์ดํ์์๋
any ์ค์กด ํ์ ์ ์ถ๊ฐ๋ก ํ์ ์ด๋ ์ด์๊ฐ Swift ์ปดํ์ผ๋ฌ์ feature๊ฐ ๋จ. ์ด์ ํ์ ์์ any ๋ฅผ ๋ถ์์ผ๋ก์จ ์๋์ผ๋ก ์ค์ํํธ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ถ์ํํจ. ํ์ ์ด ์ง์์ง ๊ฐ ⇒ ์ด๊ฒ์ ์ค์กด ํ์ ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ก ํจ.
let erased: any Cat = KoreanShortHairCatType()
์ด์ ์์ ๊ฐ์ ์ค๋ฅ ๋์ ์, ์ ์ฝ์กฐ๊ฑด ์์ด ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ค์กดํ์ ์ผ๋ก ์ฐธ์กฐํ๋ผ๋ ๋ฉ์์ง๊ฐ ๋จ๊ฒ ๋ ๊ฒ.
any ํ์ ์ ํ์ ์์ ์ฑ
์๋์ ์ธ ํ์ ์ด๋ ์ด์์ ๋ฌ๋ฆฌ ์์ ํ๋ค. Any ํค์๋๋ฅผ ์ฌ์ฉํ ํ์ ์ด๋ ์ด์๋ ๊ฒฐ๊ตญ ๊ฐ์ ์ธ๋ํ ํด์ผ๋๋ ๋ฌธ์ ๊ฐ ์์์
๐ ์ฐธ๊ณ ๋งํฌ
https://developer.apple.com/wwdc22/110352
https://www.swiftbysundell.com/articles/referencing-generic-protocols-with-some-and-any-keywords/
https://academy.realm.io/posts/tryswift-gwendolyn-weston-type-erasure/
https://soooprmx.com/ํ์ -์ง์ฐ๊ธฐ-type-erasure-swift/
https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html
https://swiftrocks.com/whats-any-understanding-type-erasure-in-swift
์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ถ๊ธํ๊ฑฐ๋ ๋๋๊ณ ์ถ์ ์๊ธฐ๊ฐ ์์ผ์๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฌ๋ฐ๊ฒ ์ฝ์ผ์ จ๋ค๋ฉด ๊ณต๊ฐ๊ณผ ๊ตฌ๋ ์ ํฐ ํ์ด ๋ฉ๋๋ค.
ํญ์ ๊ฐ์ฌํฉ๋๋ค.
์ด ๊ธ์ doy.oopy.io ์๋ ๋ฐํ๋์ด ์์ต๋๋ค.
๋๊ธ