본문 바로가기
iOS와 그 외/Swift

[Swift] 일급 객체 ( First class citizen ) 란?

by lody.park 2024. 1. 16.

안녕하세요 Lody 입니다. 오늘은 일급 객체에 대해 정리해보겠습니다.

일급 객체

일급 객체 (1st class citizen) 라는 건, 그 객체가 프로그래밍 언어 안에서 다른 값들과 마찬가지로 취급된다는 뜻입니다.

 

Swift에서는 함수, 클로저, 클래스, 구조체, 열거형이 일급 객체로 취급됩니다.

 

일급 객체가 "다른 값들과 마찬가지로 취급" 되면서 가지는 특징은 다음과 같습니다.

 

1. 변수에 할당이 가능.

2. 함수의 인자로 전달 가능.

3. 함수의 반환 값 가능.

 

커링(Currying) 

커링은 함수형 프로그래밍에서 중요한 개념입니다. 커링을 사용하면, 여러 개의 인자를 가진 함수를 하나의 인자만 받는 여러 함수로 변환할 수 있습니다. 복잡한 로직을 여러 단계로 나누어 사용할 수 있도록 해줍니다.

 

간결하게 정의하자면 커링은 여러 개의 인자를 받는 함수를 단일 인자를 받는 여러 함수로 변환하는 기법이라고 말할 수 있습니다.

 

예시를 통해 이해 해보죠.

 

저 Lody는 도미노피자에서 피자 만드는 알바를 하게 됐습니다.

 

오우.. 코딩만 할 줄 아는 저는 피자 만드는게 영 어렵습니다..

 

피자 만드는 프로세스를 단계별로 나눠서 처리해야겠습니다.

 

"피자 만들기" 를 "도우 고르기" "소스 고르기" "토핑 고르기" 이렇게 3 단계로 나눠보았습니다.

 

코드로 살펴보겠습니다.

// 도우를 선택하는 함수
func chooseDough(dough: String) -> (String) -> (String) -> String {
    // 소스를 선택하는 함수를 반환
    func addSauce(sauce: String) -> (String) -> String {
        // 토핑을 선택하는 함수를 반환
        func addTopping(topping: String) -> String {
            return "피자 with \(dough) 도우, \(sauce) 소스, and \(topping) 토핑"
        }
        return addTopping
    }
    return addSauce
}

// 각 단계별 함수 사용
let doughChosen = chooseDough(dough: "밀가루")   // 도우 선택
let sauceAdded = doughChosen("토마토")           // 소스 선택
let pizza = sauceAdded("치즈")                   // 토핑 선택
let pizza2 = chooseDough(dough: "밀가루")("토마토")("치즈")

print(pizza) // "피자 with 밀가루 도우, 토마토 소스, and 치즈 토핑"
print(pizza2) // "피자 with 밀가루 도우, 토마토 소스, and 치즈 토핑"