Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closure에 대하여 설명하시오. #32

Open
Do-hyun-Kim opened this issue Nov 20, 2023 · 2 comments
Open

Closure에 대하여 설명하시오. #32

Do-hyun-Kim opened this issue Nov 20, 2023 · 2 comments
Labels
Swift Swift CS 개념 공부

Comments

@Do-hyun-Kim
Copy link
Contributor

No description provided.

@Do-hyun-Kim Do-hyun-Kim added the Swift Swift CS 개념 공부 label Nov 20, 2023
@Do-hyun-Kim
Copy link
Contributor Author

Closure에 대하여 설명하시오.

  • closure 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호**{}** 로 구분된 코드의 블럭 이다.
  • 일급 객체의 역할을 하며, 전달 인자를 보낼 수 있으며 변수(Variable), 상수(Constant) 등으로 저장 하거나 전달 할 수 있다. 혹은 함수의 반환 값이 될 수도 있다.
  • closure는 참조 타입이며 함수는 클로져의 한 형태이기도 하다.

Closure의 표현 방식

{ (인자들) -> 반환타입 in
  로직 구현
}

Closure의 종류

  • Escaping Closure
    • 클로저가 함수의 인자로 전달 됬을때, 함수의 실행이 종료된 후에 실행되는 클로저 이다.
    • 탈출(Escaping) 클로저를 사용하기 위해서는 @escaping 키워드를 사용하여야 한다.
    • 탈출(Escaping) 클로저 내부에서는 해당 타입의 프로퍼티, 메서드, 서브스크립트 등에 접근하려면 self 키워드를 명시적으로 사용해야한다.
    • 탈출 클로저 내부에 클래스 인스턴스 프로퍼티를 참조할 경우 순환 참조 발생이 일어 나기에 [weak self] 혹은 [unowned self] 키워드를 사용하여 순환 참조 발생을 막아야 한다.
  • Non-Escaping Closure
    • 함수 스코프(scope) 범위 내에서 벗어날 수 없으며, 종료 전까지 반드시 실행되어야 하는 탈출 불가능한 클로저 이다. Stack Memory에 할당 되므로 순환 참조 발생이 나지 않는다.
    • 비탈출(Non- Escaping) 클로저 같은 경우 컴파일러가 클로저의 실행과 종료의 여부 확인이 가능하다.
    • 비탈출(Non- Escaping) 클로저는 해당 타입의 프로퍼티, 메서드, 서브스크립트 등에 접근할때 self 키워드 선택사항으로 제공해준다.
  • Auto Closure
    • 자동 클로저(Auto Closure)는 인자 값이 없으며 특정 표현을 감싸서 다른 함수에 전달 인자로 사용할 수 있는 클로저이다.
    • 자동 클로저는 클로저를 실행하기 전까지 실제 실행이 되지 않는다 즉 계산이 복잡한 연산을 하는데 유용하다.

Closure와 함수와의 관계

  • Closure는 익명함수 이며 일급 객체 역할을 하고 있다. 때문에 함수명이 존재하지 않으며, 참조 형식을 가지고 있다.
  • 일반 함수(Function)는 함수명이 존재하며, 참조 형식이 아닌 값 형식을 가지고 있다.

@ronick-grammer
Copy link
Contributor

ronick-grammer commented Dec 6, 2023

클로저(Closure)란

코드를 하나의 블럭으로 모아놓은 것을 의미한다.

  • named closure: func 키워드로 시작해서 뒤에 이름이 붙는 클로저를 named closure라 하며 일반적으로 함수라고 부른다.
func namedClosure(someValue: SomeType) -> ReturnType {
 ...
}
  • unnamed closure: func 키워드 없이 매개변수와 리턴타입을 정의하는 헤더부분과 구현부인 바디부분 이루어졌으며, 일반적으로 클로저라 부른다.
var unnamedClosure: (SomeType) -> ReturnType = { someValue -> String in
    ...
    return returnValue
}         

클로저의 타입

  • non-escaping: 함수의 매개변수로 클로저를 받을 때는 기본적으로 non-escaping 으로 설정이 되어 있다. non-escaping 클로저는 함수 내부에서의 호출이 보장되기 때문에 클로저에 대한 메모리 관리를 효율적으로 할 수 있다.

  • escaping: 반면에 escaping 클로저는 함수 외부에서도 사용이 될 수 있다. iOS는 이러한 escaping 클로저의 메모리를 추적해야 하기 때문에 퍼포먼스에 영향을 준다. 클로저는 외부 변수를 참조할 때 기본적으로 strong 방식으로 캡처하기 때문에, 강한 참조 사이클이 발생할 수가 있어서 weak이나 unowned 방식으로 캡처할 수 있도록 하여 memory leak 상황을 방지할 수 있다.

📝 참고 사이트

  • 개인 기록 및 정리

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Swift Swift CS 개념 공부
Projects
None yet
Development

No branches or pull requests

2 participants