2021. 12. 23. 01:24ㆍProgramming/iOS_Swift
강한참조와 약한참조란?
- 참조에 대한 이해
강한참조와 약한참조라는 표현을 이해하기 전에 저 '참조'라는 단어를 먼저 이해해볼 필요가 있다. 참조가 뭘까, 무언가를 참고한다는 의미인 것 같은데 뭘 참고하는 것일까.
참조라는 표현을 이해하기 위해서는 우리는 다시 또 조금 더 상위의 개념인 클래스가 어떤 타입인지를 이해해야 한다. 클래스는 레퍼런스 타입, 즉 '참조'타입이다. 따라서, 클래스의 인스턴스들은 해당 클래스의 다른 인스턴스들을 참조할 수 있다. 예시를 통해보자.
똑같은 형식으로 클래스와 구조체를 만들어줬다. 코드를 보면 student2 인스턴스는 student1 인스턴스를 '참조' 하고 있다. 쉽게 생각하면, student1과 2는 일종의 일심동체라고 보면 된다. 따라서, 1의 학생명은 'Kim'이라고 정의했지만 2에서 학생명을 'Lee'라고 재정의해줬기 때문에 프린트 결과문이 동일하게 나오는걸 확인할 수 있다.
반면에 구조체의 경우 참조타입이 아닌 '값' 타입이다. 그렇기 때문에 일종의 복사가 일어난다. 4는 3을 복사해서 탄생한 독립된 인스턴스이다. 그렇기 때문에 둘의 프로퍼티는 서로 영향을 받지 않는다.
이제 참조에 대한 이해를 간략하게 했다.
- ARC에 대한 이해
강한참조 약한참조로 넘어가기 전에 이해가 선행되어야할 게 아직 하나 남았다. 바로 ARC(Auto Reference Counting)이다. 직역하면, 자동으로 참조횟수를 세주는 것이다. 기본적으로 참조 또는 초기화(이니셜라이저)가 발생할때마다 참조 횟수는 1씩 증가한다. 위의 코드를 예시로 보면, student1이 초기화되면서 1 늘어나고 student2가 1을 참조했기 때문에 참조 횟수는 총 2 늘어나게 된다.
그러면 자동으로 참조횟수 세주는게 왜 필요한가라는 의문이 생길 수 있다. 저게 왜 필요하냐, 바로 메모리 관리를 해주기 때문이다. 내부적으로, Swift는 클래스의 인스턴스가 만들어지면 메모리를 할당한다. 또 클래스의 인스턴스가 없어지면 메모리에서 해제한다. 이러한 메모리 할당과 해제를 좀 더 유기적이고 효율적으로 실행하기 위해 Swift는 ARC라는 것을 사용한다. 즉, 참조횟수를 셈으로써 메모리 할당과 해제를 관리하는 것이다.
이제 강한참조와 약한참조를 이해하기 위한 선행지식 이해가 끝났다!
- 강한참조 약한참조
강한참조와 약한참조가 무엇이고, 무슨 차이일까. 앞선 이해를 통해 둘다 클래스의 인스턴스에서 일어나는 일인건 알았다. 참조라는 추상적인 단어에 강한이라는 수식어가 붙었으니 이게 뭔 소린가 싶다.
강한참조는 크게 이해할 부분은 없다. 기본적으로 우리가 생성하는 대부분의 클래스 인스턴스들은 강한 참조일 것이다. 선언할 때 특별히 뭘 적지 않는 이상 모두 강한참조이기 때문이다. 위의 코드에 있는 인스턴스들도 모두 강한참조이다.
반면에 약한참조는 레퍼런스 카운트를 증가시키지 않는다는 차이점이 있다. 이 말은 즉슨, 참조 횟수가 0이기 때문에 메모리가 할당되지 않는다는 것이다.
위 코드에서 보면 알 수 있듯이, 인스턴스를 초기화했지만 약한참조이기 때문에 레퍼런스 카운트를 증가시키지 않으므로, 즉시 소멸자를 호출해버렸음을 확인할 수 있다.
왜 알아야할까?
1. 메모리 누수를 방지하기 위해서이다.
모두 다 강한 참조로만 쓴다면 편할 수 있지만 순환참조라는 문제점이 발생할 수 있다. 이는 서로 다른 두 클래스의 인스턴스가 서로의 클래스를 강한 참조를 할 경우에 발생하는 문제인데, 서로가 서로를 강하게 참조하기 때문에 각각의 인스턴스에 nil을 할당했음에도 불구하고 레퍼런스 카운트가 0이 되지를 않아서 메모리 해제가 되지 않는다. 이럴 경우 사용하지 않는 인스턴스에 계속해서 메모리를 할당하기 때문에 비효율이 발생하게 된다.
** 왜 알아야 할까? 부분은 현재까지 제가 느낀 사견이기 때문에, 틀릴 수도 있습니다. 내용이 잘못됐다면 언제든 지적해주세요!
'Programming > iOS_Swift' 카테고리의 다른 글
[iOS_Swift] 클로저(3) - 탈출클로저(Escaping Closure) (0) | 2021.12.31 |
---|---|
[iOS] 앱의 생명주기 이해하기(App's Life Cycle) (0) | 2021.12.29 |
[iOS] 누락된 Crashlytics dsym파일 로컬머신에서 찾기[SPM] (0) | 2021.12.18 |
[iOS_Swift] 프로퍼티 감시자(Property Observers)(코드x) (0) | 2021.12.18 |
[iOS_Swift] 클로저(2) - 기본 클로저 (0) | 2021.11.03 |