Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Protocol #9

Closed
5 tasks done
Glsme opened this issue Dec 20, 2022 · 5 comments
Closed
5 tasks done

Protocol #9

Glsme opened this issue Dec 20, 2022 · 5 comments
Labels

Comments

@Glsme
Copy link
Contributor

Glsme commented Dec 20, 2022

🗓️ 마감일

2023.01.15

💁 참여자

  • 김도이
  • 윤여진
  • 홍석준
  • 이주영
  • 이재용

⚠️ 마지막으로 답변 단 사람이 이슈 close 하고 리드미에 항목 업데이트 해주세요.

@Glsme Glsme added the Swift label Dec 20, 2022
@Yun-YeoJin
Copy link
Contributor

프로토콜

  • 특정 컨트롤러에서 발생하는 각종 이벤트를 효율적으로 관리하기 위해 대리자(Delegate)를 지정하여 이벤트 처리를 위임, 실제로 이벤트가 발생하면 위임된 대리자 (Delegate)가 콜백 메소드를 호출해주는 딜리게이트 패턴(Delegate Pattern)을 구현하기 위해 이용.
  • Struct, Class, Enumertation, Extension에서 사용 가능.
  • 갯수 제한이 없다. 선언 순서도 상관 없다. 하지만 필수 프로퍼티, 필수 메서드는 모두 구현해야한다.

스크린샷 2022-12-26 오후 5 01 59

프로토콜 종류

1. Optional Protocol : 선택적 요청으로 필요하지 않은 요소는 안써도 된다.

2. CaseIterable : 열거형의 값들을 순회할 수 있도록 도와주는 프로토콜, allCases를 활용하여 배열처럼도 사용 가능
스크린샷 2022-12-26 오후 5 04 33

3. Hashable : 정수 Hash 값을 제공하는 타입의 프로토콜, Hashable을 준수하면 Dictionary의 키가 될 수 있는 타입이 된다. 반대로 Dictionary의 키 값은 Hashable 프로토콜을 만족하는 타입이어야 한다.

@wodyddml2
Copy link

타입으로 class나 struct의 행동을 정의하는 역할 (즉, 구현하는 역할은 하지 않는다)

  • 요구사항
    • 프로퍼티
      • var 만 사용하는 이유는 set이 들어올 수 있기 때문에
      • {get} vs {get set} 최소 구현 사항 get만 명시했다고 set을 사용 못하는 것은 아님
    • 생성자
      • required init
      • required override init
  • optional protocol
    • 선택적 요청 ( optional requirement)
    • 클래스에서만 사용이 가능 - Anyobject로 클래스의 성능 향상
    • objective- c 기반이라 클래스만 사용하기에 클래스에서만 사용이 가능
  • 예시
    • ex. tableView delegate, delegate pattern

@Glsme
Copy link
Contributor Author

Glsme commented Jan 15, 2023

Protocol

특정 메서드나 프로퍼티 및 기타 요구 사항을 추상화한 것을 의미한다.

  • 클래스의 단점을 보완한다.
Class Protocol
하나의 클래스만 상속 가능 다중 상속 가능
클래스 타입에서만 가능 모든 타입 적용 가능

정의 방법

protocol Student {
    var id: String { get }
    var name: String { get set }
    func study()
}
  • Protocol은 타입이다. 따라서 Protocol을 변수에 할당할 수 있고, 함수 호출 시 파라미터로 전달할 수 있으며, 함수에서 Protocol을 반환할 수 있다.

@LeeJoobang
Copy link

프로토콜
: 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구 사항 등의 청사진
프로토콜의 장점
: 코드 중복을 줄일 수 있다.
: 가볍고 안전하다.(상속과 다르게 필요한 것만 골라 사용할 수 있음.)
: 값 타입의 상속 효과
: 제네릭 활용 가능(타입에 관계 없이 만들 수 있다.)

@heydoy
Copy link
Member

heydoy commented Jan 17, 2023

프로토콜의 정의

특정 작업이나 기능에 적합한 메서드, 프로퍼티, 다른 요구사항 등의 청사진을 정의하는 것이 프로토콜. 프로토콜은 클래스, 구조체, 열거형 등에 채택이 될 수 있음. 어떤 타입이든 프로토콜의 요구사항을 만족하는 타입은, '프로토콜을 준수(conform to protocol)'한다고 한다.

protocol DeeProtocol {
  // 프로토콜 정의를 여기에 선언
}

프로토콜을 채택하기 위해선 커스텀 타입에 오른쪽에 콜론, 프로토콜 이름을 입력한다

struct SanStruct: DeeProtocol, CatProtocol {
   // 구조체 정의 
}

만약 클래스가 수퍼 클래스가 있을 경우, 프로토콜을 채택하기 전에 수퍼클래스를 먼저 작성해야한다.

프로토콜의 프로퍼티 요구사항

저장 프로퍼티인지 계산프로퍼티인지는 명세하지 않는다. 필요한 타입과 이름만 지정. 또한 프로토콜은 각 프로퍼티가 gettable 한지, 또는 gettable and settable한지 반드시 지정해주어야 한다.

protocol DeeProtocol {
  var settableProperty: String { get set }
  var gettableProperty: String { get } 
  static var typeProperty: String { get set } 
}

프로토콜의 메서드 요구사항

프로토콜에서 메서드는 중괄호(=메서드바디)를 포함하지 않는다. 가변 파라미터 허용되지만 메서드 파라미터의 초기값을 지정해줄 수 없다.

protocol CatProtocol {
   static func purrMethod() 
   func tasteCatFood() -> Int
   mutating func isJipsaHome() -> Bool
}

프로토콜의 생성자(Initialiser) 요구사항

생성자 바디 (= 중괄호)가 없는 것을 빼고는 일반적으로 생성자 함수를 정의하는 것과 동일하다.

protocol JipsaProtocol {
   init(catName: String) 
}

타입으로서의 프로토콜

프로토콜은 자기자신이 기능을 구현하지는 않지만, 프로토콜을 타입으로 사용할 수 있다.
프로토콜을 타입으로 사용하는 것을 existential type (실존적타입) 이라고도 한다. 이 표현은 '프로토콜을 준수하는타입 T가 실재한다.'라는 말에서 왔음.

다른 타입들 처럼 프로토콜을 여러곳에서 사용할 수 있다. 예를 들면

  • 생성자, 메서드, 함수에서 반환형이나 매개변수 타입
  • 상수, 변수, 프로퍼티의 타입
  • 배열, 딕셔너리, 다른 컨테이너의 아이템 타입

왜냐하면 프로토콜은 타입이므로.

Class San {
   let jipsa: JipsaProtocol
   let favoriteFood: [String] 

   init(jipsa: JipsaProtocol, favouriteFood: [String]) {
       self.jipsa = jipsa
       self.favouriteFood = favouriteFood
   }

   func isMyFavorite(food: String) -> Bool {
       return favoriteFood.contains(food)
   }
}

Delegation

Delegation은 클래스와 구조체가 일부 책임을 다른 타입의 인스턴스에 이관(위임)하는 디자인 패턴. 이 디자인 패턴은 위임된 권한을 캡슐화한 프로토콜을 정의함으로써 구현하는데, 프로토콜을 준수하는 유형(Delegate=대리자)이 위임된 기능을 제공하도록 보장함.
Delegate은 소스의 실제 타입을 알 필요 없이, 특정 작업에 응답하거나 데이터를 반환할 수 있다.

@heydoy heydoy closed this as completed Jan 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants