λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] ν”„λ‘œν† μ½œ (Protocol)

by hyebin (Helia) 2023. 2. 6.
λ°˜μ‘ν˜•

ν”„λ‘œν† μ½œ (Protocol)

  • νŠΉμ • μž‘μ—…μ΄λ‚˜ κΈ°λŠ₯에 μ ν•©ν•œ λ©”μ„œλ“œ, ν”„λ‘œνΌν‹° 및 기타 μš”κ΅¬μ‚¬ν•­μ˜ ‘약속’을 μ •μ˜
  • 클래슀(class), ꡬ쑰체(struct), μ—΄κ±°ν˜•(enum)μ—μ„œλŠ” μ–΄λ– ν•œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜μ—¬ ν•΄λ‹Ή ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ μ‹€μ œλ‘œ κ΅¬ν˜„ κ°€λŠ₯
  • ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±μ‹œν‚€λŠ” λͺ¨λ“  νƒ€μž…μ€ ν•΄λ‹Ή ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€ ν˜Ήμ€ λ”°λ₯Έλ‹€κ³  함
  • ν”„λ‘œν† μ½œμ„ μ±„μš©ν•œ ν˜•μ‹μ€ μš”κ΅¬μ‚¬ν•­μ„ λ°˜λ“œμ‹œ λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό 함
  • ν”„λ‘œν† μ½œμ€ ν”„λ‘œν† μ½œ κ°„ 상속을 μ§€μ›ν•˜λ©°, ν΄λž˜μŠ€μ™€ 달리 닀쀑 상속도 지원

 

ν”„λ‘œν† μ½œ μ±„νƒν•˜κΈ°

  • 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ—μ„œ μ •μ˜ν•œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κΈ° μœ„ν•΄μ„œλŠ” 콜둠(:)을 μ‚¬μš©
  •  ν•˜λ‚˜μ˜ νƒ€μž…μ—μ„œ λ‹€μˆ˜μ˜ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κΈ° μœ„ν•΄μ„œλŠ” 콀마(,)λ₯Ό μ‚¬μš©
  • ν΄λž˜μŠ€μ—μ„œ 상속과 ν”„λ‘œν† μ½œ 채택을 λ™μ‹œμ— ν•˜λ €λ©΄ μƒμ†λ°›μœΌλ €λŠ” 클래슀λ₯Ό λ¨Όμ € λͺ…μ‹œν•œ λ’€,  채택할 ν”„λ‘œν† μ½œ λͺ©λ‘μ„ μž‘μ„±
protocol SomeProtocol {}

// ν”„λ‘œν† μ½œ 채택
struct SomeStructure: SomeProtocl {}

// λ‹€μˆ˜μ˜ ν”„λ‘œν† μ½œ 채택
struct SomeStructure: SomeProtocol, AnotherProtocol {}

// SomeSuperClassλ₯Ό 상속 λ°›κ³  있고, SomeProtocl을 μ±„νƒν•œ 클래슀 μ •μ˜
class SomeClass: SomeSuperClass, SomeProtoc {}

 

ν”„λ‘œν† μ½œ ν”„λ‘œνΌν‹°

  • ν”„λ‘œνΌν‹°λŠ” νƒ€μž…κ³Ό μ΄λ¦„λ§Œ μž‘μ„±
  • gettable/settable μ—¬λΆ€λ₯Ό μž‘μ„±
  • ν”„λ‘œνΌν‹°λŠ” var둜 μ„ μ–Έ

 

ν”„λ‘œν† μ½œ λ©”μ„œλ“œ

  • λ©”μ„œλ“œ μž‘μ„± κ°€λŠ₯
  • 일반적인 λ©”μ„œλ“œ μ™€λŠ” 달리 본문은 μž‘μ„±ν•˜μ§€ μ•ŠμŒ
protocol SomeProtocol {
    var a: Int { get }
    var b: Int { get set }
    func setNumber(a: Int, b: Int)
    func add() -> Int
}

class SomeClass: SomeProtocol {
     var a: Int = 0
     var b: Int = 0
     
     func setNumber(a: Int, b: Int) {
         self.a = a
         self.b = b
     }
     func add() -> Int {
         return a + b
     }
}

 

ν”„λ‘œν† μ½œ μ΄λ‹ˆμ…œλΌμ΄μ €

  • ν”„λ‘œν† μ½œμ—μ„œλŠ” ν•„μˆ˜λ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ§€μ • κ°€λŠ₯
  • μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μžˆλŠ” ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ νƒ€μž…μ—μ„œλŠ” ν•΄λ‹Ή μ΄λ‹ˆμ…œλΌμ΄μ €μ— required ν‚€μ›Œλ“œλ₯Ό μž‘μ„±ν•΄μ•Ό 함
protocol SomeProtocol {
	init(someParameter: Int)
}
class SomeClass: SomeProtocol {
     required init(someParameter: Int) {
     }
}

 

ν”„λ‘œν† μ½œ 상속

  • ν”„λ‘œν† μ½œμ€ ν•˜λ‚˜ μ΄μƒμ˜ ν”„λ‘œν† μ½œμ„ 상속받아 κΈ°μ‘΄ ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­λ³΄λ‹€ 더 λ§Žμ€ μš”κ΅¬μ‚¬ν•­μ„ μΆ”κ°€ν•  수 있음
  •  ν”„λ‘œν† μ½œ 상속 문법은 클래슀의 상속 문법과 μœ μ‚¬ν•˜μ§€λ§Œ, ν”„λ‘œν† μ½œμ€ ν΄λž˜μŠ€μ™€ λ‹€λ₯΄κ²Œ 닀쀑상속이 κ°€λŠ₯

 

클래슀 μ „μš© ν”„λ‘œν† μ½œ

  • ꡬ쑰체, μ—΄κ±°ν˜•μ—μ„œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  클래슀 νƒ€μž…μ—λ§Œ μ‚¬μš©κ°€λŠ₯ν•œ ν”„λ‘œν† μ½œμ„ μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œν† μ½œμ— AnyObject ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€
λ°˜μ‘ν˜•