본문 바로가기
Languages/Swift

사당 iOS 스터디 3주차 - 클로저

by 탄이. 2018. 8. 17.

CHAPTER 13 클로저

클로저는 변수나 상수가 선언된 위치에서 참조를 획득하고 저장할 수 있습니다.

클로저의 몇 가지 모양 중 하나가 함수

클로저의 세 가지 형태

이름이 있으면서 어떤 값도 획득하지 않는 전역함수의 형태

이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태

이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태

클로저의 다양한 표현

클로저는 매개변수와 반환 값의 타입을 문맥을 통해 유추할 수 있기 때문에 매개변수와 반환 값의 타입을 생략할 수 있습니다.

클로저에 단 한 줄의 표현만 들어있다면 암시적으로 이를 반환 값으로 취급합니다.

축약된 전달인자 이름을 사용할 수 있습니다.

후행 클로저 문법을 사용할 수 있습니다.

클로저 표현 방법은 클로저가 함수의 모습이 아닌 하나의 블록의 모습으로 표현될 수 있는 방법을 의미

__13.1 기본 클로저

{ (매개변수들) -> 반환 타입 in

}

매개변수 이름을 지정한다면 가변 매개변수 또한 사용 가능

클로저는 매개변수 기본값을 사용할 수 없습니다.

함수가 어디에 있는지, 어떻게 구현되어 있는지 찾아다니지 않아도 됩니다.

__13.2 후행 클로저

후행 클로저는 맨 마지막 전달인자로 전달되는 클로저에만 해당되므로 전달인자로 클로저 여러 개를 전달할 때는 맨 마지막 클로저만 후행 클로저로 사용할 수 있습니다.

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

__13.3 클로저 표현 간소화

____13.3.1 문맥을 이용한 타입 유추

  • 전달인자로 전달할 클로저는 이미 적합한 타입을 준수하고 있다고 유추할 수 있습니다. 문맥에 따라 적절히 타입을 유추

  • 클로저의 매개변수 타입과 반환 타입을 생략하여 표현할 수 있습니다.

____13.3.2 단축 인자 이름

  • 간결하게 표현할 수 있도록 단축 인자 이름을 제공

  • 단축 인자 표현을 사용하게 되면 매개변수 및 반환 타입과 실행 코드를 구분하기 위해 사용했던 키워드 in을 사용할 필요도 없어집니다.

____13.3.3 암시적 반환 표현

  • 클로저에서는 return 키워드마저 생략

  • 만약 클로저가 반환 값을 갖는 클로저이고 클로저 내부의 실행문이 단 한 줄이라면, 암시적으로 그 실행문을 반환 값으로 사용

____13.3.4 연산자 함수

  • 연산자는 일종의 함수

__13.4 값 획득

자신이 정의된 위치의 주변 문맥을 통해 상수나 변수를 획득 할 수 있습니다

주변에 정의한 상수나 변수가 더 이상 존재하지 않더라도 해당 상수나 변수의 값을 자신 내부에서 참조하거나 수정할 수 있습니다.

클로저는 비동기 작업에 많이 사용

반환 타입이 () -> Int 라면 이는 함수객체를 반환한다는 의미

__13.5 클로저는 참조 타입

함수와 클로저는 참조 타입

함수나 클로저를 상수나 변수에 할당할 때마다 사실은 상수나 변수에 함수나 클로저의 참조를 설정하는 것

상수에 클로저를 할당한다는 것은 클로저의 내용물, 즉 값을 할당하는 것이 아니라 해당 클로저의 참조를 할당하는 것

__13.6 탈출 클로저

함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출될 때 클로저가 함수를 탈출한다고 표현

클로저를 매개변수로 갖는 함수를 선언할 때 매개변수 이름의 콜론(:) 뒤에 @escaping 키워드를 사용하여 클로저가 탈출하는 것을 허용한다고 명시

비동기 작업으로 함수가 종료되고 난 후 작업이 끝나고 호출할 필요가 있는 클로저를 사용해야 할 때 탈출 클로저가 필요

비탈출 클로저는 함수의 동작이 끝난 후 전달된 클로저가 필요 없을 때 사용

함수가 작업을 종료하고 난 이후(즉, 함수의 return 후)에 컴플리션 핸들러, 즉 클로저를 호출하기 때문에 클로저는 함수를 탈출해 있어야만 합니다.

탈출 클로저임을 명시한 경우, 클로저 내부에서 해당 타입의 프로퍼티나 메서드, 서브스크립트 등에 접근하려면 self 키워드를 명시적으로 사용해야 합니다.

____13.6.1 withoutActuallyEscaping

  • withoutActuallyEscaping(_:do:) 함수를 활용하여 비탈출 클로저를 탈출 클로저처럼 사용

__13.7 자동 클로저

함수의 전달인자로 전달하는 표현을 자동으로 변환해주는 클로저를 자동 클로저

자동 클로저는 전달인자를 갖지 않습니다.

자동 클로저는 클로저가 호출되기 전까지 클로저 내부의 코드가 동작하지 않습니다. 따라서 연산을 지연시킬 수 있습니다.

클로저를 만들어두면 클로저 내부의 코드를 미리 실행(연산)하지 않고 가지고만 있습니다.

자동 클로저의 사용

  • 매개변수에 @autoclosure 속성을 주었기 때문에 자동 클로저 기능을 사용

  • 자동 클로저는 전달인자를 갖지 않기 때문에 반환 타입의 값이 자동 클로저의 매개변수로 전달되면 이를 클로저로 바꿔줄 수 있는 것

  • String 값으로 전달된 전달인자가 자동으로 클로저로 변환되기 때문에 자동클로저라고 부릅니다.

  • 자동 클로저를 사용하면 기존의 사용 방법처럼 클로저를 전달인자로 넘겨줄 수 없습니다.

  • 자동 클로저의 과도한 사용은 코드를 이해하기 어렵게 만들 가능성이 크므로 정신건강에 매우 해롭습니다

자동 클로저를 탈출하는 클로저로 사용하고 싶다면

  • @autoclosure @escaping





    참고


    야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019


댓글