캠프 중 던져진 화두로 깊은 고민에 빠졌다
Swift에서 함수를 자유자재로 할당하고 사용한다는 것(a.k.a 일급객체)은 알고 있는데 타입인지는 의문이 들었다
아니 그전에 내가 타입
이 무엇인지 설명하지 못한다는 것을 깨달았다
우선, Swift에서는 타입들을 Named Type
과 Compound Type
으로 분류한다
둘은 명확한 시각적인 차이를 보인다
//Named type
let hisName: String = "Alex"
let hisAge: Int = 20
//Compound type
let hisAction: (Int) -> Bool = goToSchool
let hisParents: (mother: String, father: String) = ("Kim", "Jang")
Name type은 명확하고 통일된 타입으로 명시한다
(ex. String, Int)
Compound type은 이게 Function이다/Tuple이다를 명시하는게 아니라 요소들을 조합하여 마치 타입처럼 사용한다
(ex. (Int) -> Bool, (String, String))
결론적으로,
함수타입은 요소들을 조합하여 만들어내는 Compound type의 일종이므로 타입이다
여기까지 함수타입은 타입이 맞다는 사실을 증명했다
하지만, 원래 질문은 "함수는 타입인가?"하는 질문이었다
그렇다면 "
함수타입
은 타입이다"라는 명제가
"함수
는 타입이다"를 증명할 수 있을까?
우선, 함수타입과 함수가 같은 것인지 알아보자
이해의 편의를 위해 질문을 조금 바꿔보았다
정수타입과 정수는 다른가?
이 질문의 답은 생각보다 명확하게 떠올랐다
let number: Int = 10
위의 코드에서 Int
는 정수타입이고 10
은 정수이다
즉, 정수타입과 정수의 관계는
타입과 인스턴스의 관계로 볼 수 있다
다시 돌아와서,
함수타입과 함수는 다른가?
다르다.
함수 타입은 타입이고 함수는 함수 타입의 인스턴스이다
함수 타입
은 타입이 맞다
하지만,
함수
는 타입이 아니다
(함수 타입의 인스턴스 개념)