0. ๋ฐ๋จ
ํํ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ๋๋ฐ, ํด๋น ๋ฆฌ์คํธ ๋ด์ ๋ ธ๋๋ค์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋ ์ด์๊ฐ ๋ฐ์ํ์๋ค.
var myCLL: CircularLinkedList<Int>? = CircularLinkedList<Int>()
for i in 0..<2{
myCLL!.insertAtLast(DoublyNode(data: i))
}
myCLL = nil
1. ์ํฉ ๋ฐ ์์ธ ํ์
๋ฉ๋ชจ๋ฆฌ ํด์ ์ , ๋ฆฌ์คํธ์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ ๋ ์ค๋ก์ง ๋ฉ์๋ insertAtLast๋ง์ ์ฌ์ฉํ์๋ค.
๋ฐ๋ผ์ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋
ธ๋์ ๊ด๊ณ๋ฅผ ์ค์ ํ ๋, ๋ฆฌ์คํธ์ ํน์ฑ์ head์ tail ํ๋กํผํฐ ๋ฐ ์
๋ ฅ๋๋ ๋
ธ๋์ ๋ํ ์ฐธ์กฐ๊ฐ ๋น๋ฒํ๋ฏ๋ก ํด๋น ์ธ์คํด์ค๋ค์ ๋ํ ๋ง๊ตฌ์ก์ด์ ์ ๊ทผ์ผ๋ก RC๊ฐ ๋ง๊ตฌ์ก์ด๋ก ์์ด๋ ๊ฒ์ด ์์ธ์ด๋ผ ์ง์ํ์๋ค.
๋ฆฌ์คํธ์ ๊ตฌํ๋ถ ๋ฐ ๋ฆฌ์คํธ์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ insertAtLast ํจ์์ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
class DoublyNode<T>{
weak var prevNode: DoublyNode<T>?
var nextNode: DoublyNode<T>?
var data: T?
}
class CircularLinkedList<T>{
var head: DoublyNode<T>?
weak var tail: DoublyNode<T>?
....
func insertAtLast(_ newNode: DoublyNode<T>){
if self.head == nil {
self.head = newNode
self.tail = newNode
head?.prevNode = newNode
tail?.nextNode = newNode
return
}
self.head?.prevNode = newNode
self.tail?.nextNode = newNode
newNode.prevNode = self.tail
newNode.nextNode = self.head
self.tail = newNode
}
2. ๋ฌธ์ ์ ์ฐพ๊ธฐ
๋
ธ๋๋ฅผ 1๊ฐ๋ง ์ถ๊ฐํ์์ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ฐ ์ผ์ด๋์ง ์๋๋ค.
์ฆ, head == nil ์ผ ๋์๋ ๋ฌธ์ ๊ฐ ์์์ ์ ์ ์๋ค.
ํด๋น ๋ธ๋ก์ ํ๋์ฉ ๋ฏ์ด๋ณด๋ฉด ์ด๋ ๋ค.
- head == nil ์ผ ๋ ๋
ธ๋ ์ถ๊ฐ ์
- self.head = newNode // newNode์ ๋ํ RC 1์ฆ๊ฐ, total:1
- self.tail = newNode
- head?.prevNode = newNode
- tail?.nextNode = newNode // newNode์ ๋ํ RC 1 ์ฆ๊ฐ, total:2
- ์ด๋ myCLL = nil ์ ์ํ ์
- ํํ ๋งํฌ๋ ๋ฆฌ์คํธ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉฐ ์ ๊ฑฐ๋จ
- ์ธ์คํด์ค ์ ๊ฑฐ๋ก ์ธํ ๋ด๋ถ ํ๋กํผํฐ๋ค์ด ๊ฐ๋ฆฌํค๋ ์ธ์คํด์ค์ RC๊ฐ 1์ฉ ๊ฐ์
- ์ด๋, head๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ธ๋์ RC๊ฐ 1 ๊ฐ์ // newNode์ ๋ํ RC total:1
- ์ํฉ ์ข ๋ฃ // newNode์ ๋ํ RC total:1, ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์
1-4๋ก ์ธํ์ฌ ์ค์ค๋ก์ ๋ํ RC๊ฐ ์ฆ๊ฐํ์์ผ๋ฏ๋ก, ํด๋น ์ฝ๋๋ฅผ ์ญ์ ํ ํ head์ tail ํ๋กํผํฐ๋ฅผ fileprivat ์ฒ๋ฆฌํ์๋ค.
์๊ธฐ ์์
์ ์ํํ๋ฉฐ, ์ค์ค๋ก๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํ๋กํผํฐ๋ weak๋ก ํ์ฌ ์ค์ค๋ก์ ๋ํ RC๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ก ํด์ผ ํ๋ค๋๊ฒ์ ์์๋ค.
๋์์, ๋ฆฌ์คํธ ๋ด์ ๋
ธ๋๋ค์ ์ด์ ๋
ธ๋์ next ํ๋กํผํฐ๋ง์ด ์ ์ผํ ์ฐธ์กฐ ๊ฒฝ๋ก์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก next ํ๋กํผํฐ๋ weak๋ก ์ค์ ํ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ๋ํ ์ฐ๊ด์ง์ ์ ์์๋ค.
๋ฐ๋ผ์ insertAtLastํจ์์ ๋์์ ๋ฐ๋ผ ์ฆ๊ฐํ๋ RC๋ฅผ ์ถ์ ํ๋ฉฐ ์์ ํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
///๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ๋
ธ๋ ์ถ๊ฐ
func insertAtLast(_ newNode: DoublyNode<T>){
if self.head == nil {
self.head = newNode
self.tail = newNode
return
}
newNode.prevNode = self.tail //prevNode๋ weak๋ผ rf ์ฆ๊ฐ ์ํ๋ค
newNode.nextNode = self.tail?.nextNode //rf 1 ์ฆ๊ฐ, newNode.nextNode = self.head์ head์ ๋ํ rf๊ฐ ์ฆ๊ฐํจ
self.tail!.nextNode = newNode //์ ๋
ธ๋์ rf 1 ์ฆ๊ฐ
self.tail = newNode //tail์ weak๋ผ rf ์ฆ๊ฐ ์ํ๋ค
}
๊ทธ๋ฌ๋... ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋...
DoublyNode๋ ์ด์ ์ ์ด์ค ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ ํด๋์ค์ด๋ค.
์ด ํด๋์ค๋, ๋ง์ง๋ง ๋
ธ๋์ next ํ๋กํผํฐ๋ ํญ์ nil์ด์ฌ์ ์ฒซ ๋
ธ๋์ RC๋ฅผ ์ฆ๊ฐ์ํค์ง ์์๋๋ฐ
ํํ ๋งํฌ๋ ๋ฆฌ์คํธ๋ ๋ง์ง๋ง ๋
ธ๋๊ฐ ์ฒซ ๋
ธ๋์ RC๋ฅผ ์ฆ๊ฐ์ํค๊ณ , ์ด๋ก ์ธํ์ฌ ์ด๋ ์ธ์คํด์ค๋ ํด์ ๋์ง ์์ RC๊ฐ ์ ์์ ์ผ๋ก ๊ฐ์ํ์ง ์๊ณ , ์ด๋ก ์ธํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋ํ, ํํ ๋งํฌ๋ ๋ฆฌ์คํธ ํด๋์ค๋ ๋
ธ๋๋ฅผ ์ฝ์
ํ๋ ํจ์๊ฐ 3๊ฐ ์กด์ฌํ์๊ณ , ๊ฐ ํจ์์ ๋ํด ์ถ๊ฐ๋๋ ๋ก์ง์ ๋ฐ๋ฅธ RC๋ฅผ ์ถ์ ํ๋ฉฐ ์ต๋ํ ๋ฆฌ์คํธ๊ฐ dealloc ๋์ ๋ ๊ทธ ์์ ๋
ธ๋ ๋ชจ๋ dealloc ํ ์ ์๋๋ก ์ ๋ง ๋ง์ ์๊ฐ์ ํฌ์ํ์์ผ๋ ์คํจํ์๋ค.
3. ๋ฌธ์ ํด๊ฒฐ
ํ์ฐธ์ ์ธ๋ฉ๋ค deinit ๋ฉ์๋์์ ๋ ธ๋๋ค์ dealloc ์ํฌ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ๊ตฌํ์ ์ํด ํ์ดํ ํ๋ ์ค...
๋น๋ก์ ์ด์ ์์ผ ์๋ฉธ์์ ์ญํ ์ ๊นจ๋ฌ์๋ค.
ํดํ์ ๋ณด๋ ์๊ฐ ๋์๊ด์์ ํ์ฑ์ ๋ด์ง๋ฅผ ๋ป ํ๋ค. ์๋ฉธ์์ ์กด์ฌ ์ด์ ๋ฅผ ๊นจ๋ฌ์ ์๊ฐ์ด์๋ค.
์ปดํจํฐ ๊ณตํ๊ณผ๋ฅผ ์กธ์
ํ ํ์์ผ ์๋ฉธ์์ ์ฐ์์ ๊นจ๋ซ๋ค๋....! ์ฐธ์ผ๋ก ๋ถ๋๋ฌ์ด ์ผ์ด๋ค.
class CircularLinkedList<T>{
fileprivate var head: DoublyNode<T>?
fileprivate weak var tail: DoublyNode<T>?
deinit {
var currentNode = self.head
while(currentNode != nil){
currentNode?.nextNode = nil
currentNode = currentNode?.prevNode
}
}
...
}
์์ํ ๋๋ก, ๋ ธ๋๋ค์ด ์ ์์ ์ผ๋ก dealloc ๋์๋ค.
4. ํ๊ธฐ
myCLL = nil ์ผ ๋, ์๋ฉธ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ ๋ชจ๋ ๋
ธ๋๋ค์ด ๋จ๋ฒ์ dealloc ๋๋๋ก ํ์ง ๋ชปํ๊ฒ์ ํฐ ์์ฌ์์ด ๋จ๋๋ค.
๋ง์ฝ, ์ด ํด๋์ค๋ก ๊ตฌํ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ 1์ฒ๋ง๋ช
์ ๋ฐ์ดํฐ์ ๋ํด ๊ด๋ฆฌํ๋ ์ฝ๋์๋ค๋ฉด..? ์๋ฒ์ปดํจํฐ๋ฅผ ์ ๋ง ๋ง์ด ์ฌ๋ถํ
ํ์ด์ผ๊ฒ ์ง...
์ทจ์
์ ์ค๋นํ๋ฉฐ, Swift๋ฅผ ๊ธฐ์ด๋ถํฐ ๋ค์ ๋ค์ง๋ ๊ณผ์ ์์ ๊ทธ๋์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ถ๋ถ๋ค๋ ์ต๋ํ๋ ค ํ์ฐ๊ณ ์๋ค.
๊ทธ๋์ ์ง๋์ณค๋ ๊ฒ๋ค์ ๋ํ ์ค์์ฑ์ ๊น์ด ๊นจ๋ซ๋๋ค. ์ญ์ ๊ธฐ์ด๋ ์ฌ์ด๊ฒ ์๋๋ผ ์ค์ํ ๊ฒ์ด๋ค.
์์ผ๋ก ๊ณต๋ถํ ๊ฒ๊ณผ ๊ฒฝํํ ๊ฒ๋ค์ ๊ธฐ๋๊ฐ์ด ์๊ธด๋ค!
'learnings > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/Swift] URLProtocol์ ์ฌ์ฉํด ๋คํธ์ํน์ ํ ์คํธํด๋ณด์ (2) | 2024.10.16 |
---|---|
[iOS/Swift] ๋ทฐ ์ขํ๊ณ์ UIView.Frame (2) | 2024.08.26 |
[iOS/Swift] ์ธ์คํด์ค์ ์ํ ์ฐธ์กฐ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์ (0) | 2024.03.21 |
[iOS/Swift] TableView์์ SnapScroll (magnetic scroll) ๊ตฌํ (0) | 2023.01.20 |
[iOS/Swift] #1-2 ๋์ ์ฒซ ํ ์ดํ๋ก์ ํธ (0) | 2021.09.23 |