1급 객체란 무엇인가?
1급 객체란 무엇인가?
Swift는 함수형 프로그래밍 패러다임을 채택하고 있는 언어입니다. 함수형 프로그래 언어의 가장 큰 특징 중 하나는 함수를 1급 객체(First-Class Citizen)으로 다룬다는 점입니다.
1급 객체가 되기 위해선 아래 3가지 조건을 모두 만족해야 합니다.
① | 해당 객체를 매개변수로 전달할 수 있어야 합니다. |
② | 해당 객체를 함수가 반환할 수 있어야 합니다. |
③ | 해당 객체를 변수 혹은 상수에 할당할 수 있어야 합니다. |
요약하면 클로저(Closure)를 기본 자료 티입(Primitive Type)처럼 자유자재로 변수 혹은 상수에 할당하거나, 매개변수로 전달할 수 있어야 한다는 의미입니다.1
1급 객체는 클로저만 가능하다고 생각할 수 있습니다. 위 3가지 조건을 꼽씹어보면 1급 객체는 우리가 여태까지 사용해온 배열, 튜플, 구조체 및 클래스와 프로토콜 모두 1급 객체가 될 수 있습니다.
본 글에서는 클로저가 어떻게 1급 객체의 조건을 만족할 수 있는지 살펴보도록 하겠습니다.
① 해당 객체를 매개변수로 전달할 수 있어야 합니다.
1
2
3
4
5
6
let sum = { (x: Int, y: Int) -> Int in return x + y }
let minus = { (x: Int, y: Int) -> Int in return x - y }
func doOperate(x: Int, y: Int, opr operation: (Int, Int) -> Int) -> Int {
return operation(x, y)
}
let result = doOperate(x: 10, y: 20, opr: minus)
doOperate
함수는 피연산자로 Int
타입의 x와 y 그리고 두 개의 Int
타입의 매개변수를 전달받고 Int
타입을 반환하는 opr을 전달받고 있습니다. 매개변수로 클로저를 전달하는 게 가능합니다. doOperate
함수는 매개변수로 전달된 클로저에 따라 더하기 혹은 빼기 연산을 수행한 결과값을 반환합니다.
② 해당 객체를 함수가 반환할 수 있어야 합니다.
1
2
3
4
5
6
7
8
9
func incrementBy(amount: Int) -> () -> Int {
var total = 0
func incrementer() -> Int {
total += amount
return total
}
return incrementer
}
var incr: () -> Int = incrementBy(amount: 5)
incrementBy
함수는 Int
타입을 반환하는 클로저를 반환하고 있습니다. incrementBy
함수는 반환한 결과값인 (내부 함수인) incrementer
함수를 incr 변수에 할당하고 있습니다.
③ 해당 객체를 변수 혹은 상수에 할당할 수 있어야 합니다.
앞서 예제에서 보시다시피, 변수 혹은 상수에 클로저를 할당하는 게 가능합니다.
클로저는 모든 함수를 의미하지만, 여기서는 ‘익명 함수’만 다루도록 하겠습니다. ↩