본문 바로가기

스폰지밥으로 공부하는 swift/swift 문법

참조, 강한참조 약한참조, 순환참조...?

728x90

참조가 뭔가요?

참조는 다른 객체의 주소를 가리키는 것을 말합니다. 어떤 집에 찾아가고 싶은데 그러려면 먼저 그 집이 어디있는지 알아야 하잖아요? 주소를 받은 수 집에 찾아간다면 그 안에 들어간 후 집이 어떻게 생겼는지 볼 수 있고, 의자를 뺀다거나 하는 수정사항을 발생시킬수도 있겠죠! 이와 같이 프로그래밍에서 참조를 통해 다른 객체에 접근을 하고 수정을 할 수 있습니다.

참조 : 다른 객체의 주소를 가리키는 것

class SpongeBob {
    var name = "스펀지밥"
}

class Squidward {
    var name = "징징이"
    var friend: SpongeBob?  // 스펀지밥을 참조하는 변수
}

let spongeBob = SpongeBob()
let squidward = Squidward()
squidward.friend = spongeBob  // 징징이는 스펀지밥을 참조함

강한참조, 약한 참조

강한 참조는 참조하는 대상을 소유하며, 참조 카운트를 증가시킵니다. 반면, 약한 참조는 참조하는 대상을 소유하지 않으며, 참조 카운트를 증가시키지 않습니다.

참조카운팅은 또 머죠..?

참조 카운팅은 객체가 메모리에서 해제되는 시점을 결정하는 방법입니다. 객체를 참조할 때마다 참조 카운트는 증가하고, 참조가 끊어질 때마다 참조 카운트가 감소합니다. 참조 카운트가 0이 되는 순간, 즉 해당 객체를 참조하는 다른 객체나 변수가 더 이상 없는 순간에 시스템은 그 객체를 메모리에서 해제합니다. 스위프트는 ARC(Automatic Reference Counting)방식을 사용하여 자동으로 메모리를 관리해주고 있어요 :)

참조 카운팅 : 객체가 메모리에서 해제되는 시점을 결정하는 방법

강한 참조 : 참조하는 대상을 소유하며, 참조 카운트를 증가시킵니다.
약한 참조 : 참조하는 대상을 소유하지 않으며, 참조 카운트를 증가시키지 않습니다.

class SpongeBob {
    var name = "스펀지밥"
}

class Squidward {
    var name = "징징이"
    weak var friend: SpongeBob?  // 약한 참조를 사용
}

let spongeBob = SpongeBob()
let squidward = Squidward()
squidward.friend = spongeBob  // 징징이는 스펀지밥을 약한 참조함

순환참조는 뭐죠..?

순환 참조는 두 객체가 서로를 참조함으로써 발생하는 문제입니다. 이 문제를 해결하지 않으면 메모리 누수가 발생할 수 있습니다.

순환 참조 : 두 객체가 서로를 참조함으로써 발생하는 문제

class SpongeBob {
    var name = "스펀지밥"
    var friend: Squidward?  // 징징이를 참조하는 변수
}

class Squidward {
    var name = "징징이"
    var friend: SpongeBob?  // 스펀지밥을 참조하는 변수
}

let spongeBob = SpongeBob()
let squidward = Squidward()

spongeBob.friend = squidward  // 스펀지밥은 징징이를 참조
squidward.friend = spongeBob  // 징징이는 스펀지밥을 참조

이러한 순환 참조 문제를 방지하기 위해 약한 참조나 미소유 참조를 사용합니다. 이렇게 참조, 강한 참조와 약한 참조, 그리고 순환 참조와 참조 카운팅에 대해 알아보았는데요, 다음 포스팅에서는 미소유 참조와 약한참조의 차이점에 대해서 알아보겠습니다.