본문 바로가기
Xcode/Swift - PlayGround

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

by 후르륵짭짭 2020. 7. 16.
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
반응형

댓글