Skip to content

Latest commit

Β 

History

History
111 lines (80 loc) Β· 4.68 KB

Protocol.md

File metadata and controls

111 lines (80 loc) Β· 4.68 KB

ν”„λ‘œν† μ½œμ€ 무엇인지 μ„€λͺ…ν•˜μ‹œμ˜€

ν•¨κ»˜λ³΄λ©΄ 쒋은 λ‹΅λ³€

μ°Έκ³ ν•œ 쒋은 κΈ€

Answer

ν”„λ‘œν† μ½œμ€ μ„œλ‘œκ°„μ˜ '약속'이닀.

μ’€ 더 μžμ„Ένžˆ λ§ν•˜λ©΄ νŠΉμ • μž‘μ—…μ΄λ‚˜ κΈ°λŠ₯에 μ ν•©ν•œ λ©”μ†Œλ“œ, ν”„λ‘œνΌν‹° 및 기타 μš”κ΅¬μ‚¬ν•­μ˜ 청사진(blue print)λ₯Ό μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

μ„ μƒλ‹˜ μ΄λΌλŠ” ν”„λ‘œν† μ½œμ΄ μžˆλ‹€κ³  κ°€μ •ν•œλ‹€.

λ³€μˆ˜μ—λŠ” κ°€λ₯΄μΉ˜λŠ” κ³Όλͺ©μ΄ 있고 teaching()κ³Ό giveHomework()λΌλŠ” λ©”μ„œλ“œκ°€ μžˆλ‹€κ³  ν–ˆμ„ λ•Œ

Protocol은 κ³Όλͺ©, teaching(), giveHomework()λ₯Ό ν•΄μ•Όν•œλ‹€λŠ” μ•½μ†λ§Œ ꡬ성할 뿐 μ‹€μ§ˆμ μΈ 행동을 μ •μ˜ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

κ·Έ μ‹€μ§ˆμ μΈ 행동 즉, κ΅¬ν˜„μ€ μ„ μƒλ‹˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” κ³³μ—μ„œ 이루어진닀.

κ³Όν•™μ„ μƒλ‹˜, κ΅­μ–΄μ„ μƒλ‹˜μ€ λͺ¨λ‘ 각각 "κ³Όν•™", "κ΅­μ–΄"λΌλŠ” κ³Όλͺ©λͺ…을 κ°€μ§ˆ 것이며, teaching()κ³Ό giveHomework()λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.

DelegateλŠ” ν”„λ‘œν† μ½œλ‘œ κ΅¬ν˜„μ΄ λœλ‹€.


ν”„λ‘œν† μ½œμ˜ κ΅¬ν˜„(μ€‘μš”)--------------

클래슀 뿐만 μ•„λ‹ˆλΌ ꡬ쑰체, μ—΄κ±°ν˜• λ˜ν•œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜μ—¬ νŠΉμ • κΈ°λŠ₯을 μ‹€ν–‰ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

πŸ“Œ ν”„λ‘œνΌν‹° μš”κ΅¬ 사항

  1. ν”„λ‘œν† μ½œμ€ ν”„λ‘œνΌν‹°κ°€ μ €μž₯ ν”„λ‘œνΌν‹°μΈμ§€, μ—°μ‚° ν”„λ‘œνΌν‹°μΈμ§€ λͺ…μ‹œ ν•˜μ§€ μ•ŠλŠ”λ‹€.

  2. λŒ€μ‹  { get } 인지 { get set }인지 λͺ…μ‹œν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.(setter만 μžˆλŠ”κ±΄ μ—†λ‹€).

    • { get }만 μš”κ΅¬ν•  경우 λͺ¨λ“  μ’…λ₯˜μ˜ ν”„λ‘œνΌν‹°(μ—°μ‚° ν”„λ‘œνΌν‹°λ“  μ €μž₯ ν”„λ‘œνΌν‹°λ“ )μ—μ„œ μΆ©μ‘± & ν•„μš”ν•˜λ‹€λ©΄ setterλ₯Ό μΆ”κ°€μ μœΌλ‘œ κ΅¬ν˜„ κ°€λŠ₯
    • { get set }일 κ²½μš°μ—λŠ” μƒμˆ˜(let) μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ { get }만 κ΅¬ν˜„ν•΄μ„œλŠ” μ•ˆλœλ‹€.
  3. ν”„λ‘œνΌν‹° μš”κ΅¬μ‚¬ν•­μ€ 항상 var둜 μ„ μ–Έλ˜μ–΄μ•Ό ν•œλ‹€.

  4. νƒ€μž… ν”„λ‘œνΌν‹°λŠ” ν”„λ‘œν† μ½œ λ‚΄μ—μ„œ static ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ•Ό ν•œλ‹€.(class X)

πŸ“Œ λ©”μ†Œλ“œ μš”κ΅¬μ‚¬ν•­

  1. 'μ •μ˜'만 μ΄λ£¨μ–΄μ§ˆ 것

    protocol SomeProtocol {
        func someMethod()
        func anotherMethod(name: String, age: Int) -> Int
        func protocolMethod() -> String
    }
  2. νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό ν”„λ‘œν† μ½œμ— μ •μ˜ν•œ 경우, static ν‚€μ›Œλ“œλ₯Ό μ ‘λ‘μ‚¬λ‘œ λΆ™μ–΄μ•Ό ν•œλ‹€.

  3. mutating

    • μΈμŠ€ν„΄μŠ€μ— μ†ν•œ λ©”μ„œλ“œλ₯Ό μˆ˜μ •, λ³€κ²½ν•˜κΈ° μœ„ν•΄μ„œλŠ” func μ•žμ— mutatingμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό 두어야 ν•œλ‹€.
    • 단, ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” 주체가 ꡬ쑰체와 μ—΄κ±°ν˜•μΌ 경우만 mutating ν‚€μ›Œλ“œλ₯Ό 뢙이며 클래슀의 κ²½μš°μ—λŠ” 뢙이지 μ•Šμ•„λ„ λœλ‹€. κ·Έ μ΄μœ λŠ” Value Type인 ꡬ쑰체와 μ—΄κ±°ν˜•κ³Ό 달리 ν΄λž˜μŠ€λŠ” Reference Type으둜 λ³Έλž˜λΆ€ν„° λ©”μ†Œλ“œ λ‚΄μ—μ„œ ν”„λ‘œνΌν‹° κ°’μ˜ 변경이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— mutating ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•  수 μžˆλ‹€.
    protocol SomeProtocol {
        mutating func SomeMethod(_ num: Int)
    }
    
    struct SomeStruct: SomeProtocol {
        var x = 0
        mutating func SomeMethod(_ num : Int) {
            x += num
        }
    }
    
    class SomeClas: SomeProtocol {
        var x = 0
        // mutating ν‚€μ›Œλ“œ μƒλž΅
        func SomeMethod(_ num: Int) [
            x += num
        ]
    }

    πŸ“Œ μ΄λ‹ˆμ…œλΌμ΄μ € μš”κ΅¬μ‚¬ν•­

    1. ν”„λ‘œν† μ½œμ€ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ €λŠ” νƒ€μž…μ—κ²Œ νŠΉμ •ν•œ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ μš”κ΅¬ν•  수 μžˆλ‹€. 일반 μ΄λ‹ˆμ…œλΌμ΄μ €μ™€ λ™μΌν•˜μ§€λ§Œ { body } λ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€

      • ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” 주체가 class일 경우 μ΄λ‹ˆμ…œλΌμ΄μ € μ•žμ— requiredλ₯Ό μ‚¬μš©ν•˜λ©΄ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” 클래슀의 λͺ¨λ“  ν•˜μœ„ ν΄λž˜μŠ€λ“€λ„ μ΄λ‹ˆμ…œλΌμ΄μ € μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„μ„ 보μž₯받을 수 μžˆλ‹€.
      • final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ override λΆˆκ°€ν•˜κΈ° λ•Œλ¬Έμ— requiredμ‚¬μš©ν•  ν•„μš” μ—†μŒ
      • 같은 μ΄μœ μ—μ„œ κ΅¬μ‘°μ²΄λŠ” required ν•„μš” μ—†μŒ
      protocol SomeProtocol {
          init(someParameter: Int)
      }
      
      class SomeClass: SomeProtocol {
          // requiredλ₯Ό μ‚¬μš©ν•˜λ©΄ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” 클래슀의 λͺ¨λ“  ν•˜μœ„ ν΄λž˜μŠ€λ“€λ„ μ΄λ‹ˆμ…œλΌμ΄μ € μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„μ„ 보μž₯받을 수 μžˆλ‹€.
          required init(someParameter: Int) {
              // initializer implementation goes here
          }
      }
      
      struct SomeStruct : SomeProtocol {
          init(someParameter: Int) {
              // initializer implementation goes here
          }
      }