ํด๋์ค์ ๊ตฌ์กฐ์ฒด์์ ๊ฐ์ ์ ๊ณตํ๋ ํ๋กํผํฐ(Property)์ ๋ํด ์์๋ณด์.
ํ๋กํผํฐ๋ฅผ ํ๊ธ๋ก '์์ฑ'์ด๋ผ๋ ๋ป์ผ๋ก, ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ํด๋์ค์ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ด์์ ์ ์๋ ๋ณ์๋ ์์์ด๋ค.
๊ทธ๋ฌ๋ ์ด๋ ํ๋กํผํฐ์ ์ญํ ์ค ์ผ๋ถ์ ๋ถ๊ณผํ๊ณ , ํ๋กํผํฐ๊ฐ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์์ ํ๋ ์ ํํ ์ญํ ์ ๊ฐ์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
ํ๋กํผํฐ(Property)๋ ๊ฐ์ ๋ํ ์ ์ฅ ์ฌ๋ถ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ง ์ข ๋ฅ๋ก ๋๋ ์ ์๋ค.
์ ์ฅ ํ๋กํผํฐ
- ์ ๋ ฅ๋ ๊ฐ์ ์ ์ฅํ๊ฑฐ๋ ์ ์ฅ๋ ๊ฐ์ ์ ๊ณตํ๋ ์ญํ
- ์์ ๋ฐ ๋ณ์๋ฅผ ์ฌ์ฉํด์ ์ ์ ๊ฐ๋ฅ
- ํด๋์ค์ ๊ตฌ์กฐ์ฒด์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋, ์ด๊ฑฐํ์์๋ ์ฌ์ฉ ๋ถ๊ฐ
์ฐ์ฐ ํ๋กํผํฐ
- ํน์ ์ฐ์ฐ์ ํตํด ๊ฐ์ ๋ง๋ค์ด ์ ๊ณตํ๋ ์ญํ
- ๋ณ์๋ง ์ฌ์ฉํด์ ์ ์ ๊ฐ๋ฅ
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ
์ ์ฅ ํ๋กํผํฐ์ ์ฐ์ฐ ํ๋กํผํฐ๋ ๋์ฒด๋ก ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ค์ด์ง ๊ฐ๋ณ ์ธ์คํด์ค์ ์์๋์ด ์๋ ๊ฐ์ ์ ์ฅํ๊ฑฐ๋ ์ฐ์ฐ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
๋ฐ๋ผ์ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์คํด์ค๊ฐ ํ์ํ๋ค. ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ ์ด ์ธ์คํด์ค๋ฅผ ํตํด ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ์ ํ ๋นํด์ผ ํ๋ค. ์ด๋ ๊ฒ ์ธ์คํด์ค์ ์์๋๋ ํ๋กํผํฐ๋ฅผ ์ธ์คํด์ค ํ๋กํผํฐ๋ผ๊ณ ํ๋ค.
์์ธ์ ์ผ๋ก ์ผ๋ถ ํ๋กํผํฐ๋ ํด๋์ค์ ๊ตฌ์กฐ์ฒด ์์ฒด์ ์์๋์ด ์๋ ๊ฐ์ ๊ฐ์ง๊ธฐ๋ ํ๋ค. ์ด๋ฐ ํ๋กํผํฐ๋ค์ **ํ์ ํ๋กํผํฐ(Type Property)**๋ผ๊ณ ํ๋ค. ํ์ ํ๋กํผํฐ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํ๋กํผํฐ๋ฅผ ์์ฑํ ๋์๋ ์์น๊ฐ ์ค์ํ๋ค. ํด๋์ค ์ ์ ๊ตฌ๋ฌธ ๋ด๋ถ์ ์์ฑ๋์ด์ผ ํ์ง๋ง, ๋ฉ์๋ ๋ด๋ถ์ ์์ฑ๋๋ฉด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฉ์๋ ๋ด๋ถ์์๋ ๋ณ์๋ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ฅํ ์ ์๋๋ฐ, ์ด๋ ํ๋กํผํฐ๊ฐ ์๋ ์ง์ญ๋ณ์์ ๋ถ๊ณผํ๋ค. ๋ฐ๋ผ์ ํ๋กํผํฐ๋ ํด๋์ค์ ๋ด๋ถ์, ๊ทธ๋ฆฌ๊ณ ๋ฉ์๋์ ์ธ๋ถ์ ์ ์ํด์ผ ํ๋ค.
๋๋ถ์ด ์ค์ํํธ์์๋ ํ๋กํผํฐ ๊ฐ์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด **ํ๋กํผํฐ ์ต์ ๋ฒ(Property Observer)**๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉ์๊ฐ ์ ์ํ ํน์ ์ก์ ๊ณผ ๋ฐ์ํ๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ฆ, ํ๋กํผํฐ์ ๊ฐ์ด ๋ณํ๋ ๊ฒ์ ๊ฐ์ํ๊ณ , ํ๋กํผํฐ์ ๊ฐ์ด ๋ณํ ๋ ๊ฐ์ ๋ณํ์ ๋ฐ๋ฅธ ํน์ ์์ ์ ์คํํ๋ค. ํ๋กํผํฐ ์ต์ ๋ฒ๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ ์ํ ํ๋กํผํฐ์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ ๋ถ๋ชจ ํด๋์ค๋ก ๋ถํฐ ์์๋ฐ์ ์๋ ์๋ค.
**์ ์ฅ ํ๋กํผํฐ(Stored Property)**๋ ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค์ ์ฐ๊ด๋ ๊ฐ์ ์ ์ฅํ๋ ๊ฐ์ฅ ๋จ์ํ ๊ฐ๋ ์ ํ๋กํผํฐ์ด๋ค.
์ ์ฅ ํ๋กํผํฐ๋ var
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์ ์ ์ฅ ํ๋กํผํฐ, let
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ ์ฅ ํ๋กํผํฐ๊ฐ ๋๋ค.
์ผ๋ฐ ๋ณ์๋ ์์๋ฅผ ์ ์ธํ ๋ ์ด๊ธฐ๊ฐ์ ํ ๋นํ ์ ์๋ ๊ฒ์ฒ๋ผ ์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๋์๋ ์ด๊ธฐ๊ฐ์ ํ ๋นํ ์ ์๋ค. ํ์ง๋ง ๋ฐ๋์ ์ ์ธํ๋ ์์ ์์ ์ด๊ธฐ๊ฐ์ ํ ๋นํด์ผ ํ๋ ๊ฒ์ ์๋๊ณ , ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํตํด ์ค์ ํด๋ ๋๋ค. ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ์์ด์ฆ ๊ตฌ๋ฌธ์ด ์ด๊ฐ์ ์ญํ ์ ํ๋ค.
ํ์ง๋ง ํด๋์ค์์๋ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๋ ์ด๊ธฐ๊ฐ์ ํจ๊ป ํจ๊ป ํ ๋นํด์ฃผ์ง ์์ผ๋ฉด ์ ๊ฒฝ์จ์ผ ํ ๊ฒ๋ค์ด ์์ด ์ฃผ์ํด์ผ ํ๋ค. ํ๋กํผํฐ ์ ์ธ์ ์ด๊ธฐ๊ฐ์ด ํ ๋น๋์ง ์์ ์ ์ฅ ํ๋กํผํฐ๋ ๋ฐ๋์ ์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธํด ์ฃผ์ด์ผ ํ๋ค. ์ด๋ ์ค์ํํธ์์ ํด๋์ค์ ํ๋กํผํฐ์ ๊ฐ์ด ๋น์ด์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ฌด์กฐ๊ฑด nil๊ฐ์ผ๋ก ์ด๊ธฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ต์ ๋ ํ์ ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๋์๋ ์ผ๋ฐ ์ต์ ๋ ํ์ ๊ณผ ๋ฌต์์ ์ต์ ๋ ํด์ ํ์ ์ค์์ ์ ํํด์ ์ ์ํ ์ ์๋ค. ๋ฌต์์ ์ต์ ๋ ํ์ ์ผ๋ก ์ง์ ํด๋๋ฉด ์ด ๊ฐ์ ์ฌ์ฉํ ๋ ์ต์ ๋ ํด์ ์ฒ๋ฆฌ๋ฅผ ํ ํ์ ์์ด ์ผ๋ฐ ๋ณ์์ฒ๋ผ ์ธ ์ ์๋ค.
์๋๋ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ์ ์ฅ ํ๋กํผํฐ์ ์ ์ธ๊ณผ ์ธ์คํด์ค ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ์์์ด๋ค.
// ์ขํ
struct CoordinatePoint {
var x: Int // ์ ์ฅ ํ๋กํผํฐ
var y: Int // ์ ์ฅ ํ๋กํผํฐ
}
// ๊ตฌ์กฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ ํ๋กํผํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ ์ด๋์
๋ผ์ด์ ๊ฐ ์๋ค.
let averyPoint: CoordinatePoint = CoordinatePoint(x: 20, y: 10)
// ์ฌ๋์ ์์น์ ๋ณด
class Position {
var point: CoordinatePoint // ์ ์ฅ ํ๋กํผํฐ (๋ณ์) โ ์์น(point)๋ ๋ณ๊ฒฝ๋ ์ ์์.
let name: String // ์ ์ฅ ํ๋กํผํฐ (์์)
// ํ๋กํผํฐ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ์ด๋์
๋ผ์ด์ ๋ฅผ ๋ฐ๋ก ์ ์ํด์ฃผ์ด์ผ ํ๋ค.
init(name: String, currentPoint: CoordinatePoint) {
self.name = name
self.point = currentPoint
}
}
// ์ฌ์ฉ์์ ์ ์ด๋์
๋ผ์ด์ ๋ฅผ ํธ์ถํด์ผ ํ๋ค.
// ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋กํผํฐ ์ด๊น๊ฐ์ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค ์์ฑ์ด ๋ถ๊ฐ๋ฅํ๋ค.
let averyPosition: Position = Position(name: "avery", currentPoint: averyPoint)
์์์ ๊ตฌ์กฐ์ฒด๋ ํ๋กํผํฐ์ ๋ง๋ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์๋์ผ๋ก ์ ๊ณตํ๋ค๊ณ ํ์ง๋ง ํด๋์ค๋ ์ด๊ธฐ๊ฐ์ ๋ฐ๋ก ์ง์ ํด์ผ ๋์ค์ ์ฌ์ฉ์ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ๊ตฌํํ์ง ์์๋ ๋๋ค๊ณ ํ๋ค. ์๋๋ ๊ทธ ์์ ์ฝ๋์ด๋ค.
// ์ขํ
struct CoordinatePoint {
var x: Int = 0 // ์ ์ฅ ํ๋กํผํฐ
var y: Int = 0 // ์ ์ฅ ํ๋กํผํฐ
}
// ํ๋กํผํฐ์ ์ด๊น๊ฐ์ ํ ๋นํ๋ค๋ฉด ๊ตณ์ด ์ ๋ฌ์ธ์๋ก ์ด๊น๊ฐ์ ๋๊ธธ ํ์๊ฐ ์๋ค.
let averyPoint: CoordinatePoint = CoordinatePoint()
// ๋ฌผ๋ก ๊ธฐ์กด์ ์ด๊น๊ฐ์ ํ ๋นํ ์ ์๋ ์ด๋์
๋ผ์ด์ ๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
let oliviaPoint: CoordinatePoint = CoordinatePoint(x: 30, y: 15)
print("avery's point : \(averyPoint.x), \(averyPoint.y)") // avery's point : 0, 0
print("olivia's point : \(oliviaPoint.x), \(oliviaPoint.y)") // wizplan's point : 30, 15
// ์ฌ๋์ ์์น์ ๋ณด
class Position {
var point: CoordinatePoint = CoordinatePoint() // ์ ์ฅ ํ๋กํผํฐ
var name: String = "Unknown" // ์ ์ฅ ํ๋กํผํฐ
}
// ์ด๊น๊ฐ์ ์ง์ ํด์คฌ๋ค๋ฉด ์ฌ์ฉ์์ ์ ์ด๋์
๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
let averyPosition: Position = Position()
averyPosition.point = averyPoint
averyPosition.name = "avery"
๋ค์์ ์ต์ ๋๊ณผ ์ฌ์ฉ์ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํผํฉํ ์์ ์ด๋ค. ์ด๋ ๊ฒํ๋ฉด ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ ๋, ๋ด๊ฐ ์ฒ์ ์๋ํ ๋๋ก ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ ๋ํ ์ ์๋ค.
// ์ขํ
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 averyPosition: Position = Position(name: "avery")
// ์์น๋ฅผ ์๊ฒ๋๋ฉด ๊ทธ ๋ ์์น ๊ฐ์ ํ ๋นํ๋ค.
averyPosition.point = CoordinatePoint(x: 20, y: 10)
์ผ๋ฐ์ ์ผ๋ก ์ ์ฅ ํ๋กํผํฐ๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์ฒ์ ์์ฑ๋ ๋ ํจ๊ป ์ด๊ธฐํ๋์ง๋ง, ์ ์ฅ ํ๋กํผํฐ ์ ์ ์์ Lazy๋ผ๋ ํค์๋๊ฐ ๋ถ์ผ๋ฉด ์์ธ๊ฐ ๋๋ค. ์ด ํค์๋๋ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐํ๋ฅผ ์ง์ฐ์ํจ๋ค.
ํด๋์ค ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ๊ฐ ๋ง๋ค์ด์ง๋๋ผ๋ 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 averyPosition: Position = Position(name: "avery")
// ์ด ์ฝ๋๋ฅผ ํตํด point ํ๋กํผํฐ๋ก ์ฒ์ ์ ๊ทผํ ๋ point ํ๋กํผํฐ์ CoordinatePoint๊ฐ ์์ฑ๋๋ค.
print(averyPosition.point) // x: 0, y: 0
์ฐ์ฐ ํ๋กํผํฐCompute Property)๋ ์ค์ ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ๊ฐ ์๋๋ผ, ํน์ ์ํ์ ๋ฐ๋ฅธ ๊ฐ์ ์ฐ์ฐํ๋ ํ๋กํผํฐ์ด๋ค.
์ฐ์ฐ ํ๋กํผํฐ๋ ํ์ํ ๊ฐ์ ์ ๊ณตํ๋ค๋ ์ ์์ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ง๋ง, ์ค์ ๊ฐ์ ์ ์ฅํ๋ค๊ฐ ๋ฐํํ์ง๋ ์๊ณ ๋์ ๋ค๋ฅธ ํ๋กํผํฐ์ ๊ฐ์ ์ฐ์ฐ ์ฒ๋ฆฌํ์ฌ ๊ฐ์ ์ ์ผ๋ก ๊ฐ์ ์ ๊ณตํ๋ค.
์ฐ์ฐ ํ๋กํผํฐ์ ์ ์ ํ์์ ์ ์ฅ ํ๋กํผํฐ์ ํ์๋ณด๋ค๋ ์คํ๋ ค ํจ์์ ๋น์ทํ๋ค. ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ ์ํ ๋์๋ ํ๋กํผํฐ ์ด๋ฆ๊ณผ ํ์
์ ์ด์ด์ ์ค๊ดํธ๋ก ๋ ์คํ ๋ธ๋ก์ ๋ง๋ถ์ด๊ณ , ์คํ ๋ธ๋ก ๋ด๋ถ์๋ ์ ๊ทผ์๋ก get๊ตฌ๋ฌธ
(ํ๋กํผํฐ์ ๊ฐ์ ์ฐธ์กฐํ ๋)๊ณผ ์ค์ ์๋ก set๊ตฌ๋ฌธ
(ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๊ฑฐ๋ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋)์ ์์ฑํ๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ set๊ตฌ๋ฌธ์ ์๋ตํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๋ถ์ ์ผ๋ก return ํค์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ฐํํ๋ค.
์ฐ์ฐ ํ๋กํผํฐ๋ ํญ์ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ๋๋ ์ด๊ฑฐํ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ํ๋กํผํฐ์ ์ ๊ทผ์์ ์ค์ ์๊ฐ ๋ชจ๋ ๋ชจ์ฌ์๊ณ , ํด๋น ํ๋กํผํฐ๊ฐ ์ด๋ค ์ญํ ์ ํ๋ ์ง ์ข ๋ ๋ช ํํ๊ฒ ํํํ ์ ์๋ค.
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
}
}
}
var averyPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)
// ํ์ฌ ์ขํ
print(averyPosition) // 10, 20
// ๋์นญ ์ขํ
print(averyPosition.oppositePoint) // -10, -20
// ๋์นญ ์ขํ๋ฅผ (15, 10)์ผ๋ก ์ค์ ํ๋ฉด
averyPosition.oppositePoint = CoordinatePoint(x: 15, y: 10)
// ํ์ฌ ์ขํ๋ -15, -10๊ฐ ๋๋ค.
print(averyPosition) // -15, -10
์ฐ์ฐ ํ๋กํผํฐ๋ ์ฌ์ค ๋ฉ์๋ ํ์์ผ๋ก๋ ํํํ ์ ์๋ค. ๋ฉ์๋ ์ค๋ช
์ ๋ฐ์ ์์
์ธ์คํด์ค ์ธ๋ถ์์ ๋ฉ์๋๋ฅผ ํตํด ์ธ์คํด์ค ๋ด๋ถ ๊ฐ์ ์ ๊ทผํ๋ ค๋ฉด ๋ฉ์๋๋ฅผ ๋ ๊ฐ(์ ๊ทผ์, ์ค์ ์) ๊ตฌํํด์ผ ํ๋ค. ๋ํ ์ด๋ฅผ ๊ฐ์ํ๊ณ ๋ฉ์๋๋ก ๊ตฌํํ๋ค ํด๋ ๋ ๋ฉ์๋๊ฐ ๋ถ์ฐ ๊ตฌํ๋์ด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋๋น ์ง ์ํ์ด ์๋ค. ํ์ธ์ ์ฝ๋๋ฅผ ๋ณด๋ ํ๋ก๊ทธ๋๋จธ์ ์ ์ฅ์์๋ ํ๋กํผํฐ๊ฐ ๋ฉ์๋ ํ์๋ณด๋ค ๋ ๊ฐํธํ๊ณ ์ง๊ด์ ์ผ๋ก ๋๋ผ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ์ฐ ํ๋กํผํฐ๋ ์ ๊ทผ์์ธ get ๋ฉ์๋๋ง ๊ตฌํํด๋ ๊ฒ์ฒ๋ผ ์ฝ๊ธฐ ์ ์ฉ ์ํ๋ก ๊ตฌํํ๊ธฐ ์ฝ์ง๋ง, ์ฐ๊ธฐ ์ ์ฉ ์ํ๋ก ๊ตฌํํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค. ๋ฉ์๋๋ก๋ ์ค์ ์ ๋ฉ์๋๋ง ๊ตฌํํ์ฌ ์ฐ๊ธฐ ์ ์ฉ ์ํ๋ก ๊ตฌํํ ์ ์์ง๋ง ์ฐ์ฐ ํ๋กํผํฐ๋ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
ํน์ ํ๋กํผํฐ๋ฅผ ๊ณ์ ๊ด์ฐฐํ๊ณ ์๋ค ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์์์ฐจ๋ฆฌ๊ณ ํธ์ถ๋๋ ๊ตฌ๋ฌธ์ด ์๋ค. ์ด๋ฅผ **ํ๋กํผํฐ ์ต์ ๋ฒ (Property Observer)**๋ผ ํ๋ค.
ํ๋กํผํฐ ์ต์ ๋ฒ๋ ์ฐ๋ฆฌ๊ฐ ํ๋กํผํฐ์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์คํ ์ ์ํด ์๋์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์ ์๊ด์์ด ์ผ๋จ ํ๋กํผํฐ์ ์ ๊ฐ์ด ์ค์ (set)๋๋ฉด ๋ฌด์กฐ๊ฑด ํธ์ถ๋๋ค. ์ฌ์ง์ด ํ๋กํผํฐ์ ํ์ฌ์ ๋์ผํ ๊ฐ์ด ์ฌํ ๋น๋๋๋ผ๋ ์ด๊น์์ด ํธ์ถ๋๋ค.
์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ๋์ ํ๋ ๊ตฌ๋ฌธ์ด ์ํ๋๊ฑฐ๋ ์ฐ์ฐ ํ๋กํผํฐ์ set๊ตฌ๋ฌธ์ด ์คํ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ํ๋กํผํฐ ์ต์ ๋ฒ๊ฐ ํธ์ถ๋๋ค.
ํ๋กํผํฐ ์ต์ ๋ฒ์๋ ๋๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
willSet
: ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ์ต์ ๋ฒdidSet
: ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์งํ์ ํธ์ถ๋๋ ์ต์ ๋ฒ
willSet
์์๋ ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ ์ ์๋๋ฐ, ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ผ๋ก newValue
๋ฅผ ์ฌ์ฉํ๋ค. didSet
์์๋ ๋ฐ๋๊ธฐ ์ ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ ์ ์๋๋ฐ, ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ผ๋ก oldValue
๋ฅผ ์ฌ์ฉํ๋ค.
์๋๋ ์ ์ฅ ํ๋กํผํฐ์ ํ๋กํผํฐ ์ต์ ๋ฒ๋ฅผ ๊ตฌํํ ์ฝ๋ ์์์ด๋ค.
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์์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
์์์ ๋ณธ ์ ์ฅ ํ๋กํผํฐ๋ ์ฐ์ฐ ํ๋กํผํฐ๋ ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ ์ฌ์ฉํ ์ ์๋ ์ธ์คํด์ค ํ๋กํผํฐ(Instance Property)์ด๋ค.
์ธ์คํด์ค ํ๋กํผํฐ๋ ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํ ๋๋ง๋ค ์ด๊น๊ฐ์ ํด๋นํ๋ ๊ฐ์ด ํ๋กํผํฐ์ ๊ฐ์ด ๋๊ณ , ์ธ์คํด์ค๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ์ง๋ ์ ์๋ค.
ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์ธ์คํด์ค์ ๊ด๋ จ๋ ๊ฐ์ด ์๋๋ผ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด, ๋๋ ์ด๊ฑฐํ๊ณผ ๊ฐ์ ๊ฐ์ฒด ์์ฒด์ ๊ด๋ จ๋ ๊ฐ์ ๋ค๋ฃจ์ด์ผ ํ ๋๋ ์๋ค.
๊ฐ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ์์ฒด์ ๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ฉฐ ํ์ ์์ฒด์ ์ํ๋ ํ๋กํผํฐ๋ฅผ **ํ์ ํ๋กํผํฐ(Type Property)**๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋๋ ํ์ ํ๋กํผํฐ์ ์ธ์คํด์ค ํ๋กํผํฐ์ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์๋ ์์ ์ฝ๋์ด๋ค.
class AClass {
// ์ ์ฅ ํ์
ํ๋กํผํฐ
static var typeProperty: Int = 0
// ์ ์ฅ ์ธ์คํด์ค ํ๋กํผํฐ
var instanceProperty: Int = 0 {
didSet {
AClass.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
ํค์๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ์ด ํค์๋๋ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค์ ๊ด๊ณ์์ด ์ ์ฅ ํ๋กํผํฐ์ ์ฐ์ฐ ํ๋กํผํฐ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค. ํด๋์ค ํ์
์์ ์ ์ธ๋ ์ฐ์ฐ ํ๋กํผํฐ์ ์ผ๋ถ์๋ class
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ฅ ํ์ ํ๋กํผํฐ๋ ๋ณ์ ๋๋ ์์๋ก ์ ์ธํ ์ ์์ผ๋ฉฐ, ์ฐ์ฐ ํ์ ํ๋กํผํฐ๋ ๋ณ์๋ก๋ง ์ ์ธํ ์ ์๋ค.
class Account {
static let dollarExchangeRate: Double = 1000.0 // ํ์
์์
var credit: Int = 0 // ์ ์ฅ ์ธ์คํด์ค ํ๋กํผํฐ
var dollarValue: Double { // ์ฐ์ฐ ์ธ์คํด์ค ํ๋กํผํฐ
get {
return Double(credit) / Self.dollarExchangeRate
// Self.dollarExchangeRate๋ Account.dollarExchangeRate์ ๊ฐ์ ํํ์ด๋ค.
}
set {
// Self.dollarExchangeRate๋ Account.dollarExchangeRate์ ๊ฐ์ ํํ์ด๋ค.
credit = Int(newValue * Self.dollarExchangeRate)
print("์์ก์ \(newValue)๋ฌ๋ฌ๋ก ๋ณ๊ฒฝ ์ค์
๋๋ค.")
}
}
}
๋ฉ์๋ ํน์ ๋ฉ์๋(Method)๋ ํน์ ํ์ ์ ๊ฐ์ฒด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ํจ์๋ฅผ ๋งํ๋ค. ์ฆ, ํด๋์ค๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ๊ณผ ๊ฐ์ ๊ฐ์ฒด ๋ด์์ ํจ์๊ฐ ์ ์ธ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฉ์๋๋ผ๊ณ ํต์นญํ๋ค.
ํจ์์ ๋ฉ์๋์ ์ฐจ์ด์ ์ ๊ตฌํ ๋ชฉ์ ์ด ๊ฐ์ง๋ ๋ ๋ฆฝ์ฑ๊ณผ ์ฐ๊ด์ฑ์ ์๋ค. ํจ์๋ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ง๋ค์ด์ง๋ ๊ฒ์ด์ง๋ง, ๋ฉ์๋๋ ํ๋์ ๊ฐ์ฒด ๋ด์ ์ ์๋ ๋ค๋ฅธ ๋ฉ์๋๋ค๊ณผ ์๋ก ํ๋ ฅํ์ฌ ํจ์์ ์ธ ๊ธฐ๋ฅ์ ์ํํ๋ค.
๋ฉ์๋๋ ํฌ๊ฒ **์ธ์คํด์ค ๋ฉ์๋(Instance Method)**์ **ํ์ ๋ฉ์๋ (Type Method)**๋ก ๊ตฌ๋ถ๋๋๋ฐ, ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ ์ธ์คํด์ค ๋ฉ์๋, ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์์๋ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ ํ์ ๋ฉ์๋์ด๋ค.
**์ธ์คํด์ค ๋ฉ์๋ (Instance Method)**๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด ๋๋ ์ด๊ฑฐํ๊ณผ ๊ฐ์ ๊ฐ์ฒด ํ์ ์ด ๋ง๋ค์ด ๋ด๋ ์ธ์คํด์ค์ ์์๋ ํจ์์ด๋ค.
์ธ์คํด์ค ๋ฉ์๋๋ ์ธ์คํด์ค ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ฑฐ๋ ์ธ์คํด์ค์ ์์ฑ ๋ชฉ์ ์ ๋ฐ๋ฅธ ํจ์์ ๊ด๊ณ์ฑ์ ์ ๊ณตํ๋ ๋ฑ ๊ฐ์ฒด์ ์ธ์คํด์ค์ ๋ํ ๊ธฐ๋ฅ์ ์ธก๋ฉด์ ์ ๊ณตํ๋ค.
์ธ์คํด์ค ๋ฉ์๋๋ ๊ฐ์ฒด ํ์ ๋ด๋ถ์ ์ ์ธ๋๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ์ผ๋ฐ ํจ์์ ์ ์ธํ๋ ํ์์ด ์์ ํ ๋์ผํ๋ค.
ํ์ง๋ง ํจ์์ ๋ฌ๋ฆฌ, ์ธ์คํด์ค ๋ฉ์๋๋ ํด๋น ๋งค์๋๊ฐ ์ํ ์ธ์คํด์ค๋ฅผ ํตํด์๋ง ํธ์ถ๋ ์ ์๋ค.
๋ค์์ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ์ฝ๋ ์์์ด๋ค.
class LevelClass {
// ํ์ฌ ๋ ๋ฒจ์ ์ ์ฅํ๋ ์ ์ฅ ํ๋กํผํฐ
var level: Int = 0 {
// ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํธ์ถํ๋ ํ๋กํผํฐ ์ต์ ๋ฒ
didSet {
print("Level \(level)")
}
}
// ๋ ๋ฒจ์ด ์ฌ๋์ ๋ ํธ์ถํ ๋ฉ์๋
func levelUp() {
print("Level Up!")
level += 1
}
// ๋ ๋ฒจ์ด ๊ฐ์ํ์ ๋ ํธ์ถํ ๋ฉ์๋
func levelDown() {
print("Level Down")
level -= 1
if level < 0 {
reset()
}
}
// ํน์ ๋ ๋ฒจ๋ก ์ด๋ํ ๋ ํธ์ถํ ๋ฉ์๋
func jumpLevel(to: Int) {
print("Jump to \(to)")
level = to
}
// ๋ ๋ฒจ์ ์ด๊ธฐํํ ๋ ํธ์ถํ ๋ฉ์๋
func reset() {
print("Reset!")
level = 0
}
}
var levelClassInstance: LevelClass = LevelClass()
levelClassInstance.levelUp() // Level Up!
levelClassInstance.levelDown() // Level Down
levelClassInstance.levelDown() // Level Down
// Level -1
// Reset!
// Level 0
levelClassInstance.jumpLevel(to: 3) // Jump to 3
// Level 3
์ธ์คํด์ค ๋ฉ์๋๋ ์ผ๋ฐ ํจ์์ ์ ์ธ ํ์์ด ๊ฐ์ง๋ง ๋ค์ ์ธ ๊ฐ์ง ํญ๋ชฉ์์ ์ฐจ์ด๊ฐ ์๋ค.
- ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ธ์คํด์ค์ ์์๋๋ค๋ ์
- ๋ฉ์๋ ๋ด์์ ์ ์๋ ๋ณ์์ ์์๋ฟ๋ง ์๋๋ผ ํด๋์ค ๋ฒ์์์ ์ ์๋ ํ๋กํผํฐ๋ ๋ชจ๋ ์ฐธ์กฐํ ์ ์๋ค๋ ์
- self ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์
self.ํ๋กํผํฐ
๋ชจ๋ ์ธ์คํด์ค๋ ์์์ ์ผ๋ก ์์ฑ๋ self ํ๋กํผํฐ
๋ฅผ ๊ฐ๋๋ค. ์๋ฐ์ this์ ๋น์ท
ํ๊ฒ ์ธ์คํด์ค ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ํ๋กํผํฐ์ด๋ค. self ํ๋กํผํฐ๋ ์ธ์คํด์ค๋ฅผ ๋ ๋ช
ํํ ์ง์นญํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
ํ๋กํผํฐ์ ๋ฐ๋์ self ํค์๋๋ฅผ ๋ถ์ด์ง ์๋๋ผ๋, ์ปดํ์ผ๋ฌ๋ ์ด ๋ณ์๊ฐ ํ๋กํผํฐ์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ถ๋ถ ์ ์ธ์ํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋๋ก ์ฒ๋ฆฌํ๋ค.
์ด ๋๋ฌธ์ self ํค์๋๋ฅผ ์๋ตํ๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง์๋ฐ, ๋ฐ๋์ self ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ ๋๊ฐ ์๋ค. ๋ฐ๋ก ๋ฉ์๋ ๋ด๋ถ์ ํ๋กํผํฐ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋ณ์๋ ์์๊ฐ ์ ์ธ๋์์ ๋์ด๋ค.
ํ๋กํผํฐ์ ์ผ๋ฐ ๋ณ์์ ์ด๋ฆ์ด ์ถฉ๋ํ ๊ฒฝ์ฐ์๋ ํ๋กํผํฐ ์์ ๋ฐ๋์ self ํค์๋๋ฅผ ๋ถ์ฌ ์ฃผ์ด์ผ ํ๋ค.
์์ ์ธ์คํด์ค ๋ฉ์๋ ์์ ์ฝ๋ ์ฒ๋ผ level ๋ณ์๋ฅผ ์ฌ์ฉํ ๋, ์ค์ํํธ๋ ์๋์ผ๋ก ๋ฉ์๋ ๋ด๋ถ์ ์ ์ธ๋ ์ง์ญ๋ณ์๋ฅผ ๋จผ์ ์ฌ์ฉํ๊ณ , ๊ทธ ๋ค์ ๋ฉ์๋ ๋งค๊ฐ๋ณ์, ๊ทธ ๋ค์ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ์ฐพ์ level์ด ๋ฌด์์ ์ง์นญํ๋์ง ์ ์ถํ๋ค.
๋ฉ์๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ด level์ธ๋ฐ, ์ด level ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ธ์คํด์ค ํ๋กํผํฐ์ level์ ์ง์นญํ๊ณ ์ถ๋ค๋ฉด ์ด ๋ self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ค.
์์ ์ธ์คํด์ค ๋ฉ์๋ ์์ ์ฝ๋์ jumpLevel(to:) ๋ฉ์๋๋ฅผ ์กฐ๊ธ ๋ณ๊ฒฝํด์ ์์๋ณด์.
class LevelClass {
var level: Int = 0
func jumpLevel(to level: Int) {
print("Jump to \(level)")
self.level = level // ์ฌ๊ธฐ ์ฃผ๋ชฉ
}
}
level = level์ด๋ผ๊ณ ์ ์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ข์ธก์ level์ ์ธ์คํด์ค ํ๋กํผํฐ์ธ level์ด ์๋ ๋งค๊ฐ๋ณ์๋ก ๋์ด์จ level์ ์ง์นญํ๋ ๊ฒ์ผ๋ก ํ๋จํ๊ฒ ๋๋ค.
๊ทธ๋ด ๋ ์ข์ธก์ level ๋์ self.level์ด๋ผ๊ณ ์ ์ด์ฃผ๋ฉด ์ข์ธก์ level์ด ์ธ์คํด์ค ํ๋กํผํฐ๋ผ๋ ๊ฒ์ ๋ช ํํ ํ ์ ์๋ค.
์ถ๊ฐ๋ก, self ํ๋กํผํฐ๋ ๊ฐ ํ์
์ธ์คํด์ค ์์ฒด์ ๊ฐ์ ์นํํ ์ ์๋ค. ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐ ํ์
์ด๋ผ self ํ๋กํผํฐ์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ํ ๋นํ ์ ์๋๋ฐ, ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ ๋ฑ์ self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์์ฒด๋ฅผ ์นํํ ์๋ ์๋ค. ์์ ์ฝ๋ ์๋ต
ํ์ ํ๋กํผํฐ๋ฅผ ๋ฉ์๋๋ก ์ฎ๊ธด ๊ฒ ํ์ ๋ฉ์๋(Type Method)์ด๋ค. ์ฆ, ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๊ฐ์ฒด ํ์ (ํด๋์ค๋ ๊ตฌ์กฐ์ฒด) ์์ฒด์์ ํธ์ถํ ์ ์๋ ๋ฉ์๋๋ฅผ **ํ์ ๋ฉ์๋ (Type Method)**๋ผ๊ณ ํ๋ค.
ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ํ์
์์๋ ํ๋กํผํฐ ์ ์ธ ์์ static
ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ ํ์ ํด๋์ค์์ ์ฌ์ ์ ๊ฐ๋ฅํ ํ์
๋ฉ์๋๋ฅผ ์ ์ธํ ๋์๋ class
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ์ ์ธ๋ ํ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋์๋ ์ธ์คํด์ค ๋ฉ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๊ตฌ๋ฌธ์ ์ด์ฉํ๋ค. ๊ทธ๋ฌ๋ ํ์ ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉ์๋์ ๋ฌ๋ฆฌ self ํ๋กํผํฐ๊ฐ ํ์ ๊ทธ ์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
์ธ์คํด์ค ๋ฉ์๋์์๋ self๊ฐ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ฉด ํ์ ๋ฉ์๋์ self๋ ํ์ ์ ๊ฐ๋ฆฌํจ๋ค. ๊ทธ๋์ ํ์ ๋ฉ์๋ ๋ด๋ถ์์ ํ์ ์ด๋ฆ๊ณผ self๊ฐ ๊ฐ์ ๋ป์ด๋ผ๊ณ ๋ณผ ์ ์๊ณ , ํ์ ๋ฉ์๋์์ self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ํ๋กํผํฐ ๋ฐ ํ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋๋ค.
์๋ ์์๋ฅผ ์ดํด๋ณด์
// ์์คํ
์๋์ ํ ๊ธฐ๊ธฐ์์ ์ ์ผํ ๊ฐ์ด์ด์ผ ํฉ๋๋ค.
struct SystemVolume {
// ํ์
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์ ๋ ์ ์ผํ ๊ฐ์ด ๋๋ค.
static var volume: Int = 5
// ํ์
ํ๋กํผํฐ๋ฅผ ์ ์ดํ๊ธฐ ์ํด ํ์
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
static func mute() {
self.volume = 0
// SystemVolume.volume = 0 ๊ทธ๋ฆฌ๊ณ Self.volume = 0๊ณผ ๊ฐ์ ํํ์ด๋ค.
}
}
// ๋ด๋น๊ฒ์ด์
์ญํ ์ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์ํํ ์ ์๋ค.
class Navigation {
// ๋ค๋น๊ฒ์ด์
์ธ์คํด์ค๋ง๋ค ์๋์ ๋ฐ๋ก ์ค์ ํ ์ ์๋ค.
var volume: Int = 556
// ๊ธธ ์๋ด ์์ฑ ์ฌ์
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