iOS/Swift 기초문법

Swift - 일급객체

soultreemk 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는 함수형 언어로, 함수를 일급 객체로 사용할 수 있음!