[Swift] Protocol은 타입일까?에 대한 고민

호랭이·2022년 4월 4일
0

💬 내생각

목록 보기
2/3

먼저, Protocol은 타입이다. (두괄식 글쓰기)

[The Swift Programming Language (Swift 4) - Types]


타입이란?

Swift에는 Named Types와 Compound Types가 있다. 한글로 말하자면 명명된 타입과 복합타입 정도가 되겠다.

Named Types

말 그대로 명명된, 이름이 지어진 타입이다.
우리가 잘 알고 있는

  • Class / Struct
  • Enum
  • 기본 데이터 타입(Int, String, Bool 등등..)

외에도
Protocol이 여기에 속한다.

Compound Types

  • function
  • tuple

이름이 없는 타입이다. 이 타입의 경우 Named Type과 Compound Type가 포함될 수 있다.

:  (Int, (Int, Int))
-> TupleCompound Type이지만 Named TypeCompound Type 둘 다 포함할 수 있다. 

타입은 이런 것들이 있구나...알아봤고
일급객체이기 때문에 타입으로 사용할 수 있다는 말을 어디서 많이 봤는데..
일급객체는 무엇일까?


일급객체?

일급객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다고 한다.
일급객체는 될 수 있는 조건들이 있는데, 이것을 만족한다면 일급객체이다.
1. 런타임에 객체 생성이 가능하다.
2. 데이터 구조 안에 저장할 수 있다.
3. 객체를 함수의 인자 값으로 전달할 수 있다.
4. 객체를 함수의 반환 값으로 전달할 수 있다.


프로토콜은 일급객체이고 타입인 건 알겠는데
그래서 왜 일급객체이면 타입인데요..?

사실 이거까진 못알아냈다.

다만 프로토콜이 타입인 이유는 확실하다.
공식문서에 그렇게 나와있다...

공식문서:

[The Swift Programming Language (Swift 5.6) - Protocol]

다음과 같이 다른 타입이 허용되는 많은 위치에서 프로토콜 역시 사용할 수 있다.

  • 함수, 메서드 또는 이니셜라이저에서 매개변수 타입 또는 반환 타입으로 사용
  • 상수, 변수 또는 속성의 타입으로 사용
  • 배열, 딕셔너리 또는 기타 컨테이너의 타입으로 사용

💡 여기까지 쓰다가 갑자기 이런 생각이 들었다.❗️

일급객체라서 타입인 것이 아니고, 일급객체의 조건들을 만족하기 때문에 타입으로 사용할 수 있는 게 아닐까?
타입으로 사용하기 위해서는, 위의 일급객체 설명에서 썼던 것처럼 일반적으로 적용 가능한 연산을 모두 지원해야하기 때문에, 그 조건을 이미 갖추고 있는 일급객체들은 타입으로 사용할 수 있는 것이다.

일급객체면 -> 타입이다 ❌
일급객체면(일급객체의 조건을 만족한다면) -> 타입으로 사용할 수 있다 ⭕️

라고 정리할 수 있을 것 같다.

더 공부를 해보다가 생각이 바뀌면 다시 수정하러 오겠다...
(화려한 뇌피셜로 마무리)

profile
삐약

0개의 댓글