아삭아삭 iOS 개발

[Swift 독학] 패스트캠퍼스 챌린지 29일차_프로토콜 본문

Swift

[Swift 독학] 패스트캠퍼스 챌린지 29일차_프로토콜

바닐라머스크 2022. 2. 21. 23:11

■ 프로토콜(protocol)

  • - 특정 역할을 하기 위한 메서드, 프로퍼티, 이니셜라이저 등 기타 요구사항 등의 청사진을 정의
    - 구조체, 클래스, 열거형은 프로토콜을 채택함으로써 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현 가능
      -> 이 때 프로토콜이 요구하는 사항(기능)을 모두 충족할 경우, 해당타입이 채택한 그 프로토콜을 모두 ‘준수한다(conform)’고 말할 수 있음
    - 프로포콜은 기능을 정의하고 제시만 할 뿐, 자체적인 기능 구현은 불가
      (실제적인 구현은 그 프로토콜을 준수하는 타입이 하게됨)
protocol 프로토콜 이름 {
  // 정의부분 //
}

 

■ 프로토콜 특징

  • - 여러개의 프로토콜을 동시에 채택도 가능
    (참고) 클래스에서 상속과 프로토콜 채택을 모두 할 경우 ‘:’ 뒤에 상속받는 클래스를 제일 앞에 먼저 명시하고, 그 뒤부터 채택하는 프로토콜 목록을 작성
  • - 프로토콜을 채택한 타입에서 프로토콜이 요구하는 것 중 하나라도 구현하지 않으면 오류 발생

 

■ 프로토콜 내 요구사항

1) 프로퍼티 요구사항

  • 프로토콜은 자신을 채택한 타입이 어떤 프로퍼티를 구현해야 하는지 요구할 수 있음

    → 특정 이름, 타입을 갖는 인스턴스 프로퍼티 또는 타입 프로퍼티를 제공하기 위해 요구사항 지정

    → 읽기만 가능한 프로퍼티인지{ get }, 읽기/쓰기 둘다 가능한 프로퍼티인지{ get set } 타입 선언 뒤에 get, set을 이용해 지정해 주어야 함

    ※ 단, 저장 프로퍼티인지, 연산 프로퍼티인지는 관여 못함

  • 프로토콜에서 ‘읽기-쓰기’ 둘다 가능한 프로퍼티를 요구하는 경우, 저장된 프로퍼티 상수 또는 읽기전용 계산된 프로퍼티는 요구사항 충족 불가

  • 프로토콜에서 ‘읽기’만 가능한 프로퍼티를 요구하는 경우, 모든 종류의 프로퍼티를 설정할 수 있음

  • 프로퍼티 요구사항은 항상 변수(var)로 요구해야 함
  • '타입 프로퍼티'를 요구하려면 항상 static 키워드를 var앞에 접두사로 써줘야 함
protocol BestExercise {
    var exerciseName: String { get }
}

struct MarineSports: BestExercise {
    var exerciseName: String
}

let paddleboard = MarineSports(exerciseName: "Standup paddle boarding")

paddleboard.exerciseName // Standup paddle boarding

 

2) 메서드 요구사항

  • 프로토콜은 자신을 채택한 타입에 의해 구현되기 위해 메서드를 요구할 수 있음

    ※ 인스턴스 메서드, 타입 메서드 모두 가능
  • 프로토콜에서 메서드를 정의할 땐 중괄호나 메서드의 본문은 필요가 없지만, 
메서드에 필요한 매개변수는 정의해 주어야 함

    ※ 중괄호가 없거나 메서드 바디 없음
    ※ 가변 파라미터는 허용됨, 하지만 매개변수의 디폴트값은 지정 불가
  • '타입 메서드'를 요구하려면 항상 static 키워드를 타입 메서드 요구사항 앞에 접두사로 써줘야 함

protocol QuarantineRules {
    var selfQuarantine: String { get set }
    func printQuarantineRules ()
}

struct Contact: QuarantineRules {
    var selfQuarantine: String
    func printQuarantineRules() {
        print("밀접 접촉자로 판명된 \(selfQuarantine) 씨는 자가격리에 들어가야 합니다.")
    }
}

let contact = Contact(selfQuarantine: "홍길동")
contact.printQuarantineRules() // 밀접 접촉자로 판명된 홍길동 씨는 자가격리에 들어가야 합니다.

 

3) 이니셜라이저 요구사항

  • 프로토콜은 자신을 채택한 타입에 초기화 구문을 요구할 수 있음 (init)

    ※ 생성자 키워드와 매개변수만 작성해주면 됨
    ※ 중괄호 또는 초기화 구문 바디는 작성하지 않아도 됨
  • 프로토콜의 생성자가 init() 일 경우,
    → 클래스에서 프로토콜이 요구하는 생성자를 채택하려면 required 수식어를 초기화 구문 구현에 표시해야 함

      ※ 만약 클래스 자체가 상속받을 수 없는 final class라면 required 식별자를 붙여줄 필요가 없음

    구조체에서 프로토콜이 요구하는 생성자를 채택하려면 required 식별자가 따로 필요 없음

  • 하위 클래스가 상위 클래스의 지정된 초기화 구문을 재정의하고, 프로토콜로부터 일치하는 초기화 구문 요구사항이 구현될 경우,
    → required와 override 수식어 모두 초기화 구문에 표시

protocol SomeProtocol {
    init()
}

class SomeClass: SomeProtocol {
    required init() {
        // 초기화 구문 // 
    }
}

 

 

본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.

 fast campus강의  참조자료

[1] https://blog.yagom.net/562/

[2] https://bbiguduk.gitbook.io/swift/language-guide-1/protocols

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.