Swift
0. ๋ณ์์ ์์
1.๋ณ์์ ์์์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
๋ณ์๋ ์ ์ธ ์ดํ์๋ ๊ฐ์ ๊ณ์ํด์ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ์์๋ ์ ์ธ ์ดํ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค
Swift์์ ๋ณ์๋ var ์์๋ let์ผ๋ก ์ ์ธํฉ๋๋ค
var๋ ์ฐธ์กฐํ๊ณ ์๋ ์ฃผ์๊ฐ์ ๋ฐ๊ฟ ์ ์์ง๋ง, let์ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ธฐ๋ ํฉ๋๋ค
1+. ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค๋๊ฒ ์ ํํ ์ด๋ค ์๋ฏธ์ธ๊ฐ์?
class Some {
var num : Int
init(num: Int) {
self.num = num
}
}
let a = Some(num: 10)
let b = Some(num: 20)
var c = Some(num: 30)
๋ค์๊ณผ ๊ฐ์ ์ธ์คํด์ค๊ฐ ์์ ๋ ์์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ ํ์๋ฅผ ํ ์ ์์ต๋๋ค
a = b
a = c
b = a
b = c
class๋ ์ฐธ์กฐํ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ณ์์ ์์์๋ ์ฃผ์๊ฐ(==ํฌ์ธํฐ)์ด ๋ค์ด์์ต๋๋ค.
์ฆ, ์์๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์ฃผ์์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค๋ ์๋ฏธ๋ก ํด์๋ฉ๋๋ค
์๋์ ๊ฐ์ ํ์๋ ์ฐธ์กฐ ์ฃผ์๊ฐ์ด ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค
a.num = b.num
b.num = c.num
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ ํ์๋ c๊ฐ ์ฐธ์กฐํ๊ณ ์๋ a๊ฐ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค
c = a
2: ํ์
์ถ๋ก ์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
๋ณ์์ ์์๋ ํ์ ์ ๋ช ์ํ ์๋ ์๊ณ ์๋ตํ ์๋ ์์ต๋๋ค.
ํ์ ์ ์๋ตํ๋๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ถ๋ก ๊ณผ์ ์ ๊ฑฐ์ณ ํ์ ์ ์ง์ ํฉ๋๋ค
ํ์ ์ ์๋ตํ๋ ๊ฒฝ์ฐ ํ์ ์ถ๋ก ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์ ์ ๋ช ์ํ๋ ๊ฒ๋ณด๋ค ์ปดํ์ผ์ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค
1. Class / Struct
1. Class ์ Struct์ ์ฐจ์ด๋ฅผ ์ค๋ช
ํด ์ฃผ์ธ์
struct๋ value type์ด๊ณ class๋ reference type์ ๋๋ค
๊ทธ๋์ class๋ ARC๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค
class๋ ์์์ด ๊ฐ๋ฅํ์ง๋ง struct๋ ์์ํ ์ ์์ต๋๋ค
2. Class์ Struct์ ๊ณตํต์ ์ ์ค๋ช ํด ์ฃผ์ธ์.
ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค
์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ์ํ์ฌ ์ด๊ธฐํ๋ ๋์ ์ํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค
extension์ ํตํด ํ์ฅํ ์ ์์ต๋๋ค
ํ๋กํ ์ฝ์ ์ค์ํ ์ ์์ต๋๋ค
๊ฐํ์
๊ณผ ์ฐธ์กฐํ์
์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ '๋ฌด์์ด ์ ๋ฌ๋๋๋' ์
๋๋ค.
(๐ก ์ ๋ฌ : ํจ์์ ํ๋ผ๋ฏธํฐ๋ ์๋ก์ด ๋ณ์์ ํ ๋นํ๋ ๊ฒ)
๊ฐํ์
์ ์ ๋ฌํ ๋์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฌ์ธ์๋ฅผ ์ํ ์ธ์คํด์ค๊ฐ ์๋ก ์์ฑ๋ฉ๋๋ค. ์ฆ, ์ ๋ฌ๋๋ ๊ฐ์ด ๋ณต์ฌ ๋ฉ๋๋ค.
์ฐธ์กฐํ์
์ ์ ๋ฌํ ๋์๋ ์ธ์คํด์ค์ ์ฐธ์กฐ(์ฃผ์)๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
2+. ์ธ์ class๋ฅผ ์ฌ์ฉํ๊ณ , ์ธ์ struct๋ฅผ ์ฌ์ฉํ๋์?
Apple ๊ฐ์ด๋๋ผ์ธ์์ ๋ค์ ์กฐ๊ฑด ์ค ํ๋ ์ด์์ ํด๋นํ๋ค๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค
์ฐ๊ด๋ ๊ฐ๋จํ ๊ฐ์ ์งํฉ์ ์บก์ํํ๋ ๋ชฉ์ ์ผ ๋
ํ๋กํผํฐ๊ฐ ๊ฐ ํ์ ์ด๊ณ ์ฐธ์กฐ๋ณด๋ค ๋ณต์ฌํ๋ ๊ฒ์ด ํฉ๋นํ ๋
์์ํ ํ์๊ฐ ์์ ๋
์ฆ, ์์ ๊ด๊ณ๋ฅผ ํ์๋ก ํ๊ฑฐ๋ ๊ฐ์ฒด์ ๊ฐ์ด ๊ณ์ ๊ฐ๊ณต๋๋๊ฒฝ์ฐ์๋ class๊ฐ ๋ ์ ๋ฆฌํฉ๋๋ค
3. Swift์ ๋ณต์ฌ ๋ฐฉ๋ฒ์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
swift๋ COW๋ฐฉ์์ ์ฌ์ฉํด์ ๊ฐํ์ ์ ๋ณต์ฌํฉ๋๋ค
COW๋ ์๋ณธ๊ณผ ๋ณต์ฌ๋ณธ ์ค ์์ ๋๊ธฐ ์ ๊น์ง๋ ๋ณต์ฌ๋ฅผ ํ์ง ์๊ณ ์๋ณธ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ค๊ฐ, ๋ ์ค ํ๋์์ ์์ ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ๋ณต์ฌํ๋ ์์ ์ ํฉ๋๋ค
๊ทธ๋์ COW๋ฅผ ์ฌ์ฉํ๋ ํ์ ์์ ๋ณต์ฌ ํ ์ฒซ๋ฒ์งธ ์์ ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ์๋ COW์ ์ํด ์ฝ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํต๋๋ค
๋ชจ๋ value type์์ ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ collection type์ ๋ณต์ฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
3+. ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋๋ฐ COW๋ฅผ ์ ์ฌ์ฉํ๋๊ฑธ๊น์?
swift์ COW๋ ์๊ฐ๊ณผ ๊ณต๊ฐ ์ค์ ๊ณต๊ฐ์ ํจ์จ์ ์ ํํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ค์ ๋ก ๊ฐ์ ๋ณต์ฌ๋ง ์ผ์ด๋๊ณ ์์ ์ด ์ผ์ด๋์ง ์๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ์ค์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
๐ ๋ฆฌ์์ค ๊ณต์
COW์ ๋ฆฌ์์ค ๊ณต์ ์ class์ ์ฐธ์กฐ๋ ์กฐ๊ธ ๋ค๋ฅธ ๊ฒฝํฅ์ ๊ฐ์ง๋๋ค
class ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ๋์๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ '๊ฐ์ ์ธ์คํด์ค์ ์ฃผ์๊ฐ'์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค
COW์ ๋ฆฌ์์ค ๊ณต์ ๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฅดํค๊ณ ์์ต๋๋ค
์๋ฅผ๋ค์ด b๊ฐ a๋ฅผ ๋ณต์ฌํ ๊ฒฝ์ฐ์๋ ์์ ์ด ์ผ์ด๋๊ธฐ ์ ๊น์ง๋ b๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ง ์๊ณ a์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค
๋ค์ ๋งํ๋ฉด,
class์ a์ b๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ๋์ง๋ง ๊ทธ ๋ฉ๋ชจ๋ฆฌ์๋ ๊ฐ์ '์ฃผ์๊ฐ'์ด ๋ด๊ฒจ ์์ต๋๋ค
collection type์ a์ b๋ ์๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ '๋ฐ์ดํฐ'์
๋๋ค
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด b๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ๊ณ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ํ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค
(์ฐธ๊ณ : https://nsios.tistory.com/56)
๐ collection type
Array, Set, Dictionary
Copy On Write๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง ์ค๋ช ํ์์ค. Comment
ํ๋ก๊ทธ๋๋ฐ์์ ๋ณต์ฌ ๋์์ ํ ๋, ์ค์ ์๋ณธ์ด๋ ๋ณต์ฌ๋ณธ์ด ์์ ๋๊ธฐ ์ ๊น์ง๋ ๋ณต์ฌ๋ฅผ ํ์ง ์๊ณ ์๋ณธ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ค๊ฐ, ์๋ณธ์ด๋ ๋ณต์ฌ๋ณธ์์ ์์ ์ด ์ผ์ด๋ ๊ฒฝ์ฐ, ๊ทธ๋ ๋ณต์ฌ ์์ ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ณต์ฌ๋ ํ์ผ๋, ์์ ์ ์งํํ์ง ์๋ ๊ฒฝ์ฐ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ ๋๋ค.
4. class์ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํด์ฃผ์ธ์
final
์์๋์ง ์๋ ํด๋์ค์ final์ ๋ถ์ด๋ฉด ๋ฉ์๋๊ฐ Static Dispatch๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ์ค์ด ์ฑ๋ฅ์ด ํฅ์ ๋ฉ๋๋ค
ํด๋์ค๋ ์์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ด Dynamic Dispatch๋ฅผ ์ฌ์ฉํฉ๋๋ค
ํ์ง๋ง final ํค์๋๋ฅผ ๋ถ์ด๋ฉด ํด๋์ค์ ์์์ด ๋ถ๊ฐ๋ฅํ์ฌ ๋ฉ์๋์ ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ถ๊ฐ๋ฅํด์ ธ Static Dispatch๋ฅผ ์ฌ์ฉํฉ๋๋ค
Dynamic Dispatch๋ ๋ฐํ์์ ์คํํ ๋ฉ์๋๋ฅผ ๊ฒฐ์ ํ๊ณ , Static Dispatch๋ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค
๋ํ private ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฐธ์กฐํ ์ ์๋ ๊ณณ์ด ํ์ฌ ํ์ผ๋ก ์ ํ ๋๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๋ ์๋์ ์ผ๋ก private ํค์๋๊ฐ ์ฐธ์กฐ๋ ์ ์๋ ๊ณณ์์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋๋์ง ์๋๋์ง ํ๋จ ๊ฐ๋ฅํ๋ค. Comment
์ฝ๊ฒ ๋งํด privateํค์๋๊ฐ ์๋ ๊ฐ์ฒด๋ final ํค์๋๊ฐ ์๋๋ผ๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ง ์๊ณ ์๋ค๋ฉด, ์๋์ ์ผ๋ก static dispatch๋ก ๋์ํ๋ค.
๐ Dynamic Dispatch
- class๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ ํด๋์ค์ ํ์ ํด๋์ค ์ค ์ด๋๋ฅผ ์ฐธ์กฐํด์ผํ ์ง๋ฅผ ๋ฐํ์ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค
- ๋ฐํ์ ๊ณผ์ ์์ vTable์์ ํจ์๋ฅผ ์ฐพ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ '์ฝ๊ณ ' ๊ทธ ์ฃผ์๋ก '์ ํ' ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํด๊ฐ ๋ฐ์ํฉ๋๋ค
๐ vTable
- ์ ์ : ๋์คํจ์น๋ฅผ ์ง์ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ
- ํด๋์ค ๋ง๋ค ๊ฐ์ง๊ณ ์๋ ๊ฐ์ํ
์ด๋ธ์ ๋งํ๋ฉฐ ๋ฉ์๋๋ค์ ํฌ์ธํฐ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค
- ํ์ ํด๋์ค๋ ์์ ํด๋์ค์ vTable ๋ณต์ฌ๋ณธ์ ๊ฐ์ง๊ณ , ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๊ฒฝ์ฐ์๋ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํจ์ ํฌ์ธํฐ๋ก ์ ์ฅ๋ฉ๋๋ค
5. Dispatch๊ฐ ๋ญ๋ฐ์?
Dispatch๋ ์ด๋ค ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ์ฌ, ๊ทธ๊ฒ์ ์คํํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. Static, Dynamic ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค
Static Dispatch๋ ํธ์ถํ ํจ์๋ฅผ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ํฉ๋๋ค. Dynamic Dispatch๋ ํธ์ถํ ํจ์๋ฅผ ๋ฐํ์์ ๊ฒฐ์ ํฉ๋๋ค
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐํ์ ์ Static Dispatch๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฐธ์กฐํ์ ์์ ์ด๋ค Dispatch๋ฅผ ์ ํํ๋์ง๋ ์ค๋ฒ๋ผ์ด๋ฉ ๊ฐ๋ฅ์ฑ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค
๊ทธ๋์ final ํค์๋๋ฅผ ๋ถ์ด๋ฉด Static Dispatch๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๊ฒ ์ ๋๋ค
WMO
Whole Module Optimization์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค
WMO๋ ๋ชจ๋ ์ ์ฒด๋ฅผ ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ์ปดํ์ผํ์ฌ internal level์ ๋ํด์ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ง ์๋ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก final์ ๋ถ์ฌ์ ์ปดํ์ผ ํฉ๋๋ค
์ด๋ ๊ฐ๋ฐ์๊ฐ ๋ฐ๊ฒฌํ์ง ๋ชปํ ์์๋์ง ์๋ ํด๋์ค์ ๋ํด Dynamic Dispatch์ ์ฌ์ฉ์ ์ค์ฌ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค
๐ค WMO์ํ๋ฉด ์ ์๋์ผ๋ก final์ ๋ชป๋ถ์ฌ์ฃผ๋๊ฑธ๊น?
- ๊ธฐ๋ณธ์ ์ผ๋ก swift๋ ํ์ผ์ ํ๋์ฉ ์ปดํ์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ํ์ผ์์ ํด๋์ค๋ฅผ ์์ํ๋์ง ์ปดํ์ผ ํ์์ ์ ์ ์์ด์ final์ ๋ถ์ผ ์ ์์ต๋๋ค
6. swift์ ํ์
์บ์คํ
์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์
swift์ ํ์ ์บ์คํ ์ ํ์ ์ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋ ์ฌ์ฉ ๋ฒ์๋ฅผ ์ ํํ์ฌ ๋ค๋ฅธ ํ์ ์ฒ๋ผ ํ์ธํ ์ ์๋๋ก ํฉ๋๋ค
์ ์บ์คํ ์ ํ์ํด๋์ค๊ฐ ์์ํด๋์ค ํ์ ์ผ๋ก ์ ํํ๋ ๊ฒ์ด๊ณ , ๋ค์ด์บ์คํ ์ ์์ํด๋์ค๊ฐ ํ์ํด๋์ค ํ์ ์ผ๋ก ์ ํํ๋ ๊ฒ์ ๋๋ค
์ ์บ์คํ ์ ํ๋ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ์ ํ์ด ๊ฐ๋ฅํ๋ฏ๋ก as๋ฅผ ์ฌ์ฉํฉ๋๋ค
๋ค์ด์บ์คํ ์ ํ๋ ๊ฒฝ์ฐ์๋ ์คํจ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก as? ๋๋ as! ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ๋ค ๋ฐํ์์ ์บ์คํ ํฉ๋๋ค
as?๋ ์ต์ ๋์ด ๋ฐํ๋ฉ๋๋ค. as!๋ ์ต์ ๋์ด ๊ฐ์ ์ถ์ถ๋๋ฏ๋ก ๋ค์ด์บ์คํ ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค
6+. ์บ์คํ ํ๋ฉด ํ์ ์ด ๋ฐ๋์ง ์๋์?
์๋ฅผ๋ค์ด class Person {}, class Student: Person {}๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค
let student = Student() as Persen์ ํ๋ ๊ฒฝ์ฐ์๋ ์ ์บ์คํ ๋์ด Student์์ ์๋ก ๋ง๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค
ํ์ง๋ง type(of: student)๋ ์ฌ์ ํ Student์ ๋๋ค. ์ฆ, type์ด ๋ฐ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฒ์๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค
2. ์ ๊ทผ์ ์ด์
1. ์ ๊ทผ ์ ์ด์์ ์ข
๋ฅ์ ์ด๋ค๊ฒ ์๋์ง ์ค๋ช
ํด์ฃผ์ธ์
์ ๊ทผ์ ์ด๋ ์ ๊ทผ์์ค ํค์๋๋ฅผ ํตํด ๊ตฌํํ ์ ์์ต๋๋ค. ์ ๊ทผ์์ค ํค์๋๋ open, public, internal, fileprivate, private ๋ค์ฏ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
ํค์๋ ์ค์์ open์ ํด๋์ค์ ํด๋์ค์ ๋ฉค๋ฒ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๊ทผ ์์ค์๋ ๊ท์น์ด ์๋๋ฐ ์์์์๋ณด๋ค ํ์์์๊ฐ ๋ ๋์ ์ ๊ทผ ์์ค์ ๊ฐ์ง ์ ์์ต๋๋ค.
2. open๊ณผ public ํค์๋์ ์ฐจ์ด๋ฅผ ์ค๋ช
ํด๋ณด์ธ์
open๊ณผ public์ ์ธ๋ถ ๋ชจ๋๊น์ง ์ ๊ทผ์ ํ์ฉํ๋ค๋ ๊ณตํต์ ์ด ์์ต๋๋ค
open์ ๋ชจ๋ ์ธ๋ถ์์ ์์ํ๊ฑฐ๋ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์์ต๋๋ค. ๋จ, ํด๋์ค์ ํด๋์ค ๋ฉค๋ฒ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค
public์ ๋ชจ๋ ์ธ๋ถ์์ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ์ ๋ชจ๋ ๋ด์์๋ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ ์ ์์ต๋๋ค
3. fileprivate๊ณผ private ํค์๋์ ์ฐจ์ด๋ฅผ ์ค๋ช
ํด๋ณด์ธ์
fileprivate์ ๊ทธ ์์๊ฐ ๊ตฌํ๋ ์์คํ์ผ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์์ง๋ง, private์ ๊ธฐ๋ฅ์ ์ ์ํ๊ณ ๊ตฌํํ ๋ฒ์ ๋ด์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
class๋ struct๋ฅผ private์ผ๋ก ๋ง๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์๋์ ์ฝ๋๋ ์ ์ ๋์ํฉ๋๋ค.
private class A {
func someFunction(){
print("This is function")
}
}
private let a = A()
a.someFunction()
์ถ์ธกํ๊ฑด๋ฐ ๊ตฌํ์ฒด ์์ฒด์ private์ ๋ถ์ด๋ ๊ฒฝ์ฐ์๋ ๊ตฌํ์ฒด์ ์์์ธ 'ํ์ผ'์ ๊ตฌํ์ฒด๋ก ์ธ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ๋์ผํ ํ์ผ ๋ด์์๋ A ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฆ, fileprivate ์ฒ๋ผ ๋์ํฉ๋๋ค.
๊ทธ ๊ทผ๊ฑฐ๋ก ์์ ์ ๊ทผ ์์ค์ธ fileprivate ํด๋์ค๋ด์ private ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
fileprivate let a = A()
a.someFunction()
3. ์ด๋์
๋ผ์ด์
1 : Convenience init์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์
ํธ์ ์ด๋์ ๋ผ์ด์ ๋ ์ด๊ธฐํ๋ฅผ ์ข ๋ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค
ํธ์ ์ด๋์ ๋ผ์ด์ ๋ ๊ผญ!!! ์ง์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํด์ผํฉ๋๋ค -> self.init()
์ ๋ง ํธ์์ด๋์ ๋ผ์ด์ ๋ ๊ผญ!!! ์ง์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํด์ผํ ๊น์?
ํธ์ ์ด๋์ ๋ผ์ด์ ๋ ์ฌ๋ฌ๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค. ํธ์ init์ด ๋ค๋ฅธ ํธ์ init์ ํธ์ถํ ์๋ ์์ต๋๋ค
ํ์ง๋ง ์ต์ข ์ ์ผ๋ก ํธ์ถ๋๋ ํธ์ ์ด๋์ ๋ผ์ด์ ๋ ๊ผญ! ์ง์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๋ก ์ ์ผ๋ก ํธ์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํ๋ฉด ๋ง์ง๋ง์ ์ง์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค
ํธ์ ์ด๋์ ๋ผ์ด์ ๊ผญ ์จ์ผ ํ๋์?
์๋์! ํธ์ ์ด๋์ ๋ผ์ด์ ๋ ์ต์ ์ ๋๋ค
์ฐจ์ด์ ์ด ์๋ค๋ฉด ์ง์ ์ด๋์ ๋ผ์ด์ ๋ self.init์ ํธ์ถํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค
์ด๋ค ํด๋์ค์ ๋ค์๊ณผ ๊ฐ์ ์ ์ฅ ํ๋กํผํฐ์ ์ง์ ์ด๋์ ๋ผ์ด์ ๊ฐ ์์๋
var a : Int
var b : Int
var c : Int
init(a: Int, b: Int, c: Int) {
self.a = a
self.b = b
self.c = c
}
์๋์ ๋ ์ด๋์ ๋ผ์ด์ ๋ ๋๊ฐ์ด ๋์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋์ ๋ ์ด๋์ ๋ผ์ด์ ๋ ๋์์ ์ ์ธํ ์ ์์ต๋๋ค
init(a: Int) {
self.a = a
self.b = 0
self.c = 0
}
convenience init (a: Int){
self.init(a: a, b: 0, c: 0)
}
2 : required init์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
required init์ ์์๋ฐ์ ๋ชจ๋ ํ์ ํด๋์ค๋ค์ด ์ฌ์ ์ ํด์ผํ๋ ์ด๋์ ๋ผ์ด์ ์ ๋๋ค
ํ์ ํด๋์ค๊ฐ required init์ ๊ตฌํํด์ผํ๋ ๊ฐ์ ์ฑ์ด ์์ผ๋ฏ๋ก override ํค์๋๋ฅผ ๋ถ์ด์ง ์์ต๋๋ค
ํ์ ํด๋์ค์์ ์๋ฌด๋ฐ ์ด๋์ ๋ผ์ด์ ๋ ๊ตฌํํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์์ ํด๋์ค์ ์ด๋์ ๋ผ์ด์ ๊ฐ ์๋์์ ๋๋ฏ๋ก required init์ ๊ตฌํํ์ง ์์๋ ๋ฉ๋๋ค.
๋จ, ํ์ํด๋์ค์์ ์ด๋ ํ ์ข ๋ฅ์ ์ด๋์ ๋ผ์ด์ ๋ผ๋ ๊ตฌํํ๋ ๊ฒฝ์ฐ์๋ ์๋์์ ๋์ง ์์ผ๋ฏ๋ก required init์ ํจ๊ป ๊ตฌํํด์ผ ํฉ๋๋ค
โญ๏ธ convenience init, required init์ **class ์ด๋์
๋ผ์ด์ ** ์
๋๋ค!
3 : class์ ์ด๊ธฐํ ์งํ ๊ณผ์ ์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
swift์ ํด๋์ค ์ด๊ธฐํ๋ 2๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค
1๋จ๊ณ : ํด๋์ค์ ์ ์ํ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊น๊ฐ์ด ํ ๋น๋ฉ๋๋ค
2๋จ๊ณ : ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ ์ํ๊ฐ ๊ฒฐ์ ๋๋ฉด ์ฌ์ฉ์ ์ ์ํ ๊ธฐํ๋ฅผ ๊ฐ์ง๋๋ค
์ด๊ธฐํ ๋จ๊ณ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํ๊ธฐ์ ์ ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง์ ์ด๊ธฐํ๋ฅผ ์์ ํ๊ฒ ํ ์ ์๋๋ก ํฉ๋๋ค
์ปดํ์ผ๋ฌ๋ 2๋จ๊ณ ์ด๊ธฐํ๋ฅผ ์ค๋ฅ ์์ด ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค ๊ฐ์ง safety-checks๋ฅผ ํฉ๋๋ค
์์ํด๋์ค์ init์ด ๋ถ๋ชจํด๋์ค์ init์ ํธ์ถํ๊ธฐ ์ ์ ์์ ์ ํ๋กํผํฐ๋ฅผ ๋ชจ๋ ์ด๊ธฐํ ํ๋์ง ํ์ธํฉ๋๋ค
class Perents {
var home : String
var firstName : String
init(home: String, firstName: String) {
self.home = home
self.firstName = firstName
}
}
class Child : Perents {
var lastName : String
var age : Int
โ
init(lastName: String, age: Int) {
super.init(home: "ํ๊ฐ๋ทฐ", firstName: "๊น")
self.lastName = lastName
self.age = age
}
โญ๏ธ
init(lastName: String, age: Int) {
self.lastName = lastName
self.age = age
super.init(home: "ํ๊ฐ๋ทฐ", firstName: "๊น")
}
}
์์ํด๋์ค์ init์ ์์๋ฐ์ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๊ธฐ ์ ์ ๋ฐ๋์ ๋ถ๋ชจํด๋์ค์ init์ ํธ์ถํด์ผํฉ๋๋ค
init(lastName: String, age: Int) {
self.lastName = lastName
self.age = age
self.home = "๊ฐ๋จ" โ
super.init(home: "ํ๊ฐ๋ทฐ", firstName: "๊น")
self.home = "๊ฐ๋จ" โญ๏ธ
}
ํธ์ ์ด๋์ ๋ผ์ด์ ๋ ๊ทธ ์ด๋ค ํ๋กํผํฐ๋ผ๋ ๊ฐ์ ํ ๋นํ๊ธฐ ์ ์ ๋ค๋ฅธ init์ ํธ์ถํด์ผ ํฉ๋๋ค
convenience init(age: Int){
self.age = 20 โ
self.home = "ํ๊ฐ๋ทฐ" โ
self.init(lastName: "ํ๊ธธ๋", age: age)
self.age = 20 โญ๏ธ
self.home = "ํ๊ฐ๋ทฐ" โญ๏ธ
}
์ด๊ธฐํ 1๋จ๊ณ๋ฅผ ๋ง์น๊ธฐ ์ ๊น์ง ์ด๋์ ๋ผ์ด์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ํ๋กํผํฐ ๊ฐ์ ์ฝ์ ์ ์์ต๋๋ค.
init(lastName: String, age: Int) { sayHello() โ //ํ๋กํผํฐ์ ๊ฐ ํ ๋น ์ ์ด๋ฏ๋ก 1๋จ๊ณ ์ ์ self.lastName = lastName self.age = age super.init(home: "ํ๊ฐ๋ทฐ", firstName: "๊น") sayHello() โญ๏ธ //๋์ ์์์ ์๋ ๋ชจ๋ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋น ํ์ผ๋ฏ๋ก 1๋จ๊ณ ๋ง์นจ } func sayHello(){ print("hello") }
4. deinit์ ์ธ์ ์ฌ์ฉํ ๊น์?
ํด๋์ค ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ํด๋์ค ์ธ์คํด์ค์ ๊ด๋ จํ์ฌ ์ ๋ฆฌํ๋ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค
deinit ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค
์ธ์คํด์ค๊ฐ ํด์ ๋ ๋ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋๊ฐ์ ๋ณด๋ด์ฃผ๊ฑฐ๋ ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค
4. Extension
1 : Extension์ ๋ํด ์ค๋ช
ํ์์ค.
extension์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, ํ๋กํ ์ฝ ํ์ ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค
๊ธฐ์กด์ ์๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ ์ ์์ต๋๋ค
ํ๋กํผํฐ๋ ์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ์ฐ์ฐ ํ๋กํผํฐ๋ง ์ ์ํ ์ ์์ต๋๋ค. ๋ฉ์๋๋ ์์ ๋กญ๊ฒ ์ ์ํ ์ ์์ต๋๋ค
deinit์ ์ ์ํ ์ ์๊ณ init์ class์ ๊ฒฝ์ฐ์๋ ํธ์ ์ด๋์ ๋ผ์ด์ ๋ง ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ฐํ์ ์ ๊ฒฝ์ฐ์๋ ๋ฐ๋ผ ์ง์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๐ ๊ฐํ์
์์ extension์ ํตํด ์ง์ ์ด๋์
๋ผ์ด์ ๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ
- ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ๊ธฐ๋ณธ๊ฐ์ด ์์ด์ผ ํฉ๋๋ค
- ํ์
๋ด์ ๊ธฐ๋ณธ ์ด๋์
๋ผ์ด์ ์ ๋ฉค๋ฒ์์ด์ฆ ์ด๋์
๋ผ์ด์ ์ธ์ ์ฌ์ฉ์ ์ ์ ์ด๋์
๋ผ์ด์ ๊ฐ ์์ด์ผ ํฉ๋๋ค
5. ๋ฐ์ดํฐํ์
1. Optional์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์
์ต์ ๋์ ๊ฐ์ด ์์ ์๋, ์์ ์๋ ์์์ ๋ํ๋ด๋ ์ค์ํํธ์ ํน์ง ์ค ํ๋๋ก ์์ ์ฑ์ ๊ฐ์กฐํฉ๋๋ค
๐ ์ต์
๋์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ๋ฐ์ดํฐ ํ์
๋ค์ **๋ฌผ์ํ**๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค (var optinal : String?)
- **Optional**<Wrapped>์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค (var optional : Optional<String>)
์ต์ ๋์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ญ์ฃ ?
์ค์ํํธ์์ ์ต์ ๋์ด ์๋ ๋ณ์๋ ์์์๋ ๊ฐ์ด ์์์ ์๋ฏธํ๋ nil์ ํ ๋นํ ์ ์์ต๋๋ค
์ต์ ๋์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ณ์๋ ์์๊ฐ ๊ฐ์ด ์์ ์๋ ์์์ ์ง๊ด์ ์ผ๋ก ๋ฐ์๋ค์ผ ์ ์์ต๋๋ค
์๋ก ํจ์์ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์ ์ค ๊ตณ์ด ๋๊ธฐ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ์๋ ์ต์ ๋๋ก ์ ์ํ์ฌ ๊ฐ์ด ์์ด๋ ๊ด์ฐฎ์์ ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ค ์ ์์ต๋๋ค
์ต์ ๋์ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์?
์ต์ ๋์ ์ ๋ค๋ฆญ์ด ์ ์ฉ๋ ์ด๊ฑฐํ์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค
@frozen ํค์๋๋ type ๋ณ๊ฒฝ์ ์ ํ ํ๊ธฐ ๋๋ฌธ์ ์ต์ ๋์ case๊ฐ ์ถ๊ฐ ๋์ง ์์์ ๋ณด์ฅํฉ๋๋ค
@frozen public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
/// ์ค๋ต
}
์ต์ ๋์ ์ผ๋ฐ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์?
์ค์ํํธ์์ ์ ๊ณตํ๋ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ต์ ๋์ ๋ฒ๊ธธ ์ ์์ต๋๋ค
if let ๊ตฌ๋ฌธ๊ณผ guard let ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ๋์ ๋ฒ๊ธด ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค
์ต์ ๋ ๋ณ์๋ค์ ๋๋ํ๋ฅผ ๋ถ์ฌ ๊ฐ์ ์ถ์ถ ํ ์๋ ์์ต๋๋ค. ํ์ง๋ง, nil์ธ ๊ฒฝ์ฐ ๋ฐํ์ ์๋ฌ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์์์ ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค
๐ ์ต์
๋ ๋ฐ์ธ๋ฉ ๊ฐ์ ์ฌ์ฉ
- if let์ if๋ฌธ ๋ด๋ถ์์๋ง ์ต์
๋ ๋ฐ์ธ๋ฉํ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค
- guard let์ ์ต์
๋ ๋ฐ์ธ๋ฉ์ด ์ฑ๊ณต ํ๋ฉด ๊ทธ ์ดํ์ ์ฝ๋์์ ๋ณ์๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค
๐ ExpressibleByNilLiteral
- ์ด ํ๋กํ ์ฝ์ nil๋ก ํด๋น ํ์
์ ์ด๊ธฐํ ํ ์ ์๋ ์๊ฒฉ์๊ฑด์ ๋ช
์ํฉ๋๋ค
2 : enum์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์
์ด๊ฑฐํ์ ์ฐ๊ด๋ ํญ๋ชฉ๋ค์ ๋ฌถ์ด์ ํํํ ์ ์๋ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค
์ด๊ฑฐํ์ ๊ฐ๋ฐ์๊ฐ ์ ์ํ ํญ๋ชฉ ๊ฐ ์ด์ธ์๋ ์ถ๊ฐํ๊ฑฐ๋ ์์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค
์ด๊ฑฐํ์ ์ฌ์ฉํ ๋์๋ ์ (.)์ ํตํด์ case์ ์ ๊ทผํ ์ ์์ต๋๋ค
์ด๊ฑฐํ์ ์ฌ์ฉํ๋ฉด ์คํ๋ฅผ ์ค์ฌ์ค ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํฅ์ ์ํฌ ์ ์์ต๋๋ค
์์๊ฐ์ด๋ ์ฐ๊ด๊ฐ์ ์ฌ์ฉํ์ฌ ๋ํ ์ผํ ๊ฐ์ ์ ์ฅํ ์ ์์ต๋๋ค
enum์ ์์๊ฐ์ ๋ํด์ ์์ธํ ์ค๋ช ํด ์ฃผ์ธ์
case์ ์์๊ฐ์ ์ง์ ํด ์ค ์ ์๋๋ฐ, enum์ ์ ์ธํ ๋ ์ด๋ฆ ์์ ์์๊ฐ์ type์ ๋ช ์ํด์ฃผ์ด์ผ ํฉ๋๋ค
์์๊ฐ์ type์ Number, Character, String ์ธ๊ฐ์ง๋ง ๊ฐ๋ฅํฉ๋๋ค
์์๊ฐ์ type์ ๋ฐ๋ผ ์๋์ผ๋ก ์์ฑ๋๋ ๊ฒฝ์ฐ๋ ์๊ณ , ๋ชจ๋ ๋ช ์ํด์ฃผ์ด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค
์์๊ฐ์ rawValue๋ผ๊ณ ํ๋ ์์ฑ์ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค
enum Num : Int{
case zero
case one = 10
case two
case three
}
print(Num.two.rawValue) //11
๐ค ์์๊ฐ์ ์ธ์ ์๋ ์์ฑ๋ ๊น?
- ์ ์๊ฐ์ด ๋ค์ด ์๋ ๊ฒฝ์ฐ ์์ ์ ์ธ๋ ๊ฐ์์ +1 ์ฆ๊ฐ๋ ๊ฐ์ ์์ฑํฉ๋๋ค
- String์ ์์๊ฐ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ case์ด๋ฆ๊ณผ ๋์ผํ rawValue๋ฅผ ์์ฑํฉ๋๋ค
(detail : https://babbab2.tistory.com/116)
์ด๊ฑฐํ์ ์ฐ๊ด๊ฐ์ ๋ํด์ ์์ธํ ์ค๋ช ํด ์ฃผ์ธ์
์ฐ๊ด๊ฐ์ case์ ์กฐ๊ธ๋ ์์ธํ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ํํ ํํ๋ก ์ํ๋ ํ์ ์ ๋ช ์ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค
์ฐ๊ด๊ฐ์ ๋ชจ๋ case๊ฐ ๊ฐ์ ธ๊ฐ ํ๋ ๊ฒ์ ์๋๋ฉฐ ์ต์ ์ ๋๋ค
enum Apple {
case iPhone(model: String)
case iPad
case mackBook
}
var apple = Apple.iPhone(model: "14pro")
switch apple {
case .iPhone(model: "14pro"):
print("์ต์ ํ iPhone")
case .iPhone(model: let model):
print(model)
case .iPad:
print("iPad")
case .mackBook:
print("mackBook")
}
// ์ต์ ํ iPhone
3. Swift์ ์ปฌ๋ ์
ํ์
์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
์ปฌ๋ ์ ํ์ ์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. Swift์ ์ปฌ๋ ์ ํ์ ์๋ Array, Dictionary, Set์ด ์์ต๋๋ค
๋ฐฐ์ด์ ๊ฐ์ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ์ ์ฅํ๋ ์ปฌ๋ ์ ํ์ ์ ๋๋ค. ๋ค๋ฅธ ์์น์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ ์ ์์ต๋๋ค. Array๋ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ํ๋ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์์ , ์ญ์ ํ ์ ์์ต๋๋ค.
๋์ ๋๋ฆฌ๋ ์์ ์์ด ๋ฐ์ดํฐ๋ฅผ key-value ํํ๋ก ์ ์ฅํ๋ ์ปฌ๋ ์ ํ์ ์ ๋๋ค. ๋์ ๋๋ฆฌ์ key๊ฐ์ Hashable ํ๋กํ ์ฝ์ ๋ฐ๋ผ์ผํ๋ฉฐ ์ค๋ณต๋ ์ ์์ต๋๋ค.
์ธํธ๋ ๊ฐ์ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์์์์ด ํ๋์ ๋ฌถ์์ผ๋ก ์ ์ฅํ๋ ์ปฌ๋ ์ ํ์ ์ ๋๋ค. ์ธํธ ๋ด์ ๊ฐ์ ๋ชจ๋ ์ ์ผํ๋ฉฐ ์ค๋ณต๋ ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. Set๋ Hashable ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ฐ์ดํฐ ํ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๐ Swift์ Array๋ ๋ฒํผ์
๋๋ค.
ํ์์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ฃผ๋ฏ๋ก ์์์ ์ฝ์
๋ฐ ์ญ์ ๊ฐ ์์ ๋กญ์ต๋๋ค.
๐ Hashable ํ๋กํ ์ฝ
์ค์ํํธ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ ๋ชจ๋ Hashable ํ๋กํ ์ฝ์ ์ฑํํฉ๋๋ค.
Array๋ณด๋ค Set์ ์ฌ์ฉํ๋๊ฒ ๋ ์ข์ ๋๋ ์ธ์ ์ผ๊น์?
์์๊ฐ ์ค์ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต์์ด ๊ณ ์ ํ๊ฒ ๊ด๋ฆฌํ ๋๋ Set์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
Set์ ์ฝ์ , ์ญ์ , ์กฐํ๋ฅผ ๋ชจ๋ O(1) ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์๊ฐ ์ค์ํ์ง ์์ผ๋ฉด์ ์ญ์ ์ ์ฝ์ ์ด ๋น๋ฒํ ๋๋ Set์ด ๋ ์ข์ ์ ์์ต๋๋ค.
4 : Any์ AnyObject์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์
Any๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค. ๋ณ์๊ฐ Any ํ์ ์ผ๋ก ์ง์ ๋์ด ์๋ค๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์ ํ ๋นํ ์ ์์ต๋๋ค
AnyObject๋ Any๋ณด๋ค ์กฐ๊ธ ํ์ ๋ ์๋ฏธ๋ก ํด๋์ค์ ์ธ์คํด์ค๋ง ํ ๋นํ ์ ์์ต๋๋ค
Any๋ก ์ ์ธ๋ ๋ณ์์ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋งค๋ฒ ํ์ ํ์ธ ๋ฐ ๋ณํ์ ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค
Swift๋ ํ์ ์ ์๊ฒฉํ ์ธ์ด๋ผ๋ ํน์ฑ์ด ์์ด Any์ AnyObject์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค
6. ํด๋ก์
1 : Closure์ ๋ํด ์ค๋ช
ํด ์ฃผ์ธ์
ํด๋ก์ ๋ ์ด๋ค ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๋ค์ ๋ธ๋ก์ผ๋ก ๋ชจ์๋์ ๊ฐ์ฒด์ ๋๋ค.์ค์ํํธ์์ ํจ์ํ ํจ๋ฌ๋ค์์ผ๋ก ๊ตฌํํ ๋ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
ํด๋ก์ ๋ class์ ๊ฐ์ ์ฐธ์กฐ ํ์ ์ ๋๋ค.
2 : Closure ์ ๊ฐ ์บก์ฒ์ ๋ํด ์ค๋ช
ํด ์ฃผ์ธ์
ํด๋ก์ ๋ ์์ ์ด ์ ์๋ ์์น์์ ์ธ๋ถ์ ์๋ ๊ฐ๋ค์ ์บก์ณํ ์ ์์ต๋๋ค. ํด๋ก์ ๋ ๊ฐ์ ํ์ ๊ณผ ๊ด๊ณ ์์ด ๊ฐ์ ์บก์ณํ ๋ **์ฐธ์กฐ** ํฉ๋๋ค.
๋ง์ฝ value ํ์ ์ ์ฐธ์กฐํ์ง ์๊ณ ๋ณต์ฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ Closure List๋ฅผ ์ฌ์ฉํด์ ํด๋ก์ ๋ฅผ ์ ์ธํ ๋น์์ ๊ฐ์ ์์๋ก ์บก์ณํ ์ ์์ต๋๋ค. ์์๋ก ์บก์ณ๋๊ธฐ ๋๋ฌธ์ ํด๋ก์ ๋ด๋ถ์์ ๊ฐ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
capture list
var string = "hello"
let closure = { [string] in
string = "hi" // โerror
print(string)
}
์ฐธ์กฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด์๊ฐ ์์๊ฑฐ ๊ฐ์๋ฐ์?
ํด๋ก์ ๋ ์ฐธ์กฐํ์ ์ ๊ฐ์ ์บก์ณํ ๋ strong์ผ๋ก ์บก์ณํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ RC๊ฐ์ด ์ฆ๊ฐํฉ๋๋ค.
ํด๋์ค์์์ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ทธ ํด๋ก์ ๊ฐ ํด๋์ค์ ๊ฐ์ self๋ก ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ ํด๋น ์ธ์คํด์ค๋ฅผ nil์ฒ๋ฆฌ ํ๋๋ผ๋ ํด๋ก์ ์ ์ํด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์๋ ๊ฐํ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๋ก์ ์ ๊ฐํ ์ํ ์ฐธ์กฐ๋ capture list๋ฅผ ์ฌ์ฉํ์ฌ self๋ฅผ weak์ผ๋ก ์บก์ณํ์ฌ RC๊ฐ์ ์ฆ๊ฐ์ํค์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
๐ ๊ฐํ ์ํ ์ฐธ์กฐ
์ธ์คํด์ค๊ฐ ์๋ก๋ฅผ ๊ฐํ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐํ ์ํ ์ฐธ์กฐ๋ผ๊ณ ํฉ๋๋ค.
์ฐธ์กฐ ํ์
์ธ์คํด์ค A์ B๊ฐ ์๊ณ , ๊ฐ๊ฐ์ ์ธ์คํด์ค๊ฐ ํ๋กํผํฐ๋ก B์ A๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค๊ฒ ์ต๋๋ค.
์ด ๊ฒฝ์ฐ์๋ A,B์ ๋ชจ๋ nil์ ์ ์ธ ํ๋๋ผ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ต๋๋ค. ์๋ก์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ฌ RC๊ฐ์ด ๋จ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ์ง๋ง ๋์ด์ A,B๋ฅผ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. A,B๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ์ง๋ง ์ฌ์ฉํ ์ ์๋ ์ํ๊ฐ ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๊ฐํ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
self๋ฅผ weak ๋ง๊ณ unowned๋ก ์บก์ณํ๋ฉด ์๋๋์?
๋ง์ฝ ํด๋์ค ๋ด์์ ํด๋ก์ ๊ฐ unowned๋ก self๋ฅผ ์บก์ณํ๋ ๊ฒฝ์ฐ์๋ ์์ ์ฐจ์ด๋ก ์ธํด ํด๋น ์ธ์คํด์ค๊ฐ nil์ด ํ ๋น ๋ ํ์๋ ํด๋ก์ ์ ์์ ์ด ์คํ๋์ด์ผ ํ๋ ์ํฉ์ด ์๊ธธ ์ ์์ต๋๋ค.
unowned๋ ์กด์ฌํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณ์ํด์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๊ฒฝ์ฐ nil์ ๋ฐํํ๋ weak ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
Name Closure๋ ๊ฐ์ ์บก์ณํ๋์?
Name Closure์ธ ๊ฒฝ์ฐ์๋ ์ด๋์ ์์น ํ๋์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์ ์ญ ํจ์๋ ์ด๋ ํ ๊ฐ๋ ์บก์ณํ์ง ์์ต๋๋ค.
์ค์ฒฉ ํจ์๋ ์์ ์ ํฌํจํ๊ณ ์๋ ํจ์์ ๊ฐ์ reference capture ํฉ๋๋ค.
3 : Trailing Closure์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
ํจ์ ํ๋ผ๋ฏธํฐ์ ์ ์ผ ๋ง์ง๋ง ์์๊ฐ ํด๋ก์ ์ผ ๋ ์๊ดํธ ๋ฐ์์ ํด๋ก์ ๋ฅผ ์ ์ธํ ์ ์๋๋ฐ ์ด๋ฅผ ํํ ํด๋ก์ ๋ผ๊ณ ํฉ๋๋ค.
๋ง์ฝ ํ๋ผ๋ฏธํฐ์ ํด๋ก์ ๊ฐ ์ฌ๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ค์ค ํํ ํด๋ก์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์๊ดํธ ๋ฐ์์ ์ค๊ดํธ๋ฅผ ์ด๊ณ ๋ซ์ผ๋ฉฐ ํด๋ก์ ๋ฅผ ํํํฉ๋๋ค.
ํด๋ก์ ์ ์์ด ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ ํํ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. Xcode์์๋ ํํ ํด๋ก์ ์ ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค. (์๋ ๋ณํ๋จ)
4 : Escpaing Closure์ ๋ํด ์ค๋ช
ํด ์ฃผ์ธ์
ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ํด๋ก์ ๊ฐ ํจ์ ์ข ๋ฃ ์ดํ์ ํธ์ถ๋ ๋ ํ์ถ ํด๋ก์ ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ถ ํด๋ก์ ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ํจ์ ์ธ๋ถ์์ ํด๋ก์ ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๋๋ค.
์ฃผ๋ก ๋น๋๊ธฐ ์์ ์ ํ ๋ ํ์ถ ํด๋ก์ ๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๋น๋๊ธฐ ์์ ์ ์คํํ๋ ํจ์๋ ๋น๋๊ธฐ ์์ ์ผ๋ก ํจ์๊ฐ ์ข ๋ฃ๋๊ณ ํธ์ถํด์ผ ํ๋ ํด๋ก์ ๋ฅผ ํ์ถ ํด๋ก์ ๋ก ๋ฐ์ต๋๋ค.
ํ์ถ ํด๋ก์ ๋ ํด๋ก์ ์์ @escaping ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํฉ๋๋ค.
5 : Function๊ณผ Closure์ ์ฐจ์ด์ ์ ๋งํด๋ณด์ธ์
ํด๋ก์ ๋ ๋ค์ํ ํํ๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ, ํจ์๋ ํด๋ก์ ์ ํํ ์ค ํ๋์ ๋๋ค. ์ฆ, ํจ์๋ ํด๋ก์ ์ ์ํฉ๋๋ค.
ํ์ง๋ง ์ฃผ๋ก ์ด๋ฆ์ด ์๋ ํด๋ก์ ๋ฅผ ํจ์๋ผ๊ณ ํํํ๊ณ , ์ต๋ช ํด๋ก์ ๋ฅผ ํด๋ก์ ๋ผ๊ณ ํํํฉ๋๋ค.
7. ARC
1. ARC์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
ARC๋ swift์์ ์ฐธ์กฐํ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
ARC๋ ๋์ด์ ์ฐธ์กฐ๋์ง ์๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ํด์ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๋ฅผ ์ธ์ ํด์ ํ ์ง์ ๋ํ ์ฌ๋ถ๋ ์ธ์คํด์ค์ RC๊ฐ์ ํตํด ๊ฒฐ์ ํฉ๋๋ค.
์ธ์ RC๊ฐ์ด ์ฆ๊ฐํ๊ณ ์ธ์ ๊ฐ์ํ๋์?
RC๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฑฐ๋, ๋ณต์ฌํ๊ฑฐ๋ ์ฐธ์กฐํ ๋ ์ฆ๊ฐํฉ๋๋ค.
ํจ์๋ด์์ ์ธ์คํด์ค์ ์ฌ์ฉ์ด ๋๋๊ฑฐ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์์ nil์ ํ ๋นํ๊ฒ ๋๋ฉด RC๊ฐ์ด ๊ฐ์ํฉ๋๋ค.
2. ์ฐธ์กฐ๋ ์ด๋ค๊ฒ ์๋์?
์ฐธ์กฐ์ ์ข ๋ฅ๋ strong, weak, unowned ์ธ ๊ฐ์ง ์ ๋๋ค.
strong์ ๊ฐํ ์ฐธ์กฐ๋ฅผ ํ์ฌ RC๊ฐ์ +1 ์ฆ๊ฐ ์ํค๋ ํค์๋ ์ ๋๋ค.
weak๊ณผ unowned๋ RC๊ฐ์ ์ฆ๊ฐ์ํค์ง ์๊ณ ์ฐธ์กฐํ ์ ์๋ ํค์๋ ์ ๋๋ค.
๐ก strong์ ๊ฐํ์ฐธ์กฐ, weak์ ์ฝํ์ฐธ์กฐ, unowned๋ ๋ฏธ์์ ์ฐธ์กฐ ๋ผ๊ณ ํฉ๋๋ค.
weak๊ณผ unowned์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์?
weak์ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด nil์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
unowned๋ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋๋ผ๋ ๊ทธ ์ธ์คํด์ค๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณ์ํด์ ์ฐธ์กฐํฉ๋๋ค. ์ฆ ๋น์ด์๋ ๊ณต๊ฐ์ ์ฐธ์กฐํ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์์์ ์ฐจ์ด๋ ์์ต๋๋ค. unowned๋ก ์ฐธ์กฐํ ๋๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ฐธ์กฐํ์ง๋ง, weak์ผ๋ก ์ฐธ์กฐํ ๋๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ธฐ๋กํ๋ ์ฌ์ด๋ ํ ์ด๋ธ์ ์ฐธ์กฐํ๊ณ ์ด๋ฅผ ํตํด์ ๊ฐ์ ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
๐๐ปโโ๏ธ๐๐ปโโ๏ธ ์ํํ๊ฑฐ ๊ฐ์๋ฐ unowned์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ญ๊น์?
unowned๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง๋ง, weak์ ์ฌ์ด๋ ํ ์ด๋ธ์ ์ฐธ์กฐํฉ๋๋ค.
์ฌ์ด๋ ํ ์ด๋ธ์ ์ฒ์๋ถํฐ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ weak reference๋ก ์ฐธ์กฐ๋ ๋ ์์ฑ๋ฉ๋๋ค.
์ฌ์ด๋ ํ ์ด๋ธ์ ์์ฑํ๊ณ ์ฐธ์กฐํ๋๊ฒ์ ๊ทธ๋ ์ง ์์๋ ๋ณด๋ค ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๊ฒ์ด ํ์คํ ๊ฒฝ์ฐ์๋ unowned๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ ํฅ์์ ๋์์ด ๋ ์ ์์ต๋๋ค.
strong, weak, unowned reference๋ ๊ฐ๊ฐ ์ธ์ ์ฌ์ฉํ ๊น์?
๊ธฐ๋ณธ์ ์ผ๋ก ๋จ๋ฐฉํฅ์ผ๋ก ์ฐธ์กฐ๊ฐ ์ด๋ค์ง๋ ๊ฒฝ์ฐ์๋ strong๋ ์์ ํ๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๊ฐ ๋ฐ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ strong์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
weak์ ๊ฐํ ์ํ ์ฐธ์กฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
unowned๋ ํด๋น ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๋ณด๋ค ๋จผ์ ํด์ ๋๋ ๊ฒ์ด ํ์คํ ์ํฉ์์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
3 : class๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ๊ณผ์ ์ ์ค๋ช
ํด๋ณด์ธ์
class ์ธ์คํด์ค๋ strong, weak, unowned ์ธ๊ฐ์ง ๋ฐฉ์์ ํตํด ์ฐธ์กฐ ๋ ์ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ๊ฐ์์ reference counting์ ํฉ๋๋ค.
๋ง์ฝ weak count๊ฐ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ด๋ ํ ์ด๋ธ์ ์์ฑํ์ฌ weak reference๋ ์ฌ์ด๋ ํ ์ด๋ธ์ ์ฐธ์กฐํฉ๋๋ค.
์ธ์คํด์ค์ RC๊ฐ์ธ strong reference count ๊ฐ์ด 0์ด ๋๋ฉด deinited ๋ฉ๋๋ค.
deinited๋๋ฉด unowned count๊ฐ์ด ๊ฐ์ํ๊ณ unowned count๊ฐ์ด 0์ด ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค.
๋ง์ฝ weak count๊ฐ์ด 0์ด ์๋๋ผ๋ฉด ์ฌ์ด๋ ํ ์ด๋ธ์ด ๋จ์์๋ freed ์ํ๊ฐ ๋๋ฉฐ ์ด๋ weak count๊ฐ์ด ๊ฐ์ํ๊ณ weak count๊ฐ์ด 0์ด ๋๋ฉด, ํด๋น ์ค๋ธ์ ํธ์ side table์ด ํด์ ๋๋ฉฐ ๊ฐ์ฒด๊ฐ ์์ ํ ์๋ฉธ๋ฉ๋๋ค.
8. ํ๋กํ ์ฝ
1. ํ๋กํ ์ฝ์ด๋ ๋ฌด์์ธ์ง ์ค๋ช
ํด ์ฃผ์ธ์
ํ๋กํ ์ฝ์ด๋ ๊ฐ์ฒด๊ฐ ์ด๋ค ์ญํ ์ ํ๊ธฐ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
ํ๋กํ ์ฝ์ ์ ์๋ฅผ ํ๊ณ ์ ์๋ง ํ ๋ฟ, ์ค์ค๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์์ต๋๋ค.
ํ๋กํ ์ฝ์ ํตํด ๋คํ์ฑ์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ํ๋กํ ์ฝ์ ์ด์ฉํ์ฌ ๊ฐ์ฒด ๊ฐ์ ์ ์ฐํ ์ปค๋ฎค๋์ผ์ด์ ์ ํ ์ ์์ต๋๋ค.
ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ด ํ๋กํ ์ฝ์ ์ฑํํ ์ ์์ผ๋ฉฐ, ์ฑํํ ํ์ ์ ํ๋กํ ์ฝ์ด ์ ์ํ๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํํด์ผ ํฉ๋๋ค.
๐ ๋คํ์ฑ
ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค์ํ ํ์
์ ๊ฐ์ง ์ ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๐ ์ฑํ์ ์ ํ
ํ๋กํ ์ฝ์ ์์ ๋ฆฌ์คํธ์ class ํค์๋๋ฅผ ์ถ๊ฐํ๋ฉด, class๋ง ์ฑํ๊ฐ๋ฅํ ํ๋กํ ์ฝ์ด ๋ฉ๋๋ค.
๐ ํ๋กํผํฐ
- ํ๋กํผํฐ๋ ํญ์ var ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ํด๋น ํ๋กํ ์ฝ์ ์ฑํํ ํ์๋ var, let ์ค ์ด๋ค๊ฒ์ผ๋ก ์ ์ธํด๋ ๋ฌด๊ดํฉ๋๋ค.
- ํ๋กํผํฐ๋ฅผ { get set }์ผ๋ก ์๊ตฌํ ๊ฒฝ์ฐ์๋ ์ฑํํ ํ์๋ let์ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค. set์ ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
- ํ์ง๋ง { get }์ผ๋ก ์๊ตฌํ๋๋ผ๋, ์ฑํํ ํ์ ํ์ํ๋ค๋ฉด set์ ์ ์ฉ ํด๋ ๋ฌด๊ดํฉ๋๋ค.
ํ๋กํ ์ฝ์ ๊ธฐ๋ฅ ๊ตฌํ์ ํ์ง ๋ชปํ๋์?
์๋์, ํ๋กํ ์ฝ์ ์ด์ฉํด ์ถ์ํด๋์ค๋ก์จ์ ์ญํ ์ ํ ์ ์์ต๋๋ค.
ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ฅ ๊ตฌํ์ ํ ์ ์๊ณ , ํด๋์ค๋ ์ถ์ ํํ์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
ํ์ง๋ง ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ํ๋กํ ์ฝ๋ก ์ ์ํ๊ณ extension์ ํตํด ํ๋กํ ์ฝ ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค๋ฉด ์ถ์ํด๋์ค์ ๋์ผํ ๊ฐ๋ ์ ๊ฐ์ง๋๋ค.
- ํ๋กํ ์ฝ์ extension์ ํตํด์๋ง ๊ตฌํ์ฒด ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํ๋กํ ์ฝ๊ฐ์ ์์์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ๋กํ ์ฝ์์ ์ ์๋ ๊ธฐ๋ฅ์ ๋ฌด์กฐ๊ฑด ๊ตฌํํด์ผ ํ ๊น์?
์๋์, ํ๋กํ ์ฝ์ ์ ํ์ ์๊ตฌ์ฌํญ์ ์ง์ ํ ์ ์์ต๋๋ค.
๋จ, ์ ํ์ ์๊ตฌ์ฌํญ์ ์ ์ํ๊ณ ์ถ์ ํ๋กํ ์ฝ์ objc ์์ฑ์ด ๋ถ์ฌ๋ ํ๋กํ ์ฝ์ด์ด์ผ ํ๋ค๋ ๊ท์น์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํ์ ์๊ตฌ์ฌํญ์ด ์ ์ฉ๋ ํ๋กํ ์ฝ์ objc ์์ฑ์ด ๋ถ์ฌ๋ ํด๋์ค์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ ํ์ ์๊ตฌ์ฌํญ์
@objc optional
ํค์๋๋ฅผ ์๊ตฌ์ฌํญ ์์ ๋ถ์ฌ์ค์ผ ํฉ๋๋ค.
@objc protocol SomeProtocol {
func essential() //ํ๋กํ ์ฝ ์ฑํ์ ๋ฐ๋์ ๊ตฌํํด์ผํจ!!
@objc optional func option() //์ ํ์ ์ผ๋ก ๊ตฌํํด๋ ๋จ
}
2 : associatedType์ด ๋ฌด์์ธ์ง ์ค๋ช
ํด์ฃผ์ธ์
associatedType์ ํ๋กํ ์ฝ ๋ด์์ ํ์ ์ ์ง์ ํ์ง ์๊ณ , ํ๋กํ ์ฝ์ ์ฑํํ์ฌ ๊ตฌํํ ๋ ํ์ ์ ์ง์ ํ ์ ์๋๋ก ๋์์ค๋๋ค. ํ๋กํ ์ฝ์์ ์ผ์ข ์ ์ ๋ค๋ฆญ ์ญํ ์ ํฉ๋๋ค.
protocol ExamScore {
associatedtype SubjectScore
func calculateAverage(subject1: SubjectScore, subject2: SubjectScore) -> String
}
3 : Codable์ ๋ํ์ฌ ์ค๋ช
ํด ์ฃผ์ธ์
Encodable๊ณผ Decodable ํ๋กํ ์ฝ์ ํฉ์ฑ ํ๋กํ ์ฝ์ ๋๋ค.
Codable์ ์ค์ํ๋ ํ์ ์ ๋ค๋ฅธ ํํ ๋ฐฉ์์ผ๋ก ์ํธ ๋ณํํ ์ ์์ต๋๋ค.
๋ํ์ ์ผ๋ก JSONEncoder, JSONDecoder๊ณผ ๊ฒฐํฉํ์ฌ ์ธ์คํด์ค๋ฅผ JSON์ผ๋ก ๋ณํํ๊ณ , JSON์ ์ธ์คํด์ค๋ก ๋ณํํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ Encodable๊ณผ Decodable?
- ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ํ์
์ ๋ค๋ฅธ ํ์์ผ๋ก ์ธ์ฝ๋ฉ(with Encodable)ํ๊ฑฐ๋ ๋์ฝ๋ฉ(with Decodable)ํ ์ ์๋ ํ๋กํ ์ฝ์
๋๋ค.
- Foundation ํ๋ ์์ํฌ์ ์๋ ์ฌ๋ฌ ํด๋์ค์ ํธํํ๋ฉด ๋ค์ํ ๊ธฐ๋ฅ์ ํ ์ ์์ต๋๋ค.
Codable๊ณผ NSCoding์ ์ฐจ์ด๋?
Codable์ ํด๋์ค, ์ด๊ฑฐํ, ๊ตฌ์กฐ์ฒด์ ๋ชจ๋ ์ ์ฉํ ์ ์์ง๋ง NSCoding์ ํด๋์ค ํ์ ์๋ง ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
NSCoding์ NSObject๋ฅผ ์์๋ฐ์ ํด๋์ค์์๋ง ์ฑํํ ์ ์์ต๋๋ค. ๋ NSCoding์ ์ฑํํ๋ฉด ๋ฐ๋์ NSKeyedArchiver์ NSKeyedUnarchiver๋ฅผ ์ฌ์ฉํด Data ํ์ ์ผ๋ก ์ ์ฅํ๊ณ ๋์ฝ๋ฉํด์ผํฉ๋๋ค.
4 : Equatable ํ๋กํ ์ฝ์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
ํ์ ๋ผ๋ฆฌ ๋น๊ต(==)์ฐ์ฐ์ ํ๊ธฐ ์ํด ํ์์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ ํ๋กํ ์ฝ ์ ๋๋ค.
๊ธฐ๋ณธ ํ์ ์ Equatable์ ๋ฐ๋ฅด๊ณ ์์ด ๋น๊ต ์ฐ์ฐ์ด ๊ฐ๋ฅํ์ง๋ง, ์ปค์คํ ํ์ ์ ๊ฒฝ์ฐ ์ง์ ์ฑํํด ์ฃผ์ด์ผ ํฉ๋๋ค.
๊ตฌ์กฐ์ฒด๋ ํ๋กํผํฐ๊ฐ ๋ชจ๋ ๊ธฐ๋ณธ ํ์ ์ธ ๊ฒฝ์ฐ Equatable์ ์ฑํํ๋ฉด ๋น๊ต ์ฐ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํด๋์ค์ ๊ฒฝ์ฐ ์ง์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๊ฑฐํ์ ๊ฒฝ์ฐ ์ฐ๊ด๊ฐ์ด ์์ผ๋ฉด ์๋์ผ๋ก Equatable์ ์ฑํํฉ๋๋ค. ์ฐ๊ด๊ฐ์ด ์๋ ๊ฒฝ์ฐ Equatable์ ์ง์ ์ฑํํด์ค์ผ ํ๋ฉฐ, ์ฐ๊ด๊ฐ์ด ๋ชจ๋ Equatable์ ๋ฐ๋ฅด๊ณ ์์ด์ผ ํฉ๋๋ค.
//์ง์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ค์ผ ํ๋ ๊ฒฝ์ฐ
static func == (lhs: Class, rhs: Class) -> Bool {
return lhs.first == rhs.first && lhs.second == rhs.second
}
5. Hashable ํ๋กํ ์ฝ์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
Hashable์ ์ฑํํ๋ ํ์ ์ ๋ชจ๋ ๊ฐ์ ์ ์ ํด์๊ฐ์ผ๋ก ํํํ ์ ์์ต๋๋ค.
Hashable์ Equatable ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ Hashable์ ๋ฐ๋ฅด๊ณ ์์ง๋ง, ์ปค์คํ ํ์ ์ ๊ฒฝ์ฐ ์ง์ ์ฑํํด์ผ ํฉ๋๋ค.
๊ตฌ์กฐ์ฒด๋ ํ๋กํผํฐ๊ฐ ๋ชจ๋ ๊ธฐ๋ณธ ํ์ ์ด๋ฉด Hashable์ ์ฑํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
ํด๋์ค๋ ์ง์ hashํจ์๋ฅผ ๊ตฌํํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ถ๊ฐ๋ก Equatable์ ์ฑํํ๊ณ ์๊ธฐ ๋๋ฌธ์ == ํจ์๋ ํจ๊ป ๊ตฌํํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๊ฑฐํ์ ๊ฒฝ์ฐ ์ฐ๊ด๊ฐ์ด ์์ผ๋ฉด ์๋์ผ๋ก Hashable์ ์ฑํํฉ๋๋ค. ์ฐ๊ด๊ฐ์ด ์๋ ๊ฒฝ์ฐ Hashable์ ์ฑํํด์ค์ผ ํ๋ฉฐ, ์ฐ๊ด๊ฐ์ด ๋ชจ๋ Hashable์ ์ฑํํด์ผ ํฉ๋๋ค.
Equatable์ ์ ์ฑํํด์ผ ํ๋์?
ํด์๊ฐ์ ๊ณ ์ ๊ฐ์ด์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ ๊ณ ์ ๊ฐ์ ์๋ณํด ์ค ์ ์๋ == ํจ์๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋์ Equatable์ ์ฑํํ์ฌ ==ํจ์๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
9. ํค์๋
1 : mutating ํค์๋์ ๋ํด ์ค๋ช
ํด ์ฃผ์ธ์
๊ธฐ๋ณธ์ ์ผ๋ก Swift์์๋ ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ ๋ด๋ถ์์ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํ์ง๋ง, mutating ํค์๋๋ฅผ ํจ์ ์์ ๋ถ์ด๋ฉด ํจ์ ๋ด๋ถ์์ ํด๋น ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
2 : lazy ์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์
lazy๋ ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ๋ก, ํธ์ถ์ด ์์ด์ผ๋ง ๊ฐ์ ์ด๊ธฐํ ํฉ๋๋ค.
lazy๋ ํธ์ถ๋ ๋ ๊ฐ์ ์ด๊ธฐํ ํ๋ฏ๋ก init์์ ์ดํ์ ๊ฐ์ ์ด๊ธฐํ ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์๊ฐ ์๋๋ณ์๋ก ์ ์ํด์ผ ํฉ๋๋ค.
lazy ํ๋กํผํฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ํ๋ ๊ณต๊ฐ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
lazy๋ ์ด๋ค ๋ฌธ์ ๊ฐ ์์ ์ ์๋์?
๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ lazy ํค์๋๋ก ์์ฑํ ๋ณ์๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ฌ๋ฌ๋ฒ ์ด๊ธฐํ๋๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
3 : typealias ๊ฐ ๋ฌด์์ธ์ง ๋งํด์ฃผ์ธ์
๊ธฐ์กด ํ์ ์ ์๋ก์ด ์ด๋ฆ(๋ณ๋ช )์ ์ง์ ํ ๋ ์ฌ์ฉํ๋ ํค์๋์ ๋๋ค.
typealias๋ฅผ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋์ฑ ๊ฐ๋ ์ฑ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
typealias Name = String
let name : Name = "๊น์ ๋"
4. required ํค์๋์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์
ํด๋์ค๋ ํ๋กํ ์ฝ์ ์์๋ฐ๋ ํด๋์ค์์ ํด๋น ๋ฉ์๋๊ฐ ๋ฐ๋์ ๊ตฌํ๋์ด์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
required ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋๋ ํ์ ํด๋์ค์์ ๊ตฌํ๋์ง ์์ผ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ง์ฝ, override ํค์๋์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ, override ํค์๋๊ฐ ๋ฐ๋์ ํจ๊ป ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
5. some ๋ถ๋ช
ํ ํ์
์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์.
10. ํจ๋ฌ๋ค์
1. Swift์ map, filter, reduce์ ๋ํ์ฌ ์ค๋ช
ํด ์ฃผ์ธ์
์ค์ํํธ๋ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธํฉ๋๋ค. ๊ทธ๋์ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋งค๊ฐ๋ณ์๋ก ํจ์๋ฅผ ๊ฐ๋ ํจ์๋ฅผ ๊ณ ์ฐจ ํจ์๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, map, filter, reduce๋ ๋ชจ๋ ๊ณ ์ฐจํจ์์ ์ํฉ๋๋ค.
map์ ์ด๊ธฐ๊ฐ๊ณผ ํด๋ก์ ๋ฅผ ์ ๋ฌ ๋ฐ์ ์ ๋ฌ๋ฐ์ ํด๋ก์ ๋ฅผ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฐํํด์ฃผ๋ ํจ์์ ๋๋ค. ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ง ์๊ณ ์๋ก์ด ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋ฅผ๋ค์ด, ์ด๊ธฐ ๊ฐ์ ํ์ ์ Int โ String์ผ๋ก ๋ณํํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
filter๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ๊ฐ์ ๊ฑธ๋ฌ์ ์ถ์ถํ๋ ํจ์์ ๋๋ค. ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ ๋ชจ์ map๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฅผ๋ค์ด, ์ด๊ธฐ ๊ฐ์ด Int์ธ ๊ฒฝ์ฐ 10์ด์์ธ ๊ฐ๋ง ์ถ์ถ ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
reduce๋ ์ด๊ธฐ๊ฐ์ ํ๋์ ๊ฐ์ผ๋ก ํฉ์ณ์ฃผ๋ ํจ์์ ๋๋ค. reduce๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ชจ๋ ๊ฐ์ ํฉ์น๋ ๊ฒฝ์ฐ ๊ทธ ๊ฒฐ๊ณผ๋ ๋ฐฐ์ด์ด ์๋ ํ๋์ ๊ฐ์ผ๋ก ๋์ค๊ฒ ๋ฉ๋๋ค.
map์ ์ข ๋ฅ์ธ flatMap๊ณผ compactMap์ ๋ํด์ ์ค๋ช ํด ์ฃผ์ธ์
๋ ํจ์๋ ์์๊ฐ ์ผ์ฐจ์ ๋ฐฐ์ด์ผ ๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
์ผ์ฐจ์ ๋ฐฐ์ด์์ ํด๋ก์ ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ต์ ๋์ผ ๋, nil์ธ ๊ฒฝ์ฐ nil์ ์ ๊ฑฐํ๊ณ ์ต์ ๋ ๋ฐ์ธ๋ฉ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด ๋ฐํํฉ๋๋ค. ํ์ง๋ง, 2์ฐจ์ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ nil์ ์ ๊ฑฐํ์ง์์ต๋๋ค.
flatMap์ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก(flatten) ๋ง๋ค์ด๋ด๊ณ , compactMap์ 2์ฐจ์ ๋ฐฐ์ด ๊ทธ๋๋ก ๋ฐํํ๋ค๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๐ก swift์์ ๊ฐ์ ์ผ์ฐจ์ ์ต์
๋ ๋ฐฐ์ด์ ์ฌ์ฉํ ๋, compactMap์ ๊ถ์ฅํฉ๋๋ค.
'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value
2. Protocol Oriented Programming๊ณผ Object Oriented Programming์ ์ฐจ์ด์ ์ ์ค๋ช
ํ์์ค.
11. function / method
1. function๊ณผ method์ ์ฐจ์ด๋ฅผ ๋งํด๋ณด์ธ์.
funtion์ ํน์ ๊ฐ์ฒด์ ์ํด์์ง ์์ ์ฝ๋ ๋ธ๋ก์ ๋๋ค.
method๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ ํน์ ๊ฐ์ฒด ์์์ ์ ์ ๋๋ ํจ์์ ๋๋ค.
function์ ์ธ๋ถ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง, method๋ ์๊ธฐ๊ฐ ์ํด ์๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ง ์ ๊ทผํ ์ ์์ต๋๋ค.
2. instance ๋ฉ์๋์ class ๋ฉ์๋์ ์ฐจ์ด์ ์ ์ค๋ช
ํด์ฃผ์ธ์.
์ธ์คํด์ค ๋ฉ์๋๋ ์ธ์คํด์ค์ ์ํ ํจ์๋ฅผ ๋ปํฉ๋๋ค. ์ธ์คํด์ค ๋ด๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฑ ์ธ์คํด์ค์ ๊ด๋ จ๋ ์ผ์ ํฉ๋๋ค. (์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด ์์ ์ ์ธํด์ ์ฌ์ฉํ๋ ํจ์๊ฐ ์ธ์คํด์ค ๋ฉ์๋์!!)
ํด๋์ค ๋ฉ์๋๋ ํด๋์ค์ ํ์ ๋ฉ์๋ ์ค ํ๋๋ก, ํ์ ์์ฒด์ ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฉ์๋ ์ ๋๋ค. ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ํ์ ์ ํตํด ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
3. class ๋ฉ์๋์ static ๋ฉ์๋์ ์ฐจ์ด์ ์ ์ค๋ช
ํด์ฃผ์ธ์.
๋ ๋ฉ์๋๋ ํด๋์ค์ ํ์ ๋ฉ์๋ ์ ๋๋ค.
ํ์ ๋ฉ์๋๋ ํ์ ์์ฒด์ ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฉ์๋๋ก, ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ํธ์ถํ ์ ์์ต๋๋ค.
static ๋ฉ์๋๋ ์์ ํ ๋ฉ์๋ ์ฌ์ ์๊ฐ ๋ถ๊ฐ๋ฅ ํ๊ณ , class ๋ฉ์๋๋ ์์ ํ ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
4. ํจ์์์ ์ธ๋ถ์ ์๋ ๊ฐํ์
๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ๋ ๊น์?
์ผ๋ฐ์ ์ผ๋ก ํจ์์ ์ธ์๋ ์์ ๊ฐ์ผ๋ก ์ ๋ฌ๋์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํจ์ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์๋ inout ํค์๋๋ฅผ ์ฌ์ฉํ
inout ํค์๋๋ ์ธ์์ ํ์ ์์ ์ ์ธํฉ๋๋ค. ์ด๋ ํด๋น ์ธ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌ ๋ฐ๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค.
ํจ์๋ฅผ ํธ์ถํ ๋์๋ ์ธ์ ์์
&
๋ฅผ ๋ถ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ค๊ณ ํ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.inout์ ํจ์ ํธ์ถ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
func functionName(_ value : inout String) {
value = "change"
}
var someValue: String = "hello"
functionName(&someValue)
print(someValue) // "change"
5. defer๋ ๋ฌด์์ธ์ง ์ค๋ช
ํด์ฃผ์ธ์.
defer๋ ์ฝ๋ ๋ธ๋ก์ ์ง์ฐํ์ฌ ํจ์ ์คํ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์คํ๋๋๋ก ํ๋ ํค์๋ ์ ๋๋ค.
defer์์ ์๋ ๋ด์ฉ์ ํจ์๊ฐ ๋ฐํํ๊ธฐ ์ง์ ์ ์คํ๋ฉ๋๋ค.
ํจ์๋ด์์ ์ผ์ด๋๋ ์ผ ์ค ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ๋ฆฌํด์ผ ํ๋ ์ผ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. (๋ฆฌ์์ค ํด์ , ์์ ๋ฐ์ดํฐ ์ญ์ , ํ์ผ ๋ซ๊ธฐ etc)
defer๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ํธ์ถ๋๋ ์์๋ ์ด๋ป๊ฒ ๋๊ณ , defer๊ฐ ํธ์ถ๋์ง ์๋ ๊ฒฝ์ฐ๋ ์์๊น์?
defer๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ํจ์ ๋ด์์ ์ ์ธํ ์์์ ์ญ์์ผ๋ก ์คํ๋ฉ๋๋ค. ํจ์ ์ฝ๋ ๋ธ๋ก์ ๊ฐ์ฅ ์๋์ ์๋ defer๋ถํฐ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
๋ง์ฝ ํจ์๋ฅผ ์คํ์ค์ธ ์ค๋ ๋๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๊ฑฐ๋, defer๋ฅผ ์ฝ๊ธฐ ์ ์ ํจ์๊ฐ return ๋๋ ๊ฒฝ์ฐ์๋ defer๋ฅผ ์คํํ์ง ์์ต๋๋ค.
guard๋ฌธ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์คํจํ๋ ๊ฒฝ์ฐ, guard๋ฌธ ์๋์ ์๋ defer๊ฐ ์คํ๋์ง ์์ ์ ์์ต๋๋ค.
func say(){
defer {
print("๋๋ ๋ง์ง๋ง์ด๋ค!")
}
defer {
print("๋๋ ์ธ๋ฒ์งธ")
}
print("๋ด๊ฐ ์ ์ผ ์ฒ์ ํธ์ถ๋๊ฒ ์ง")
defer {
print("๋๋ ๋๋ฒ์งธ๋ก ํธ์ถ๋๊ฒ ์ง")
}
}
say() // print์ ์ ํ ์์๋๋ก ์ถ๋ ฅ
defer๋ฅผ ์ธ์ ์ฌ์ฉํ ๊น์?
ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์๋ฅผ๋ค์ด ํจ์์์ lock์ ๊ฑธ์ด ๋๊ธฐํ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๋ ๊ฒฝ์ฐ, ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ unlock์ ํด์ฃผ์ด์ผ ๋ฐ๋๋ฝ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
ํจ์๊ฐ ์ข ๋ฃ๋ ๋ ๋ง๋ค ํด์ผ ํ๋ ํ์๋ฅผ ํจ์ ๋ด์ ์๋ ์ฌ๋ฌ๊ฐ์ return ์์ ์จ์ฃผ๊ธฐ ๋ณด๋ค๋, defer๋ฅผ ํจ์ ์๋จ์ ์ ์ธํด์ฃผ๋ฉด ํจ์๊ฐ ์์์ ์ข ๋ฃ๋ ๋ ํด์ผํ๋ ํ์๋ฅผ ์ํํ ์ ์์ต๋๋ค.
12. ํ๋กํผํฐ
1. ์ ์ฅ ํ๋กํผํฐ์ ์ฐ์ฐ ํ๋กํผํฐ์ ์ฐจ์ด์ ์ ์ค๋ช
ํด ์ฃผ์ธ์.
์ ์ฅ ํ๋กํผํฐ๋ ๊ฐ์ฒด ๋ด์์ ๊ฐ์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ํ๋กํผํฐ ์ ๋๋ค.
๋ณ์๋ ์์๋ก ์ ์ธํ ์ ์์ผ๋ฉฐ, ์ด๊ธฐ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
์ฐ์ฐ ํ๋กํผํฐ๋ ๊ฐ์ ์ ์ฅํ์ง ์๊ณ ์ธ์คํด์ค์ ๋ด๋ถ ๋๋ ์ธ๋ถ ๊ฐ์ ์ฐ์ฐ์ ํ๋ ํ๋กํผํฐ ์ ๋๋ค.
์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ํตํด ์ธ์คํด์ค ๋ด๋ถ์ ์๋ ์๋ํ ๋ ๊ฐ์ ๊ฐ์ ์ ์ผ๋ก ์์ ๋๋ ์ ๊ทผ ํ ์ ์์ต๋๋ค.
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ ๊ตณ์ด ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฐ๋ ์ด์ ๊ฐ ๋ญ๊น์?
์ธ์คํด์ค์ ์ธ๋ถ์์ ๋ด๋ถ ๊ฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ getter, setter ๋ ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ด๋ ๋ ๋ฉ์๋๊ฐ ๋ถ์ฐ ๊ตฌํ๋์ด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋๋น ์ง ์ ์์ต๋๋ค.
์ฐ์ฐ ํ๋กํผํฐ๋ ๊ทธ ์ญํ ์ ๋์์ ํ์ฌ ๊ฐํธํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์ฐ์ฐ ํ๋กํผํฐ๋ ์ฐ๊ธฐ ์ ์ฉ์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ์ฐ๊ธฐ ์ ์ฉ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
2. ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์.
์ง์ฐ ์ ์ฅ ํ๋กํผํฐ๋ ํด๋น ํ๋กํผํฐ๊ฐ ํธ์ถ ๋ ๋ ๊ฐ์ ์ด๊ธฐํ ํฉ๋๋ค.
lazy ํค์๋๋ฅผ ํ๋กํผํฐ ์์ ๋ถ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ง์ฐ ์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ํ๋ ๊ณต๊ฐ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
3 : property warrper์ ๋ํด์ ์ค๋ช
ํด ์ฃผ์ธ์.
ํ๋กํผํฐ ๋ํผ๋ ์ฌ๋ฌ ํ๋กํผํฐ์ ๋ํด ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค.
ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
@propertyWrapperํค์๋๋ฅผ ์ฌ์ฉํด ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๊ณ ๋ด๋ถ์ ํ๋กํผํฐ์ ๋ํ ๋์์ ์ ์ํด๋๋ฉด, ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๋ ํ๋กํผํฐ ๋ํผ๋ฅผ ํค์๋๋ก ๋ถ์ฌ ๋ฏธ๋ฆฌ ์ ์ํ ๋์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ค ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋
ํน์ ์์
์ ์ํํ๊ธฐ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ์์ฑ๋๋ ์ฝ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ธฐ๋ณธ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
//property wrapper ์์ ์๋ ค์ฃผ๋ ์ด๋
ธํ
์ด์
์
๋๋ค.
@propertyWrapper
struct Wrapper {
var value : String
//๊ผญ!! ์์ฑํด์ผ ํ๋ ์ฐ์ฐ ํ๋กํผํฐ ์
๋๋ค. ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
var wrappedValue: String {
get { "Value : \(value)"}
set { value = newValue }
}
}
๋คํธ์ํฌ ์๋ฌ ์ํ ์ฝ๋๋ฅผ ์ ์ํ๋ ์ํฉ์ ์์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
struct NotFound {
private var _alert : String = "404 not found"
**var alert : String {
get{ "Alert!! \(_alert)" }
set{ _alert = newValue }
}**
init(_ value : String){
self._alert = value
}
}
struct Forbidden {
private var _alert : String = "403 forbidden"
**var alert : String {
get{ "Alert!! \(_alert)" }
set{ _alert = newValue }
}**
init(_ value : String){
self._alert = value
}
}
์ ์ฝ๋๋ฅผ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ณต์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
@propertyWrapper
struct Alert {
private var _alert : String
var wrappedValue : String {
get{ "Alert!! \(_alert)" }
set{ _alert = newValue }
}
init(wrappedValue alert: String) {
self._alert = alert
}
}
struct NotFound {
@Alert var alert : String = "404 not found"
}
struct Forbidden {
@Alert var alert : String = "403 forbidden"
}
Userdefault์ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ ์ฉํ๋ฉด ์ฝ๊ฒ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
@propertyWrapper
struct UserDefault<T> {
let key : String
let value : T
var wrappedValue : T {
get { UserDefaults.standard.object(forKey: key) as? T ?? self.value }
set { UserDefaults.standard.set(newValue, forKey: key)}
}
}
class UserManager {
@UserDefault(key: "userName", value: nil) //๊ธฐ๋ณธ๊ฐ ์ค์
static var userName : String?
@UserDefault(key: "autoLogin", value: false) //๊ธฐ๋ณธ๊ฐ ์ค์
static var autoLogin : Bool
}
13. ์ ๋ค๋ฆญ
์ ๋ค๋ฆญ์ ํ์ ์ ์ผ๋ฐํํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ ๋ค๋ฆญ์ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์ ์ํฌ ์ ์์ต๋๋ค.
์ ๋ค๋ฆญ์ ํ์ ์ ์ฝ์ด ๋ฌด์์ธ๊ฐ์?
์ ๋ค๋ฆญ์ ํ์ ์ ์ผ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ํ์ ๋ ์์ฉํ ์ ์์ง๋ง, ์ ์ฝ์ ๊ฑธ์ด ํ์ ์ ์ ํํ ์ ์์ต๋๋ค.
์ ๋ค๋ฆญ ํ์ ์ ๋ช ์ํ ๋ ํน์ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ํ์ ๋ง ์ฌ์ฉํ ์ ์๋๋ก ์ ์ฝํ ์ ์์ต๋๋ค.
ํ์ ์ ์ฝ์ ํด๋์ค๋ ํ๋กํ ์ฝ๋ง ๊ฐ๋ฅํฉ๋๋ค.
14. Subscript
subscript๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ์์ ์ปฌ๋ ์ ์์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ปฌ๋ ์ ์์๋ ๋ฐฐ์ด, ๋์ ๋๋ฆฌ, ์งํฉ ๋ฑ์ด ์์ต๋๋ค.
subscript๋ index๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ํจ์๋ฅผ ๋ง๋ค์ด ํจ์ ๋ด์์ get๊ณผ set์ ์์ฑํด์ผ ํฉ๋๋ค. get๋ง ์์ฑํ์ฌ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๊ตฌํํ ์๋ ์์ต๋๋ค.
subscript๋ฅผ ์์ฑํ ํ์๋ ์ธ์คํด์ค์ ์ด๋ฆ ๋ค์ ๋๊ดํธ([])๋ฅผ ๋ถ์ฌ์ ํธ์ถํ ์ ์์ต๋๋ค.
subscript๋ ๊ตฌํ๋ถ ๋๋ ์ต์คํ ์ ๊ตฌํ๋ถ์ ์์นํด์ผ ํฉ๋๋ค.
class MyArray {
var array = [Int]()
subscript(index: Int) -> Int {
get {
return array[index]
}
set(newValue) {
array[index] = newValue
}
}
}
var myArray = MyArray()
myArray.array = [1, 2, 3, 4, 5]
let value = myArray[2] // 3
String๋ ์๋ธ์คํฌ๋ฆฝํธ๋ก ์ ๊ทผํ ์ ์๋์?
๋ค, String์ Character ์ปฌ๋ ์ ํ์ ์ ๋๋ค. ๋ฐ๋ผ์ ํน์ ๋ฌธ์์ ์ ๊ทผํ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
class MyClass {
var myString = "Hello, world!"
subscript(index: Int) -> Character {
get {
return myString[myString.index(myString.startIndex, offsetBy: index)]
}
set {
let startIndex = myString.index(myString.startIndex, offsetBy: index)
myString.replaceSubrange(startIndex...startIndex, with: String(newValue))
}
}
}
var myClass = MyClass()
print(myClass[1]) // "e"
myClass[0] = "J"
print(myClass.myString) // "Jello, world!"
15. ์ถ๊ฐ ๊ฐ๋
1. Resultํ์
์ ๋ํด ์ค๋ช
ํด ์ฃผ์ธ์.
์ฑ๊ณต ํน์ ์คํจ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ํ์ ์ ๋๋ค. ์ ๋ค๋ฆญ ์ด๊ฑฐํ์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
์ต์ ๋๊ณผ ์ฐจ์ด์ ?
์ต์ ๋์ ๊ฐ์ด ์์ ๋ ๋ฌด์กฐ๊ฑด nil์ ๊ฐ์ง๊ณ ์์ง๋ง, Result ํ์ ์ ์คํจํ์ ๋ ์ค๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ์ฐ๊ด ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
2. ์ค์ํํธ์์ ์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
์ค์ํํธ๋ ์ถ์ ํด๋์ค ๋ฌธ๋ฒ์ ์ง์ํ์ง ์์ง๋ง ํ๋กํ ์ฝ์ ํตํด ๋์ผํ ๋์์ ํ๋๋ก ํ ์ ์์ต๋๋ค.
ํ๋กํผํฐ์ ๋ฉ์๋์ ์ํ์ ํ๋กํ ์ฝ์ ์ ์ธํด๋๊ณ , ํ๋กํ ์ฝ์ extensionํ์ฌ ํ๋กํ ์ฝ ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ์ถ์ํด๋์ค์ ๋์ผํ ๊ฐ๋ ์ ๊ตฌํ์ ํ ์ ์์ต๋๋ค.
3. Self์ self์ ์ฐจ์ด๊ฐ ๋ญ๊น์?
๋๋ฌธ์ Self๋ ํ์ ์์ฒด๋ฅผ ๋ํ๋ด๋ ํค์๋ ์ ๋๋ค.
class, struct์ ์๊ธฐ ์์ ์ ํ์ ์ ๋ํ๋ด๊ฑฐ๋, ํ๋กํ ์ฝ์์ ํด๋น ํ๋กํ ์ฝ์ ์ฑํํ๋ ํ์ ์ ๋ํ๋ผ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฌธ์ self๋ ์์ฝ์ด๋ก ํ์ฌ ์ธ์คํด์ค๋ฅผ ๋ํ๋ ๋๋ค. ์ฆ, ํด๋น ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ํ๋ ๋๋ค.
4. @objc๋ ์ธ์ ์ฌ์ฉํ๋์?
Objective-C ๋ฐํ์์ swift ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
swift์์ ํ๋กํ ์ฝ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ static ๋์คํจ์น๋ฅผ ์ฌ์ฉํ๋๋ฐ, @objc๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์๋๋ฅผ ๋์ ๋์คํจ์น๋ก ๋์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
5. autoclosure attribute์ ๋ํด์ ์ค๋ช
ํด๋ณด์ธ์.
ํจ์ ์ธ์์ autoclosure ์์ฑ์ ๋ถ์ด๋ฉด, ์ ๋ฌ๋๋ ์ธ์ ์ฝ๋๋ฅผ ๊ฐ์ธ์ ์๋์ผ๋ก ํด๋ก์ ๋ก ๋ง๋ค์ด์ค๋๋ค.
๋ค์ ๋งํด ์ผ๋ฐ ํํ์ ์ฝ๋๋ฅผ ํด๋ก์ ํํ์ ์ฝ๋๋ก ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ ํด๋ก์ ์๋ ์ธ์๊ฐ ์๊ณ ๋ฆฌํด๊ฐ๋ง ์กด์ฌํด์ผ ํฉ๋๋ค.
ํด๋ก์ ํธ์ถ์ ํ์ํ ์ค๊ดํธ๋ฅผ ์์ฐ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
Swift์์ @autoclosure๋ฅผ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ์๋ก assert()ํจ์๊ฐ ์์ต๋๋ค.
// @autoclosure ๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ
func normalPrint(_ closure: () -> Void) {
closure()
}
// ์ด ํจ์๋ฅผ ํธ์ถํ ๋ ํด๋ก์ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ๋๊ดํธ {...}๋ก ๋ฌถ์ด์ ์ธ์๋ฅผ ๋ฃ์ด์ผ ํฉ๋๋ค.
normalPrint({ print("I'm Normal Expression") })
// @autoclosure ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
func autoClosurePrint(_ closure: @autoclosure () -> Void) {
closure()
}
// @autoclosure๋ฅผ ์ด์ฉํ๋ฉด ํจ์์ ํด๋ก์ ๋ฅผ ์ธ์๋ก ์ฌ์ฉํ ๋ ์ผ๋ฐ ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
autoClosurePrint(print("I'm AutoClosure Expression"))
6. Never ๋ฐํ ํ์
์ ๋ํด ์ค๋ช
ํด๋ณด์ธ์.
์๋ฌ ๋ฑ์ ์ด์ ๋ก ์ ์์ ์ผ๋ก ๋ฆฌํด ๋์ง์๋ ํจ์์ ๋ฆฌํด ํ์ ์ ๋๋ค. ์ค์ ๋ก ์ด๋ค ๊ฐ์ ๋ฆฌํดํ์ง๋ ์์ต๋๋ค. (The return type of functions that do not return normally, that is, a type with no values.)
func crashAndBurn() -> Never {
fatalError("Something very, very bad happened")
}
7. ๋ชจ๋๋์ ๋ํด์ ์ค๋ช
ํด์ฃผ์ธ์.
๋ชจ๋๋๋ ๊ฐ์ด ์ ํ์ ์ผ๋ก ์กด์ฌํ๋ ํจ์ ๊ฐ์ฒด(functor)์ ๋๋ค.
ํจ์ ๊ฐ์ฒด(functor) = ๊ฐ์ ๋ด๊ณ ์๋ ์ปจํ ์ด๋ ํ์ ์ ๋๋ค. ๊ณ ์ฐจ ํจ์ map ์ ์ ์ฉ์ํฌ ์ ์๋ค๋ ํน์ง์ด ์์ต๋๋ค. Swift ์์๋ Array, Dictionary, Optional ๋ฑ์ด ์ปจํ ์ด๋ ํ์ ์ ๋๋ค.
Swift ์์ ๋ํ์ ์ผ๋ก ๋ชจ๋๋๋ Optional ์ด ์์ต๋๋ค.
Optional ์ ๊ฐ์ด ์ ํ์ ์ผ๋ก ์กด์ฌํ๊ณ , map ์ ์ ์ฉ์ํฌ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ชจ๋๋๋ ํจ์ ๊ฐ์ฒด ์์ ํฌํจ๋๋ ๊ฐ๋ ์ด์ง๋ง, ํจ์ ๊ฐ์ฒด์์ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ๋ฐ๋ก ๋ชจ๋๋์๋ flatMap (์ต์ ๋ ํด์ ๊ธฐ๋ฅ ์ถ๊ฐ) ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ๋ชจ๋๋๊ฐ ์๋ ํจ์ ๊ฐ์ฒด์๋ flatMap ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ถ์ฒ
Last updated