iOS/Swift

[Swift] Protocol(ν”„λ‘œν† μ½œ)에 λŒ€ν•΄μ„œ

κ²½ν‘Έ 2023. 4. 2. 18:30
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~

 

μ˜€λŠ˜μ€ ν”„λ‘œν† μ½œμ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€ : )

 

ν”„λ‘œν† μ½œμ΄λž€ 무엇인가?

ν”„λ‘œν† μ½œ(protocol)은 νŠΉμ • μž‘μ—… λ˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ, ν”„λ‘œνΌν‹°, 기타 μš”κ΅¬μ‚¬ν•­ λ“±μ˜ μ²­μ‚¬μ§„μž…λ‹ˆλ‹€.

ν”„λ‘œν† μ½œμ€ μ–΄λ–€ νƒ€μž…μ΄λ“  ν•΄λ‹Ή ν”„λ‘œν† μ½œμ„ 채택할 수 μžˆλ„λ‘ μ •μ˜λ©λ‹ˆλ‹€.

 

ν”„λ‘œν† μ½œμ€ λ‹€μŒκ³Ό 같이 μ •μ˜λ©λ‹ˆλ‹€.

 

protocol MyProtocol {
    // ν”„λ‘œν† μ½œ μ •μ˜
}

 

ν”„λ‘œν† μ½œμ€ 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• λ“± λͺ¨λ“  νƒ€μž…μ— 적용될 수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œν† μ½œμ—μ„œ μ •μ˜λœ μš”κ΅¬μ‚¬ν•­μ„ κ΅¬ν˜„ν•œ νƒ€μž…μ€ ν•΄λ‹Ή ν”„λ‘œν† μ½œμ„ 채택(adopt)ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

ν”„λ‘œν† μ½œμ˜ μ‚¬μš©λ°©λ²•

1. λ©”μ„œλ“œ

ν”„λ‘œν† μ½œμ—μ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

protocol MyProtocol {
    func myMethod()
}

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ MyProtocol은 myMethod()λΌλŠ” μš”κ΅¬μ‚¬ν•­μ„ μ •μ˜ν•©λ‹ˆλ‹€.

이 μš”κ΅¬μ‚¬ν•­μ€ ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ νƒ€μž…μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

class MyClass: MyProtocol {

    func myMethod() {
        // κ΅¬ν˜„
    }
}

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ MyClassλŠ” MyProtocol ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³ , myMethod()λ₯Ό κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

2. ν”„λ‘œνΌν‹°

ν”„λ‘œν† μ½œμ—μ„œ ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

protocol MyProtocol {
    var myProperty: Int { get set }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ MyProtocol은 myPropertyλΌλŠ” μš”κ΅¬μ‚¬ν•­μ„ μ •μ˜ν•©λ‹ˆλ‹€.

이 μš”κ΅¬μ‚¬ν•­μ€ 읽고 μ“Έ 수 μžˆλŠ” Int νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ‘œ, ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ νƒ€μž…μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

ν”„λ‘œνΌν‹°μ˜ 경우, λ°˜λ“œμ‹œ  var둜 μ„ μ–Έλ˜μ–΄μ•Ό ν•˜λ©°

{ get }, ν˜Ήμ€ { get set }으둜 gettable, settable ν•œ 지 λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

class MyClass: MyProtocol {
    var myProperty: Int = 0
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ MyClassλŠ” MyProtocol ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³ , myPropertyλ₯Ό κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Delegation으둜의 ν™œμš©

ν”„λ‘œν† μ½œμ„ μ΄μš©ν•˜μ—¬ λΈλ¦¬κ²Œμ΄μ…˜ νŒ¨ν„΄μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” 객체지ν–₯ λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ, 객체가 μžμ‹ μ˜ 행동 일뢀λ₯Ό λ‹€λ₯Έ κ°μ²΄μ—κ²Œ μœ„μž„ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

λΈλ¦¬κ²Œμ΄μ…˜ νŒ¨ν„΄μ—μ„œλŠ” 델리게이트(delegate) ν”„λ‘œν† μ½œμ„ μ •μ˜ν•˜κ³ , 이λ₯Ό μ±„νƒν•œ 델리게이트 객체(delegate object)κ°€ 델리게이트λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. 그리고 이 델리게이트 객체λ₯Ό λ‹€λ₯Έ κ°μ²΄μ—κ²Œ ν• λ‹Ήν•˜μ—¬ νŠΉμ • 행동을 μœ„μž„ν•©λ‹ˆλ‹€.

 

protocol MyDelegate {
    func didSomething()
}

class MyClass {

    var delegate: MyDelegate?

    func doSomething() {
        print(#function)
        delegate?.didSomething()
    }
}

class MyDelegateImpl: MyDelegate {

    func didSomething() {
        print(#function)  
    }
}

let myClass = MyClass()
let myDelegate = MyDelegateImpl()

myClass.delegate = myDelegate
myClass.doSomething() // myDelegate.didSomething()이 ν˜ΈμΆœλ©λ‹ˆλ‹€.

// κ²°κ³Ό
/*
 doSomething()
 didSomething()
*/

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ MyDelegateλŠ” 델리게이트 μš”κ΅¬μ‚¬ν•­μ„ μ •μ˜ν•˜κ³ , MyClassλŠ” MyDelegate ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³  μžˆλŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. MyClassλŠ” doSomething()이 호좜될 λ•Œ, delegate에 ν• λ‹Ήλœ 델리게이트 객체의 didSomething()을 ν˜ΈμΆœν•©λ‹ˆλ‹€. μ΄λ•Œ MyDelegateImpl은 MyDelegate ν”„λ‘œν† μ½œμ„ κ΅¬ν˜„ν•˜κ³ , didSomething()을 κ΅¬ν˜„ν•˜μ—¬ MyClassμ—μ„œ μœ„μž„λ°›μ€ 행동을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

AnyObject 채택

ν”„λ‘œν† μ½œμ€ AnyObjectλ₯Ό 채택할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•΄λ‹Ή ν”„λ‘œν† μ½œμ΄ 클래슀 νƒ€μž…μ—μ„œλ§Œ μ‚¬μš©λ  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

protocol MyProtocol: AnyObject {
    // Requirements
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ MyProtocol은 AnyObjectλ₯Ό μ±„νƒν•˜κ³ , 클래슀 νƒ€μž…μ—μ„œλ§Œ μ‚¬μš©λ  수 μžˆλŠ” ν”„λ‘œν† μ½œμž„μ„ λͺ…μ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

λ°˜μ‘ν˜•