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

Capture List란 무엇인가요? #30

Open
0Hooni opened this issue Jan 12, 2025 · 4 comments
Open

Capture List란 무엇인가요? #30

0Hooni opened this issue Jan 12, 2025 · 4 comments

Comments

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 12, 2025

No description provided.

@hsw1920
Copy link
Owner

hsw1920 commented Jan 14, 2025

클로저는 코드 블럭 외부의 상수나 변수를 캡처할 수 있습니다. 이후 클로저는 상수와 변수를 정의한 범위가 존재하지 않더라도 in 이후의 클로저 바디 내부에서 해당 상수나 변수값을 사용할 수 있습니다. 하지만 클래스 인스턴스를 캡처할때 클로저와 클래스 인스턴스 사이에 강한 참조 사이클이 생성되기 때문에 순환 참조 문제를 유의해야 합니다.

@youn9k
Copy link
Collaborator

youn9k commented Jan 14, 2025

캡쳐 리스트란 클로저에서 외부 변수를 캡쳐할 때 Copy하여 캡쳐하기 위한 방식입니다. 클로저 시작 부분에 [ ] 대괄호 안에 Copy 캡쳐하고 싶은 변수를 넣게 되면 해당 클로저가 선언되는 시점의 값을 복사하여 캡쳐하게 됩니다. (Value 타입의 변수 캡쳐 시)
참조 타입의 변수를 캡쳐할 경우엔 해당 변수에 대해 RC가 증가하게 되는데, 클로저가 메모리에서 해제될 때까지 해당 변수가 해제되지 않는 문제나 순환 참조 문제가 발생할 수 있어 weak 이나 unowned 키워드를 같이 사용하는게 좋습니다.

@0Hooni
Copy link
Collaborator Author

0Hooni commented Jan 14, 2025

🙋🏻 답변

캡처 리스트를 설명하기 위해서 클로저의 기본 값 캡처 방식에 대해서 먼저 말씀드리겠습니다.

클로저의 값 캡처는 기본적으로 참조 대상의 타입과 상관없이 강한 레퍼런스 캡처를 합니다. 그래서 값타입을 참조 했더라도 추후 값타입의 값이 바뀌면 copy가 적용되는것이 아닌 원본의 변경점을 따라갑니다. 또한 레퍼런스 캡처의 경우에는 레퍼런스 카운트가 늘어 자칫하면 순환참조 문제가 발생합니다.

이러한 문제들을 해결하기 위해서 클로저는 캡처 리스트를 만들 수 있습니다. 중괄호 옆에 대괄호로 캡처 대상을 나열하는데, 이 때 이 대괄호와 캡처 대상들을 캡처 리스트라고 합니다.

캡처 리스트를 사용하면 값 타입을 캡처할 때에는 copy 방식으로 클로저 선언 이전의 값을 그대로 사용할 수 있고, 참조 타입을 캡처할 때에는 weak와 같은 키워드를 통해 순환참조 문제를 방지할 수 있습니다.

🏷️ 키워드

기본 캡처방식, 값/참조타입 문제, 캡처리스트, copy, weak

@Kiyoung-Kim-57
Copy link
Collaborator

캡쳐 리스트는 기본적으로 정보를 참조 캡쳐하는 클로저에서 값 캡쳐를 사용하기 위해 쓰입니다.

캡쳐리스트의 동작은 리스트 내의 변수(또는 상수)들을 상수로 복사하여 클로저가 힙에 저장될 때 같이 저장합니다.

일반적으로 상수에 복사하는 것과 동작이 같아 값 타입은 깊은 복사가, 참조 타입은 얕은 복사가 일어납니다.

참조 타입의 값 캡쳐는 기본 참조 캡쳐와 같아보일 수 있지만 weak, unowned 키워드를 쓸 수 있다는 점에서 차이가 있습니다. 이를 사용하면 강한 참조로 인해 발생하는 순환 참조 문제를 방지할 수 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants