Xcode/Swift - PlayGround

PlayGround) Closure에 대해서 알아보자 1부 (Expression)

후르륵짭짭 2020. 7. 16. 01:23
728x90
반응형

안녕하세요 후르륵짭짭 입니다,

이번에는 Swift에서 가장 머랄까,,, 개인적으로 가장 많은 시간을 투자한 문법입니다.

가장 이해하기 어려웠습니다.

물론 아직 보지 못한 문법들도 있으니,,, 더 어려운 것도 많겠지만, 지금 공부 한 것 중 가장 어려웠던 걸 설명할까 합니다.

 

** Closure **

자바에서는 람다라고 불리기도 합니다.

클로저는 그냥 함수 입니다.

하지만 가독성을 높히고 간편하게 만들었다? 를 위해서 만들었다고 생각합니다.

하지만 가독성은 잘 모르겠네요 ㅎㅎㅎㅎ

생각을 하고 읽어야하니,,, 초심자에게는 어렵습니다

 

** Closure Expression **

클로저의 표현 방법은 정말 다양합니다.

클로저는 아래와 같이 변수에 함수를 정의 할 수 있습니다.

let addTwoNumber : (Int, Int) -> (Int) = { (one : Int, two : Int) -> (Int) in
    print("덧셈")
    return one + two
}

따라서 우리가 일반적으로 변수를 정의 할 때 처럼 변수의 자료형을 정의 해주세요

정수인 두개의 변수를 받아서 정수를 반환한다. 그리고 {} 안에

함수 처럼 변수의 이름과 자료형을 모두 넣어주고 반환형을 적어주세요!

그리고 in 을 써주고

그 아래 부분에 내용을 적어주면 됩니다.

그리고 addTwoNumber(1,3) 처럼 그냥 함수 쓰듯이 사용해주면 됩니다.

 

그런데 코드를 보면 

(Int, Int) -> Int  와  (one : Int , two : Int) -> (Int)

자료형 정의가 두번 되어 있습니다. 따라서 굉장히 길어요....

그래서 이 둘을 줄일 수 있습니다

let timesTwoNumber = { (one :Int, two :Int) -> (Int) in
    print("곱셈")
    return one * two
}

요렇게 앞 부분을 제거 해줄 수도 있고 

let minusTwoNumber : (Int, Int) -> (Int) = { one, two in
    print("뺄셈")
    return max(one,two) - min(one,two)
}

이렇게 뒷 부분을 제거 해줄 수도 있씁니다

 

또한 저 in 이 맘에 안 들면 "$"이라는 인자를 통해서 

let diviedTwoNumber : (Int, Int) -> (Int) = {
    print("나눗셈")
    return max($0, $1) / min($0,$1)
}

이렇게 정의 해줄 수도 있습니다 (참고로 저 return 부분도 지울 수 있습니다)

$0은 첫번째 인자를 의미하고 $1은 두번째 인자를 의미합니다. 인자는 변수라 생각하면 편합니다.

 

하지만 저는 저렇게 확 줄이는 것을 안 좋아합니다.

무슨 코드 인지 잘 읽기가 어려워서 

가급적이면 minusTwoNumber 처럼 적는 것을 좋아합니다.

 

지금 까지 Closure의 표현법에 대해서 배워보았습니다.

그리고 다음에는 Complete Handler에서 배워 보고 

더 나아가서 escaping Closure에 대해서 배워보도록 하겠습니다.

** 전체 코드 **

728x90
반응형