Swift

protocol initializer가 클래스에서 required로 정의되어야 하는 이유

Phililip
728x90

안녕하세요.

 

initializer를 protocol에 정의한 경우, protocol을 채택한 클래스는 protocol에 정의된 initializer를 required로 정의해야 합니다.

 

인터넷에 이유를 찾아보니까 클래스의 서브클래스에서도 initializer를 강제로 구현하도록 하기 위해서라고 하는데 전 이해가 잘 안 가더라고요..

 

저처럼 이해 못 하신 분들의 이해를 돕기 위해 예시를 하나 가져와봤습니다.

 


# 예시

우선 protocol의 initializer를 required로 정의하지 않아도 된다고 가정해 볼게요.

 

initializer가 정의된 Animal이란 protocol이 있고,

 

 

Animal protocol을 준수하는 Mammal 클래스가 있다고 해볼게요.

 

 

Animal protocol을 채택한 타입을 인자로 받아서 인스턴스를 생성해 주는 animalBuilder 함수에 Mammal 타입을 넘기면 문제없이 잘 동작할 거예요.

 

 

문제는 여기서부터 생깁니다.

 

Mammal 클래스의 서브클래스인 Cat 클래스를 만들고 animalBuilder 함수에 Cat 타입을 넘기면 어떻게 될까요?

 

Cat은 Mammal 클래스의 서브클래스이기 때문에 Animal protocol을 준수한다고 볼 수 있지만, Animal protocol이 정의한 initializer는 구현되어 있지 않기 때문에 모순인 상황이 발생합니다.

 

 

그래서 protocol의 initializer를 채택한 클래스는 required로 선언해서 서브클래스에서도 initializer를 구현하도록 강제해야 하는 것입니다.

 

그래서 final 클래스는 서브클래스가 없으니 required를 사용하지 않아도 되는 것이구요.

 

그래서 상속 개념이 없는 구조체는 required를 사용하지 않아도 되는 것이죠.

 

이해해벌임.

 

# 참고

 

In Swift, why protocol initializers must be defined as required in conforming types? - Justin Eghtedari

In Swift, why protocol initializers must be either defined as required in the conforming types or the conforming types must be final?

codedstuff.com

 


이번 글은 여기서 마무리.

 

 

 

반응형

'Swift' 카테고리의 다른 글

lazy var 클로저에서 retain cycle이 생기는 경우  (0) 2024.06.20
@propertywrapper  (0) 2024.06.07
propertyWrapper로 UserDefaults 관리  (0) 2024.05.11
@discardableResult  (0) 2024.01.28
KeyValuePairs  (0) 2024.01.28