Closed Glsme closed 1 year ago
1. Optional Protocol : ์ ํ์ ์์ฒญ์ผ๋ก ํ์ํ์ง ์์ ์์๋ ์์จ๋ ๋๋ค.
2. CaseIterable : ์ด๊ฑฐํ์ ๊ฐ๋ค์ ์ํํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋กํ ์ฝ, allCases๋ฅผ ํ์ฉํ์ฌ ๋ฐฐ์ด์ฒ๋ผ๋ ์ฌ์ฉ ๊ฐ๋ฅ
3. Hashable : ์ ์ Hash ๊ฐ์ ์ ๊ณตํ๋ ํ์ ์ ํ๋กํ ์ฝ, Hashable์ ์ค์ํ๋ฉด Dictionary์ ํค๊ฐ ๋ ์ ์๋ ํ์ ์ด ๋๋ค. ๋ฐ๋๋ก Dictionary์ ํค ๊ฐ์ Hashable ํ๋กํ ์ฝ์ ๋ง์กฑํ๋ ํ์ ์ด์ด์ผ ํ๋ค.
ํ์ ์ผ๋ก class๋ struct์ ํ๋์ ์ ์ํ๋ ์ญํ (์ฆ, ๊ตฌํํ๋ ์ญํ ์ ํ์ง ์๋๋ค)
Class | Protocol |
---|---|
ํ๋์ ํด๋์ค๋ง ์์ ๊ฐ๋ฅ | ๋ค์ค ์์ ๊ฐ๋ฅ |
ํด๋์ค ํ์ ์์๋ง ๊ฐ๋ฅ | ๋ชจ๋ ํ์ ์ ์ฉ ๊ฐ๋ฅ |
protocol Student {
var id: String { get }
var name: String { get set }
func study()
}
Protocol
์ ํ์
์ด๋ค. ๋ฐ๋ผ์ Protocol
์ ๋ณ์์ ํ ๋นํ ์ ์๊ณ , ํจ์ ํธ์ถ ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์์ผ๋ฉฐ, ํจ์์์ Protocol
์ ๋ฐํํ ์ ์๋ค.ํ๋กํ ์ฝ : ํน์ ์ญํ ์ ํ๊ธฐ ์ํ ๋ฉ์๋, ํ๋กํผํฐ, ๊ธฐํ ์๊ตฌ ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง ํ๋กํ ์ฝ์ ์ฅ์ : ์ฝ๋ ์ค๋ณต์ ์ค์ผ ์ ์๋ค. : ๊ฐ๋ณ๊ณ ์์ ํ๋ค.(์์๊ณผ ๋ค๋ฅด๊ฒ ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ ์ฌ์ฉํ ์ ์์.) : ๊ฐ ํ์ ์ ์์ ํจ๊ณผ : ์ ๋ค๋ฆญ ํ์ฉ ๊ฐ๋ฅ(ํ์ ์ ๊ด๊ณ ์์ด ๋ง๋ค ์ ์๋ค.)
ํน์ ์์ ์ด๋ ๊ธฐ๋ฅ์ ์ ํฉํ ๋ฉ์๋, ํ๋กํผํฐ, ๋ค๋ฅธ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง์ ์ ์ํ๋ ๊ฒ์ด ํ๋กํ ์ฝ. ํ๋กํ ์ฝ์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ์ ์ฑํ์ด ๋ ์ ์์. ์ด๋ค ํ์ ์ด๋ ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ํ์ ์, 'ํ๋กํ ์ฝ์ ์ค์(conform to protocol)'ํ๋ค๊ณ ํ๋ค.
protocol DeeProtocol {
// ํ๋กํ ์ฝ ์ ์๋ฅผ ์ฌ๊ธฐ์ ์ ์ธ
}
ํ๋กํ ์ฝ์ ์ฑํํ๊ธฐ ์ํด์ ์ปค์คํ ํ์ ์ ์ค๋ฅธ์ชฝ์ ์ฝ๋ก , ํ๋กํ ์ฝ ์ด๋ฆ์ ์ ๋ ฅํ๋ค
struct SanStruct: DeeProtocol, CatProtocol {
// ๊ตฌ์กฐ์ฒด ์ ์
}
๋ง์ฝ ํด๋์ค๊ฐ ์ํผ ํด๋์ค๊ฐ ์์ ๊ฒฝ์ฐ, ํ๋กํ ์ฝ์ ์ฑํํ๊ธฐ ์ ์ ์ํผํด๋์ค๋ฅผ ๋จผ์ ์์ฑํด์ผํ๋ค.
์ ์ฅ ํ๋กํผํฐ์ธ์ง ๊ณ์ฐํ๋กํผํฐ์ธ์ง๋ ๋ช ์ธํ์ง ์๋๋ค. ํ์ํ ํ์ ๊ณผ ์ด๋ฆ๋ง ์ง์ . ๋ํ ํ๋กํ ์ฝ์ ๊ฐ ํ๋กํผํฐ๊ฐ gettable ํ์ง, ๋๋ gettable and settableํ์ง ๋ฐ๋์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
protocol DeeProtocol {
var settableProperty: String { get set }
var gettableProperty: String { get }
static var typeProperty: String { get set }
}
ํ๋กํ ์ฝ์์ ๋ฉ์๋๋ ์ค๊ดํธ(=๋ฉ์๋๋ฐ๋)๋ฅผ ํฌํจํ์ง ์๋๋ค. ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ ํ์ฉ๋์ง๋ง ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ค ์ ์๋ค.
protocol CatProtocol {
static func purrMethod()
func tasteCatFood() -> Int
mutating func isJipsaHome() -> Bool
}
์์ฑ์ ๋ฐ๋ (= ์ค๊ดํธ)๊ฐ ์๋ ๊ฒ์ ๋นผ๊ณ ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค.
protocol JipsaProtocol {
init(catName: String)
}
ํ๋กํ ์ฝ์ ์๊ธฐ์์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ์ง๋ ์์ง๋ง, ํ๋กํ ์ฝ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ํ๋กํ ์ฝ์ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ existential type (์ค์กด์ ํ์ ) ์ด๋ผ๊ณ ๋ ํ๋ค. ์ด ํํ์ 'ํ๋กํ ์ฝ์ ์ค์ํ๋ํ์ T๊ฐ ์ค์ฌํ๋ค.'๋ผ๋ ๋ง์์ ์์.
๋ค๋ฅธ ํ์ ๋ค ์ฒ๋ผ ํ๋กํ ์ฝ์ ์ฌ๋ฌ๊ณณ์์ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด
์๋ํ๋ฉด ํ๋กํ ์ฝ์ ํ์ ์ด๋ฏ๋ก.
Class San {
let jipsa: JipsaProtocol
let favoriteFood: [String]
init(jipsa: JipsaProtocol, favouriteFood: [String]) {
self.jipsa = jipsa
self.favouriteFood = favouriteFood
}
func isMyFavorite(food: String) -> Bool {
return favoriteFood.contains(food)
}
}
Delegation์ ํด๋์ค์ ๊ตฌ์กฐ์ฒด๊ฐ ์ผ๋ถ ์ฑ ์์ ๋ค๋ฅธ ํ์ ์ ์ธ์คํด์ค์ ์ด๊ด(์์)ํ๋ ๋์์ธ ํจํด. ์ด ๋์์ธ ํจํด์ ์์๋ ๊ถํ์ ์บก์ํํ ํ๋กํ ์ฝ์ ์ ์ํจ์ผ๋ก์จ ๊ตฌํํ๋๋ฐ, ํ๋กํ ์ฝ์ ์ค์ํ๋ ์ ํ(Delegate=๋๋ฆฌ์)์ด ์์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํจ. Delegate์ ์์ค์ ์ค์ ํ์ ์ ์ ํ์ ์์ด, ํน์ ์์ ์ ์๋ตํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ ์๋ค.
๐๏ธ ๋ง๊ฐ์ผ
2023.01.15
๐ ์ฐธ์ฌ์
โ ๏ธ ๋ง์ง๋ง์ผ๋ก ๋ต๋ณ ๋จ ์ฌ๋์ด ์ด์ close ํ๊ณ ๋ฆฌ๋๋ฏธ์ ํญ๋ชฉ ์ ๋ฐ์ดํธ ํด์ฃผ์ธ์.