본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.
프로토콜 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"
'YAGOM CAREER STARTER' 카테고리의 다른 글
[TIL] 20230119: 데이터전달(델리게이트, 노티피케이션센터) (0) | 2023.01.21 |
---|---|
[TIL] 20230116: Refactoring with delegation (0) | 2023.01.18 |
[TIL] 20230112: Closures (0) | 2023.01.13 |
[TIL] 20230110: Protocol1 (0) | 2023.01.11 |
[TIL] 20230109: Singleton (0) | 2023.01.10 |