νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°
Protocol - Oriented Programming
νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°
νν μκ³ μλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° : μ¬λ¬Όμ κ°μ²΄λ‘ νμ±νμ¬ κ³΅ν΅μ μ κ°λ λͺ¨λ κ³³μμ μμλ°λ κ°μ²΄ λ΄λΆμ λͺ¨λ λ‘μ§μ μΊ‘μννλ€. μλ νμ§ μμλ μμνλ€λ μ΄μ λ‘ λͺ¨λ μμ±κ³Ό νμλ₯Ό 곡μ ν΄μΌνλ©°, 볡μ‘ν μμ ꡬ쑰λ₯Ό μ§λ ν΄λμ€λ₯Ό μμνλ€λ©΄ μνλ ν΄λμ€λ₯Ό μ°Έμ‘°ν΄μΌ ν λ λ€μ΄μΊμ€ν μ ν΄μΌ νλ€. λν ν° λ¨μ μ λ¨ νλμ SuperClassλ§ μμν μ μλ€λ μ μ΄λ€. μκ°μ΄ νλ₯΄λ©΄ κΈ°λ₯λ νμ₯νκΈ° λ§λ ¨μ΄λ―λ‘ λ³΅μ‘λλ λμμ§κ³ κ΄λ¦¬λ μ΄λ €μμ§λ€.
νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ° : νμν λΆλΆλ§ νλ‘ν μ½λ‘ λΆλ¦¬ν΄μ λ§λ€ μ μκ³ λ€μ€ νλ‘ν μ½μ ꡬνν μ μλ€. κ²λ€κ° νλ‘ν μ½ κ·μΉμ class, struct, enumμ μ μ©ν μ μκΈ° λλ¬Έμ νμ₯ λΆλΆμμλ μ μ°νλ€. μ€μννΈλ λ€λ₯Έ μΈμ΄μ λ¬λ¦¬ ν΄λμ€λ‘ ꡬνλ νμ 보λ€λ λλΆλΆ κ΅¬μ‘°μ²΄λ‘ κΈ°λ³Έ νμ μ΄ κ΅¬νλμ΄ μλ€. μμλ λμ§ μλ κ³΅ν΅ κΈ°λ₯μ κ°μ§ μ μλ λ°©λ²μλ νλ‘ν μ½κ³Ό μ΅μ€ν μ μ΄ μλ€.
νλ‘ν μ½ κ΅¬ν
protocol Walkable {
var isBarFoot: Bool { get set }
func walk()
}
struct Person: Walkable {
var isBareFoot: Bool
var name: String
func walk() {
print("\(name)μ κ±·μ΅λλ€")
}
}
struct Animal: Walkable {
var isBareFoot: Bool
func walk() {
print("\name)μ κ±·μ΅λλ€")
}
}
μ¬κΈ° Walkable νλ‘ν μ½μ΄ μλ€. μ΄ νλ‘ν μ½μ 맨λ°μΈμ§ μλμ§μ ꡬλΆκ³Ό κ±Έμ μ μλ₯μ΄ μλ€.
νλ‘ν μ½ μ±νμ νλ‘ν μ½μ΄ μꡬνλ μ¬νμ λͺ¨λ ꡬνν΄μ£Όμ΄μΌ νλ€.
μλ₯Ό λ€μ΄, νλ‘ν μ½μ λ§μ μꡬμ¬νμ΄ λ€μ΄μκ³ λ§μ ꡬ쑰체μμ μ±νμ νλ€λ©΄ λ§μ μ€λ³΅λ μ½λλ₯Ό μ¬μ©ν΄μΌ ν κ²μ΄λ€.
μ΄λ₯Ό λ°©μ§νκΈ° μν΄ νλ‘ν μ½μ μꡬμ¬νμ ꡬννμ§ μλλΌλ νλ‘ν μ½μ μ΅μ€ν μ μ 미리 νλ‘ν μ½μ μꡬμ¬νμ ꡬνν΄ λ μ μλ€.
protocol Walkable {
var isBareFoot: Bool { get set }
var speed: Double { get set }
func walk(name: String)
}
extension Walkable {
func walk(name: String) {
if isBareFoot == true {
print("\(name)μ 맨λ°μΈ μνμ \(speed)μλλ‘ κ±·μ΅λλ€.")
} else {
print("\(name)μ μ λ°μΈ μνμ \(speed)μλλ‘ κ±·μ΅λλ€.")
}
}
}
struct Person: Walkable {
var isBareFoot: Bool
var speed: Double
}
struct Animal: Walkable {
var isBareFoot: Bool
var speed: Double
}
let gilDong = Person(isBareFoot: false, speed: 5.0)
gilDong.walk(name:"κΈΈλ")
let cat = Animal(isBareFoot: true, speed: 10.0)
cat.walk(name:"μΌμΉ")
μ μ½λμμ Personκ³Ό Animalμ Walkableμ μꡬμ¬νμΈ walk(name:)μ ꡬννμ§ μμμμλ λΆκ΅¬νκ³ μ€λ₯κ° λ°μνμ§ μλλ€.
νλ‘ν μ½μ΄ μꡬνλ μ¬νμ 미리 ꡬνν΄ λ μ μλ€λ©΄ μ€λ³΅λ μ½λλ₯Ό νΌν μ μλ€. ꡬνμ μν΄λλ€λ©΄ νλ‘ν μ½ μ±νλ§μΌλ‘λ κ·Έ νμ μ κΈ°λ₯μ΄ μΆκ°λμ΄ μ¬μ©ν μ μλ κ²μ΄λ€.
protocol Walkable {
func walk()
}
extension Walkable {
func walk() {
print("κ±·λ€")
}
}
protocol Flyable {
func fly()
}
extension Flyable {
func fly() {
print("λ λ€")
}
}
protocol Runable {
func run()
}
extension Runable {
func run() {
print("λ°λ€")
}
}
struct Person: Walkable, Runable {}
let gilDong = Person()
gilDong.walk()
struct Bird: Flyable, Walkable, Runable {}
let bird = Bird()
bird.fly()
bird.walk()
bird.run()
ν¬λ‘ν μ½ μ±νλ§μΌλ‘λ κ·Έ κΈ°λ₯μ μ¬μ©ν μ μκ² νλ‘ν μ½ κ΅¬νμ μ ν΄λλκ² νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°μμ κ°μ₯ μ€μνλ€.
λν κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ SuperClassμ λ¬λ¦¬, κΈ°λ₯λ€μ λΆλ¦¬νμ¬, Protocol extensionμ μμ±ν μ μλ€. μ΄λ SuperClass λ¨μΌν λ¬Έμ μ μ λν ν΄κ²°μ± μ΄λΌκ³ λ³Ό μ μλ€.
μ‘°κΈ λ μμΈν λ€μ¬λ€λ³΄μ
β Protocol Oriented Programming νμλ°°κ²½
μΌλ°μ μΌλ‘ OOPμμ ν΄λμ€μ μμ κ°λ μ ν΅ν΄ κ³΅ν΅ κΈ°λ₯λ€μ λͺ¨λννμ¬ μ¬μ©ν μ μμμΌλ, ꡬ쑰체 νΉμ μ΄κ±°νμ κ²½μ°μλ μμμ΄ λΆκ°νκΈ°μ κ°μ νμ μ λν΄μ 곡ν΅μ μΈ κΈ°λ₯ ꡬνμ μν΄μλ λ€λ₯Έ λ°©λ²μ μ΄μ©ν΄μΌ νλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν λ°©μμ΄ Appe WWDC15( Swift 2 )μμ Extensionμ΄ λ°νλμλ€.
Protocol ( μ²μ¬μ§ ) μ ꡬννκ³ ExtensionμΌλ‘ ν΄λΉ νλ‘ν μ½μ κΈ°λ₯μ νμ₯νλ ννλ‘ μ¬μ©νλ€.
μ΄λ₯Ό νλ‘ν μ½ μ΄κΈ°κ΅¬ν ( Protocol Default Implementation ) μ΄λΌκ³ νλ€.
β POPμ μ₯μ
- μ½λμ μ€λ³΅μ μ΅μν
- κ°λ³κ³ μμ νλ€.
- μμκ³Ό λ¬λ¦¬ νμν κ²λ§ 골λΌμ μ¬μ©ν μ μλ€.
- μμμ κ²½μ°, μ°Έμ‘°νμ μ΄λ―λ‘ μ°Έμ‘° μΆμ μ μν λΉμ©μ΄ λ§μ΄ λ°μνκΈ° λλ¬Έμ μλλ©΄μμλ λ€μ λ리λ€.
- κ° νμ
μ μμ ν¨κ³Ό
- 곡ν΅λ κΈ°λ₯μ μ½κ² ꡬνν μ μλ€.
- μνμ μΈ νμ₯ κΈ°λ₯
- μ λ€λ¦μ νμ©
β νλ‘ν μ½ ( Protocol )
νλ‘ν μ½μ νΉμ κΈ°λ₯ μνμ νμμ μΈ μμλ₯Ό μ μν μ²μ¬μ§(blueprint)μ΄λ€.
νλ‘ν μ½μ λ§μ‘±μν€λ νμ μ νλ‘ν μ½μ λ°λ₯Έλ€(conform)κ³ λ§νλ€.
νλ‘ν μ½μ νμ ꡬνμ μΆκ°νκ±°λ μΆκ°μ μΈ κΈ°λ₯μ λνκΈ° μν΄ νλ‘ν μ½μ νμ₯(extend) νλκ²μ΄ κ°λ₯νλ€.
β νλ‘ν μ½ λ¬Έλ²
protocol SomeProtocol {
// protocol definition goes here
}
β νλ‘νΌν° μꡬμ¬ν
protocol SomeProtocol {
var mustBeSettle: Int { get set }
var doesNotToBeSettable: Int { get }
}
νλ‘ν μ½μμλ νλ‘νΌν°μ νμ κ·Έλ¦¬κ³ gettable, settableμ λͺ μνλ€.
νμ νλ‘νΌν°λ νμ varλ‘ μ μΈν΄μΌνλ€.
protocol AnotherProtocol {
static var someTypeProperty: Int { get set }
}
νμ νλ‘νΌν°λ static ν€μλλ₯Ό μ μ΄ μ μΈνλ€.
β λ©μλ μꡬμ¬ν
protocol someProtocol {
static var someTypeMethod()
}
νμ λ©μλ μ§μ μ ν¨μλͺ κ³Ό λ°νκ°μ μ§μ ν μ μκ³ , ꡬνμ μ¬μ©νλ κ΄νΈλ μ μ§ μμλ λλ€.
β νλ‘ν μ½ μ΄κΈ° ꡬν ( Protocol Default Implementation )
extensionμΌλ‘ protocolμ μ μλ κ²λ€μ 미리 ꡬνν¨μΌλ‘μ ν΄λΉ protoclμ ꡬννλ λμλ€μ΄ μ½λμ μ€λ³΅μ νΌν μ μλ€.
// νλ‘ν μ½ μ μ
protocol Person {
var name: String? { get }
var age: Int? { get }
func getName() -> String?
func getAge() -> Int?
}
// νλ‘ν μ½ κΈ°λ₯ νμ₯
extension Person {
func getName() -> String? {
return self.name
}
func getAge() -> Int? {
return self.age
}
}
μ μ€λͺ λλ‘ protoclμλ μ μΈλΆ(μ μ)λ§ μ μ΄μ£Όκ³ ν΄λΉ κΈ°λ₯μ νμ₯(extension) ν΄μ£Όμλ€.
struct Student: Person {
var name: String?
var age: Int?
init(name: String?, age: Int?) {
self.name = name
self.age = age
}
}
μ΄μ΄μ Student κ΅¬μ‘°μ²΄κ° Person νλ‘ν μ½μ μ±ν(μ€μ) νλ€.
let gilDong = Student(name: "gilDong", age: 25)
print(gilDong.getName()) // gilDong
Stduent ꡬ쑰체λ₯Ό μ΄κΈ°ννκ³ , .(dot)λ¬Έλ²μ ν΅ν΄ getName λ©μλλ₯Ό νΈμΆνλ©΄ μ΄λ¦μ΄ μΆλ ₯λλ€.
'π iOS > κΈ°μ΄λ¬Έλ²' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift κΈ°μ΄] μ λ€λ¦ ( Generic ) (0) | 2023.06.05 |
---|---|
[Swift κΈ°μ΄] λͺ¨λλ (0) | 2023.01.31 |
[Swift κΈ°μ΄] 맡, νν°, 리λμ€ (0) | 2023.01.27 |
[Swift κΈ°μ΄] μ΅μ λ 체μ΄λκ³Ό λΉ λ₯Έ μ’ λ£ (2) | 2023.01.19 |
[Swift κΈ°μ΄] ν΄λ‘μ (0) | 2023.01.19 |