1. 1급객체로서의 프로토콜

이전에 함수에서 다뤘지만 한번 더 설명하자면

일급 객체의 조건은 뭐 객체가 런타임에도 생성되어야 하고,

파라미터로 객체를 전달할 수 있고, 반환 값으로 객체를 사용할 수 있고 등등 있는데, 이것을 만족하면 1급 객체이고 → 프로토콜도 이를 만족한다!

변수/상수의 타입이 프로토콜이 될 수 있어야 하고, 함수의 파라미터 타입과 반환 타입으로 프로토콜이 될 수 있어야 한다

⇒ 프로토콜은 독립적인 하나의 타입으로 볼 수 있구나!!!

1-1. 프로토콜 타입을 변수/상수 타입으로 선언할 수 있다

근데 의문이 드는 점 → 프로토콜로 인스턴스 못 만들자나…? 그럼 변수 타입을 프로토콜로 하면 어케 구현해?

protocol Sopt {
    var partLeader: String { get set }
}

struct IOS: Sopt {
		var partLeader: String = "김승찬"
		var partName: String = "햄볶아요"
}

A. 말이 안됨 따라서 프로토콜 타입을 쓴다는 말은

해당 프로토콜을 채택한 구조체/클래스/열거형의 인스턴스를 프로토콜로 타입 캐스팅을 해서 사용하겠다!

따라서 아래 코드처럼 구현을 해준다면 우리는 partLeader만 접근할 수 있고, partName은 접근할 수 없다! partName은 IOS 구조체의 속성이지 Sopt 프로토콜의 속성이 아니기 때문!

Untitled

+) as?, as! → 이건 내일 하겠습니다

인스턴스를 프로토콜로 타입으로 캐스팅 할 땐 as, as?, as! 모두 가능하지만, 프로토콜로 타입 캐스팅 된 인스턴스를 원래 타입으로 캐스팅 할 땐 런타임에 확인하는 as?나 as!만 가능합니다

1-2. 프로토콜 타입을 함수의 파라미터 타입과 반환 타입으로 사용할 수 있다

위에 내용을 이해했으면 해당 프로토콜을 준수하는 구조체/클래스/열거형 인스턴스를 프로토콜 타입으로 캐스팅해서 전달한다는 것을 알겠죠?

protocol Sopt {
    var partLeader: String { get set }
		func semina()
}

struct IOS: Sopt {
		var partLeader: String = "김승찬"
		var partName: String = "햄볶아요"
}

func introduceiOSPart(sopt: Sopt) -> Sopt {
		print("우리는 아요파트입니다")
		return IOS.init()
}

let ios = IOS.init()
introduceiOSPart(sopt: ios)

프로토콜은 어떤 인스턴스를 생성할 수 있는 객체는 아니기 때문에 Sopt라는 프로토콜을 채택받은 IOS의 인스턴스를 Sopt라는 프로토콜 타입으로 타입 캐스팅해서 리턴한다

2. Protocol Extension

2-1. 상속과 달리 불편한점..