-
Swift - 일급객체iOS/Swift 기초문법 2022. 3. 25. 09:28
일급 객체(1급객체, First Class Object)
일급객체에 대한 정의이다.
일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. [위키백과]
일급객체의 조건에 대해서 정의를 내려보겠다.
- 변수에 할당(assignment)할 수 있다.
- 다른 함수를 인자(argument)로 전달 받는다.
- 다른 함수의 결과로서 리턴될 수 있다.
위에 대한 조건으로 인해 알 수 있는 것은 함수를 데이터(string, number, boolean, array, object) 다루 듯이 다룰 수 있다는 점이다.
여기서 데이터를 다룬다는 의미는 변수에 할당이 가능하다는 것으로, 함수 역시 할당이 가능하다는 의미이다.
그렇다면, 함수가 일급객체이기 때문에 할 수 있는 것은 무엇인가?
- 고차함수(Higher order function)를 만들 수 있다.
- 콜백(callback)을 사용할 수 있다.
고차함수와 콜백에 대해서는 아래에 더 설명을 이어가겠다.
우선, 일급객체의 조건 예시를 살펴보겠다.
1. 변수에 할당(assignment)한다.
변수에 할당은 함수 표현식을 생각하면 된다.
const mul = function (num) { return num*num; }
2. 다른 함수를 인자(argument)로 받는다.
function mul(num) { return num*num; } // func는 매개변수임, 이름은 아무거나 지정해도 상관없음 function mulNum(func, number) { return func(number); } let result = mulNum(mul, 3); // 9
- mul()에서 매개변수가 하나이기 때문에 mulNum()의 매개변수(number)가 하나임
- 만약 mul()의 매개변수가 2개라면 mulNum()의 매개변수도 2개이여야함
- mulNum()의 매개변수인 func는 위의 mul()을 나타내는 것임
- 마지막 result변수에 mulNum()을 할당하고 인자로 mul()을 받아옴
- 이 때 mulNum()인자로 다른 함수(mul())를 받아오기 때문에 고차함수임
// 이 부분에서 mul을 인자로 받는 mulNum이 고차함수 // mul은 콜백함수이다. let result = mulNum(mul, 3);
3. 다른 함수의 결과로 리턴 될 수 있다.
- 반환값(return value)로 사용할 수 있다.
function add(num1) { return function (num2) { return num1 + num2; } } add(3)(4); // 7
지금까지 일급객체에 대해서 알아보았다.
그럼 이 일급객체로 인해 할 수 있는 일에 대해서 살펴보겠다.
일급객체 조건을 설명하면서 살짝 언급되었던 고차함수부터 시작하겠다.고차함수(Higher-order function)
함수를 전달인자(argument) 또는 매개변수(parameter)로 받거나 함수를 리턴하는 함수를 말한다.
예시는 위의 2번과 3번을 참고하면 된다.# func는 익명함수 # 다른 함수를 인자로 받는 경우 function mul(num) { return num * num } function mulNum(func, num) { return func(num); } # 함수를 리턴하는 경우 function mul(num1) { return function(num2) { return num2*num1; }; } # 함수를 인자로 받고, 함수를 리턴하는 경우
콜백함수(callback)
전달인자(Argument)로 받는 함수이다.
# 전체적으로 정리 # 위의 정리된 코드와 같은건데 함수 표현식으로 작성한것 뿐 // 일반함수 const mul = function(num) { return num * 2 } // 매개변수(parameter)로 func를 받았고, 함수(func)를 리턴하기 때문에 고차함수 const mulNum = function(func, num) { return func(num) } // mulNum은 전달인자(argument)로 함수(mul)을 받았으므로 고차함수 // 전달인자(argument)로 받은 함수인 mul은 콜백함수 mulNum(mul, 3) // 6
📎 Swift의 함수의 일급객체 증명
간단히 함수를 이용한 코드를 작성해보며 예시를 확인해본다.
✏️ 전달 인자로 전달이 가능한가?
func plus(_ num: Int) -> Int { return num + 1 } func minus(_ num: Int) -> Int{ return num - 1 } func calculate(_ a: Int, _ b: Int) -> Int { return a + b } calculate(plus(1), minus(2)) // 3
calculate 함수를 호출하면서 전달 인자로 plus, minus 함수를 사용하는 것이 가능한 것을 확인할 수 있다.
✏️ 변수나 데이터 구조 안에 담을 수 있는가?
func plus(_ num: Int) -> Int { return num + 1 } func minus(_ num: Int) -> Int{ return num - 1 } func calculate(_ a: Int, _ b: Int) -> Int { return a + b } let p = plus let m = minus calculate(p(1), m(2)) // 3
변수에 함수를 저장하여 사용할 수 있음을 확인 가능하다.
✏️ 반환 값으로 사용 가능한가?
func plus(_ num: Int) -> Int { return num + 1 } func minus(_ num: Int) -> Int{ return num - 1 } func calculate(_ a: Int, _ b: Int) -> Int { return plus(a) + plus(b) } let p = plus let m = minus calculate(p(1), m(2)) // 5
calculate 함수 안에서 반환 값으로 plus, minus 함수를 사용해주었다.
반환 값으로 함수를 사용할 수 있는 것을 확인할 수 있다.
🌟 정리 🌟
일급 객체란 전달인자, 반환 값으로 사용할 수 있고 변수나 데이터 구조 안에 담을 수 있는 것.
Swift는 함수형 언어로, 함수를 일급 객체로 사용할 수 있음!
'iOS > Swift 기초문법' 카테고리의 다른 글
Swift 문법 기초 2편 (0) 2022.03.27 Swift 문법 기초 (0) 2022.03.25