[iOS_Swift] 클로저(1) - 1급 객체(First-class Citizen)

2021. 10. 25. 01:27Programming/iOS_Swift

클로저를 이해하기 위해서는 먼저 1급 객체(First-class Citizen)에 대한 이해가 반드시 수반되어야한다. 1급 객체란 어떠한 객체가 다음과 같은 조건을 만족할 때 1급 객체라고 한다.

 

1. 변수나 상수에 객체를 저장할 수 있는가?

2. 객체를 어떤 함수의 매개변수로 전달할 수 있는가?

3. 객체를 어떤 함수의 반환값으로 지정할 수 있는가?

 

이러한 조건을 충족할 때 우리는 해당 언어를 함수형 프로그래밍 언어라고 할 수 있다. 개인적으로 여기서 객체라는 개념이 늘 헷갈리는데(클래스나 구조체의 인스턴스 등) 여기서 말하는 객체, 함수형 프로그래밍 언어에서의 1급 객체는 '함수'를 의미하기도 한다!

 

좀 더 자세하게 함수가 어떻게 1급 객체의 요건을 충족시키는지 살펴보자

 

1.  변수나 상수에 객체(함수)를 저장할 수 있는가?

Int타입을 매개변수로 갖고 반환타입이 Int인 함수이다. 예시에서 알 수 있듯이 park라는 상수에 함수가 정상적으로 저장되었음을 알 수 있다!

 

2. 객체(함수)를 어떤 함수의 매개변수로 전달할 수 있는가?

 

매개변수로 (Double, Double) 을 인자로 가지고 반환값으로 Double을 갖는 함수타입을 지정해주었다. 작동순서대로 확인해보자면 최초에 매개변수 값으로 나이와 키, 몸무게의 데이터를 받은 뒤, bMISetting이라는 함수를 통해 bmi값이 Double타입으로 도출되었다. 이후 도출된 값을 bmi라는 상수에 할당하여 정상적으로 return값을 출력했음을 알 수 있다!

 

3. 객체(함수)를 어떤 함수의 반환값으로 지정할 수 있는가?

이번에는 나이만 매개변수로 받고 (Double, Double)을 인자로 갖고 반환값으로 Double을 갖는 함수타입을 반환해주는 함수를 만들어줬다! 말이 좀 복잡한데 한마디로 반환값으로 특정 함수를 지정해줬다는 뜻이다. 예시를 살펴보면 parkData의 반환값으로 bMISetting함수를 지정해줬다. 현재 상수 park는 (Double, Double) 인자를 필요로 하는 함수타입이다. 따라서 park에 인자들의 값을 넣어줌으로써 성공적으로 값을 도출해낼 수 있다!