🍎swift

swift 클로저 01 - Closure사용 이유와 형태

Kendrick 2023. 2. 27. 01:07

함수는 일급객체이다.  

따라서 클로저도 일급객체이다.

일급객체(First-class citizen 또는 First-class object)란 프로그래밍 언어에서 다른 객체들과 동등한 지위를 가지는 객체를 의미한다.

그리고 일급객체이기 위한 다음과 같은 조건이 있다. 

쉽게 외우는 법은 소에 갔더니 파리!

 

1. 변: 변수에 할당 가능 

let add: (Int, Int) -> Int = { (a, b) in
    return a + b
}

2. 파: 함수를 파라미터로 전달 가능 

func applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let add: (Int, Int) -> Int = { (a, b) in
    return a + b
}

let result = applyOperation(3, 5, operation: add) // 8

3. 리: 리턴(반환) 가능

func chooseOperation(_ choice: Int) -> (Int, Int) -> Int {
    switch choice {
    case 1:
        return { (a, b) in a + b }
    case 2:
        return { (a, b) in a - b }
    default:
        return { (a, b) in a * b }
    }
}

let operation = chooseOperation(1)
let result = operation(3, 5) // 8

 

 

클로저와 함수의 기능은 완전히 동일하지만 형태가다르다. 

기능이 같다면 클로저를 사용하는 이유는 뭘까?

 

  1. 코드 중복을 줄일 수 있다.
    클로저는 코드 중복을 줄이는 데 사용 가능 예를 들어, 반복적인 작업을 수행하는 함수가 있을 때, 클로저를 사용하여 코드를 중복 방지

  2. 함수 인자로 사용
    Swift에서 함수는 일급 객체이므로 함수 인자로 전달할 수 있음 클로저는 함수 인자로 전달되어 함수가 실행될 때 동작을 정의 가능 
     
  3. 비동기 처리를 위해 사용
    예를 들어, 비동기적으로 데이터를 가져오는 함수를 호출할 때, 클로저를 사용하여 데이터가 가져와졌을 때 실행할 코드를 정의

  4. 간단한 코드 블록을 만들 수 있음
    예를 들어, 애니메이션을 만들 때, 클로저를 사용하여 애니메이션이 시작될 때와 종료될 때 실행할 코드를 정의 가능

  5. 함수 내부에서 코드를 정의
    내부에서 사용할 수 있는 코드 블록을 생성하여 함수의 범위를 제한할 수 있음 이렇게 하면 함수 외부에서 클로저를 호출할 수 없으므로 코드를 보다 안전하게 사용 가능 

클로저의 기본형태

// 함수: func + 함수명(파라미터) -> 리턴타입 {코드}
func dog(name:String) -> String {
    return "귀여운 \(name)"
}
var name01 = dog
name01("동글이")
// 귀여운동글이

//클로저 {(파라미터) -> 리턴타입 in 코드}
let dog1 = {(name:String) -> String in
    return "매우 귀여운 \(name)" 
}
var name02 = dog1
name02("방글이")
//매우귀여운방글이

 

클로저의 형태

클로저는 크게 4가지 형태로 표현이 가능함

일반적인 함수의 형태
func funcb(a: Int, b:Int) -> Int {
    let result = a + b
    return result
}


//1. 일반적인 클로저 형태 
let _ = {(a:Int, b:Int) -> Int in
    let result = a + b
    return result
}
//2. 타입을 명시한 뒤 할당하는 형태
let _ : (Int,Int) -> Int = {(a, b) in
    let result = a + b
    return result
}

// 3. 타입추론형태
// +, -, * 등은 같은 타입으로만 가능함 따라서, plus + "4"는 같은 String 타입으로,
// plus + 4 는 Int 타입으로 컴파일러가 추론
let c = {(plus) in
    return plus + 4
}

let cString = {(plus) in
    return plus + "4"
}

//4.void형태
let _ = {
    print("")
}