본문으로 건너뛰기

프로토콜을 타입으로 사용

프로토콜에 아무런 기능이 없더라도,스위프트 언어에서는 여전히 하나의 완벽한 타입으로 간주하며, 대부분 다른 타입과 마찬가지로 사용될 수 있다. 이는 프로토콜을 함수의 매개변수나 반환타입으로 사용할 수 있음을 의미한다. 또한 프로토콜을 변수나 상수, 그리고 컬렉션에 대한 타입으로도 사용할 수 있다.

protocol Person {
var firstName: String {get set}
var lastName: String {get set}
var birthDate: Date {get set}
var profession: String {get}
init(firstName: String, lastName: String, birthDate: Date)
}

Person 프로토콜은 네 개의 프로퍼티와 한 개의 생성자를 정의하고 있다.

아래 예는 프로토콜을 함수나 메서드 또는 생성자의 매개변수와 반환 타입으로 사용하는 방법이다.

func updatePerson(person: Person) -> Person {
var newPerson: Person

return newPerson
}

아래 예는 프로토콜을 컬렉션에 저장하기 위한 타입으로 사용하는 방법이다.

var personArray = [Person]()
var personDict = [String: Person]()

프로토콜 타입을 요구하는 곳 어디에서나 이 프로토콜을 따르는 타입의 인스턴스를 사용할 수 있다.

Person 프로토콜을 따르는 SwiftProgrammerFootballPlayer 이름의 두 타입이 있다면 다음과 같이 사용할 수 있다.

var myPerson: Person
myPerson = SwiftProgrammer(firstName: "Kim", lastName: "minsu", birthDate: Date())
myPerson = FootballPlayer(firstName: "Park", lastName: "jisung", birthDate: Date()) // 인스턴스의 타입 변경

Person 프로토콜은 배열에 대한 타입으로 사용될 수 있다. 그러므로 다음과 같은 배열을 생성할 수 있다.

var programmer = SwiftProgrammer(firstName: "Kim", lastName: "minsu", birthDate: Date())
var player = FootballPlayer(firstName: "Park", lastName: "jisung", birthDate: Date())
var people: [Person] = [programmer, player]

마지막 예는 다형성polymorphism의 한 형태다. 프로토콜을 잘 활용하기 위해서 다형성이 무엇인지 이해해야만 한다.