포스트

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 변수에 할당하고 있습니다.

③ 해당 객체를 변수 혹은 상수에 할당할 수 있어야 합니다.

앞서 예제에서 보시다시피, 변수 혹은 상수에 클로저를 할당하는 게 가능합니다.


  1. 클로저는 모든 함수를 의미하지만, 여기서는 ‘익명 함수’만 다루도록 하겠습니다. 

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.