일모도원(日暮途遠) 개발자
[Swift문법] let someValue: Int = {...}() 맨마지막에 있는 ()는 뭐지? 본문
아래와 같은 코드를 처음 봤을때 맨 마지막의 ()가 뭔지 궁금했었다.
결론부터 말하면 함수를 실행할때 함수명 다음에 ()를 붙이는거와 같다. 즉 함수를 실행하고 그 결과 값을 받는거다.
아래 코드에서 ()는 someValue에 {}의 내용을 실행하여 결과값을 할당(割當, assigne)하는 코드이다. 즉 15를 리턴해준다.
(아래에서 설명할 함수명()와 동일하다. 함수를 실행시킬려면 함수명 뒤에 ()를 붙여야 하듯이)
let someValue: Int = {
return 5 + 10
}()
print(someValue)를 하게 되면 15이 나온다.
만약 아래처럼 ()를 빼고 실행하면 어떻게 되나 확인해 봤다.
let someValue: Int = {
return 5 + 10
}
someValue를 Int형이라 지정했으니 Int를 값이 와야 한다고, ()를 붙이겠냐고 한다.
이문장 자체는 입력 파라미터는 없고 리턴값은 Int형인 클로저이다.
{
return 5 + 10
}
그래서 someValue에 Int값이 아닌 위 클로저를 담고 싶으면 아래처럼 하면 된다.
let someValue: () -> Int = {
return 5 + 10
}
근데 아래처럼 someValue를 print해보면 클로저의 값이 아니라 클로저라고 Function이라고 찍힌다.
즉 someValue는 함수(클로저)이지 클로저를 실행시킨건 아니기 때문이다.
실행시킬려면 위에서 말한 ()가 필요하다. 그렇다고 해서 아래처럼 클로저 뒤에 ()를 넣어주면 안된다. ()를 넣어주면 { return 5 + 10 }을 실행시킨 값인 15를 리턴해주는데 이건 Int타입이지 () -> Int 가 아니기 때문에 에러가 난다.
let someValue: () -> Int = {
return 5 + 10
}()
대신 someValue라는 함수를 실행시켜야 한다. 즉 함수를 정의한 다음에 함수이름에 ()를 붙이면 실행이 되는거다.
위 클로저를 일반적인 함수로 만들어보면 아래와 같다.
func myValue() -> Int {
return 5 + 10
}
이 함수를 실행시킬려면 어떻게 해야 하나? 그냥 함수이름에 ()를 붙이면 된다.
함수를 실행시키지 않고 그냥 함수이름을 print하면 (Function)이라고 나온다.
만약 someValue에 파라미터를 주고 싶다면, someValue2를 보자. (Int, Int) -> Int는 Int형 파라미터를 두개를 받아서 결과로 Int를 리턴하는거다. 클로저 내부에는 (a, b)를 선언하여, 인자값을 a, b에 할당해서 결과물로 a+b를 리턴한다.
사용할때는 일반적인 함수 사용하듯이 someValue2(5, 10)을 하면 된다.
let someValue: () -> Int = {
return 5 + 10
}
print(someValue())
let someValue2: (Int, Int) -> Int = { (a, b) in
return a + b
}
print(someValue2(5, 10))
someValue2는 클로저로 작성한거고, someValue3은 함수로 작성한거다. (클로저는 이름없는 함수라 생각하자)
클로저가 익숙치 않은 사람들은 왜 그냥 함수를 만들어서 사용하기 어렵게 클로저를 사용하는지 이해하기 힘들다. 아래코드만 봐도 똑같은 기능을 클로저로 이해하기 힘들게 만든거 같다. 맞다. 아래와 같은 경우는 그냥 함수로 쓰자.
클로저는 함수를 변수에 담거나, 다른 함수의 인자로 함수를 넘기거나 결과값으로 함수를 받아야 할때 쓰자. 클로저에 대해서 좀더 알고 싶으면 비슷해보이는 일급객체(First-Class Citizen)와 고차함수(Higher-Order Function)등에 대해서도 공부해야 한다.
let someValue2: (Int, Int) -> Int = { (a, b) in
return a + b
}
print(someValue2(5, 10))
func someValue3(_ a:Int,_ b:Int) -> Int {
return a + b
}
print(someValue3(5, 10))
'프로그래밍 언어 > 스위프트' 카테고리의 다른 글
[Swift] Range를 이용한 Array생성 (0) | 2022.12.07 |
---|---|
[스위프트] switch문에서 @unknown default (0) | 2022.09.13 |
[Swift] 문자열에 숫자가 있는거 정렬하기 (0) | 2022.09.03 |
[Swift] ~= 연산자 (0) | 2022.08.08 |
[Swift] @objc가 뭐지? (0) | 2022.07.23 |