Open hyun99999 opened 2 years ago
function ์์ ๊ธฐ๋ฅ์ฑ์ ์ถ์ถํ ๋, details ์ abstracted ๋ก ๋ถํฐ ๋ฉ์ด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ abstraction ์ details ์ ๋ฐ๋ณต์์ด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์ด๋์ด๋ฅผ ํํํ ์ ์์ต๋๋ค.
Swift ์์๋ concrete type ์ abstract ํ ์ ์์ต๋๋ค.
๋ฐ๋ก ์ด๊ฒ..! ์ฒ๋ผ์
์๋ก ๋ค๋ฅธ details ๋ฅผ ๊ฐ์ง ๋์ผํ ์์ด๋์ด์ set of types ๊ฐ ์๋ ๊ฒฝ์ฐ abstract code ๋ฅผ ์์ฑํ์ฌ concrete types ์ผ๋ก ์์ ํ ์ ์์ต๋๋ค.
์ค๋์ ๋ค์์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
farm ์๋ฎฌ๋ ์ด์ ์ ์ํ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ด ์๋ค!
์๋๋ Cow ๋ผ๋ ๊ตฌ์กฐ์ฒด๊ฐ ์์ต๋๋ค.
์ง , ์ด์ ์ฐ๋ฆฌ๋ cow ๋ค์ farm ์์ ๊ธฐ๋ฅผ ์ ์์ด์.
ํ์ง๋ง ์ข ๋ ๋ง์ ๋๋ฌผ๋ค์ ์ํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํ ๊น์?
feed ๋ฉ์๋๋ฅผ overload ํ ์ ์๊ฒ ์ง๋ง, ๊ฐ ๊ตฌํ์ ๋งค์ฐ ํก์ฌํ๊ณ , ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ๋์ด๋ฒ๋ ธ์ต๋๋ค.
๋ค์์ ๋๋ฌผ ํ์ ๋ค ์ฌ์ด์ common capabilities ๋ฅผ ํ์ ํ๋ ๊ฒ์ ๋๋ค.
๋๋ฌผ๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋จน์ด๋ฅผ ๋จน๊ณ , eat ๋ฉ์๋๋ ๋ค๋ฅด๊ฒ ๊ตฌํ๋์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ abstract code ๊ฐ eat ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ํ๊ณ , concrete type ์ ๋ฐ๋ผ abstract code ๊ฐ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ์ ๋๋ค.
์ด์ฒ๋ผ ๋ค๋ฅธ concrete types ์ ๋ํด ๋ค๋ฅด๊ฒ ๋์ํ๋ abstract code ๋ฅผ polymorphism
์ฆ, ๋คํ์ฑ
์ด๋ผ๊ณ ํฉ๋๋ค. ๋คํ์ฑ์ ์ฌ์ฉํ๋ฉด ์ฝ๋ ์ฌ์ฉ ๋ฐฉ์์ ๋ฐ๋ผ์ ํ๋์ ์ฝ๋ ์กฐ๊ฐ์ด ์ฌ๋ฌ ๋์์ ํ ์ ์์ต๋๋ค.
๋คํฅ์ฑ์ ๋ค์ํ ํํ๊ฐ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ overloading ์ผ๋ก, ๋์ผํ ํจ์ ํธ์ถ์ด argument ์ ํ์
์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ค๋ฒ๋ก๋ฉ์ ์ผ๋ฐ์ ์ธ ์๋ฃจ์
์ด ์๋๊ธฐ ๋๋ฌธ์ ad-hoc polymorphism(์์ ๋คํฅ์ฑ)
์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
์ฐ๋ฆฌ๋ ์์ ์ค๋ฒ๋ก๋ฉ์ผ๋ก ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ก ์ด์ด์ง๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
๋ ๋ฒ์งธ๋ subtype ์ผ๋ก ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, generic ์ ์ฌ์ฉํ๋ parametric polymorphism ์ด ์์ต๋๋ค. type parameters ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์ ๊ณผ ์๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ํ์ ์ด arguments ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ overloads ๋ฅผ ๋ฐฐ์ ํ์ผ๋ฏ๋ก subtype polymorphism ์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. subtype ๊ด๊ณ์ ํ๋์ ๋ฐฉ๋ฒ์ class hierarchy ์ ๋๋ค.
Animal ์ด๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๊ฐ ๋๋ฌผ ํด๋์ค์์ Animal ์ ์์๋ฐ์์ eat ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๊ฒ์ ๋๋ค. ์ฆ, subtype polymorphism ์ ์ฌ์ฉํด์ ํ์ ํด๋์ค์์์ ๊ตฌํ์ ํธ์ถํฉ๋๋ค.
Animal ์ eat ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์ ์ ์์ง ์ฑ์ฐ์ง ๋ชปํ์ผ๋ฉฐ, ์ด ์ฝ๋์๋ ๋ช๊ฐ์ง red flags! ๊ฐ ์์ต๋๋ค. ์ํ ์ ํธ๊ฐ ์๋ค๋ ์๋ฆฌ์ฃ ..
์ฐ๋ฆฌ๊ฐ ์ทจํ ์ ์๋ ํ ๊ฐ์ง ๋ฐฉ์์ Any
์ ๊ฐ์ด ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ํ์ฉํ๋๋ก ํ๋ ๊ฒ์
๋๋ค.
ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ์์ ๊ฐ์ด ์ฌ๋ฐ๋ฅธ ํ์ ์ด ์ ๋ฌ๋์๋์ง as? ๋ฅผ ์ฌ์ฉํด์ ๋ค์ด์บ์คํ ์ ์งํํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ถ๊ฐ์ ์ธ boilerplate code ๋ฅผ ๋ถ๊ณผํ์ง๋ง ์ค์๋ก ์๋ชป๋ ํ์ ์ ์ง์ด๋ฃ์์ ๋๋ ๋ฐํ์์๋ง ์ก์ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฒ๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์! ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๋ํด ๋ด ์๋ค.
type parameter(ํ์ ์ธ์. ex. T) ๋ฅผ ๋์ ํด์ type-safe ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฌผ์ food ์ ํ์ ์ ํํํ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ Food ํ์ ์ธ์๊ฐ Animal ํด๋์ค์ ์ ์ธ์ผ๋ก ์น๊ฒฉ๋๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด๊ฒ์ ๋ถ์์ฐ์ค๋ฝ์ต๋๋ค. ๋๋ฌผ์ด ๋์ํ๋ ค๋ฉด ์์์ด ํ์ํ์ง๋ง ์์์ ๋จน๋ ๊ฒ์ด ๋๋ฌผ์ ํต์ฌ ๋ชฉ์ ์ด ์๋๋ฉฐ ๋๋ฌผ์์ ์๋ํ๋ ๋ง์ ์ฝ๋๋ค์ ์์์ ๋ํด์ ์ ํ ์ ๊ฒฝ์ฐ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด์ฃ . ๋๋๋๋..
์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ๋๋ฉด Animal ํด๋์ค์ ๋ํ ๋ชจ๋ ์ฐธ์กฐ๋ food ํ์ ์ ์ง์ ํด์ผ๋งํ๊ฒ ๋ฉ๋๋ค.
๋ํ, ํ์ํ๋ค๋ฉด ๊ฐ Animal ์ ํ์ ์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ด์ฒ๋ผ ์์ ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ๋ ์ข์ ๋ฐฉ์์ ์์์ต๋๋ค.
๋๋ฌผ์๊ฒ๋ ๋ ๊ฐ์ง capabilites ๊ฐ ์์ต๋๋ค.
์ด์ ์์ ๊ธฐ๋ฅ์ ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
Swift ์์๋ protocol ์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค.
ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์ ์ ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ์ถ์ํ ๋๊ตฌ์ ๋๋ค.
type parameter ์ฒ๋ผ associated type ์ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๋ํ placeholder ์ญํ ์ ํฉ๋๋ค.
associated type ์ ์ฌ์ฉํ๋ฏ๋ก์จ ํ๋กํ ์ฝ์ ์ค์ํ๋ ํน์ ํ์ ์ ์์กดํฉ๋๋ค. ์ด๊ฒ์ ํน์ ํ์ ์ Animal ์ ๊ฐ ์ธ์คํด์ค๊ฐ ๊ฐ์ food ํ์ ์ ๊ฐ์ง๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
๋ค์์ผ๋ก ์์์ ์๋นํ๋ ์์ ์ eat ๋ฉ์๋์ ๋งคํ๋ฉ๋๋ค. Animal ์ Feed ํ์ ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ต๋๋ค.
ํ๋กํ ์ฝ์๋ ๋ฉ์๋์ ๊ตฌํ์ด ๋์ด์์ง ์์ผ๋ฉฐ, ๊ตฌํํ๋ ค๋ฉด concrete Animal ํ์ ์ด ํ์ํฉ๋๋ค.
ํ๋กํ ์ฝ์ ์ค์ํ๊ธฐ ์ํด์ ๊ฐ Animal ํ์ ์ eat ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํ๋ฉฐ ์ปดํ์ผ๋ฌ๋ Feed ํ์ ์ ์ ์ถํ ์ ์์ต๋๋ค.
๋ค์์ generic code ๋ฅผ ์ฌ์ฉํด๋ด ์๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ concrete Animal ํ์ ์ ๋ํด ์๋ํ๋ ํ๋์ ๊ตฌํ์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค! parametric polymorphism ์ ์ฌ์ฉํ๊ณ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ type parameter ๋ฅผ ๋์ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํญ์ concrete Animal(๊ตฌํ๋ Animal. ์ฆ, Animal ์ ์ค์ํ ๊ฒ.)๊ฐ Animal ํ๋กํ ์ฝ์ ์ค์ํ๊ธฐ๋ฅผ ์ํ๋ฏ๋ก <A: Animal>
๋ก ํ์ํฉ๋๋ค.
ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฒ์ ๊บฝ์ ๊ดํธ๋ก ์์ฑํ๊ฑฐ๋ trailing where
์ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ค๋ฅธ type parameters ์์ ๊ด๊ณ๋ ์ง์ ํ ์ ์์ต๋๋ค.
func feed<A>(_ animal: A) where A: Animal
์์ ์ ๋ค๋ฆญ ํจํด์ ์ค์ ๋ณด๋ค ํจ์ฌ ๋ณต์กํด ๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ ๊ฐ๋จํ๊ฒ ํํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
func feed(_ animal: some Animal)
ํ์
์ธ์๋ฅผ ๋ช
์์ ์ผ๋ก ์์ฑํ๋ ๋์ some Animal
์ ์์ฑํ์ฌ protocol conformance ๋ฅผ ํํํ ์ ์์ต๋๋ค. ์ด์ ์ ์ธ๊ณผ ๋์ผํ์ง๋ง ๋ถํ์ํ ํ์
์ธ์ ๋ชฉ๋ก๊ณผ where
์ ์ด ์ฌ๋ผ์ก์ต๋๋ค.
some Animal
์์ some ์ ์์
์ค์ธ ํน์ ํ์
์ด ์์์ ๋ํ๋
๋๋ค. some ํค์๋ ๋ค์๋ ํญ์ conformance ์๊ตฌ์ฌํญ์ด ๋ฐ๋ฆ
๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ํน์ ํ์
์ ๋งค๊ฐ๋ณ์์ ๋ํด Animal ํ๋กํ ์ฝ์ ์ค์ํด์ผํจ์ ์๋ฏธํฉ๋๋ค.
some ํค์๋๋ ํ๋ผ๋ฏธํฐ ๋ฐ result ํ์ ์๋ ์ฌ์ฉ๋ฉ๋๋ค.
var body: some View { ... }
var body: modifiercontent<text, _backgroundmodifier<color>> {
}
SwiftUI ์ฝ๋์์๋ ํ์ธํ ์ ์์ต๋๋ค. body ํ๋กํผํฐ๋ ํน์ View ํ์
์ ๋ฐํํ์ง๋ง, ์ฝ๋๋ ํน์ ํ์
์ด ๋ฌด์์ธ์ง ์ ํ์๊ฐ ์์ต๋๋ค. ์ด์ฒ๋ผ concrete type ์ ๋ํ placeholder ๋ฅผ ๋ํ๋ด๋ abstract type ์ด ๋ฐ๋ก opaque type, ๋ถํฌ๋ช
ํ์
์ด๋ผ๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ทฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋๋ง๋ค ์๋ก์ด ํ์ ์ผ๋ก body ๋ฅผ ์ ์ํด์ฃผ์ด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๊ฒ์ด ๋ฐ๋ก opaque type ์ ์ฌ์ฉํ๋ ์ด์ ์ ๋๋ค. ์ด๋ฐ ๋ถํฌ๋ช ํ์ ์ protocol type ์ ๋นํด์ ๊ฐ๋ ฅํ ๋ณด์ฅ์ ์ ๊ณตํฉ๋๋ค. ์๋๋ฉด protocol type ์ ํน์ ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์๊ธฐ๋งํ๋ค๋ฉด mulitple type ์ ๋ํด์ ๋ฆฌํดํ ์ ์์ง๋ง, opaque type ์ single type ์ด์ด์ผ๋ง ํฉ๋๋ค.
์ฐธ๊ณ :
[Swift] Opaque Type vs Protocol Type
์ค์ ์ฌ์ฉ๋๋ ํ์
์ underlying type
์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์ด๋ฐ ์์ผ๋ก ๊ฐ์ ์ ๊ทผํ ๋๋ง๋ค ๋์ผํ underlying type ์ ๊ฐ์ ธ์ค๋๋ก ๋ณด์ฅ๋ฉ๋๋ค.
โ (function arrow) ๋ parameter position ๊ณผ result position ์ ๋๋๋๋ค.
opaque type ์ ์์น๋ก ํ๋ก๊ทธ๋จ์ ์ด๋ ๋ถ๋ถ์ด abstract trype ์ ๋ณด๊ณ concrete type ์ ์ ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค.
๋ช ์๋๋ ํ์ ์ธ์๋ input ์ธก์์ ์ ์ธ๋๊ณ , ํธ์ถ์๊ฐ underlying type ์ ๊ฒฐ์ ํ๊ณ ๊ตฌํ์ abstract type ์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก opaque type ๋๋ result type ๋ํ ๊ฐ์ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋จ ๋ถ๋ถ์ underlying type ์ ๊ฒฐ์ ํ๊ณ , ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ ๋ถ๋ถ์ abstract type ์ ๋ด ๋๋ค.
local variable ์ ๋ํด์ underlying type ์ ํ ๋น์ right-hand side ์์ ์ ์ถ๋ฉ๋๋ค. ์ด๊ฒ์ opaque type ์ ์ง์ญ๋ณ์๊ฐ ํญ์ ์ด๊ธฐ๊ฐ์ ๊ฐ์ ธ์ผํจ์ ์๋ฏธํฉ๋๋ค. ์ ๊ณตํ์ง ์์ผ๋ฉด, ์ปดํ์ผ๋ฌ๋ error ์ ๋ณด๊ณ ํฉ๋๋ค.
๋ํ, underlying type ์ ํด๋น ๋ณ์์ scope ์ ๋ํด์๋ ๊ณ ์ ๋์ด์ผ ํ๋ฏ๋ก underlying type ์ ๋ณ๊ฒฝํ๋ ค๋ฉด error ๊ฐ ๋ฐ์ํฉ๋๋ค.
opaque type ์ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ, underlying type ์ ํธ์ถ ๋ถ๋ถ์ argument ๋ก ๋ถํฐ ์ ์ถ๋ฉ๋๋ค.
some ์ ํ๋ผ๋ฏธํฐ ํฌ์ง์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ด Swift 5.7 ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค.
underlying type ์ ํ๋ผ๋ฏธํฐ ๋ฒ์ ๋ด์์๋ง ์์ ๋๋ฏ๋ก ๊ฐ ํธ์ถ์ ๋ค๋ฅธ argument type ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
opaque type ์ result type ์ ๊ฒฝ์ฐ, underlying type ์ด ๊ตฌํ์ ๋ฐํ๊ฐ์์ ์ ์ถ๋ฉ๋๋ค.
opaque result ๋ฅผ ๊ฐ์ง ๋ฉ์๋ ํน์ computed property ๋ ํ๋ก๊ทธ๋จ ์ด๋์์๋ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ช ๋ช ๋ ๊ฐ์ ๋ฒ์๋ ์ ์ญ์ ๋๋ค. ์ด๋ underlying return type ์ด ๋ชจ๋ return ๋ฌธ์์ ๋์ผํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์์ ์ฝ๋์ฒ๋ผ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ underlying ๊ฐ์ด ๋ฏธ์ค๋งค์นญ๋์๋ค๊ณ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
opaque SwiftUI view ์ ๊ฒฝ์ฐ, ViewBuilder ์ ๊ฐ ๋ถ๊ธฐ์ ๋ํด ๋์ผํ underlying return type ์ ๊ฐ๋๋ก control-flow ๋ฌธ์ ๋ณํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ViewBuilder ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋๋์ด.. feed ๋ฉ์๋๋ก ๋์๊ฐ ๋ด ์๋ค.
๋ค๋ฅธ ๊ณณ์์ opaque type ์ ์ฐธ์กฐํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ์์ some ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํจ์์์ opaque type ์ ์ฌ๋ฌ๋ฒ ์ฐธ์กฐํด์ผํ ๋๊ฐ ํ์ ์ธ์๊ฐ ์ ์ฉํ ๋์ ๋๋ค.
์๋ฅผ ๋ค์ด, Habitat ๋ผ๋ ๋ค๋ฅธ associatedtype ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ๋์ฅ์ ์ง์ ๋ ๋๋ฌผ์ ์์์ง๋ฅผ ๊ตฌ์ถํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, result type ์ ํน์ ๋๋ฌผ ํ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก ํ๋ผ๋ฏธํฐ์ ๋ฆฌํด ํ์ ์ ํ์ ์ธ์ A ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
opaque tpye ์ ์ฌ๋ฌ๋ฒ ์ฐธ์กฐํด์ผํ๋ ๋ ๋ค๋ฅธ ์ํฉ์ generic type ์
๋๋ค. ์ฝ๋๋ ์ข
์ข
ํ์
์ธ์๋ฅผ ์ ์ธํ๊ณ , ํ์
์ธ์๋ฅผ ์ ์ฅ ํ๋กํผํฐ์ ์ฌ์ฉํ๊ณ , ๋ค์ memberwise initializer ์ ์ฌ์ฉํฉ๋๋ค. ๋ค๋ฅธ context ์์ ์ ๋ค๋ฆญ ํ์
์ ์ฐธ์กฐํ๋ ค๋ฉด < >
์์ ํ์
์ธ์๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ช
ํํ ํ๋๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด์ feed ๋ฉ์๋๋ฅผ ๊ตฌํํด๋ด ์๋ค.
animal ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ grow ํ๋ ์๋ฌผ ํ์ ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ค์์ผ๋ก, harvest ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์๋ฌผ์ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ animal ์๊ฒ ๋จน์ผ ์ ์์ต๋๋ค.
underlying animal type ์ด ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๋ ๋ค์ํ ๋ฉ์๋ ํธ์ถ์์ ํ์ ์ ๊ด๊ณ์ ๋ํด์ ์๊ณ ์์ต๋๋ค.
์ด๋ฌํ ์ ์ ๊ด๊ณ๋ ๋๋ฌผ์๊ฒ ์๋ชป๋ ํ์ ์ ๋จน์ด๋ฅผ ๋จน์ด๋ ์ค์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋ฐฐ์ด์ ์ฌ์ฉํ๋ feedAll ๋ฉ์๋๋ฅผ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค. element ํ์ ์ด Animal ํ๋กํ ์ฝ์ ์ค์ํด์ผํ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ฐฐ์ด์ด ๋ค์ํ ์ ํ์ ๋๋ฌผ์ ์ ์ฅํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
some
์๋ ๋ณ๊ฒฝํ ์ ์๋ underlying type ์ด ์์ต๋๋ค. underlying type ์ ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ ๋์ผํ ํ์
์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ some Animal
์ ์ํ๋ ๊ฒ์ ํํํ์ง ๋ชปํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ ํ์ Animal ์ ๋ํ๋ผ ์ ์๋ supertype ์ด ํ์ํฉ๋๋ค.
any Animal
์ฌ์ฉํ๋ฉด arbitrary type ์ Animal ์ ํํํ ์ ์์ต๋๋ค.
์ด๋ฌํ storage flexibility ์ ํ๋ฝํ๊ธฐ ์ํด์ any Animal ํ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ํน๋ณํ ํํ์ด ์์ต๋๋ค.
๊ฐ์ด ์์ ์์ ์ง์ ๋ค์ด๊ฐ ๋งํผ ์ถฉ๋ถํ ์๊ธฐ๋ ํ์ง๋ง ๋๋ก ์์์ ๋นํด ๋๋ฌด ์ปค์ ๋ค๋ฅธ ๊ณณ์ ํ ๋นํ๊ณ ํด๋น ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๊ธฐ๋ ํฉ๋๋ค.
any Animal ํ์ ์ ๋์ ์ผ๋ก ๋ชจ๋ concrete Animal type ์ ์ ์ฅํ ์ ์๊ณ , existential type ์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ concrete types ์ ๋ํด ๋์ผํ ํํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ type erasure
๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. concrete type ์ ์ปดํ์ผ ํ์์ erase ๋๊ณ ๋ฐํ์์๋ง ์๋ ค์ง๋๋ค.
extential type any Animal ์ ๋ ์ธ์คํด์ค๋ ์ ์ ํ์ ์ ๋์ผํ์ง๋ง ๋์ ํ์ ์ ๋ค๋ฆ ๋๋ค. type erasure ๋ ๋ค๋ฅธ ๋๋ฌผ ๊ฐ ์ฌ์ด์ type-level distinction ์ ์ ๊ฑฐํ์ฌ ๋ค๋ฅธ ๋์ ์ ํ์ ๊ฐ์ ๋์ผํ ์ ์ ์ ํ์ผ๋ก ๊ตํ ๊ฐ๋ฅํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
type erasure ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐฐ์ด์ ์์ฑํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด associated types ๊ฐ ์๋ ํ๋กํ ์ฝ์ any ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด Swift 5.7 ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค.
feedAll ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ ๊ฐ anmial ์ ๋ํด์ eat ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ์ต๋๋ค. ์ด๋ ๋ฐ๋ณต์์ underlying animal ์ ๋ํ Feed ํ์ ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Animal ์ ๋ํด eat ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๊ณ ํ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
type-level distinction ์ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ํน์ animal types ์ ๋ํ ์์กดํ๋ associated types ๋ ์ ๊ฑฐํ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด ๋๋ฌผ์ด ์ด๋ค ๋จน์ด๋ฅผ ์์ํ๋์ง ์ ์ ์์ต๋๋ค.
๊ทธ๋์! ์ฐ๋ฆฌ๋ type relationships ๋ฅผ ์์กดํ๋ ค๋ฉด ํน์ ํ์ ์ ๋๋ฌผ์ด ๊ณ ์ ๋ context ๋ก ๋์๊ฐ์ผ ํฉ๋๋ค. Animal ์์ ์ง์ eat ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋์ some Animal ์ ์ฌ์ฉํ๋ feed ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
any Animal ๊ณผ some Animal ์ ๋ค๋ฅธ ํ์ ์ด์ง๋ง, ์ปดํ์ผ๋ฌ๋ underlying value ๋ฅผ unboxing ํ๊ณ , some Animal ํ๋ผ๋ฏธํฐ๋ก ์ง์ ์ ๋ฌํจ์ผ๋ก์จ any Animal ์ ์ธ์คํด์ค๋ฅผ some Animal ๋ก ๋ณํํ ์ ์์ต๋๋ค.
arguments ๋ฅผ unboxing ํ๋ ๊ฒ์ด Swift 5.7 ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค.
some Animal ํ๋ผ๋ฏธํฐ ๋ฒ์์ ๊ฒฝ์ฐ, ๊ฐ์ด underlying type ์ผ๋ก ๊ณ ์ ๋์์ผ๋ฏ๋ก underlying type ์ ๋ํ operations ๋ฅผ ํฌํจํ์ฌ associated types ์๋ ์ก์ธ์ค ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ ์ ์ ํ์ ์ ํํ์ฑ์ ๊ฐ๋ ์ปจํ ์คํธ๋ก ๋์๊ฐ ์ ์๋๋ก ํด์ค๋๋ค. ์์ some ์ ์ฌ์ฉํ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด์ ๊ฐ ๋๋ฌผ์ feed ๋ฉ์๋๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ๋ฐ๋ณต์์ ํน์ ๋๋ฌผ์๊ฒ ๋จน์ผ ์ ์ ํ ์๋ฌผ์ ์ฌ๋ฐฐํ๊ณ ์ํํ์ฌ ๋จน์ผ ์ ์์ต๋๋ค.
์ด ๊ณผ์ ์์ some ๊ณผ any ๊ฐ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
some ์ ์ฌ์ฉํ๋ฉด underlying type ์ด ๊ณ ์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด generic code ์ underlying type ์ ๋ํ type relationships ๋ฅผ ์์กดํ ์ ์์ผ๋ฏ๋ก ์์ ์ค์ธ ํ๋กํ ์ฝ์ API ๋ฐ associated types ์ ๋ํ ์ ์ฒด ์ก์ธ์ค ๊ถํ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
arbitrary concrete type ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ any ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. any ๋ type erasure ์ ์ ๊ณตํ์ฌ ์๋ก ๋ค๋ฅธ ์ข ๋ฅ๋ก ์ด๋ฃจ์ด์ง collections ์ ํ์ํ๊ณ optional ์ ์ฌ์ฉํ์ฌ underlying type ์ ๋ถ์ฌ๋ฅผ ํํํฉ๋๋ค. ๋ํ ์ธ๋ถ์ ์ธ ๊ตฌํ์ฌํญ์ ์ถ์ํํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก some ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , ์์์ ๊ฐ์ ์ ์ฅํด์ผ ํ๋ค๋ฉด any ๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด storage flexibility ๊ฐ ํ์ํ ๋ type erasure ์ semantic limitations ๋ง ์ง๋ถํ๋ฉด ๋ฉ๋๋ค. ์ด ์ํฌํ๋ก์ฐ๋ ๋ง์น mutation ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ๋๊น์ง ๊ธฐ๋ณธ์ ์ผ๋ก let-constants ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.