Protocol and Polymorphism

2019-04-24
Swift

안녕하세요. 도미닉입니다.

프로토콜과 다형성에 대해 정리해보겠습니다.

프로토콜은 특정 역할을 하기 위해 메서드, 프로퍼티 등을 정의하는 것입니다.

프로토콜을 채택하면 해당 프로토콜에서 정의되있는 메서드, 프로퍼티를 무조건 구현해주어야 합니다.

Food 프로토콜을 채택하였는데 eat 메서드를 작성하지 않아서 오류가 발생한 상태
위와 같이 Food 라는 프로토콜에 eat 메서드를 정의하였습니다.

스파게티 구조체가 Food 프로토콜을 채택하였으나 eat 메서드가 존재하지 않아서 오류가 발생하였습니다.

동그라미를 클릭해서 오류 해결을 자동으로 요청하니 아래와 같이 eat 메서드가 생기고 구현부가 생성되었습니다.

eat 메서드가 추가되니 오류가 사라졌습니다.

스파게티, 햄버거, 피자 구조체 작성했습니다.

위와 같이 스파게티, 햄버거, 피자 구조체를 Food 프로토콜을 채택해서 작성했습니다.

이제 스파게티, 햄버거, 피자는 Food 프로토콜을 따르기 때문에 무조건 eat 메서드가 있다고 안심할 수 있습니다.

프로토콜에 정의된 프로퍼티, 메서드는 해당 프로토콜을 채택한 객체에서 안전하게 수행된다고 보장됩니다.

스파게티와 피자 인스턴스를 생성했습니다.

스파게티 구조체와 피자 구조체는 Food 타입인 food 프로토콜 변수에 저장할 수 있고 eat 메서드를 사용할 수 있습니다.

먼저 food 프로토콜 변수에 스파게티 구조체를 넣고 eat 메서드를 실행시켰습니다.

스파게티 구조체에 eat 메서드에 구현한 “스파게티를 포크로 먹어치웠습니다.” 문구가 출력됩니다.

그 다음에 pizza 구조체를 food 프로토콜 변수에 넣고 eat 메서드를 실행시키니 피자 구조체에 구현한 문구가 정상적으로 출력됩니다.

프로토콜의 이러한 특징을 다형성(Polymorphism)이라고 합니다.

다형성(Polymorphism)이란 객체들의 형태는 다양하게 가질 수 있지만 프로토콜을 채택했거나 클래스를 상속 받았다면 해당 프로토콜과 상위 클래스에서 정의한 기능은 무조건 수행될 것이라고 예측할 수 있는 특성입니다.