[Swift] 클로저(Closure)

13907 단어 swiftswift

swift를 공부하다 보면 클로저라는 단어를 많이 보게 되는데요. 저 또한 많이 들었고,, 항상 아 맞다 이런 거였지 하면서도 직접 사용해 보면 항상 헷갈리더라구요!
저와 같은 분이 많을 것 같다는 생각과 이왕 하는 거 정리도 해 보자 싶어서 글을 써보려 합니다!


  • 클로저란?
  • 클로저 표현 방법
  • 클로저 표현 간소화


💻 클로저란?

그렇다면 클로저란 정확히 무엇일까요?
클로저는 일정 기능을 하는 코드를 하나의 블럭으로 모아놓은 것을 이야기합니다.
엇... 뭔가 함수랑 비슷한 것 같은데?
라는 생각이 드셨을 거예요! 맞아요, 함수도 클로저의 한 형태입니다. 클로저의 몇 가지 모양 중 하나가 함수라고 합니다.




💻 클로저 표현 방법

  • 기본 클로저
  • 후행 클로저

클로저는 위치를 기준으로 크게 기본 클로저 표현과 후행 클로저 표현으로 나눌 수 있습니다.



🍒 기본 클로저

우선, 기본 클로저의 형태는

{ (매개변수들) -> 반환타입 in 
	실행코드 
}

입니다!


예시를 한번 들어볼게요. calculator 이라는 함수를 만들어 보겠습니다. 매개변수는 n1, n2와 함수 타입으로 들어올 수 있는 operation이라 하겠습니다.
밑에는 매개변수 두 값을 곱하여 반환하는 multiply 함수도 같이 선언하고, calculator 함수를 호출해 보겠습니다.

func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int {
	return operation(n1, n2)
} 

func multiply(no1: Int, no2: Int) -> Int {
	return no1*no2
}

calculator(n1: 2, n2: 3, operation: multiply) //6

이라는 코드를 완성했어요.
이번에는 multiply 함수를 호출하는 대신, 클로저를 사용하여 동일한 작업을 해 보겠습니다.

{ (no1: Int, no2: Int) -> Int in
	return no1 * no2
}

calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in
	return no1 * no2
})

이런 식으로 작성하면 동일하게 6이라는 결과가 나온답니다!


🍒 후행 클로저

후행 클로저에 간단하게 정리해 보고, 뒤의 예제에서 적용해 볼게요.

  • 함수나 메서드의 마지막 전달인자로 위치하는 클로저는,
    함수의 메서드나 소괄호를 닫은 후 작성하면 됩니다.

  • 이때, 전달인자로 클로저 여러 개를 전달할 때는, 맨 마지막 클로저만 후행 클로저 형태로 사용할 수 있습니다.

  • 또한, 단 하나의 클로저만 전달인자로 전달하는 경우에는 소괄호를 생략해 줄 수 있습니다.




💻 클로저 표현 간소화

이번에는 클로저 표현을 간소화하는 표현들을 알아 보겠습니당!

calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in
	return no1 * no2
})

위 코드를 같이 간소화시켜 보아요.


  • 매개변수 타입 생략
  • 반환 타입 생략
  • 단축 인자 이름 사용
  • 암시적 반환 표현


🍒 매개변수 타입 생략

메서드의 전달인자로 사용하는 클로저는, 메서드에서 요구하는 형태로 전달되어야 합니다. 즉, 매개변수의 타입이나 개수, 반환 타입 등이 가아야 전달인자로서 전달할 수 있습니다.
이는 전달인자로 전달할 클로저는 이미 적합한 타입을 준수하고 있다고 생각할 수 있겠죠?
따라서 클로저를 구현할 때는 매개변수의 타입을 굳이 명시해 주지 않아도 되는 것이랍니다.

calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in
	return no1 * no2
})

따라서 이 코드는 이렇게 표현할 수 있습니다.

calculator(n1: 2, n2: 3, operation: { (no1, no2) -> Int in return no1 * no2 })


🍒 반환 타입 생략

매개변수 타입을 생략할 때의 이유와 마찬가지로

calculator(n1: 2, n2: 3, operation: { (no1, no2) in return no1 * no2 })

이렇게 표현할 수도 있어요! 점점 간단해지고 있죠?



🍒 단축 인자 이름 사용

계속 코드를 작성하다 보니, 매개변수들의 이름이 의미없게 느껴지지 않나요? Swift에서는 이를 조금 더 멋스럽게 표현할 수 있도록 단축 인자 이름을 제공합니당.

첫 번째 전달인자부터 $0, $1, $2, ... 순서대로 표현합니다.
클로저를 표현할 때 항상 in을 사용했었는데요. in 이라는 키워드는 매개변수 및 반환타입과 실행 코드를 구분하기 위해 사용했던 것이므로 in도 같이 생략해 주면 됩니다.

calculator(n1: 2, n2: 3, operation: { return $0 * $1 })


🍒 암시적 반환 표현

아 이제 뭘 더 줄일 수 있지? 싶지만 사실 return 키워드마저 생략할 수 있답니다.

calculator(n1: 2, n2: 3, operation: { (no1, no2) in  no1 * no2 })

엄청 간단해졌죠!

또한, 클로저가 반환 값을 갖는 클로저이고 클로저 내부의 실행문이 단 한 줄이면, 그 실행문을 바로 반환값으로 사용할 수도 있습니다.

이때 단축 인자 이름을 사용해 주면,

calculator(n1: 2, n2: 3, operation: { $0 * $1 })

이렇게까지 간단하게 표현할 수 있답니다!



앞에서 후행 클로저의 특징들을 적어봤었는데요.
  • 함수나 메서드의 마지막 전달인자로 위치하는 클로저는,
    함수의 메서드나 소괄호를 닫은 후 작성하면 됩니다.

이 특징을 이용하면, 마지막으로 이렇게까지 간단하게 표현할 수 있답니다.

calculator(n1: 2, n2: 3) { $0 * $1 })

엄청 간단하게 줄여지긴 했는데, 아직 저같은 코린이는 한눈에 알아보기엔 약간 가독성이 떨어지기도 하는 것 같아요!




오늘은 클로저에 대해 작성해 보았습니당.
빨리 더 많이 공부해 봐야겠어용... 문법 공부 열심히!!!!!!!




출처: SWIFT 스위프트 프로그래밍 - yagom
udemy iOS boostcamp - 안젤라유

좋은 웹페이지 즐겨찾기