Protocol

작성일

Protocol

  • 규격, 규약, 규칙, 뼈대
    protocol이란 다른곳에서 사용할 때 무조건 있어야하는 것들을 모아놓은 것이다.
protocol UserInfo {
  
  var name: String { get set }
  var age: Ing { get set }

  func isAdult() -> Bool 
  
}

get은 무조건 있어야한다. set은 필요여부에 따라 만들수도있고, 지울수도 있다.
구현부는 절대로 들어가면 안된다.
사용 예제를 보면,

protocol UserInfo {
  
  var name: String { get set }
  var age: Ing { get set }

  func isAdult() -> Bool 
  
}

class Guest: UserInfo {
  var name: String == ""

  var age: Ing = 0

  func isAdult() -> Bool {
    if age > 19 {
      return true
    }
    return false
  }
}

class Member: UserInfo {
  var name: String == ""
  var age: Ing = 0

  func isAdult() -> Bool {
    if age > 19 {
      return true
    }
    return false
  }

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
}

이런 식으로 사용할 수 있다.
extension으로 확장된 기능을 사용할 수 있는데,

protocol UserInfo {
  var name: String { get set }
  var age: Ing { get set }

  func isAdult() -> Bool 
}

//추가된 부분
extension UserInfo {
  func isAdult() -> Bool {
    if age > 19 {
      return true
    }
    return false
  }
}

class Guest: UserInfo {
  var name: String == ""
  var age: Ing = 0
}

이렇게 추가를 시키면 밑에 부분에 isAult메서드를 사용하지 않아도 자동으로 추가가 된다.

protocol에 좋은 점은 하나 더있다 예를들어보면,

protocol UserInfo {
  var name: String { get set }
  var age: Ing { get set }

  func isAdult() -> Bool 
}

extension UserInfo {
  func isAdult() -> Bool {
    if age > 19 {
      return true
    }
    return false
  }
}

class Guest: UserInfo {
  var name: String == "kim"
  var age: Ing = 0
}

class UserInfoPresenter {
  
  func present() {

    let guest = Geust()
    let member = Member(name: "jane", age: 25)

    print(guest.name)
    print(member.name)
  }
}

let presenter = UserInfoPresenter()
presenter.present()

이렇게 코드가 있으면, 하나하나 적어서 내놓아야한다 하지만, protocol에 정의를 해놨으니,

class UserInfoPresenter {
  
  func present() {

    let guest = Geust()
    let member = Member(name: "jane", age: 25)

    print(guest.name)
    print(member.name)
  }
}

이부분을

class UserInfoPresenter {
  
  func present() {

    let guest = Geust()
    let member = Member(name: "jane", age: 25)

    //추가된 부분
    let members: [UserInfo] = [guest, member]

    for element in members {
      print(element.name)
    }
  }
}

이렇게 바꿔줘도 위 코드와 같은 결과 값이 나온다.
프로토콜을 이런방식으로도 사용할 수 있다.