본문 바로가기
YAGOM CAREER STARTER

[TIL] 20230113: Protocol2

by Rhode 2023. 1. 14.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


프로토콜 Protocol

메서드 요건 Method Requirements

프로토콜은 특정한 인스턴스 메서드와 타입 메서드를 적절한 타입을 통해서 구현하도록 요구할 수 있다. 이 메서드는 일반적인 인스턴스와 타입메서드와 정확히 같은 방식으로 프로토콜의 정의의 일부분으로 쓰여진다. 그런데 중괄호와 메서드 바디가 빠진..ㅎ 일반적인 메서드에 적용되는 규칙과 같은 규칙에 따라서 가변 매개변수를 사용할 수 있다. 하지만 디폴트 값은 프로토콜의 정의 내에서 메서드 매개변수로 특정될 수 없다.

타입 프로퍼티의 요건과 함께, 프로토콜 안에서 정의 되었을 때 static 키워드로 타입 메서드 요건을 항상 앞에 달아줘야한다. 클래스에 의해서 구현되어 class나 static 키워드로 타입 메서드 요건이 앞에 달려있을 때도 마찬가지이다:

protocol SomeProtocol {
static func someTypeMethod()
}

다음의 예제는 프로토콜을 단일 인스턴스 메서드 요건으로 정의한 예시이다:

protocol RandomNumberGenerator {
func random() -> Double
}

이 RandomNumberGenerator라는 프로토콜은 적합한 타입이 random이라는 Double 값을 반환하는 인스턴스 메서드를 갖도록 한다. 프로토콜의 일부로서 특정되지 않았더라도, 이 값은 0.0부터 1.0까지가 될 것이다.(왜지?)

RandomNumberGenerator 프로토콜은 어떻게 각각의 숫자들이 생성될 것인지에 대한 추정을 하지 않는다. 그저 새로운 랜덤 넘버를 생성하는 표준 방법을 제공하는 제너레이터를 필요로 할 뿐이다. 

RandomNumberGenerator 프로토콜을 사용하고 따르는 클래스의 구현을 보여주겠다. 

class LinearCongruentialGenerator: RandomNumberGenerator {
var lastRandom = 42.0
let m = 139968.0
let a = 3877.0
let c = 29573.0
func random() -> Double {
lastRandom = ((lastRandom * a + c)
.truncatingRemainder(dividingBy:m))
return lastRandom / m
}
}
let generator = LinearCongruentialGenerator()
print("Here's a random number: \(generator.random())")
// Prints "Here's a random number: 0.3746499199817101"
print("And another one: \(generator.random())")
// Prints "And another one: 0.729023776863283"