개발이 취미인 사람

[Swift] Swift 일급 객체 개념 및 사용법 본문

언어(Programming Language)/Swift

[Swift] Swift 일급 객체 개념 및 사용법

RyanSin 2021. 6. 7. 13:02
반응형

- 지난 시간

안녕하세요. 지난 시간에는 Swift에서 함수를 선언하고 사용하는 방법에 대해 알아보겠습니다.

 

놓치고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다. :)

 

[Swift] 함수 선언 및 사용법

 

[Swift] 함수 선언 및 사용법

- 개요 안녕하세요. 이번 시간에는 Swift에서 함수를 선언과 사용법에 대해 알아보겠습니다. Swift에서 함수를 선언하는 방법은 func이라는 키워드를 사용합니다. //func 함수 키워드 //setName 함수 이

any-ting.tistory.com

 

이번 시간에는 Swift언어에 대한 일급 객체에 대해 알아보겠습니다.

 

Swift는 함수형 패러다임을 따르고 있습니다. 즉, Swift라는 언어는 일급 객체(First-Class Citizen)에 부합하는 언어입니다.

-  일급 객체

일급 객체?... 일급 객체란 무엇일까요. 아래 조건을 충족한다면 1급 객체라고 할 수 있습니다.

 

1. 객체가 런타임에도 생성 가능하다.

2. 객체를 인자 값으로 전달할 수 있어야 한다.

3. 객체를 반환 값으로 사용할 수 있어야 한다.

4. 데이터 구조 안에 저장할 수 있어야 한다.

 

함수가 위 조건을 만족하는 프로그래밍 언어는 함수형 언어가 되며, 함수형 프로그래밍에서는 "함수가 일급 객체"가 될 수 있습니다.

 

위 글을 읽고 아마 잘 이해가 안 가실 텐데요.(제가... 그랬습니다...) 몇 가지 예시를 통해 Swift가 왜 함수형 언어이고 왜 일급 객체인지에 대해 알아보겠습니다.

 

- 일급 함수의 특성

1. 변수에 함수 대입 가능

일급 함수의 첫 번째 특성은 변수와 상수에 함수를 대입할 수 있습니다.

단순하게 함수를 호출하고 호출한 결과 값을 변수 또는 상수에 할당하는 게 아니라, 함수 자체를 할당할 수 있습니다.

 

아래 코드를 확인하면 상수에 함수 자체를 할당하는 걸 확인할 수 있습니다. 

func getName(name: String) -> String {
    return name
}

let name = getName(name: "개발이 취미인 사람") // 상수에 함수가 호출 된 결과 값을 할당
let nameFun = getName(name:) // 상수에 함수 자체를 할당

//식별자로 할당
let nameFun = getName(name:)

//함수 타입을 지정한 할당
let nameFun: (String) -> String = getName

 

2. 함수를  반환 가능

일급 객체인 함수는 반환 값으로 데이터가 아닌 함수 자체를 반환할 수 있습니다.

 

//덧셈 함수 선언
func plus( a:Int, b: Int) -> Int {
    return a+b
}

// Int형태에 a와 b 값을 전달 받고 (Int,Int) 파라미터를 받는 함수를 반환한다. 
// 그리고 두번째 호출을 통해 그 결과 자료 형태는 Int 타입이라고 선언하는 함수
func setPlus(a:Int, b: Int) -> (Int, Int) -> Int {
    
    return plus
}

//사용법
let onPlus = setPlus(a: 1, b:2) // 함수를 반환

onPlus(1, 2) // 결과 값은 3

//바로 호출 가능
setPlus(a: 1, b: 2)(3, 2) // 결과 값 5

3. 인자로 함수를 전달 가능

일급 객체인 함수는 인자(파라미터) 값으로 변수 또는 상수가 아닌 함수를 전달할 수 있습니다.

 

setPlus 함수 두 번째 인자로 plus 함수를 전달하고 있습니다.

//덧셈 함수 선언
func plus( a:Int) -> Int {
    print("3")
    return a + 1
}

//(Int) -> Int 형태에 파라미터를 받는다.
func setPlus(a:Int, fn: (Int) -> Int) -> Int {
    print("2")
    return fn(a) //값 2 반환
}

print("1")

//plus 함수를 전달한다.
setPlus(a: 1, fn: plus) // 2값 반환
print("4")

// 실행 순서 1 -> 2 -> 3 -> 4 

 

이번 시간에는 Swift 언어가 왜 일급 객체에 부합 되는지에 대해 알아봤습니다. :)

 

실습은 꼭 하시는 걸!! 잊지마세요.