본문으로 건너뛰기

프로토콜과 다형성

다형성이라는 단어는 그리스어인 poly(많다)dhk morphe(형태)에 어원을 두고 있다. 프로그래밍 언어에서 다형성은 여러 타입(다양한 형태)을 위한 단일 인터페이스다.

다향성은 하나의 일관된 인터페이스를 통해 여러 타입과 상호작용을 할 수 있게 해준다. 일반적으로 객체지향 프로그래밍에서는 슈퍼클래스에서 일관된 인터페이스가 나오는 반면, 프로토콜지향 프로그래밍에서는 프로토콜에서 일관된 인터페이스가 나오게 된다.

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

위 예에서 Person 타입의 변수 하나를 갖는다. 다형성은 SwiftProgrammerPerson 프로토콜을 따르는 타입의 인스턴스면 변수에 대입할 있게 해준다.

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

people.append(programmer)
people.append(player)

위 예에서 역시 people 배열이 Person 타입의 배열이기에, Person 프로토콜을 준수하는 SwiftProgrammerFootballPlayer 타입의 인스턴스를 추가할 수 있다.

하나의 일관된 인터페이스를 통해 타입 인터페이스 접근하는 경우 타입 특정 기능type-specific functionality에는 접근할 수 없다. 예를 들어 FootballPlayer 타입에 선수의 나이를 저장한 프로퍼티가 있더라도 해당 프로퍼티는 Person 프로토콜에 정의되어 있지 않기 때문에 접근할 수 없다.

이 경우 형 변환type casting을 사용할 수 있다.