About Swift – “클로저, Closure”

About Swift – “클로저, Closure”

10월 3, 2021

클로저 : “익명 함수”

클로저는 사용자의 코드 안에서 전달되거나 사용할 수 있는 독립적인 코드 블록을 의미합니다. 익명의 함수로 생각하면 편할 것입니다. 함수는 일급 객체(혹은 일급 시민)인데, 일급 시민에 관한 글은 https://www.gdsanadevlog.com/about-swift-first-class-object-1%ea%b8%89-%ea%b0%9d%ec%b2%b4/ 을 참고해주세요.

클로저 표현식의 기본적인 형태는 다음과 같습니다.

{(매개변수 이름: 매개변수 타입,...) -> 반환타입 in
//클로저 표현식 코드 작성
} 

예를 들면, 세 개의 정수 매개변수를 받아 곱한 값을 반환하는 클로저 표현식을 작성해 봅시다.

let multiply = {(val1: Int, val2: Int, val3: Int) -> Int in
return val1 * val2 * val3
}
let result = multiply(10, 20, 30)
print(result)

클로저의 여러 가지 예제

func mul(val1: Int, val2: Int) -> Int
{
return val1 * val2
}
let result = mul(val1:10, val2:20)
print(result)

mul이라는 이름을 가진(정확히는 mul(val1:val2:) 라는 함수명을 가진) 함수를 만들었습니다. 함수에 관한 글을 잘 읽고 오셨다면 저 위의 함수를 이해하는 데에는 큰 무리가 없을 것이라 생각합니다. Int형 매개변수 2개를 받아서, 두 개를 곱한 값을 리턴해주는 함수입니다.

이를 익명 함수, 클로저로 바꾸어 보겠습니다. 익명 함수이므로 func mul 부분은 없어지고, in이라는 단어가 추가됩니다. 아래와 같은 코드가 될 것입니다. 클로저를 저장할 임의의 상수 multiply를 만들어 놓았습니다.

let multiply = {(val1: Int, val2: Int) -> Int in
return val1 * val2
}

이번에는, 두 수의 뺄셈을 하는 클로저를 만들어 보겠습니다. 아래와 같은 코드가 될 것입니다.

let sub = {(val1: Int, val2: Int) -> Int in
return val1 - val2
}

아래의 함수는 Int형 매개변수 2개, (Int,Int)->Int형 매개변수 1개를 가지는 함수입니다.

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}

cal의 자료형은 (Int, Int) -> Int) 이므로 저 자료형을 가지는 매개변수를 대입해야 할 것입니다. 위에 만들었던, multiply에 저장되어 있는 클로저와 sub에 저장되어 있는 클로저의 자료형 모두 (Int, Int) -> Int) 입니다. math라는 함수를 호출해 보겠습니다.

result = math(x: 10, y: 20, cal: add) 로 호출했는데, 이는 add(10,20) 의 값을 result에 저장한다는 뜻입니다.

let a = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) -> Int in
return val1 - val2
})
print(a)

위의 코드와 같이 클로저의 코드 전체를 매개변수에 직접 작성할 수도 있습니다.

a = math(x: 10, y: 20) {(val1: Int, val2: Int) -> Int in
return val1 - val2
}
print(result)

위의 코드를 살펴봅시다. 클로저가 함수의 마지막 augument라면, 마지막 매개변수 이름이었던 cal을 생략하고 함수 소괄호 외부에 클로저를 구현할 수 있는데, 이를 후행 클로저라고 합니다.

제가 이해한 클로저 개념 정리입니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.