# ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌ์กฐ
ํ์ : BMO๐ค, Serena๐ท
### ๋ฉ๋ชจ๋ฆฌ์ ๊ตฌ์กฐ
#### Q. ์ปดํจํฐ์ ์ฃผ๊ธฐ์ต์ฅ์น๋ ์ด๋ค์ด๋ค ์์ญ์ ๊ฐ์ง๊ณ ์์๊น?
์ปดํจํฐ์ ์ฃผ๊ธฐ์ต์ฅ์น๋?
- CPU์ ์ง์ ์๋ฃ๋ฅผ ๊ตํํ ์ ์๋ ์ฅ์น.
- ๊ธฐ๋ณธ์ ์ธ ๋ช
๋ น์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ต.
- RAM / ROM๋ก ๊ตฌ์ฑ
**RAM(Random Access Memory)**
: ์์ ๊ธฐ์ต ์ฅ์น. ์ฐพ๋ ์๋ฃ ์์น๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฐพ์๊ฐ๋๊ฒ ์๋๋ผ ์ด๋ ํน์ ์์น์ ์ง์ ์๋ฃ๋ฅผ ๊ฒ์ํ๊ณ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค. CPU๋ฅผ ๋์ ๋ช
๋ น ์ฒ๋ฆฌ๋ฅผ ๋์์ฃผ๋ฉฐ, ์ปดํจํฐ์ ํ๋์ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ ๋ค์ ํ์ํ ๋ ๋น ๋ฅธ ์๋๋ก ๊ธฐ์ต์ ๋ถ๋ฌ์จ๋ค.
ํต์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ๋ณดํต ๊ธฐ์ต์ฅ์น์ ์๋ ์ฃผ๊ธฐ์ต์ฅ์น, ํนํ๋ RAM์ ์๋ฏธํ๋ค. ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ํ๊ธฐ ์ํด์ ์ด์์ฒด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ(RAM)์ ๋ฐ์ดํฐ ๋ฐ ๋ช
๋ น์ด๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ ํ ๋นํ์ฌ ์ค๋ค.
**ROM(Read Only Memory)**
: ์ฝ๊ธฐ ์ ์ฉ ๊ธฐ์ต ์ฅ์น. ์ปดํจํฐ์ ์ ์์ด ๋์ด์ ธ๋ ๋ด์ฉ์ด ์ ์ง๋๋ฉฐ, ์ปดํจํฐ ๊ธฐ๋ณธ ์ด์ ์ฒด์ ๊ธฐ๋ฅ์ด๋ ์ธ์ดํด์์ฅ์น(interpreter)๋ฅผ ๋ด์ฅํ๊ณ ์๋ค. ๋ด์ฉ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด์ ๊ณ ์ณ์ฐ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ **์ฝ๋(code)**, **๋ฐ์ดํฐ(data)**, **์คํ(stack)**, **ํ(heap)** ์์ญ์ผ๋ก ๊ตฌ์ฑ๋๋ค.

**code ์์ญ**
: ์ฌ์ฉ์๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ `ํจ์๋ค์ ์ฝ๋`๊ฐ CPU์์ ์ํํ ์ ์๋ ๊ธฐ๊ณ์ด ๋ช
๋ น ํํ๋ก ๋ณํ๋์ด ์ ์ฅ๋๋ ๊ณต๊ฐ. ์ปดํ์ผ(compile) ํ์์ ๊ฒฐ์ ๋๊ณ ์ค๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๊ฟ ์ ์๊ฒ Read-Only ๋ก ๋์ด์๋ค.
**data ์์ญ**
: ์ ์ญ ๋ณ์ ๋๋ static ๋ณ์ ๋ฑ `ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ`๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ. ์ ์ญ ๋ณ์ ๋๋ static ๊ฐ์ ์ฐธ์กฐํ ์ฝ๋๋ ์ปดํ์ผ์ด ์๋ฃ๋๋ฉด data ์์ญ์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํค๋๋ก ๋ฐ๋๋ค. ์ ์ญ๋ณ์๊ฐ ๋ณ๊ฒฝ ๋ ์๋ ์์ด Read-Write๋ก ๋์ด์๋ค. Swfit์ ๊ฒฝ์ฐ static์ ๊ธฐ๋ณธ ๋์์ด lazy์ด๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ ์คํ๊ณผ ๋์์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋์ง๋ ์๊ณ ๊ฐ์ ์ ๊ทผํ ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๋ ๊ฒ์ผ๋ก ์์ํ๋ค.

**stack ์์ญ**
: ํธ์ถ๋ ํจ์์ ์ํ์ ๋ง์น๊ณ ๋ณต๊ทํ ์ฃผ์ ๋ฐ ๋ฐ์ดํฐ(์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด๊ฐ ๋ฑ)๋ฅผ ์์๋ก ์ ์ฅํ๋ ๊ณต๊ฐ. ์ด ์์ญ์ ํจ์ ํธ์ถ์ ๊ธฐ๋กํ๊ณ ํจ์์ ์ํ์ด ์๋ฃ๋๋ฉด ์ฌ๋ผ์ง๋ค. stack์ LIFO(Last In First Out) ๋ฐฉ๋ฒ์ ๋ฐ๋ฅธ๋ค. ์ปดํ์ผ ์ stack ์์ญ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฌดํ์ ํ ๋น ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฌ๊ทํจ์๊ฐ ๋ฐ๋ณตํด์ ํธ์ถ๋๊ฑฐ๋ ํจ์๊ฐ ์ง์ญ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ณผํ ์ ๋๋ก ๋๋ฌด ๋ง์ด ๊ฐ์ง๊ณ ์๋ค๋ฉด `stack overflow`๊ฐ ๋ฐ์ํ๋ค. -> Struct
์ฐ๋ ๋๋ณ๋ก ๊ฐ๋ณ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ
**heap ์์ญ**
: ํ๋ก๊ทธ๋๋จธ๊ฐ ํ์ํ ๋๋ง๋ค ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ. ์๋ฐ์์๋ ๊ฐ์ฒด๊ฐ heap์์ญ์ ์์ฑ๋๊ณ GC์ ์ํด ์ ๋ฆฌ๋๋ค. Swift์์๋ ์ฐธ์กฐ ํ์
์ ๊ฐ์ด heap ์์ญ์ ํ ๋น๋๊ณ ARC์ ์ํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์ ๋๋ค. heap ์์ญ์ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ๋๊ณ ๋ฐํ์๋ ์คํ๋๋ค. heap์ ์์ ์ ์์ญ ์ธ๋ก ํ์ฅํ๋ ค๊ณ ํ๋ฉด `heap Overflow`๋ผ๋ ๊ฒ์ด ๋ฐ์ํ๋ค. -> class
์ฐ๋ ๋๋ผ๋ฆฌ ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ

### ARC
#### Q. ARC๋ ๋ฌด์์ธ๊ฐ?
`Automatic Reference Counting`
: ๊ฐ์ฒด์ ๊ทธ์ ์ฐ๊ด๊ด๊ณ์ ๋ผ์ดํํ์ ์๋ช
์ ๋ชจ๋ธ๋ง. Swift์์ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ๋ฅ. ์๋์ผ๋ก ์ฐธ์กฐ ํ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๊ณ ARC๊ฐ ์์์ ๋์ด์ ์ฌ์ฉํ์ง ์๋ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์งํ๋ค. ํ์ง๋ง ๋ช๋ช์ ๊ฒฝ์ฐ ARC์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฝ๋์ ํน์ ๋ถ๋ถ์ ๋ํ ๊ด๊ณ์ ๋ํ ์ ๋ณด๋ฅผ ํ์๋ก ํ๋ค. ์ฐธ์กฐ ํ์๋ ํด๋์ค ํ์
์ ์ธ์คํด์ค์๋ง ์ ์ฉ๋๊ณ ๊ฐ ํ์
์ธ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ์๋ ์ ์ฉ๋์ง ์๋๋ค.
#### Q. ARC ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ด๋ ์๊น?
`MRC(Manual Reference Counting)`์ผ๋ก ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํ ๋น/ํด์ ํด์ฃผ์๋ค.
์ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ํด `retain`, ํด์ ๋ฅผ ์ํด `release` ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
#### Q. ARC๋ฅผ ์ดํดํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์๋ฌด์์ด ์์๊น?
ARC์ ์ฅ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํธ์์ฑ, ์์ ์ฑ ๋ฑ์ ๊ผฝ์ ์ ์๋ค. ์ด๋ฌํ ์ฅ์ ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ARC์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ๋ค.
1. ํธ๋ฆฌํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
ARC๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ๊ฐ์ฒด์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ง์ ์ถ์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ ํด์ ํ๋ ์์
์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ก์จ ๊ฐ๋ฐ์๋ ๋ ์์ ํ๊ณ ํธ๋ฆฌํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค. ARC๋ฅผ ์ดํดํ๊ณ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์
์ ๋ ์ง์คํ ํ์ ์์ด ์ฝ๋ ์์ฑ์ ์ง์คํ ์ ์๋ค.
2. ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
ARC๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ถ์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ ๋น ๋ฐ ํด์ ํ๋ค. ๊ฐ๋ฐ์๋ ๋ช
์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์
์ ์ํํ์ง ์์๋ ๋๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ๊ณ์ํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ณ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๊ฐ ๋์ด๋๋ ํ์์ด๋ค. ARC๋ฅผ ์ดํดํ๊ณ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ค์ผ ์ ์๋ค.
3. ๋๊ธ๋ง ํฌ์ธํฐ ๋ฐฉ์ง
ARC๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ ์กด์ฌํ๋ ๋์์๋ง ํด๋น ๊ฐ์ฒด๋ฅผ ์ ์งํ๋ค. ์ฐธ์กฐ๊ฐ ๋ ์ด์ ์๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค. ์ด๋ฅผ ํตํด ๋๊ธ๋ง ํฌ์ธํฐ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๋๊ธ๋ง ํฌ์ธํฐ๋ ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ๋ก, ํ๋ก๊ทธ๋จ์ ์์ ์ฑ๊ณผ ์ ํ์ฑ์ ์ ํ์ํฌ ์ ์๋ ์ค๋ฅ์ด๋ค.
> ๋๊ธ๋ง ํฌ์ธํฐ(dangling pointer)
> ๋ ์ด์ ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ
#### Q. ์ธ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ํํ๊ณ ์ธ์ ํด๋์ค๋ฅผ ์ ํํด์ผํ ๊น?
๊ตฌ์กฐ์ฒด์ ๊ฐ ํ์
, ํด๋์ค๋ ์ฐธ์กฐํ์
์ด๋ค. ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์ฐธ์กฐ ํ์
์ ์๋์น ์์ ๊ณต์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ ํ์
์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์ฐธ์กฐ ํ์
(Class)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ARC๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
> ์๋์น ์์ ๊ณต์ : ์ํ ์ฐธ์กฐ, ์ด ํด๋์ค๋ฅผ ์ฐธ์กฐํ๋ฉด์ ์๊ธฐ์น ์๊ฒ ๊ฐ์ด ๋ฐ๋ ์ ์๋ค.
- ๊ฐ ํ์
: Struct, Enum
- ์ฐธ์กฐ ํ์
: Class
### ๐ ์ฐธ๊ณ ๋งํฌ
- [๐ Apple Docs - ARC](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/automaticreferencecounting/)
- [๐ Apple Docs - Choosing Between Structures And Classes](https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes)
- [๐ Blog - iOS ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ](https://babbab2.tistory.com/26)
overHead????