10. Swift 일급 객체로서의 함수

  • 스위프트는 객체지향 언어이자 동시에 함수형 언어이다. 함수형 언어를 학습하게 되면 반드시 일급 객체 라는 용어를 접하게 되는데,이것은 크리스토퍼 스트래치 라는 영국의 컴퓨터 과학자가 1960년대에 처음 사용한 개념으로서, 프로그램 언어 안에서 특정 종류의 객체가 일급의 지위를 가지는가에 대한 의미이다.
  • 일급 함수의 특성
    • 객체가 런타임에도 생성이 가능해야 한다.
    • 인자값으로 객체를 전달할 수 있어야 한다.
    • 반환값으로 객체를 사용할 수 있어야 한다.
    • 변수나 데이터 구조 안에 저장할 수 있어야 한다.
    • 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야 한다


  1. 변수나 상수에 함수를 대입할 수 있음
  • 변수나 상수에 함수를 대입 한다는 것은 말 그대로 함수 자체를 변수에 집어넣는다는 뜻이며,이렇게 함수가 대입된 변수나 상수는 함수처럼 실행할 수도 있고,인자값을 입력받을수도 있다.반환값도 가질수 있다.
//정수를 입력 받는 함수
func foo(base:Int) -> String {
    return “결과값은 \(base + 1)입니다”
}

let fn1 = foo(bee: 5)
// “결과값은 6 입니다."

let fn2 = foo //fn2 상수에 foo 함수가 할당 됨
fn2(5) // “결과값은 6입니다”

###################

func foo(base:Int) -> String {
    print(“함수 foo 가 실행됩니다”)
    return “결과값은 \(base + 1)입니다”
}

let fn3 = foo(base:5)
// 출력 함수 foo 가 실행됩니다

  1. 함수의 반환 타입으로 함수를 사용할 수 있음
  • 일급 객체로 대우받는 함수는 실행 결과로 정수,실수,문자열 등의 기본 자료형이나 클래스, 구조체 등의 객체를 반환할 수 있을 뿐만 아니라 함수 자체를 반환할 수도 있다.
func desc() -> String {
    return “This is desc()”
}

func pass() -> (Void) -> String {
    return desc
}

let p = pass()
p() 
// 출력 값
“this is desc()"

  1. 함수의 인자값으로 함수를 사용할 수 있음
  • 함수를 인자값으로 전달할 때 그 함수는 하나의 타입이 된다. 따라서 함수를 입력받는 인자값은 함수 타입으로 정의되어야 한다. 이 점을 제외 하면 인자값으로 함수를 전달하는 방식에는 특별한 것이 없다.
func incr(param : Int) -> Int {
    return param + 1
}

func broker(base : Int, function fn : (Int) -> Int) -> Int {
    return fn(base)
}

broker(base:3 ,function:incr)  // 4

  1. 콜백 함수
func successThrough() {
    print(“연산 처리가 성공하였습니다.”)
}

func failThrough() {
    print(“처리 과정에 오류가 발생하였습니다.”)
}

func divide(base : Int, success sCallBack : (Void) -> Void, fail fCallBack: (Void) -> Void) -> Int {
    guard base != 0 else {
        fCallBack() //실패 함수를 실행한다.
        return 0
    }

    defer {
        sCallBack() //성공 함수를 실행한다.
    }
    return 100 //base
}

divide(base : 30 , success : successThrough, fail : failThrough)

//함수 인자를 사용하여 콜백을 처리하고 있다.이 함수는 첫 번째 인자로 받은 정수를 사용하여 100 을 나누고 , 그 몫을 정수 형태로 반환하는 역활을 한다. 두번째 인자는 내부 연산 과정이 성공적으로 완료 되었을때 실행할 함수이며, 세 번째 인자는 내부 연산 과정이 실패 했을때 실행할 함수이다.

  • defer 블록
    • defer 블록은 작성된 위치와 순서에 상관없이 함수가 종료되기 직전에 실행된다.
    • defer 블록을 읽기 전에 함수의 실행이 종료될 경우 defer 블록은 실행되지 않는다.
    • 하나의 함수나 메소드 내에서 defer 블록을 여러 번 사용할 수 있다. 이때에는 가장 마지막에 작성된 defer 블록부터 역순으로 실행된다.
    • defer 블록을 중첩해서 사용할 수 있다. 이때에는 바깥쪽 defer 블록부터 실행되며 가장 안쪽에 있는 defer 블록은 가장 마지막에 실행된다.

//defer는 주로 함수가 연산을 처리하는 과정에 영향을 끼치지 않으면서 실행해야 할 다른 내용이 있을 때 사용하거나 함수를 종료하기 직전에 정리해야 하는 변수나 상수값들을 처리하는 용도로 사용된다. 


'Swfit' 카테고리의 다른 글

12. Swift 클로저(Closure)  (0) 2017.08.04
11. Swift 함수의 중첩  (0) 2017.08.04
9. Swift 매개변수  (1) 2017.08.04
8. Swift 함수(Function)  (0) 2017.08.04
7. Swift 옵셔널 (Optional)  (0) 2017.08.04

설정

트랙백

댓글