iOS

[iOS] 일급 객체에 대해 알아보기

스벅 보안관 2024. 6. 20. 15:25

안녕하세요 스벅보안관입니다.

 

오늘은 Swift의 일급 객체(First-Class Citizen)에 대해 이야기해보려고 합니다.

일급 객체라는 용어가 다소 생소할 수도 있지만, 사실 우리가 Swift에서 매일같이 다루는 것들입니다.

막상 이해하면 그렇게 어렵지 않으면서 중요한?(뭔 소리야...) 개념인거같습니다. 

 

 

일급 객체란?

먼저, 일급 객체가 무엇인지 정의해볼까요? 일급 객체(First-Class Citizen)란 다른 객체들과 동등하게 취급되며, 다음과 같은 작업이 가능한 객체를 말합니다:

  1. 변수에 할당 가능
  2. 함수의 인자로 전달 가능
  3. 함수의 반환 값으로 사용 가능

이 세 가지 조건을 충족하면 해당 객체를 일급 객체라고 부릅니다. 간단히 말해서, 일급 객체는 프로그램 내에서 자유롭게 이동할 수 있는 객체입니다. 그렇다면 Swift에서는 어떤 것들이 일급 객체일까요? 바로 함수, 클로저, 그리고 대부분의 데이터 타입입니다.

Swift에서의 일급 객체 예시

Swift에서 함수는 일급 객체입니다. 이는 함수를 변수에 할당하거나, 다른 함수의 인자로 전달하거나, 반환 값으로 사용할 수 있다는 뜻입니다. 코드로 예를 들어보겠습니다.

 

1. 함수를 변수에 할당

func greet(name: String) -> String {
    return "Hello, \(name)!"
}

let greetingFunction = greet
print(greetingFunction("StarBucks"))

 

여기서 greet 함수는 greetingFunction이라는 변수에 할당되었고, 그 변수를 통해 greet 함수를 호출할 수 있습니다. 함수가 변수를 통해 전달될 수 있다는 점에서 Swift의 함수는 일급 객체로 취급됩니다.

 

2. 함수의 인자로 전달

함수를 다른 함수의 인자로 전달할 수도 있습니다.

func printGreeting(using function: (String) -> String, name: String) {
    let result = function(name)
    print(result)
}

printGreeting(using: greet, name: "StarBucks")

 

위 코드에서는 greet 함수를 printGreeting 함수의 인자로 전달하여, greet 함수가 호출됩니다. 함수 자체가 전달될 수 있다는 점에서 역시 일급 객체의 특징을 보여줍니다.

 

3. 함수의 반환 값으로 사용

함수가 다른 함수를 반환하는 경우도 가능합니다. Swift에서는 이러한 패턴을 활용해 고차 함수를 구현할 수 있습니다.

func makeIncrementer() -> (Int) -> Int {
    func increment(number: Int) -> Int {
        return number + 1
    }
    return increment
}

let incrementer = makeIncrementer()
print(incrementer(5)) // 출력: 6

 

makeIncrementer 함수는 또 다른 함수(increment)를 반환하며, 반환된 함수는 이후에 호출될 수 있습니다.

이처럼 함수가 다른 함수의 반환 값이 되는 것도 Swift의 함수가 일급 객체임을 보여주는 사례입니다.

 

왜 일급 객체가 중요한가?

일급 객체는 함수형 프로그래밍의 핵심 요소 중 하나입니다. 함수가 일급 객체로 취급되면, 함수를 자유롭게 전달하고 반환할 수 있어 코드를 더 유연하게 설계할 수 있습니다. 이는 고차 함수나 클로저와 같은 개념을 쉽게 구현할 수 있게 해줍니다.

  • 고차 함수: 고차 함수는 함수를 인자로 받거나 반환하는 함수입니다. Swift에서는 map, filter, reduce와 같은 고차 함수가 자주 사용되며, 이를 통해 더 깔끔하고 간결한 코드를 작성할 수 있습니다.
  • 클로저: 클로저는 코드에서 독립적으로 사용할 수 있는 코드 블록으로, 함수와 동일하게 일급 객체로 취급됩니다. 클로저 역시 변수에 할당되거나 함수 인자로 전달될 수 있습니다.

 

Swift에서 일급 객체의 활용

Swift에서 일급 객체를 이해하고 활용하면, 코드 재사용성과 가독성을 크게 향상시킬 수 있습니다. 특히 비동기 프로그래밍, 콜백 패턴, 그리고 함수형 프로그래밍 기법을 사용할 때 유용합니다.

예를 들어, 비동기 네트워킹 작업에서 클로저를 사용해 콜백 패턴을 구현할 수 있습니다. 클로저는 함수처럼 일급 객체로 다루어지며, 비동기 작업이 완료된 후 호출될 수 있습니다.

func fetchData(completion: @escaping (String) -> Void) {
    DispatchQueue.global().async {
        let result = "데이터 수신 완료"
        DispatchQueue.main.async {
            completion(result)
        }
    }
}

fetchData { result in
    print(result)
}

 

 

결론

단어는 좀 생소하게 들리지만, 실제로 우리가 개발할 때 쓰는 개념들이나 키워드들이 이 일급객체에 속한다는 거에 대해 다시 한번 의미를 강조하게 되는거같습니다.

일급객체에 대한 이해를 통해, 함수나 클로저를 자유롭게 전달하고, 반환하며, 변수에 할당하는 작업을 좀 더 자연스럽게 구현할 수 있을 거같다는 생각?이 듭니다 ㅎ

 

뻔한 결론이지만...

 

알고 쓰자,,