꿈돌이랜드

코코아 인터널스 - 8장 블록과 클로저 본문

Programming/iOS

코코아 인터널스 - 8장 블록과 클로저

loinsir 2023. 8. 14. 23:08
반응형

…중략…

8.2 스위프트 클로저

클로저는 접근 가능한 특정 범위(scope) 내에서 사용하는 값을 (함수 내부에) 갖고 있는 함수를 의미한다. 스위프트에서 함수는 모두 클로저다. 그리고 스위프트에서 클로저는 함수이거나 이름 없는 그냥 클로저 중 하나다. 일부 스위프트 함수는 오브젝티브-C 블록 객체 형태로 호환 가능하다. 반대로 블록 객체는 스위프트에서 클로저처럼 호환성을 유지하면서 호출할 수 있다.

8.2.1 클로저 형식

…중략…

스위프트에서 함수는 당연히 다른 함수의 인자 값으로 사용할 수 있다.

…중략…

참조 범위가 전체인 글로벌 함수는 이름은 있지만 캡처하는 변수가 없는 클로저가 된다. 다른 함수 내부에 선언한 중첩 함수는 감싸고 있는 함수 범위에 접근 가능한 변수들을 캡처하는 이름 있는 클로저가 된다. 마지막으로 함수명을 지정하지 않고 글자 그대로 선언하는 클로저 표현식은 코드를 감싸고 있는 컨텍스트 변수들 값을 캡처하는 방식이다. 특히 클로저 표현식은 다른 코드 중간에 끼워넣는 경우가 많기 때문에, 복잡한 항목을 축약해서 쓸 수 있는 간결한 스타일이다. 클로저 표현식은 다음과 같은 변형 방식을 제공한다.

  • 인자 값이나 리턴 값에 대한 타입은 생략 가능하다.
  • 한 줄 표현 클로저에서 리턴 구문을 생략해도 된다.
  • 인자 값에 대한 축약 표현식을 사용할 수 있다.
  • 함수 마지막 인자 값이 클로저인 경우, 꼬리 클로저는 외부에 선언할 수 있다. 꼬리 클로저는 함수 인자 괄호 뒤에 나오는 클로저 표기법을 지칭한다. 꼬리 클로저는 클로저를 함수 인자 값으로 전달하는 코드가 좀 더 명료하게 읽힐 수 있도록 도와준다. 꼬리 클로저는 함수 중심 언어에서 for구문 대신 ‘꼬리 재귀’ 반복 동작을 최적화할 수 있는 중요한 요소다.
  • 클로저에 전달하는 인자 값이 없을 경우 괄호는 생략할 수 있다. 인자 값이 없을 경우 괄호가 있어야 함수 구분이 명확한 경우도 있지만, 반대로 함수 이름이 없는 클로저인 경우는 인자 값이 없을 경우 괄호를 생략하는 게 가독성이 좋다.

…중략…

8.2.2 함수 유형

앞서 설명한 모든 클로저와 함수를 동일하게 처리하는 것은 컴파일러가 스위프트 코드를 분석하면서 자동적으로 분석하고 분류하기 때문에 가능한 것이다. 동일한 형태를 가진 함수들도 선언한 범위나 역할에 따라서 함수 유형은 달라질 수 있다. 스위프트 오픈소스에서 클로저와 함수와 관련된 코드는 컴파일러 Clang 관련 AST(Abstract Syntax Tree) 소스 코드에서 힌트를 얻을 수 있다. Clang은 C++ 기반으로 작성되어 있고, 그 중에서 함수와 관련된 AST는 AbstractFunctionDecl 클래스와 FuncDecl 클래스가 담당한다. …중략…

함수 표현 유형 (Representation Type)

스위프트 중간 언어에는 함수 표현 유형이 선언되어 있다. C언어나 오브젝티브-C언어와 함께 사용해서 연결 가능한 함수 표현이 있고, 스위프트에서만 사용하는 함수 표현이 나누어져 있다. …중략…

스위프트 컴파일러가 연결 가능한 외부 언어는 스위프트 2.2 기준으로 C 언어와 오브젝티브-C 언어뿐이다. C 언어 구조체나 열거형, 함수 그리고 오브젝티브-C 언어의 객체는 연결 가능하다. 다만 모든 함수와 연결이 가능한 것은 아니다. 객체인 경우 메타 타입 정보가 있어야 하고, 함수인 경우 재귀 호출 방식이 아니거나 입력 변수 타입이나 출력 타입에 튜플 타입이 없어야 한다. 외부 함수 연결은 컴파일 시점에 결정되는 고정 연결(StaticBridged), 런타임에 동적으로 연결 가능한 동적 연결(Bridged), 블록 객체로 연결하는 객체 연결(Object), 그리고 나머지 함수 연결 형태로 나눠서 처리한다. 스위프트로 만든 함수를 C 언어에서 사용하려면 @convention(c) 지시어를 붙여서 호출 규격을 C언어 스타일로 지정해줘야만 한다.


Uploaded by N2T

반응형