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

strong , unowned , weak 키워드에 대해 설명해주세요. #26

Open
youn9k opened this issue Jan 4, 2025 · 3 comments
Open

strong , unowned , weak 키워드에 대해 설명해주세요. #26

youn9k opened this issue Jan 4, 2025 · 3 comments

Comments

@youn9k
Copy link
Collaborator

youn9k commented Jan 4, 2025

  • strong, weak, unowned의 개념 설명
  • weak와 unowned의 차이 설명
@hsw1920
Copy link
Owner

hsw1920 commented Jan 10, 2025

strong

인스턴스의 주소값이 변수에 할당될 때 참조 카운트가 증가하면 강한 참조(strong)을 의미합니다.

기본적으로 생성되는 클래스 인스턴스는 별도의 키워드를 붙이지 않아도 default로 strong으로 생성되어 참조 카운트(RC)가 증가합니다. 이렇게 강한 참조를 통해 참조 카운트(RC)가 증가한 후 순환참조가 발생하여 영구적으로 메모리가 해제되지 않는 경우 메모리 누수 문제를 겪을 수 있기 때문에 주의해야 합니다.

weak

강한 참조를 통한 순한 참조 문제를 해결하기 위해서 weak와 unowned 키워드를 사용할 수 있습니다.

weak는 약한 참조라 부르며, 강한 참조와 달리 인스턴스를 참조하여도 참조 카운트(RC)를 증가시키지 않습니다. 참조하던 인스턴스가 메모리에서 해제되는 경우 자동으로 nil이 할당되어 메모리가 해제됩니다.

unowned

unowned는 미소유참조라 불리며, weak와 마찬가지로 강한 순환 참조 문제를 해결할 수 있고 참조 카운트(RC)를 증가시키지 않습니다. weak와의 차이점은 nil이 될 수 없기 때문에 참조하는 인스턴스가 메모리에서 사라질 일이 없다고 확신하는 경우에 사용합니다.

만약 unowned로 선언된 변수가 메모리에서 먼저 해제된 후 접근하면 해당 주소의 인스턴스가 이미 사라진 뒤기 때문에 에러를 발생시키게 됩니다.

따라서 weak와 반대로 수명이 더 긴 인스턴스를 unowned 미소유 참조로 선언해야합니다.

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 11, 2025

strong

강한 참조로 기본적인 참조 유형입니다. 객체를 소유하며 참조 카운트를 증가시킵니다. 객체가 소유되는 동안 메모리에서 해제되지 않습니다.

weak

약한 참조로 참조 카운트를 증가시키지 않고, 참조 대상이 해제되면 인스턴스가 자동으로 nil로 설정됩니다. 주로 순환 참조를 방지하기 위해 사용합니다.

unowned

무소유 참조로 참조 카운트를 증가시키지 않고, 참조 대상이 항상 존재한다고 가정할 때 사용됩니다. 그래서 weak과 다르게 optional 타입이 아닙니다. 만약 참조 대상이 해제된 후 접근하면 런타임 에러가 발생합니다.

@Kiyoung-Kim-57
Copy link
Collaborator

strong, weak, unowned 키워드는 Swift에서 참조 방식을 나타내는 키워드입니다.
strong은 기본적인 참조 방식으로 참조가 이뤄지면 참조 카운트가 1 증가합니다. 참조 카운트가 0이 되면 메모리에서 해제됩니다. 다만 두 객체가 서로를 강한 참조를 하게 되면 순환참조가 발생할 수 있습니다.

weak는 참조 카운트를 증가시키지 않는 참조 방식입니다. 참조 카운트를 증가 시키지 않기 때문에 순환참조 문제가 생기지 않습니다. 약한 참조는 객체가 메모리에서 해제될 경우 자동으로 nil을 할당합니다. 그렇기 때문에 weak 키워드를 적용시킨 객체는 옵셔널 타입이어야합니다.

unowned도 weak처럼 참조 카운트를 증가시키지 않는 참조 방식입니다. weak과 다른 점은 메모리 해제될 때 nil을 할당하는 것이 아니라 runtime crash가 발생합니다. 그래서 참조 대상이 메모리에서 해제되지 않는 것이 확실할 경우 사용하게 됩니다.

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