์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ํ๋ก๊ทธ๋๋จธ์ค
- Til
- discardableResult
- SwiftUI Tutorials
- concurrency
- Swift
- duno
- URLSession
- SQL
- dfs
- HAVIT
- SOPT
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- BFS
- SwiftUI ํํ ๋ฆฌ์ผ
- 0์ด๋์ด์๋๊ธธ
- algoritm
- ๋์ ๊ณํ๋ฒ
- SwiftUI
- algorithm
- IOS
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- DynamicProgramming
- binarySearch
- GCD
- ๊ธฐ์ด๋ฌธ๋ฒ
- APPJAM
- ๊ณ ๋์ kit
- GroupBy
- ์ด์งํ์
- Today
- Total
suvera-dev ๐ฅฆ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ Swift - Struct, Class, Property, Method ๋ณธ๋ฌธ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ Swift - Struct, Class, Property, Method
suvera 2023. 3. 30. 15:01๊ธฐ๋ณธ๊ธฐ ๋ณด์ถฉ์ ์ํด ์ค์ํํธ์ ๊ต๊ณผ์๋ผ๊ณ ํ ์ ์๋ ์ผ๊ณฐ์ฑ ์ ๋ค์ ๋ณด๋ ์ค์ธ๋ฐ์.
๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด์ง๋ง ์ญ์ ๋ณผ ๋๋ง๋ค ์๋ก์ด ๊ฒ ๊ฐ๋ค์ ใ ใ ใ ใ
์๋ ์ ์ํฐ๋์์ ์งํํ๋ ํ๋ฆฌ์จ๋ณด๋ฉ ๊ฐ์๋ฅผ ๋ค์์ ๋๋ ์ผ๊ณฐ๋์ด ๊ธฐ์ด์ ์ธ ๊ฐ๋ ์ ๋งค์ฐ ๊ฐ์กฐํ์๋ฉด์
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ 1์ฐจ์์ ์๊ฐํด์ฃผ์ จ๋ ๊ฒ์ด ์๊ฐ๋๋ค์.. ^^..
๋งค๋ฌ 1๊ถ์ฉ์ ๊ผญ ์ฑ ์ ์ฝ์ผ๋ ค๊ณ ํ๋๋ฐ,
์ด๋ฒ ๋ฌ์ ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด. ๋ผ๋ ์ฑ ์ ๊ตฌ๋งคํ์ต๋๋ค.
์ ๋ฒ ๋ฌ๊น์ง ์๊ธฐ๊ณ๋ฐ์, ์ธ๋ฌธํ ๋์๋ฅผ ํ ๋ฌ์ 1~2๊ถ ์ ๋ ์ฝ์๋๋ฐ
์ด๋ฒ ๋ฌ์ ๊ฐ๋ฐ ์์ ์ ์ข ์ฝ์ด๋ณด๋ ค๊ณ ํฉ๋๋ค !
์จ๋ , ์ฑ ์ ์ฝ๊ธฐ ์ ์ Swift์์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจํฐ๋ค์์ ํ์ฉํ ์ ์๋ ๋ฌธ๋ฒ์ ์ง์ด๋ณด๊ณ ์ ๋ณต์ต์ ํ๊ฒ ๋์์ต๋๋ค !
1ํ์์๋ ๊ตฌ์กฐ์ฒด, ํด๋์ค, ํ๋กํผํฐ, ๋ฉ์๋๋ฅผ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ค ์ด์ ์ ์ ๋ฆฌํด๋ ๊ฒ์ ์กฐ๊ธ ๋ค๋ฌ์ด์ ํฉ์น ๊ฒ.. ใ ..
๊ฐ๋ ์ฑ ์๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ๋ด์ฉ์ ์๋๋ผ์,,, ๊ทธ๋ฅ ์ญ ๋ณด๋ฉด์ ๋์ณค๋ ๋ถ๋ถ๋ง ์๊ธฐ์ํค๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ค์ํํธ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ฐ์กฐํ์ง๋ง, ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ ํ์ ํ๋ ์์ํฌ๋ ๋๋ถ๋ถ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ทผ๊ฐ์ ๋ก๋๋ค !
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ํ ์ดํด๋ ํ์ !
- ๊ตฌ์กฐ์ฒด์ ํด๋์ค
- ํ๋กํผํฐ์ ๋ฉ์๋
- ์ธ์คํด์ค ์์ฑ ๋ฐ ์๋ฉธ
- ์ ๊ทผ์ ์ด
์์ 4๊ฐ ํํธ๋ก ๋๋์ด์ ธ ์์ต๋๋ค.
๊ฐ๊ฐ์ ๊ฐ๋ ์ ๋ํ ๋ด์ฉ์ด ๋ง์์ ๊ธ์ด ๊ธธ์ง๋ง,
ํ๋ฒ์ ๋ชจ์์ ๋ณด๊ธฐ ์ํด 2ํํธ์ฉ ๋๋ ์ ์ ๋ฆฌํ์ต๋๋ค.
1. ๊ตฌ์กฐ์ฒด์ ํด๋์ค
์ฌ์ค ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๋ํ ๋ด์ฉ์ ๋๋ฌด ๋ง์ด ๋ด์ ์ง๊ธ์ง๊ธ..ํ๋ค์
๊ทธ๋์ ์ด์ ์ ์ ๋ฆฌํด๋จ๋ ๋ด์ฉ์ ๋ณต๋ถํ์ต๋๋ค. ใ ใ
๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ ๊ฐ ํ์
ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐ ํ์
๊ตฌ์กฐ์ฒด - Struct
- ๊ตฌ์กฐ์ฒด ์ ์๋ฅผ ๋ง์น ํ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๊ณ ์ ํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ์ฌ์ฉ
- ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ? ํ๋กํผํฐ์ ์ด๋ฆ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ์ด๋์ ๋ผ์ด์
- ๊ตฌ์กฐ์ฒด์ ๊ธฐ๋ณธ ์์ฑ๋ ์ด๋์ ๋ผ์ด์ ์ ๋งค๊ฐ๋ณ์๋ ๊ตฌ์กฐ์ฒด์ ํ๋กํผํฐ ์ด๋ฆ์ผ๋ก ์๋ ์ง์
- ๊ตฌ์กฐ์ฒด๋ฅผ var๋ก ์ ์ธํ๊ฒ ๋ ๊ฒฝ์ฐ .์ผ๋ก ์ ๊ทผํ์ฌ ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ์ฌ์ฉ์ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ ๊ตฌํ ๊ฐ๋ฅ
ํด๋์ค - Class
- Swift ์ ํด๋์ค๋ ๋ถ๋ชจํด๋์ค ์๋๋ผ๋ ์์์์ด ๋จ๋ ์ผ๋ก ์ ์ ๊ฐ๋ฅ.
- ํด๋์ค๋ฅผ ์ ์ํ ํ, ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํ ํ๊ณ ์ ํ ๋๋ ๊ธฐ๋ณธ์ ์ธ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ฌ์ฉ
- ํ๋กํผํฐ์ ๊ธฐ๋ณธ ๊ฐ์ด ์ง์ ๋์ด ์๋ ๊ฒฝ์ฐ, ์ ๋ฌ์ธ์๋ฅผ ํตํ์ฌ ๋ฐ๋ก ์ด๊น๊ฐ์ ์ ๋ฌํด์ฃผ์ง ์์๋ ๋๋ค.
- ํด๋์ค์ ์ธ์คํด์ค = ๊ฐ์ฒด
- ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ์ด๊ธฐํ๋ ํ ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ๋ ค๋ฉด ๋ง์นจํ ์ฌ์ฉ.
- ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐ ํ์ ์ด๋ฏ๋ก ํด๋์ค์ ์ธ์คํด์ค๋ฅผ let์ผ๋ก ์ ์ธํด๋ ๋ด๋ถ ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
ํด๋์ค ์ธ์คํด์ค์ ์๋ฉธ
๐ฅ ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐํ์ ์ด๋ฏ๋ก ๋๋ ์ฐธ์กฐํ ํ์๊ฐ ์์ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค.
์๋ฉธ๋๊ธฐ ์ง์ deinit์ด๋ผ๋ ๋ฉ์๋(๋์ด๋์ ๋ผ์ด์ deinitializer) ํธ์ถ
- ํด๋์ค ๋ด๋ถ์ deinit ๋ฉ์๋๋ฅผ ๊ตฌํํด์ฃผ๋ฉด, ์๋ฉธ๋๊ธฐ ์ง์ ์ ํธ์ถ๋จ
- ํด๋์ค๋น ํ๋๋ง ๊ตฌํ, ๋งค๊ฐ๋ณ์์ ๋ฐํ๊ฐ์ ๊ฐ์ง ์ ์์
Class Person {
...
deinit {
print("์ธ์คํด์ค ์๋ฉธ")
}
}
var yagom: Person? = Person()
yagom = nil // Person ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์๋ฉธ๋ฉ๋๋ค.
→ ๋ณดํต deinit ๋ฉ์๋์๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๊ธฐ ์ง์ ์ ์ฒ๋ฆฌํ ์ฝ๋๋ฅผ ๋ฃ์ด์ค๋๋ค. ์๋ฅผ ๋ค์ด ์ธ์คํด์ค ์๋ฉธ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ธ์คํด์ค ์๋ฉธ์ ์๋ ค์ผํ ๋๋ ํนํ deinit ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ต๊ทผ์ ๊ฐ๋ฐ์ ํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๊ฐ ํด์ ๋์๋์ง ํ์ธํ๊ธฐ ์ํด deinit ํธ์ถ์ ํ์ธํ๋ ๊ธฐ์ต์ด๋ฉ๋๋ค.
deinit ๋ฉ์๋์ ํธ์ถ์ ํตํด์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ ์ก์๋ผ ์ ์์์ต๋๋ค :)
๊ฐ ํ์ ๊ณผ ์ฐธ์กฐ ํ์ ??
๊ฐ ํ์ ๊ณผ ์ฐธ์กฐ ํ์ ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ?? → ๋ฌด์์ด ์ ๋ฌ๋๋๋??
- ์ด๋ค ํจ์์ ์ ๋ฌ ์ธ์๋ก ๊ฐ ํ์ ์ ๊ฐ์ ๋๊ธด๋ค๋ฉด ์ ๋ฌ๋ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋ ์ฐธ์กฐ ํ์ ์ด ์ ๋ฌ์ธ์๋ก ์ ๋ฌ๋ ๋๋ ๊ฐ์ ๋ณต์ฌํ์ง ์๊ณ ์ฐธ์กฐ(์ฃผ์)๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
- ํจ์์ ์ ๋ฌ์ธ์๋ก ๋๊ธธ๋๋ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋๋ฉฐ ๋ค๋ฅธ ๋ณ์ ๋๋ ์์์ ํ ๋น๋ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐธ์กฐ๊ฐ ํ ๋น๋๋ค !
๊ฐ ํ์
struct BasicInformation {
let name: String
var age: Int
}
var yagomInfo: BasicInformation = BasicInformation(name: "yagom", age: 99)
yagomInfo.age = 100
//friendInfo ์ yagomInfo ์ ๊ฐ์ "๋ณต์ฌ"ํ์ฌ ํ ๋น (extra memory)
var friendInfo: BasicInformation = yagomInfo
print("yagom's age: \\(yagomInfo.age)")
print("friend's age: \\(friendInfo.age)")
friendInfo.age = 25
//friendInfo ๋ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์๊ธฐ ๋๋ฌธ์ yagomInfo.age ์๋ ๊ฐ ๋ณ๊ฒฝ X
func changeBasicInfo(_ info: BasicInformation){
var copiedInfo: BasicInformation = info
copiedInfo.age = 1
}
changeBasicInfo(yagomInfo)
print("yagom's age: \\(yagomInfo.age)")
//call by reference ๊ฐ ์๋ call by value ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๊ณ ๊ทธ๋๋ก 100์
์ฐธ์กฐํ์
class Person{
var height: Float = 0.0
var weight: Float = 0.0
}
var yagom: Person = Person()
var friend: Person = yagom
//yagom์ ์ฐธ์กฐ๋ฅผ ํ ๋นํ๋ค
friend.height = 182.3
print("yagom height: \\(yagom.height)")
//friend.height ์ ๋ฐ๊ฟจ์์๋ ๋ถ๊ตฌํ๊ณ yagom.height ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค
// ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ
func changePersonInfo(_ info: Person){
info.height = 155.2
}
changePersonInfo(yagom)
print("yagom height: \\(yagom.height)")
//Call by reference ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ฐ์ด ๋ณํ๋์ด 155.2 ์ถ๋ ฅ
- ๊ฐ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ํจ์์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฌ์ธ์๋ฅผ ์ํ ์ธ์คํด์ค๊ฐ ์๋ก ์์ฑ๋๋ค.
- ์์ฑ๋ ์ ์ธ์คํด์ค์๋ ์ ๋ฌํ๋ ค๋ ๊ฐ์ด ๋ณต์ฌ๋์ด ๋ค์ด๊ฐ.
- ๋ฐ๋ฉด, ์ฐธ์กฐํ์ ์ ๋ฐ์ดํฐ๋ ์ ๋ฌ์ธ์๋ก ์ ๋ฌํ ๋ ๊ธฐ์กด ์ธ์คํด์ค์ ์ฐธ์กฐ๋ฅผ ์ ๋ฌ.
- ์๋ก์ด ์ธ์คํด์ค๊ฐ ์๋ ๊ธฐ์กด์ ์ธ์คํด์ค ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๋ค.
๐ฅ ์๋ณ์ฐ์ฐ์ === : ํด๋์ค์ ์ธ์คํด์ค๋ผ๋ฆฌ ์ฐธ์กฐ๊ฐ ๊ฐ์์ง ํ์ธํ ๋ ์ฌ์ฉ !
์ค์ํํธ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ ๋ชจ๋ ๊ตฌ์กฐ์ฒด
๐ฅ ์ ํ์ ๊ฐ์ด๋๋ผ์ธ์์ ๋ค์ ์กฐ๊ฑด ์ค ํ๋ ์ด์์ ํด๋นํ๋ค๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ
- ์ฐ๊ด๋ ๊ฐ๋จํ ๊ฐ์ ์งํฉ์ ์บก์ํํ๋ ๊ฒ๋ง์ด ๋ชฉ์ ์ผ ๋
- ์บก์ํํ ๊ฐ์ ์ฐธ์กฐํ๋ ๊ฒ๋ณด๋ค ๋ณต์ฌํ๋ ๊ฒ์ด ํฉ๋นํ ๋
- ๊ตฌ์กฐ์ฒด์ ์ ์ฅ๋ ํ๋กํผํฐ๊ฐ ๊ฐํ์ ์ด๋ฉฐ, ์ฐธ์กฐํ๋ ๊ฒ ๋ณด๋ค ๋ณต์ฌํ๋ ๊ฒ์ด ํฉ๋นํ ๋
- ๋ค๋ฅธ ํ์ ์ผ๋ก ๋ถํฐ ์์ ๋ฐ๊ฑฐ๋ ์์ ์ ์์ํ ํ์๊ฐ ์์ ๋
์ ์ ํ ์๋ก๋ ์ขํ๊ณ๊ฐ ์์ต๋๋ค.
- ์ขํ๋ฅผ ํํํ๊ณ ์ถ์๋ Int ํ์ ์ผ๋ก x,y ํ๋กํผํฐ ์์ฑ
- ๋๋ค์ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ํ์ ์ ํด๋์ค๋ก ๊ตฌํํ ์ผ์ด ๋ ๋ง์ ๊ฒ !
์ค์ํํธ์ ๋ณต์ฌ ์ฒ๋ฆฌ
์ค์ํํธ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ด ๋ชจ๋ ๊ตฌ์กฐ์ฒด๋ผ์ ๋ค์์ ๋ฐฐ์ด ๋๋ ๋์ ๋๋ฆฌ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ณ ์ด์ฉํ ๋
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋นํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค๊ณ ์คํดํ ์ ์์.
ํ์ง๋ง, ์ค์ํํธ๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ง์ง๋ณต์ฌ๋ฅผ ํฉ๋๋ค !
์ปดํ์ผ๋ฌ๊ฐ ํ๋จํด์ ์์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ
์ค์ํํธ๋ ์์คํ์ผ ํ๋์ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ๊ตฌํํด๋ ๋ฌธ์ ์์.
์ค์ฒฉํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ฒฉ ํ์ ์ ์ ์ ๋ฐ ์ ์ธ์ด ๊ฐ๋ฅํจ.
๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ฐจ์ด
๊ณตํต์
1. ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ํ๋กํผํฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
2. ๊ธฐ๋ฅ ์คํ์ ์ํด ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
3. ์๋ธ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ํตํด ๊ตฌ์กฐ์ฒด ๋๋ ํด๋์ค๊ฐ ๊ฐ๋ ๊ฐ์ ์ ๊ทผํ๋๋ก ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ ์ ์์
4. ์ด๊ธฐํ ๋ ๋์ ์ํ๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
5. ์ด๊ธฐ๊ตฌํ๊ณผ ๋๋ถ์ด ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์ํด ์ต์คํ ์ ์ ํตํด ํ์ฅํ ์ ์์ต๋๋ค.
6. ํน์ ๊ธฐ๋ฅ์ ์คํํ๊ธฐ ์ํด ํน์ ํ๋กํ ์ฝ์ ์ค์ํ ์ ์์ต๋๋ค.
์ฐจ์ด์
1. ๊ตฌ์กฐ์ฒด๋ ์์ํ ์ ์์ต๋๋ค. ํด๋์ค์ ์ธ์คํด์ค์๋ง ํ์ฉ๋ฉ๋๋ค.
2. ๋์ด๋์ ๋ผ์ด์ ๋ ํด๋์ค์ ์ธ์คํด์ค์๋ง ํ์ฉํ ์ ์์ต๋๋ค.
3. ์ฐธ์กฐํ์ ๊ณ์ฐ์ ํด๋์ค์ ์ธ์คํด์ค์๋ง ์ ์ฉ๋ฉ๋๋ค.
4. ํ์ ์บ์คํ ์ ํด๋์ค์ ์ธ์คํด์ค์๋ง ํ์ฉ.
5. ๊ตฌ์กฐ์ฒด๋ ์์ฑ์๋ฅผ ๊ตฌํํ์ง ์์๋ default initalizer ๋ฅผ ์ฌ์ฉํ ์ ์์.
6. ๊ตฌ์กฐ์ฒด๋ let์ผ๋ก ์ ์ธํ์ ๊ฒฝ์ฐ ํ๋กํผํฐ ๊ฐ์ด ์์ ๋ถ๊ฐ๋ฅ. ํด๋์ค๋ let์ผ๋ก ์ ์ธํด๋ ์์ ๊ฐ๋ฅ.
2. ํ๋กํผํฐ์ ๋ฉ์๋
ํ๋กํผํฐ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด ๋๋ ์ด๊ฑฐํ ๋ฑ์ ๊ด๋ จ๋ ๊ฐ.
๋ฉ์๋๋ ํน์ ํ์ ์ ๊ด๋ จ๋ ํจ์.
Property = ์ ์ฅ ํ๋กํผํฐ, ์ฐ์ฐ ํ๋กํผํฐ, ํ์ ํ๋กํผํฐ
- ์ ์ฅ ํ๋กํผํฐ : ์ธ์คํด์ค์ ๋ณ์ ๋๋ ์์ ( ๊ตฌ์กฐ์ฒด, ํด๋์ค์์๋ง )
- ์ฐ์ฐ ํ๋กํผํฐ : ๊ฐ์ ์ ์ฅํ ๊ฒ์ด ์๋๋ผ ํน์ ์ฐ์ฐ์ ์คํํ ๊ฒฐ๊ด๊ฐ. ( ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์ฐ์ผ ์ ์๋ค. )
- ํ์ ํ๋กํผํฐ : ํน์ ํ์ ์ ์ฌ์ฉ๋๋ ํ๋กํผํฐ
์ ๋ฆฌ : ์ธ์คํด์ค ๋ณ์ => ์ ์ฅ ํ๋กํผํฐ๋ก, ํด๋์ค ๋ณ์ => ํ์ ํ๋กํผํฐ๋ก ๊ตฌ๋ถ.
Property Observers : ํ๋กํผํฐ์ ๊ฐ์ด ๋ณํ๋ ๊ฒ์ ๊ฐ์.
- ํ๋กํผํฐ์ ๊ฐ์ด ๋ณํ ๋ ๊ฐ์ ๋ณํ์ ๋ฐ๋ฅธ ํน์ ์์ ์ ์คํ.
- ์ ์ฅ ํ๋กํผํฐ์ ์ ์ฉํ ์ ์์ผ๋ฉฐ ๋ถ๋ชจํด๋์ค๋ก๋ถํฐ ์์ ๋ฐ์ ์ ์์.
1) ์ ์ฅ ํ๋กํผํฐ
= ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค์ ์ฐ๊ด๋ ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ.
- ํ๋กํผํฐ ๊ธฐ๋ณธ๊ฐ๊ณผ ์ด๊น๊ฐ์ ์ง์ ํด์ค ์ ์์ต๋๋ค.
** ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ๋ ์ต์ ๋์ด ์๋๋ผ๋ฉด ํ๋กํผํฐ ๊ธฐ๋ณธ ๊ฐ์ ๊ธฐ์ ํด์ฃผ๊ฑฐ๋
- ์ฌ์ฉ์ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํตํด ๋ฐ๋์ ์ด๊ธฐํํด์ฃผ์ด์ผํฉ๋๋ค.
** ํด๋์ค ์ธ์คํด์ค์ ์์ ํ๋กํผํฐ๋ ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ ๋ ๋ ํ๋ฒ๋ง ๊ฐ์ ํ ๋นํ ์ ์์.
์์ ํด๋์ค์์ ์ด ์ด๊ธฐํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํด๋์ค์์๋ ํ๋กํผํฐ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํด์ฃผ์ง ์๋๋ค๋ฉด ์ด๋์ ๋ผ์ด์ ๋ฅผ ๋ฐ๋ก ์ ์ํด์ฃผ์ด์ผํฉ๋๋ค !
- ์ด ๋ง์ ์ฆ, ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊น๊ฐ์ ์ง์ ํด์ฃผ๋ฉด ๋ฐ๋ก ์ฌ์ฉ์ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ๊ตฌํํด์ค ํ์๊ฐ ์๋ค !
- ํ์ง๋ง, ์๋์ ๋ง์ง ์๊ฒ ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋จ์์๊ณ , ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ์ ์ํ๋ ๊ฐ์ ์ผ์ผ์ด ํ ๋นํด์ผํด์ ๋ถํธํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋, let์ผ๋ก ์ ์ํด์ฃผ๊ณ ์ถ์๋ ํ๋กํผํฐ๋ ์ธ์คํด์ค ์์ฑ ํ์ ๊ฐ์ ํ ๋นํด์ฃผ๋๊ฒ ๋ถ๊ฐ๋ฅํฉ๋๋ค !
ํ๋กํผํฐ๊ฐ ์ต์ ๋์ด ์๋๋ผ๋ฉด, ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํตํด ์ด๊น๊ฐ์ ๋ณด๋ด์ฃผ์.
- ์ธ์คํด์ค๋ ์์ฑํ ๋ ํ๋กํผํฐ์ ๊ฐ์ด ๊ผญ ์์ด์ผํ๋ ์ํ์ด๊ธฐ์, ์ต์ ๋์ด ์๋ ๊ฐ์ผ๋ ์ด๊น๊ฐ์ ๋ณด๋ด์ค์ผํฉ๋๋ค. ๋ง์ฝ ์ต์ ๋์ด๋ผ๋ฉด, ์ด๊ธฐ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์์๋ ๋ฉ๋๋ค.
struct CoordinatePoint {
// ์์น๋ x, y ๊ฐ์ด ๋ชจ๋ ์์ด์ผ ํ๋ฏ๋ก ์ต์
๋์ด๋ฉด ์ ๋ฉ๋๋ค.
var x: Int
var y: Int
}
class Position {
// ํ์ฌ ์ฌ๋์ ์์น๋ฅผ ๋ชจ๋ฅผ ์๋ ์์ต๋๋ค. - ์ต์
๋
var point: CoordinatePoint?
let name: String
init(name: String) {
self.name = name
}
}
// ์ด๋ฆ์ ํ์์ง๋ง ์์น๋ ๋ชจ๋ฅผ ์ ์์ต๋๋ค.
let eunseoPosition: Position = Position(name: "eunseo")
// ์์น๋ฅผ ์๊ฒ๋๋ฉด ๊ทธ๋ ์์น ๊ฐ์ ํ ๋นํด์ค๋๋ค.
eunseoPosition.point = CoordinatePoint(x: 3, y: 6)
-> ์ด๋ ๊ฒ ์ต์ ๋๊ณผ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ ๋, ๋ด๊ฐ ์ฒ์ ์๋ํ๋ ๋๋ก ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์์๋๋ก ์ ๋ํ ์ ์์ด์ !
+ ) ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ
- ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ์ ๊ฐ์ด ํ์์๋ค๋ฉด ์ต์ ๋๋ก ์ ์ธํด ์ค ์ ์๋ค ํ๋๋ฐ, ๋ค๋ฅธ ์ฉ๋๋ก ํ์ํ ๋ ๊ฐ์ด ํ ๋น๋๋ ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ๊ฐ ์์ต๋๋ค. ์ง์ฐ์ ์ฅํ๋กํผํฐ๋ ํธ์ถ์ด ์์ด์ผ ๊ฐ์ ์ด๊ธฐํํด์. lazy ํค์๋ ์ฌ์ฉ.
- ์์๋ ์ธ์คํด์ค๊ฐ ์์ ํ ์์ฑ๋๊ธฐ ์ ์ ์ด๊ธฐํํด์ผํ๋ฏ๋ก var๋ก ์ ์ํด์.
- ์ฃผ๋ก ๋ณต์กํ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํํ ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ํด๋์ค์ ์ธ์คํด์ค์ ์ ์ฅ ํ๋กํผํฐ๋ก ๋ค๋ฅธ ํด๋์ค ์ธ์คํด์ค๋ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๋ฅผ ํ ๋นํด์ผ๋ ๋๊ฐ ์์์์. ์ด๋ด ๋ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๋ฉด์ ์ ์ฅ ํ๋กํผํฐ๋ก ์ฐ์ด๋ ์ธ์คํด์ค๋ค์ด ํ๋ฒ์ ์์ฑ๋์ด์ผ ํ๋ค๋ฉด ? ๋, ๊ตณ์ด ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๋ฅด๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ฉด ? ์ง์ฐ์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์.
=> ์ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ์ฑ๋ฅ์ ํ๋ ๊ณต๊ฐ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
struct CoordinatePoint {
var x: Int = 0
var y: Int = 0
}
class Position {
lazy var point: CoordinatePoint = CoordinatePoint()
let name: String
init(name: String) {
self.name = name
}
}
let eunseoPosition = Position(name: "eunseo")
// ์ด ์ฝ๋๋ฅผ ํตํด point ํ๋กํผํฐ๋ก ์ฒ์ ์ ๊ทผํ ๋
// point ํ๋กํผํฐ์ CoordinatePoint๊ฐ ์์ฑ๋ฉ๋๋ค.
print(eunseoPosition.point)
์ฃผ์ : ๋ค์ค์ค๋ ๋์ ์ง์ฐ์ ์ฅ ํ๋กํผํฐ
- ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ์ ๋์๋ค๋ฐ์ ์ผ๋ก ์ ๊ทผํ ๋๋ ํ๋ฒ๋ง ์ด๊ธฐํ ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค.
- ์์ฑ๋์ง ์์ ์ง์ฐ์ ์ฅ ํ๋กํผํฐ์ ๋ง์ ์ค๋ ๋๊ฐ ๋น์ทํ ์์ ์ ์ ๊ทผํ๋ค๋ฉด, ์ฌ๋ฌ๋ฒ ์ด๊ธฐํ ๋ ์ ์์ต๋๋ค !
2) ์ฐ์ฐ ํ๋กํผํฐ
= ์ค์ ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ๊ฐ ์๋๋ผ ํน์ ์ํ์ ๋ฐ๋ฅธ ๊ฐ์ ์ฐ์ฐํ๋ ํ๋กํผํฐ.
- ์ธ์คํด์ค ๋ด/์ธ๋ถ์ ๊ฐ์ ์ฐ์ฐํ์ฌ ์ ์ ํ ๊ฐ์ ๋๋ ค์ฃผ๋ ์ ๊ทผ์(getter) ์ญํ
- ์๋ํ๋ ๋ด๋ถ์ ํ๋กํผํฐ ๊ฐ์ ๊ฐ์ ์ ์ผ๋ก ์ค์ ํ๋ ์ค์ ์(setter)์ ์ญํ
๊ตณ์ด ๋ฉ์๋๋ฅผ ๋๊ณ ์ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ธ๊น???
- ์ธ์คํด์ค ์ธ๋ถ์์ ๋ฉ์๋๋ฅผ ํตํด ์ธ์คํด์ค ๋ด๋ถ ๊ฐ์ ์ ๊ทผํ๋ ค๋ฉด ๋ฉ์๋๋ฅผ ๋๊ฐ ๊ตฌํํด์ผํฉ๋๋ค . ( getter setter )
- ์ด๋ฅผ ๊ฐ์ํ๊ณ ๋ฉ์๋๋ก ๊ตฌํํ๋คํด๋ ๋ ๋ฉ์๋๊ฐ ๋ถ์ฐ ๊ตฌํ๋์ด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋๋น ์ง ์ํ์ด ์์ต๋๋ค.
- ํ์ธ์ ์ฝ๋๋ฅผ ๋ณด๋ ํ๋ก๊ทธ๋๋จธ์ ์ ์ฅ์์๋ ํ๋กํผํฐ๊ฐ ๋ฉ์๋ ํ์๋ณด๋ค ํจ์ฌ ๋ ๊ฐํธํ๊ณ ์ง๊ด์ !
์ฐ์ฐ ํ๋กํผํฐ์ ๋จ์
- ์ ๊ทผ์์ธ get ๋ฉ์๋๋ง ๊ตฌํํด๋ ๊ฒ์ฒ๋ผ ์ฝ๊ธฐ ์ ์ฉ์ํ๋ก ๊ตฌํํ๊ธฐ ์ฝ์ง๋ง, ์ฐ๊ธฐ ์ ์ฉ์ํ๋ก ๊ตฌํํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
- ๋ฉ์๋๋ก๋ ์ค์ ์ ๋ฉ์๋๋ง ๊ตฌํํ์ฌ ์ฐ๊ธฐ ์ ์ฉ ์ํ๋ก ๊ตฌํํ ์ ์์ง๋ง ์ฐ์ฐ ํ๋กํผํฐ๋ ๊ทธ๊ฒ์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
์๋๋ ๋ฉ์๋๋ก ๊ตฌํ๋ getter, setter ์ ๋๋ค.
struct CoordinatePoint {
var x: Int // ์ ์ฅ ํ๋กํผํฐ
var y: Int // ์ ์ฅ ํ๋กํผํฐ
// ๋์นญ์ ์ ๊ตฌํ๋ ๋ฉ์๋ - ์ ๊ทผ์
// Self๋ ํ์
์๊ธฐ ์์ ์ ๋ปํฉ๋๋ค.
// Self ๋์ CoordinatePont๋ฅผ ์ฌ์ฉํด๋ ๋ฉ๋๋ค.
func oppositePoint() -> Self {
return CoordinatePoint(x: -x, y: -y)
}
// ๋์นญ์ ์ ์ค์ ํ๋ ๋ฉ์๋ - ์ค์ ์
mutating func setOppositePoint(_ opposite: CoordinatePoint) {
x = -opposite.x
y = -opposite.y
}
}
var yagomPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)
yagomPosition // ํ์ฌ์ขํ
yagomPosition.oppositePoint() // ๋์นญ ์ขํ
yagomPosition.setOppositePoint(CoordinatePoint(x: 15, y:10))
yagomPosition // ๋์นญ์ขํ๋ฅผ 15,10์ผ๋ก ์ค์ ํ๋ฉด ํ์ฌ๋ -15, -10 ์ด ๋๋ค.
-> oppositePoint() ๋ก ๋์นญ์ ์ ๊ตฌํ ์ ์๊ณ , setOppositePoint()๋ก ๋์นญ์ ์ ์ค์ ํด์ค์ผํ๋ค.
์ฐ์ฐํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ๋ ๊ฐ๊ฒฐํ๊ฒ ํํํ์
struct CoordinatePoint {
var x: Int
var y: Int
// ๋์นญ์ข์ตธ
var oppositePoint: CoordinatePoint {
// ์ฐ์ฐ ํ๋กํผํฐ
get {
return CoordinatePoint(x: -x, y: -y)
}
set(opposite) {
x = -opposite.x
y = -opposite.y
}
}
}
- ์ด๋ฐ์์ผ๋ก ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๋์ ํ๋กํผํฐ์ ์ ๊ทผ์์ ์ค์ ์๊ฐ ๋ชจ๋ ๋ชจ์ฌ์๊ณ , ํด๋น ํ๋กํผํฐ๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ข ๋ ๋ช ํํ๊ฒ ํํ์ด ๊ฐ๋ฅํฉ๋๋ค ! ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ์ ์ฅ์์๋ ๋ง์น ์ ์ฅ ํ๋กํผํฐ์ธ ๊ฒ์ฒ๋ผ ํธํ๊ฒ ์ฌ์ฉํ ์ ์์ด์.
- ์ค์ ์์ ๋งค๊ฐ๋ณ์๋ก ์ํ๋ ์ด๋ฆ์ ์๊ดํธ์ ๋ช ์ํด์ฃผ๋ฉด, set๋ฉ์๋ ๋ด๋ถ์์ ์ ๋ฌ๋ฐ์ ์ ๋ฌ์ธ์ ์ฌ์ฉ ๊ฐ๋ฅ.
- ๊ด์ฉ์ ์ธ ํํ์ผ๋ก newValue๋ก ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๋์ ํ ์ ์์ด์. ๊ทธ๋ด ๊ฒฝ์ฐ, ๋งค๊ฐ๋ณ์๋ ๋ฐ๋ก ํ๊ธฐํ์ง ์์ต๋๋ค.
- ์ ๊ทผ์ ๋ด๋ถ์ ์ฝ๋๊ฐ ๋จ ํ ์ค ์ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ํ์ ์ด ํ๋กํผํฐ ํ์ ๊ณผ ๊ฐ์ผ๋ฉด return ํค์๋๋ฅผ ์๋ตํด๋ ๋ฉ๋๋ค.
- ๊ตณ์ด ๋์นญ์ ์ ์ค์ ํ ํ์๊ฐ ์๋ค๋ฉด, get๋ง ๊ตฌํํด์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
// ์ฝ๊ธฐ์ ์ฉ์ผ๋ก ๊ตฌํํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ค์ ํ๋ ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
yagomPosition.oppositePoint = CoordinatePoint(x: 15, y: 10)
ํ๋กํผํฐ ์ต์ ๋ฒ Property Observers
- ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ์ ์ ํ ์์ ์ ์ทจํ ์ ์์ต๋๋ค.
- ํ๋กํผํฐ ์ต์ ๋ฒ๋ ํ๋กํผํฐ์ ๊ฐ์ด ์๋ก ํ ๋น๋ ๋๋ง๋ค ํธ์ถ๋ฉ๋๋ค.
- ๋ณ๊ฒฝ๋๋ ๊ฐ์ด ํ์ฌ์ ๊ฐ๋๋ผ๋ ํธ์ถ๋ฉ๋๋ค.
- ์ ์ฅํ๋กํผํฐ ๋ฟ๋ง ์๋๋ผ ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํด ์์๋ฐ์ ์ ์ฅ,์ฐ์ฐ ํ๋กํผํฐ์๋ ์ ์ฉ์ด ๊ฐ๋ฅํด์.
- ์์๋ฐ์ง ์์ ์ฐ์ฐ ํ๋กํผํฐ๋ ์ ๊ทผ์์ ์ค์ ์๋ฅผ ํตํด ํ๋กํผํฐ ์ต์ ๋ฒ๋ฅผ ๊ตฌํํ ์ ์์ด์.
- ์์ ๋ฐ์์ ๋๋ง ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ ํด์ค๋๋ค.
ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ง์ : willSet, ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์งํ : didSet
- willSet๊ณผ didSet ๋ฉ์๋์๋ ๋งค๊ฐ๋ณ์๊ฐ ํ๋์ฉ ์๋๋ฐ์.
- willSet ๋ฉ์๋์ ์ ๋ฌ๋๋ ์ ๋ฌ์ธ์๋ ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ์ด๊ณ , didSet ๋ฉ์๋์ ์ ๋ฌ๋๋ ์ ๋ฌ์ธ์๋ ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๊ฐ์ ๋๋ค.
- ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๋ฐ๋ก ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ, willSet์๋ newValue / didSet์๋ oldValue๋ผ๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ด ์๋์ผ๋ก ์ง์ ๋ฉ๋๋ค.
- ๋ค๋ฅธ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์๊ดํธ ์์ ์ ์ด์ฃผ์ธ์.
- didSet ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์์ oldValue ๊ฐ์ ์ฐธ์กฐํ์ง ์๊ฑฐ๋ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ๋ช ์์ ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ด์ฃผ์ง ์์ผ๋ฉด didSet ๋ธ๋ก์ ์คํ๋์ง ์์ต๋๋ค !
class Account {
var credit: Int = 0
willSet {
print("์์ก์ด \(credit)์์์ \(newValue)์์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค.")
}
didSet {
print("์์ก์ด \(oldValue)์์์ \(credit)๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.")
}
}
}
let myAccount: Account = Account()
// ์์ก์ด 0์์์ 1000์์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค.
myAccount.credit = 1000
// ์์ก์ด 0์์์ 1000์์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
- ํด๋์ค๋ฅผ ์์ ๋ฐ์๋ค๋ฉด ๊ธฐ์กด์ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํ์ฌ ํ๋กํผํฐ ์ต์ ๋ฒ๋ฅผ ๊ตฌํํ ์๋ ์์.
- ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํด๋ ๊ธฐ์กด์ ์ฐ์ฐ ํ๋กํผํฐ ๊ธฐ๋ฅ์ ๋์
dollarValue๊ฐ ํฌํจ๋์ด ์๋ Account ํด๋์ค๋ฅผ ์์๋ฐ์ ForeignAccount ํด๋์ค์์ ๊ธฐ์กด dollarValue ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํ์ฌ ํ๋กํผํฐ ๊ฐ์์๋ฅผ ๊ตฌํํ๋ ์์
class Account {
var credit: Int = 0
willSet {
print("์์ก์ด \(credit)์์์ \(newValue)์์ผ๋ก ๋ณ๊ฒฝ๋ ์์ ์
๋๋ค.")
}
didSet {
print("์์ก์ด \(oldValue)์์์ \(credit)๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.")
}
}
var dollarValue: Double {
get {
return Double(credit) / 1000.0
}
set {
credit = Int(newValue * 1000)
print("์์ก์ \(newValue)๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ์ค")
}
}
}
class ForeignAccount: Account {
override var dollarValue: Double {
willSet {
print("์์ก์ด \(dollarValue)์์ \(newValue)๋ก ๋ณ๊ฒฝ๋ ์์ ")
}
didSet {
print("์์ก์ด \(oldValue)์์์ \(dollarValue)๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.")
}
}
}
let myAccount: ForeignAccount = ForeignAccount()
// ์์ก์ด 0์์์ 1000์์ผ๋ก ๋ณ๊ฒฝ๋ ์์
myAccount.credit = 1000
// ์์ก์ด 0์์์ 1000์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
// ์์ก์ด 1.0๋ฌ๋ฌ์์ 2.0๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ๋ ์์
// ์์ก์ด 1000์์์ 2000์์ผ๋ก ๋ณ๊ฒฝ๋ ์์
// ์์ก์ด 1000์์์ 2000์์ผ๋ก ๋ณ๊ฒฝ๋จ
myAccount.dollarValue = 2 // ์์ก์ 2.0๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ์ค
//์์ก์ด 1.0๋ฌ๋ฌ์์ 2.0๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
- ๋ง์ฝ ํ๋กํผํฐ ๊ฐ์์๊ฐ ์๋ ํ๋กํผํฐ๋ฅผ ํจ์์ ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌํ๋ค๋ฉด ํญ์ willSet๊ณผ didSet ๊ฐ์์๋ฅผ ํธ์ถ, ํจ์ ๋ด๋ถ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๋์ง ์๋ ๊ฐ์ ํจ์๊ฐ ์ข ๋ฃ๋๋ ์์ ์ ๊ฐ์ ๋ค์ ์ฐ๊ธฐ ๋๋ฌธ !!
์ ์ญ๋ณ์์ ์ง์ญ๋ณ์
์์ ์ค๋ช ํ ์ฐ์ฐ ํ๋กํผํฐ์ ํ๋กํผํฐ ๊ฐ์์๋ ์ ์ญ๋ณ์์ ์ง์ญ๋ณ์ ๋ชจ๋์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค !
- ํ๋กํผํฐ์ ํ์ ํ์ง ์๊ณ , ์ ์ญ์์ ์ฐ์ผ ์ ์๋ ๋ณ์์ ์์์๋ ๋ ๊ธฐ๋ฅ ์ฌ์ฉ๊ฐ๋ฅ
- ์ฐ๋ฆฌ๊ฐ ํ๋กํผํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ ์ ๊ณ์ํด์ ์ฌ์ฉํ๋ ๋ณ์์ ์์๋ ๋ชจ๋ ์ง์ญ๋ณ์ ์์
- ์ ์ญ๋ณ์ ๋๋ ์ ์ญ์์๋ ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ์ฒ๋ผ ์ฒ์ ์ ๊ทผํ ๋ ์ต์ด๋ก ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง
- lazy ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ฐ์ ๋ฆ์ถ ํ์๊ฐ ์๋ค.
- ์ง์ญ๋ณ์ ๋ฐ ์ง์ญ์์๋ ์ ๋๋ก ์ง์ฐ ์ฐ์ฐ๋์ง ์๋๋ค !
ํ์ ํ๋กํผํฐ
- ์ด์ ๊น์ง ์์ ๋ณธ ํ๋กํผํฐ ๊ฐ๋ ์ ๋ชจ๋ ํ์ ์ ์ ์ํ๊ณ ํด๋น ํ์ ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋์์ ๋ ์ฌ์ฉํ ์ ์๋ ์ธ์คํด์ค ํ๋กํผํฐ์ ๋๋ค. ์ธ์คํด์ค ํ๋กํผํฐ๋ ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํ ๋๋ง๋ค ์ด๊น๊ฐ์ ํด๋นํ๋ ๊ฐ์ด ํ๋กํผํฐ์ ๊ฐ์ด ๋๊ณ , ์ธ์คํด์ค ๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ์ง๋ ์ ์์ต๋๋ค.
๊ฐ๊ฐ์ ์ธ์คํด์ค๊ฐ ์๋, ํ์ ์์ฒด์ ์ํ๋ ํ๋กํผํฐ๋ฅผ ํ์ ํ๋กํผํฐ๋ผ๊ณ ํฉ๋๋ค !
- ํ์ ํ๋กํผํฐ๋ ํ์ ์์ฒด์ ์ํฅ์ ๋ฏธ์น๋ ํ๋กํผํฐ์ ๋๋ค.
- ์ธ์คํด์ค์ ์์ฑ ์ฌ๋ถ์ ์๊ด์์ด ํ์ ํ๋กํผํฐ์ ๊ฐ์ ํ๋๋ฉฐ, ๊ทธ ํ์ ์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๊ฐ, ๋ชจ๋ ์ธ์คํด์ค์์ ๊ณต์ฉ์ผ๋ก ์ ๊ทผํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ณ์ ๋ฑ์ ์ ์ํ ๋ ์ ์ฉํด์ !
ํ์ ํ๋กํผํฐ๋ ๋ ๊ฐ์ง ์ ๋๋ค.
1. ์ ์ฅ ํ์ ํ๋กํผํฐ๋ ๋ณ์ ๋๋ ์์๋ก ์ ์ธํ ์ ์์ต๋๋ค. ๋ฐ๋์ ์ด๊น๊ฐ์ ์ค์ ํด์ผํ๋ฉฐ ์ง์ฐ ์ฐ์ฐ๋ฉ๋๋ค.
์ง์ฐ ์ ์ฅ ํ๋กํผํฐ์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์ด๋ผ๊ณ ํ๋๋ผ๋ ๋จ ํ๋ฒ๋ง ์ด๊ธฐํ๋๋ค๋ ๋ณด์ฅ์ ๋ฐ์ต๋๋ค.
2. ์ฐ์ฐ ํ์ ํ๋กํผํฐ๋ ๋ณ์๋ก๋ง ์ ์ธํ ์ ์์ต๋๋ค.
class AClass {
// ์ ์ฅ ํ์
ํ๋กํผํฐ
static var typeProperty: Int = 0
// ์ ์ฅ ์ธ์คํด์ค ํ๋กํผํฐ
var instanceProperty: Int = 0 {
didSet {
// Self.typeProperty๋
// AClass.typeProperty ์ ๊ฐ์ ํํ
Self.typeProperty = instanceProperty + 100
}
}
// ์ฐ์ฐ ํ์
ํ๋กํผํฐ
static var typeComputedProperty: Int {
get {
return typeProperty
}
set {
typeProperty = newValue
}
}
}
AClass.typeProperty = 123
let classInstance: AClass = AClass()
classInstance.instanceProperty = 100
print(AClass.typeProperty) // 200
print(AClass.typeComputedProperty) // 200
- ์ด์ฒ๋ผ ํ์ ํ๋กํผํฐ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ์ ์ ํด๋นํ๋ ๊ฐ์ ๋๋ค. !
- ์ธ์คํด์ค ์ ๊ทผ ํ์์์ด ํ์ ์ด๋ฆ ๋ง์ผ๋ก๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- static let dollarExchangeRate: Double = 1000.0 ์ ๊ฐ์ด ํ์ ์์๋ก ์ฌ์ฉํ ์๋ ์๋ค.
ํค ๊ฒฝ๋ก Key Path
- ํจ์๋ ์ผ๊ธ์๋ฏผ์ผ๋ก์ ์์๋ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ํ ๋นํ ์ ์์์
- ํจ์๋ฅผ ์ฐธ์กฐํด๋๊ณ ๋์ค์ ์ํ ๋ ํธ์ถํ ์๋ ์๊ณ , ๋ค๋ฅธ ํจ์๋ฅผ ์ฐธ์กฐํ๋๋ก ํ ์๋ ์๋ค.
func someFunction(paramA: Any, paramB: Any) {
print("์ด์ฉ๊ตฌ")
}
var functionReference = someFunction(paramA:paramB)
functionReference("A","B")
functionReference = anotherFunction(paramA:paramB)
ํ๋กํผํฐ๋ ์ด์ฒ๋ผ ๊ฐ์ ๋ฐ๋ก ๊บผ๋ด์ค๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ค ํ๋กํผํฐ์ ์์น๋ง ์ฐธ์กฐํ๋๋ก ํ ์ ์๋ค.
๋ฐ๋ก KeyPath๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ !
- KeyPath๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ์ผ๋ก ํน์ ํ์ ์ ์ด๋ค ํ๋กํผํฐ ๊ฐ์ ๊ฐ๋ฆฌ์ผ์ผ ํ ์ง ๋ฏธ๋ฆฌ ์ง์ ํด๋๊ณ ์ฌ์ฉํ ์ ์๋ค.
KeyPath ํ์ ์ AnyKeyPath๋ผ๋ ํด๋์ค๋ก๋ถํฐ ํ์๋ฉ๋๋ค.
- ์ ์ผ ๋ง์ด ํ์ฅ๋ ํค ๊ฒฝ๋ก ํ์ ์ WritableKeyPath<Root, Value> ์ ReferenceWritableKeyPath<Root, Value> ํ์
- WritableKeyPath<Root, Value> : ๊ฐ ํ์ ์ ํค ๊ฒฝ๋ก ํ์ ์ผ๋ก ์ฝ๊ณ ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉ
- ReferenceWritableKeyPath<Root, Value> : ์ฐธ์กฐํ์ , ์ฆ ํด๋์ค ํ์ ์ ํค ๊ฒฝ๋ก ํ์ ์ผ๋ก ์ฝ๊ณ ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉ
- ํค๊ฒฝ๋ก๋ ์ญ์ฌ๋์์ ํ์ , ๋ง์นจํ ๊ฒฝ๋ก๋ก ๊ตฌ์ฑ๋จ => \ํ์ ์ด๋ฆ.๊ฒฝ๋ก.๊ฒฝ๋ก.๊ฒฝ๋ก (์ฌ๊ธฐ์ ๊ฒฝ๋ก๋ ํ๋กํผํฐ ์ด๋ฆ)
class Person {
var name: String
init(name: String) {
self.name = name
}
}
struct Stuff {
var name: String
var owner: String
}
print(type(of: \Person.name)) // ReferenceWritableKeyPath<Person,String>
print(type(of: \Stuff.name)) // WritableKeyPath<Stuff, String>
// ๊ธฐ์กด์ ํค ๊ฒฝ๋ก์ ํ์ ๊ฒฝ๋ก ๋ง๋ถ์ด๊ธฐ
let keyPath = \Stuff.owner
let nameKeyPath = keyPath.appending(path: \.name)
- ๊ฐ ์ธ์คํด์ค์ KeyPath ์๋ธ์คํฌ๋ฆฝํธ ๋ฉ์๋์ ํค ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํ์ฌ ํ๋กํผํฐ์ ์ ๊ทผํ ์ ์๋ค.
class Person {
var name: String
init(name: String) {
self.name = name
}
}
struct Stuff {
var name: String
var owner: String
}
let yagom = Person(name: "yagom")
let hana = Person(name: "hana")
let macbook = Stuff(name: "MacBook Pro", owner: yagom)
var iMac = Stuff(name: "iMac", owner: yagom)
let iPhone = Stuff(name: "iPhone", owner: hana)
let stuffNameKeyPath = \Stuff.name
let ownerkeyPath = \Stuff.owner
// \Stuff.owner.name ๊ณผ ๊ฐ์ ํํ
let ownerNameKeyPath = ownerkeyPath.appending(path: \.name)
// ํค ๊ฒฝ๋ก์ ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ํ๋กํผํฐ์ ์ ๊ทผํ์ฌ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
print(macbook[keyPath: stuffNameKeyPath]) // MacBook Pro
print(iMac[keyPath: stuffNameKeyPath]) // iMac
print(iPhone[keyPath: stuffNameKeyPath]) // iPhone
print(macbook[keyPath: ownerNameKeyPath]) // yagom
print(iMac[keyPath: ownerNameKeyPath]) // yagom
print(iPhone[keyPath: ownerNameKeyPath]) // hana
// ํค ๊ฒฝ๋ก์ ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ํ๋กํผํฐ์ ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝ
iMac[keyPath: stuffNameKeyPath] = "iMac Pro"
// ์์๋ก ์ง์ ํ ๊ฐ ํ์
๊ณผ ์ฝ๊ธฐ ์ ์ฉ ํ๋กํผํฐ๋ ํค ๊ฒฝ๋ก ์คํฌ๋ฆฝํธ๋ก๋ ๊ฐ์ ๋ฐ๊ฟ์ค์ ์๋ค.
// macbook ์ stuffName์ ์์ฒ๋ผ ๋ฐ๊ฟ ์ ์๋ค.
- KeyPath๋ฅผ ์ ํ์ฉํ๋ฉด ํ๋กํ ์ฝ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ ๊ฐ์ ์์กด์ฑ์ ๋ฎ์ถ๋๋ฐ ๋ง์ ๋์์ ์ค๋ค๊ณ ํด์!
- ๊ทธ๋ฆฌ๊ณ , ์ ํ์ ํ๋ ์์ํฌ๋ ํค-๊ฐ ์ฝ๋ฉ ๋ฑ ๋ง์ ๊ณณ์ KeyPath๋ฅผ ํ์ฉํ๋ฏ๋ก, ์ ์์๋ก์๋ค !!
- KeyPath๋ ํ์ ์ธ๋ถ๋ก ๊ณต๊ฐ๋ ์ธ์คํด์ค ํ๋กํผํฐ ํน์ ์๋ธ์คํฌ๋ฆฝํธ์ ํํ์ฌ ํํํ ์ ์์ต๋๋ค.
TIP ! ) ์์ ์ ๋ํ๋ด๋ KeyPath์ธ \.self๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค ๊ทธ ์์ฒด๋ฅผ ํํํ๋ KeyPath๊ฐ ๋๋ค. ๋ํ, ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ KeyPath์์ ํ์ ์ด๋ฆ์ ์๋ตํ ์๋ ์๋ค.
Swift 5.2 ~
- (SomeType) -> Value ํ์ ์ ํด๋ก์ ๋ฅผ ํค ๊ฒฝ๋ก ํํ์ผ๋ก ๋์ฒดํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
struct Person {
let name: String
let nickname: String?
let age: Int
var isAdult: Bool {
return age > 18
}
}
let yagom: Person = Person(name: "yagom", nickname: "bear", age: 100)
let hana: Person = Person(name: "hana", nickname: "na", age: 100)
let happy: Person = Person(name: "happy", nickname: nil, age: 3)
let family: [Person] = [yagom, hana, happy]
let names: [String] = family.map(\.name)
let nicknames: [String] = family.compactMap(\.nickname)
let adults: [String] = family.filter(\.isAdult).map(\.name)
- family ๋ฐฐ์ด์ [Person] ํ์ ์ด๊ณ , ์ด ํ์ ์ map์ (Person) -> T๋ฅผ, compactMap์ (Person) -> T? ๋ฅผ, filter๋ (Person) -> Bool ํ์ ์ ํด๋ก์ ๋ฅผ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ๊ฒ.
- ์ด์ ๋ฐ๋ผ, \.name ํํ์ (Person) -> T ํ์ ์ ํด๋ก์ ๋ฅผ ๋์ฒดํ์ฌ ํํํจ. ์ด๋ ํด๋ก์ ํํ์ธ { $0.name } ์ ํํ๊ณผ ๊ฐ์ ์ญํ !
- .nickname๊ณผ .isAdult ํํ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์
๋ฉ์๋
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ์ ์คํํ๋ ๊ธฐ๋ฅ์ ์บก์ํํ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์.
- ํ์ ์์ฒด์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์คํํ๋ ํ์ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ.
- ํ์ ๋ฉ์๋๋ ํด๋์ค ๋ฉ์๋์ ์ ์ฌํ ๊ฐ๋ .
- ์ค์ํํธ์ ํน์ด์ : ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ด ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์๋ค !
์ธ์คํด์ค ๋ฉ์๋ = ํน์ ํ์ ์ ์ธ์คํด์ค์ ์ํ ํจ์
- ์ธ์คํด์ค ๋ด๋ถ์ ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํน์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ฑ ์ธ์คํด์ค์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์คํ
- ์ธ์คํด์ค ๋ฉ์๋๋ ํจ์์ ๋ฌ๋ฆฌ ํน์ ํ์ ๋ด๋ถ์ ๊ตฌํ = ์ธ์คํด์ค๊ฐ ์กด์ฌํ ๋๋ง ์ฌ์ฉ.
// ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋
class LevelClass {
// ํ์ฌ ๋ ๋ฒจ์ ์ ์ฅํ๋ ์ ์ฅ ํ๋กํผํฐ
var level: Int = 0 {
// ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถํ๋ ํ๋กํผํฐ ๊ฐ์์
didSet {
print(level)
}
}
// ๋ ๋ฒจ์ด ์ฌ๋์ ๋ ํธ์ถํ ใน๋ฉ์๋
func levelUp() {
level += 1
}
// ๋ ๋ฒจ์ด ๊ฐ์ํ ๋ ํธ์ถํ ๋ฉ์๋
func levelDown() {
level -= 1
if level < 0 {
reset()
}
}
// ํน์ ๋ ๋ฒจ๋ก ์ด๋ํ ๋ ํธ์ถํ ๋ฉ์๋
func jumpLevel(to: Int) {
level = to
}
// ๋ ๋ฒจ์ ์ด๊ธฐํํ ๋ ํธ์ถํ ๋ฉ์๋
func reset() {
level = 0
}
}
var levelClassInstance: LevelClass = LevelClass()
levelClassInstance.levelUp()
levelClass์ ์ธ์คํด์ค ๋ฉ์๋๋ level ์ธ์คํด์ค ํ๋กํผํฐ์ ๊ฐ์ ์์ ํ๋ ์ฝ๋๊ฐ ์กด์ฌํฉ๋๋ค.
-> ์์ ์ ํ๋กํผํฐ ๊ฐ์ ์์ ํ ๋ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋๋ ํฌ๊ฒ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ด์. ํ์ง๋ง, ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ ๋ฑ์ ๊ฐ ํ์ ์ด๋ฏ๋ก ๋ฉ์๋ ์์ mutating ํค์๋๋ฅผ ๋ถ์ฌ์ ํด๋น ๋ฉ์๋๊ฐ ์ธ์คํด์ค ๋ด๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค๋ ๊ฒ์ ๋ช ์ํด์ผํฉ๋๋ค !
self ํ๋กํผํฐ
- ๋ชจ๋ ์ธ์คํด์ค๋ ์์์ ์ผ๋ก ์์ฑ๋ self ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋๋ค. ์๋ฐ์ this์ ๋น์ทํ๊ฒ ์ธ์คํด์ค ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ํ๋กํผํฐ์์ !
- self ํ๋กํผํฐ๋ ์ธ์คํด์ค๋ฅผ ๋ ๋ช ํํ ์ง์นญํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
- level ๋ณ์๋ฅผ ์ฌ์ฉํ ๋, ์ค์ํํธ๋ ์๋์ผ๋ก ๋ฉ์๋ ๋ด๋ถ์ ์ ์ธ๋ ์ง์ญ๋ณ์๋ฅผ ๋จผ์ ์ฌ์ฉํ๊ณ , ๊ทธ ๋ค์์ ๋ฉ์๋ ๋งค๊ฐ๋ณ์, ๊ทธ ๋ค์์ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ์ฐพ์์ level์ด ๋ฌด์์ ์ง์นญํ๋์ง ์ ์ถํฉ๋๋ค.
=> ๊ทธ๋ฐ๋ฐ ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ด level์ธ๋ฐ ์ด level ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ธ์คํด์ค ํ๋กํผํฐ์ธ level์ ์ง์นญํ๊ณ ์ถ๋ค๋ฉด ? self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ค๋๋ค.
class LevelClass {
var level: Int = 0
func jumpLevel(to level: Int) {
print("Jump to \(level)")
self.level = level
}
}
- ์์ ์์๋ฅผ ๋ณด๋ฉด, jumpLevel ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ๊ณผ ์ธ์คํด์ค ํ๋กํผํฐ์ ์ด๋ฆ์ด ๊ฐ์ต๋๋ค.
- ๊ทธ๋ด ๋ level = level ์ด๋ผ๊ณ ์ ์ด์ฃผ๋ฉด, ์ปดํ์ผ๋ฌ๋ ์ข์ธก์ level์ ์ธ์คํด์ค ํ๋กํผํฐ์ level์ด ์๋ ๋งค๊ฐ๋ณ์ level์ ์ง์นญํ๋ ๊ฑธ๋ก ํ๋จํ๊ฒ ์ฃ ! ( ์์ ์ ์ถ ์์์ ๋ฐ๋ผ.. )
- ๊ทธ๋์ ์ข์ธก์ level ๋์ self.level์ ์ ์ด์ค๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด์ ์ธ์คํด์ค ํ๋กํผํฐ๋ผ๋ ๊ฒ์ ๋ช ํํ ํ ์ ์์ด์.
๋, self ํ๋กํผํฐ์ ๋ค๋ฅธ ์ฉ๋๋ ๊ฐ ํ์ ์ธ์คํด์ค ์์ฒด์ ๊ฐ์ ์นํํ ์ ์์ต๋๋ค.
=> ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐ ํ์ ์ด๋ผ self ํ๋กํผํฐ์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ํ ๋นํ ์ ์๋๋ฐ, ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ ๋ฑ์ self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ธฐ ์์ฒด๋ฅผ ์นํํ ์ ์์ด์ !
class LevelClass {
var level: Int = 0
func reset() {
// ์ค๋ฅ !
self = LevelClass()
}
}
struct LevelStruct {
var level: Int = 0
mutating func levelUp() {
level += 1
}
mutating func reset() {
self = LevelStruct()
}
}
enum OnOffSwitch {
case on, off
mutating func nextState() {
self = self == .on ? .off : .on
}
}
var toggle: OnOffSwitch = OnOffSwitch.off
toggle.nextState()
print(toggle) // on
์ธ์คํด์ค๋ฅผ ํจ์์ฒ๋ผ ํธ์ถํ๋๋ก ํ๋ ๋ฉ์๋
- ํน์ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ฌธ๋ฒ์ ์ผ๋ก ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ์ ์์ต๋๋ค.
- ์ธ์คํด์ค๋ฅผ ํจ์์ฒ๋ผ ํธ์ถํ ์ ์๋๋ก ํ๋ ค๋ฉด callAsFunction์ด๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
- ์ด ๋ฉ์๋๋ ๋งค๊ฐ๋ณ์์ ๋ฐํํ์ ๋ง ๋ค๋ฅด๋ค๋ฉด ๊ฐ์์ ์ ํ ์์ด ์ํ๋ ๋งํผ ๋ง๋ค ์ ์์ต๋๋ค.
- mutating ํค์๋๋ ์ฌ์ฉํ ์ ์๊ณ , throws์ rethrows๋ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
struct Puppy {
var name: String = "ํฐ๋ฅ์ด"
func callAsFunction() {
print("๋ฉ๋ฉ")
}
func callAsFunction(destination: String) {
print("\(destination)์ผ๋ก ๋ฌ๋ ค๊ฐ๋๋ค.")
}
}
var myPuppy: Puppy = Puppy()
myPuppy.callAsFunction()
myPuppy()
myPuppy.callAsFunction(destination: "์ง")
myPuppy(destination: "์ง")
- Puppy ๊ตฌ์กฐ์ฒด์ ๋ค์ํ ํํ์ callAsFunction ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์ ํ์ , ์ ๋ฌ์ธ์ ๋ ์ด๋ธ, ๋ฐํ ํ์ ๋ง ์ ๊ฒน์น๊ฒํ๋ฉด ์ํ๋ ๋งํผ ๊ฐ๋ฅํด์.
- myPuppy() ์ myPuppy.callAsFunction ์ด ๊ฐ์ ํํ. ํ์ง๋ง, ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ ์ธ์ ํจ์ํํ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฆ, let function: (String) -> Void = myPuppy(destination:) ์ฒ๋ผ์ ์๋ฉ๋๋ค. ๋์ let function: (String) -> Void = myPuppy.callAsFunction(destination:) ์ผ๋ก ํํํด์ผ ํด์.
ํ์ ๋ฉ์๋ = ํ์ ์์ฒด์ ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฉ์๋
- ๋ฉ์๋์๋ ์ธ์คํด์ค ๋ฉ์๋์ ํ์ ๋ฉ์๋๊ฐ ์๋๋ฐ์, ํ์ ๋ฉ์๋๋ ํ์ ์์ฒด์ ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฉ์๋์ ๋๋ค.
- ํํ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ง์นญํ๋ ํด๋์ค ๋ฉ์๋์ ์ ์ฌํ ๊ฐ๋ ์ ๋๋ค.
- static ํค์๋๋ฅผ ์ฌ์ฉํด์ ํ์ ๋ฉ์๋์์ ๋ํ๋ด์ฃผ๊ณ ์.
- ํด๋์ค์ ํ์ ๋ฉ์๋๋ static ํค์๋์ class ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ static์ผ๋ก ์ ์ํ๋ฉด ์์ ํ ๋ฉ์๋ ์ฌ์ ์๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ , class๋ก ์ ์ํ๋ฉด ์์ ํ ๋ฉ์๋ ์ฌ์ ์๊ฐ ๊ฐ๋ฅํด์ !
class AClass {
static func staticTypeMethod() {
print("์์ด ํด๋์ค ํ์
๋ฉ์๋")
}
class func classTypeMethod() {
print("์์ด ํด๋์ค ํด๋์ค ๋ฉ์๋")
}
}
class BClass: AClass {
override class func classTypeMethod() {
print("๋น ํด๋์ค ํด๋์ค ๋ฉ์๋")
}
// ํ์
๋ฉ์๋๋ ์ฌ์ ์ ๋ถ๊ฐ๋ฅ
}
AClass.staticTypeMethod() // ์์ด ํด๋์ค ํ์
๋ฉ์๋
AClass.classTypeMethod() // ์์ด ํด๋์ค ํด๋์ค ๋ฉ์๋
BClass.classTypeMethod() // ๋น ํด๋์ค ํด๋์ค ๋ฉ์๋
- ๋, ํ์ ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉ์๋์ ๋ฌ๋ฆฌ self ํ๋กํผํฐ๊ฐ ํ์ ๊ทธ์์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- ์ธ์คํด์ค ๋ฉ์๋์์๋ self๊ฐ ์ธ์คํด์ค ๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ํ์ ๋ฉ์๋์ self๋ ํ์ ์ ๊ฐ๋ฆฌํต๋๋ค.
- ๊ทธ๋์ ํ์ ๋ฉ์๋ ๋ด๋ถ์์ ํ์ ์ด๋ฆ๊ณผ self๋ ๊ฐ์ ๋ป์ด์์.
- ํ์ ๋ฉ์๋์์ self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ํ๋กํผํฐ ๋ฐ ํ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
// ์์คํ
์ฉ๋์ ํจ ๊ธฐ๊ธฐ์์ ์ ์ผํ ๊ฐ
struct SystemVolume {
// ํ์
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์ ๋ ์ ์ผํ ๊ฐ์ด ๋๋ค.
static var volume: Int = 5
// ํ์
ํ๋กํผํฐ๋ฅผ ์ ์ดํ๊ธฐ ์ํด ํ์
๋ฉ์๋๋ฅผ ์ฌ์ฉ
static func mute() {
self.volume = 0 // SystemVolume.volume ๊ณผ ๊ฐ์ ํํ, Self.volume๊ณผ๋ ๊ฐ์ํํ
}
}
// ๋ด๋น๊ฒ์ด์
์ญํ ์ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์ํํ ์ ์๋ค.
class Navigation {
// ๋ด๋น๊ฒ์ด์
์ธ์คํด์ค๋ง๋ค ์๋์ ๋ฐ๋ก ์ค์ ํ ์ ์๋ค.
var volume: Int = 5
// ๊ธธ ์๋ด ์์ฑ ์ฌ์
func guideWay() {
// ๋ด๋น๊ฒ์ด์
์ธ ๋ค๋ฅธ ์ฌ์์ ์์๊ฑฐ
SystemVolume.mute()
}
// ๊ธธ ์๋ด ์์ฑ ์ข
๋ฃ
func finishGuideWay() {
// ๊ธฐ์กด ์ฌ์์ ์์ ใ
๋ณต๊ตฌ
SystemVolume.volume = self.volume
}
}
SystemVolume.volume = 10
let myNavi: Navigation = Navigation()
myNavi.guideWay()
print(SystemVolume.volume) // 0
myNavi.finishGuideWay()
print(SystemVolume.volume) // 5
์ค๋์ Struct , Class, Property, Method ๋ด์ฉ์ ๋ค์ ํ์ด๋ดค๋๋ฐ์.
์๋ ๋ด์ฉ๋ ์์๊ณ , ๋ค์๋ด์ ์๊ธฐ์ํจ ๋ด์ฉ๋ ์์์ต๋๋ค.
๋ค์์๋ ๋ ๊น์ ๋ด์ฉ์ ๋ค๋ค๋ณผ ์๊ฐ์ ๋๋ค !
ํ์ ๋ฉ์๋์์ class func๊ณผ static func์ ์ฐจ์ด๋ฅผ ์์ธํ ์ฐพ์๋ณด๋ ค๊ตฌ์.
๊ทธ๋ฆฌ๊ณ , static property๋ method๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์กฐ๋ง๊ฐ ์ ๋ฆฌํด๋ณผ๊ฒ์ !
์ถ์ฒ : ๋ชจ๋ ๋ด์ฉ์ ์ผ๊ณฐ๋์ Swift ํ๋ก๊ทธ๋๋ฐ ์ฑ ์ ์ฐธ๊ณ ํ์ต๋๋ค.
'Language > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ Swift - ์ ๊ทผ์ ์ด (2) | 2023.03.31 |
---|---|
Swift) SOLID ์์น in Swift (4) | 2022.04.14 |
Swift) ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ (4) | 2022.04.03 |
Swift ) ๊ธฐ์ด ๋ฌธ๋ฒ 6์ผ์ฐจ - Class ์ Struct (2) | 2022.02.10 |
Swift ) Closure (0) | 2022.02.09 |