์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ด๋ฒ์๋ ํ๋กํ ์ฝ์ ๋ํด์ ์์๋ณด๋๋ก ํ ๊ฒ์!
ํ๋กํ ์ฝ (protocol) ์ด๋?
ํน์ ์ญํ ์ ํ๊ธฐ ์ํ ๋ฉ์๋, ํ๋กํผํฐ, ๊ธฐํ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง์ ์ ์ํ๋ค. ๊ตฌ์กฐ์ฒด ํด๋์ค ์ด๊ฑฐํ์ ํ๋กํ ์ฝ์ ์ฑํํ์ฌ ํน์ ๊ธฐ๋ฅ์ ์คํํ๊ธฐ ์ํด ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ์ค์ ๋ก ๊ตฌํํ ์ ์๋ค. ์ด๋ ํ๋กํ ์ฝ์ด ์๊ตฌํ๋ ์ฌํญ์ ๋ชจ๋ ์ถฉ์กฑํ๋ฉด ํด๋น ํ์ ์ด ์ฑํํ ํ๋กํ ์ฝ์ ์ค์ํ๋ค๊ณ ๋งํ ์ ์๋ค. ๊ทธ๋ผ ์ฝ๋ค๋ฅด ํตํด ํ๋กํ ์ฝ์ด ์ด๋ป๊ฒ ์ฑํ๋๋์ง ์์๋ณด์.
ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ฝ๋๋ธ๋ก ์์๋ ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ์ ๋๋ค.
protocol ์ด๋ฆ {
// ~~~
}
๊ทธ๋ผ ์ด์ ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ฐฉ์์ ์ดํด๋ณด์. ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
protocol SomeProtocol {
}
struct SomeStructure: SomeProtocol {
}
ํ๋กํ ์ฝ์ ๋ ๊ฐ ์ด์์ ํ๋กํ ์ฝ์ ๋์์ ์ฑํํ ์ ์๋ค. ๋์์ ์ฌ๋ฌ๊ฐ์ ํ๋กํ ์ฝ์ ์ฑํํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
protocol SomeProtocol {
}
protocol SomeProtocol2 {
}
struct SomeStructure: SomeProtocol, SomeProtocol2 {
}
ํด๋์ค์์๋ ํ๋กํ ์ฝ ์ฑํ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ํด๋์ค์์๋ ์์์ด๋ผ๋ ๊ฐ๋ ์ด ์๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์ด ์๋ค. ์์๋ ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ฅด ํด๋ก (:) ๋ค์์ ์ํผํด๋์ค ์ด๋ฆ์ ์ฐ๊ฒ๋๋๋ฐ, ์์๋ฐ์ ํด๋์ค๊ฐ ์๋ค๋ฉด ํ๋กํ ์ฝ์ ์ฑํํ๊ธฐ ์ํ ๊ธฐ๋ณธํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
class ์ด๋ฆ: superClass, protocol1, protocol2... {
}
ํ๋กํ ์ฝ ์ฒญ์ฌ์ง? ๊ทธ๊ฒ ๋ญ๋ฐ?
์์ ๊ฐ๋ ์ ์ดํด๋ณด๋ฉด, ํ๋กํ ์ฝ์ ํน์ ์ญํ ์ ํ๊ธฐ ์ํ ๊ธฐํ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง์ ์ ์ํ๊ณ , ํ๋กํ ์ฝ์ ์ฑํํ ๊ตฌ์กฐ์ฒด,ํด๋์ค,์ด๊ฑฐํ์๊ฒ ์ ์ํ ์๊ตฌ์ฌํญ์ ์ค์ํ๋ผ๊ณ ์์ฒญํ๋ค๊ณ ํ์๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ์ฒญ์ฌ์ง์ ์ ์ํด์ผ ํ๋กํ ์ฝ์ ์ฑํํ์ ๋ ์ ์ํ ์๊ตฌ์ฌํญ์ ์ค์ํ๋ผ๊ณ ์์ฒญํ๋์ง ์์๋ณด์.
ํ๋กํ ์ฝ์ ์์ ์ ์ฑํํ ํ์ ์ด ์ด๋ค ํ๋กํผํฐ๋ฅผ ๊ตฌํํด์ผํ๋์ง ์๊ตฌํ ์ ์๋ค. ํ๋กํ ์ฝ์ด ํ๋กํผํฐ๋ฅผ ์ค์ํ๋๋ก ์ ์ํ ๋ ๊ณ์ฐํ๋กํผํฐ์ธ์ง ์ ์ฅํ๋กํผํฐ์ธ์ง ์ง์ ํ์ง ์๊ณ ํ๋กํผํฐ ์ด๋ฆ๊ณผ ํ์ ๋ง ์ง์ ํ๋ฉด ๋๋ค. ์ด๋ ํ๋กํผํฐ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ํ๋กํผํฐ์ธ์ง, ์ฝ๊ณ ์ธ ์ ์๋ ํ๋กํ ์ฝ์ธ์ง get,set์ ํ์ฉํ์ฌ ์ ์ํด์ค์ผํ๋ค. ํ๋กํ ์ฝ์์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ํ๋กํผํฐ๋ฅผ ์๊ตฌํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ข ๋ฅ์ ํฌ๋กํผํฐ๋ฅผ ์ค์ ํ ์ ์๋ค.
protocol FirstProtocol {
var name: Int {get set} //์ฝ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅ
var age: Int {get} // ์ฝ๊ธฐ ๊ฐ๋ฅ
}
ํ๋กํ ์ฝ์ ํ๋กํผํฐ๋ฅผ ์๊ตฌํ ๋, ์ฝ๋์ ๊ฐ์ด ํญ์ varํค์๋ ์ฆ ๋ณ์๋ก ์ ์ํด์ผํ๋ค. ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ํ๋กํผํฐ๋ get set ์ ์์ฑํด์ฃผ๊ณ , ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ํ๋กํผํฐ๋ get์ ์์ฑํด์ฃผ์.
๊ทธ๋ฆฌ๊ณ ํ๋กํ ์ฝ์์ ํ์ ํ๋กํผํฐ๋ฅผ ์๊ตฌํ๋ ค๋ฉด ํญ์ staticํค์๋๋ฅผ ์จ์ค์ผํ๋ค.
protocol AnotherProtocol {
static var someTypeProperty: Int {get set}
}
โถ ๊ทธ๋ผ ์ด์ ํ๋กํ ์ฝ์์ ํ๋กํผํฐ์ ์๊ตฌ์ฌํญ์ ์ ์ํ๊ณ ๊ตฌ์กฐ์ฒด์ ์ ์ํ ํ๋กํ ์ฝ์ ์ฑํํด๋ณด์.
protocol FullyNames {
var fullName : String { get set }
}
struct Person: FullyNames {
var fullName: String // ํ๋กํ ์ฝ์์ ์ ์ํ ๋ณ์๋ฅผ person์์ ์ง์ ํด์ฃผ๋ฉด ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ค๊ณ ํ ์ ์๋ค.
}
โถ ํ๋กํ ์ฝ์ ์์ ์ ์ฑํํ ํ์ ์์ ๋ฉ์๋๋ฅผ ์๊ตฌํ ์ ์๋ค. ํ๋กํ ์ฝ์์ ๋ฉ์๋๋ฅผ ์ ์ํ ๋, ๋ฉ์๋์ ํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ค์ผํ๋๋ฐ, ๋ฉ์๋๊ฐ์ ๋ํด๋๊ฐ์ ์ง์ ํ ์ ์๋ค. ๊ทธ๋ผ FullyNamesํ๋กํ ์ฝ์ ๋ฉ์๋๋ฅผ ์ ์ํด๋ณด์.
protocol FullyNames {
var Name: String { get set }
func printFullName()
}
์ด๋ ๊ฒ FullyNamesํ๋กํ ์ฝ์ด ๋ณ๊ฒฝ๋์ด์ ์๋์ฒ๋ผ person๊ตฌ์กฐ์ฒด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ FullyNames ํ๋กํ ์ฝ ์๊ตฌ์ฌํญ์ ์ค์ํ์ง ์์๋? ์ด๋ป์ด๋ค. ์๊ตฌ์ฌํญ์ ์ค์ํ๊ธฐ ์ํด์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ค์ผํ๋ค.
struct Person: FullyNames {
var fullName: String
func printFullName() {
print(fullName)
}
}
โถ ์์ฑ์(initializer) ์๊ตฌ์ฌํญ์ ์ดํด๋ณด์. ํ๋กํ ์ฝ์ ์์ ์ ์ฑํํ ํ์ ์ ์์ฑ์๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์๊ตฌ ํ ์ ์๋ค.
protocol SomeProtocol4 {
init(someParameter: Int)
}
์ฝ๋๋ฅผ ํตํด ์์ฑ์ ์๊ตฌ์ฌํญ์ ์ฑํํด๋ณด์.
protocol Someprotocol5 {
init()
}
class Someclass: Someprotocol5 {
required init() {
}
}
๊ตฌ์กฐ์ฒด์์๋ ์์ฑ์ ์๊ตฌ์ฌํญ์ ์ค์ํ ๋ required ์๋ณ์๊ฐ ํ์์์ง๋ง, class์์๋ ํ์ํ๋ค. ๋จ ์์ธ์ ์ผ๋ก ํด๋์ค ์์ฒด๊ฐ ์์๋ฐ์ ์ ์๋ final ํด๋์ค๋ผ๋ฉด required ์๋ณ์๊ฐ ํ์์๊ธฐ๋ ํ๋ค.
'Swift > Swift BASIC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ์ด๊ฑฐํ (enum) (0) | 2022.01.20 |
---|---|
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - extension(ํ์ฅ) (0) | 2022.01.20 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - assert (0) | 2022.01.19 |
[Swift] ํ์ ์บ์คํ (Type casting) (0) | 2022.01.19 |
[Swift] ํ๋กํผํฐ ์ต์ ๋ฒ (property observer) (0) | 2022.01.19 |