🔥 프로토콜의 이니셜라이져 요구사항

446자
7분

프로토콜은 준수하는 타입에서 구현해야 하는 특정 이니셜라이져를 요구할 수 있습니다. 이러한 이니셜라이져는 프로토콜 정의의 일부로 작성되는데, 일반적인 이니셜라이져와 동일한 방식으로 작성되지만 중괄호나 이니셜라이져 본문은 없습니다.

protocol SomeProtocol {
    init(someParameter: Int)
}
swift

이 코드에서는 SomeProtocol이라는 프로토콜을 정의하고 있습니다. 이 프로토콜은 Int 타입의 someParameter라는 매개변수를 받는 이니셜라이져를 요구하고 있죠. 이 프로토콜을 준수하는 타입은 반드시 이 이니셜라이져를 구현해야 합니다.

클래스에서 프로토콜 이니셜라이져 요구사항 구현하기

프로토콜 이니셜라이져 요구사항은 준수하는 클래스에서 지정 이니셜라이져 또는 편의 이니셜라이져로 구현할 수 있습니다. 두 경우 모두 이니셜라이져 구현에 required 수정자를 표시해야 합니다.

class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
        // 이니셜라이져 구현이 여기에 들어갑니다.
    }
}
swift

이 코드에서 SomeClassSomeProtocol을 준수하며, required 수정자가 표시된 이니셜라이져를 구현하고 있습니다.

required 수정자를 사용하면 준수하는 클래스의 모든 하위 클래스에서 이니셜라이져 요구사항에 대한 명시적 구현 또는 상속된 구현을 제공하여 프로토콜을 준수하도록 보장할 수 있습니다.

필수 이니셜라이져에 대한 자세한 내용은 필수 이니셜라이져를 참조하세요.

하위 클래스가 상위 클래스의 지정 이니셜라이져를 재정의하고 프로토콜의 일치하는 이니셜라이져 요구사항도 구현하는 경우, 이니셜라이져 구현에 requiredoverride 수정자를 모두 표시해야 합니다.

protocol SomeProtocol {
    init()
}
 
class SomeSuperClass {
    init() {
        // 이니셜라이져 구현이 여기에 들어갑니다.
    }
}
 
class SomeSubClass: SomeSuperClass, SomeProtocol {
    // SomeProtocol 준수에서 "required", SomeSuperClass에서 "override"
    required override init() {
        // 이니셜라이져 구현이 여기에 들어갑니다.
    }
}
swift

이 코드에서는 SomeProtocolSomeSuperClass를 정의하고 있습니다. SomeSubClassSomeSuperClass를 상속받고 SomeProtocol을 준수합니다.

SomeSubClass의 이니셜라이져는 requiredoverride 수정자를 모두 사용하여 표시되었습니다. 이는 프로토콜 준수를 위해 필요하며, 상위 클래스의 지정 이니셜라이져를 재정의하기 때문입니다.

실패 가능한 이니셜라이져 요구사항

프로토콜은 실패 가능한 이니셜라이져에서 정의된 대로 준수하는 타입에 대한 실패 가능한 이니셜라이져 요구사항을 정의할 수 있습니다.

실패 가능한 이니셜라이져 요구사항은 준수하는 타입의 실패 가능한 이니셜라이져 또는 실패하지 않는 이니셜라이져로 충족될 수 있습니다. 실패하지 않는 이니셜라이져 요구사항은 실패하지 않는 이니셜라이져 또는 암시적으로 언래핑된 실패 가능한 이니셜라이져로 충족될 수 있습니다.

다음은 실패 가능한 이니셜라이져 요구사항의 예시입니다:

protocol FailableInitializerProtocol {
    init?(someParameter: Int)
}
swift

이 프로토콜은 Int 타입의 someParameter 매개변수를 받는 실패 가능한 이니셜라이져를 요구합니다.

이제 이 프로토콜을 준수하는 클래스를 작성해 볼까요?

class FailableInitializerClass: FailableInitializerProtocol {
    required init?(someParameter: Int) {
        // 매개변수 값이 0이면 초기화에 실패합니다.
        if someParameter == 0 {
            return nil
        }
    }
}
swift

FailableInitializerClassFailableInitializerProtocol을 준수하며, 실패 가능한 이니셜라이져를 구현하고 있습니다.

someParameter의 값이 0이면 이니셜라이져는 nil을 반환하여 초기화에 실패합니다. 그 외의 경우에는 초기화에 성공하게 되죠.

이렇게 프로토콜의 이니셜라이져 요구사항을 사용하면 프로토콜을 준수하는 타입이 특정 이니셜라이져를 반드시 구현하도록 강제할 수 있습니다. 이를 통해 코드의 일관성과 안정성을 높일 수 있습니다.

프로토콜과 이니셜라이져에 대해 더 자세히 알아보려면 다음 다이어그램을 참고해 보세요:

lecture image

이 다이어그램은 프로토콜의 이니셜라이져 요구사항과 관련된 주요 개념들의 관계를 보여줍니다. 프로토콜은 이니셜라이져 요구사항을 정의하고, 이는 클래스 구현과 실패 가능한 이니셜라이져 요구사항으로 나뉩니다. 클래스 구현에는 필수 이니셜라이져와 필수 및 재정의 이니셜라이져가 포함됩니다.

이제 프로토콜의 이니셜라이져 요구사항에 대해 더 잘 이해하게 되었길 바랍니다.