ํด๋์ค๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐ์ฒด์ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ๊ทธ ๋ด๋ถ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ ์ํ์ ๊ดํ ์ ๋ณด๋ฅผ ๋งํ๋ค.
- ์ ์ฅ ํ๋กํผํฐ: ์ธ์คํด์ค์ ์ผ๋ถ๋ก ์์์ ๋ณ์ ๊ฐ์ ์ ์ฅ
- ๊ณ์ฐ ํ๋กํผํฐ: ๊ฐ์ ์ ์ฅํ๋ ๋์ ์ ๊ณ์ฐ์ ํจ( ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์์ ์ ๊ณต)
- ํ์ ํ๋กํผํฐ: ํ๋กํผํฐ๋ ํ์ ๊ทธ ์์ฒด์ ์ฐ๊ฒฐ๋์ด ์์ ์ ์๋๋ฐ, ์ด๋ฅผ ํ์ ํ๋กํผํฐ๋ผ๊ณ ํจ
์ ์ฅ ํ๋กํผํฐ (Stored Properties)
์ ์ฅ ํ๋กํผํฐ๋ ํน์ ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค ์ผ๋ถ๋ก์ ์ ์ฅ๋ ์์ ๋๋ ๋ณ์์ด๋ค. ๋ํ ์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ๋ “๊ธฐ๋ณธ๊ฐ (Default Property Value)”๋ฅผ ์ค์ ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ ์ฅ ํ๋กํผํฐ๋ initializer(์์ฑ์)๋ก ์ด๊ธฐํ ์ํฌ ์ ๋ ์๋ค. ์์ฑ์์ ์ํด ์ด๊ธฐํ ๋ ๋๋ ํด๋น ํ๋กํผํฐ๊ฐ ์์๋ก ์ ์ธ ๋์๋ค๊ณ ํด๋ ์์ ์ด ๊ฐ๋ฅํ๋ค.
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8
์์๋ก ์ ์๋ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค (Stored Properties of Constant Structure Instances)
๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์์์ ํ ๋นํ๋ฉด ํ๋กํผํฐ๊ฐ ๋ณ์๋ก ์ ์ธ๋์ด ์์ด๋ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ฅผ ์์ ํ ์ ์๋ค.
let rangeOfFourItems = FixedLengthRange(firstValue : 0, length: 4)
// ์ด ๋ฒ์๋ ์ ์ ๊ฐ 0, 1, 2, 3 ์ ๋ํ๋
rangeOfFourItems.firstValue = 6.
// ์ด๋ firstValue ๊ฐ ๋ณ์ ์์ฑ์ผ์ง๋ผ๋, ์๋ฌ๋ฅผ ๋ฐํ
์ด๋ฌํ ๋์์ ๊ตฌ์กฐ์ฒด๊ฐ ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ ํ์ ์ ์ธ์คํด์ค๊ฐ ์์๋ก ์ ์ธํ๋ฉด ์ธ์คํด์ค์ ๋ชจ๋ ํ๋กํผํฐ์ ๋ํด ์์ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์ฐธ์กฐํ์ ์ธ ํด๋์ค์์๋ ์ด๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ค. ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์๋ก ์ ์ธํด๋ ์ ์ธํ ํ๋กํผํฐ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ง์ฐ ์ ์ฅ ํ๋กํผํฐ (Lazy Stored Properties)
์ง์ฐ ์ ์ฅ ํ๋กํผํฐ (lazy stored property)๋ ์ฒ์ ํธ์ถ๋ ๋๊น์ง ์ด๊ธฐ๊ฐ์ ๊ณ์ฐ๋์ง ์๋ ํ๋กํผํฐ ์ด๋ค. ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ๋ ์ ์ธ ์ ์ lazy ํค์๋๋ฅผ ๋ถ์ฌ ๋ํ๋ธ๋ค.
NOTEโ๏ธ
์ธ์คํด์ค ์ด๊ธฐํ๊ฐ ์๋ฃ๋ ํ์๋ ์ด๊ธฐ๊ฐ์ด ์์ ์ ์์ผ๋ฏ๋ก ์ง์ฐ ํ๋กํผํฐ๋ var ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ก ์ ์ธํด์ผ ํ๋ค. ํ๋กํผํฐ ์์๋ ์ด๊ธฐํ๊ฐ ์๋ฃ๋๊ธฐ ์ ์ ํญ์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ฏ๋ก lazy๋ก ์ ์ธํ ์ ์๋ค.
ํด๋น ์์ฑ์ด ๋ฐ๋์ ์ฒ์๋ถํฐ ์ด๊ธฐํ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ(์ผ๋ฐ์ ์ผ๋ก ๋ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ์ด๋ฏธ์ง ๋ฑ)์ ์ด๊ธฐํ๋ฅผ ์ง์ฐ์ํฌ ์ ์๋ค.
(๋ถํ์ํ ์ฑ๋ฅ์ ํ๋, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ญ๋น ์ค์ผ ์ ์์)
๊ณ์ฐ ํ๋กํผํฐ (Computed Properties)
ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ์ ์๋ค. ์ด ์ฐ์ฐํ๋กํผํฐ๋ ์ค์ ๊ฐ์ ์ ์ฅํ๊ณ ์๋ ๊ฒ์ด ์๋๋ผ, getter๊ณผ optionalํ setter๋ฅผ ์ ๊ณตํด ๊ฐ์ ํ์ํ๊ณ ๊ฐ์ ์ ์ผ๋ก ๋ค๋ฅธ ํ๋กํผํฐ ๊ฐ์ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. setter๋ ํ์์ ์ธ ์์๋ ์๋๊ณ ์ ํ์ฌํญ์ด๋ค.
struct Point {
var x = 0.0, y = 0.0
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
// initialSquareCenter is at (5.0, 5.0)
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// Prints "square.origin is now at (10.0, 10.0)"
์ ์ฝ๋๋ ์ขํ์ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ์ฌ๊ฐํ์ ํํํ๋ ๊ตฌ์กฐ์ฒด์ ๊ดํ ์ฝ๋์ด๋ค. ์ฌ๊ธฐ์ Rect ๊ตฌ์กฐ์ฒด๋ ์ฌ๊ฐํ์ ์ค์ ์ ํํํ๋ center๋ผ๋ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ ๊ณตํ๋ค. ์ด ํ๋กํผํฐ๋ ๊ณ์ฐ๋ ํ๋กํผํฐ์ ์ ์๋๋ก ๊ฐ์ ์ง์ ๊ฐ๊ณ ์๋ ๊ฒ์ด ์๋๋ผ ๋ค๋ฅธ ์ขํ์ ํฌ๊ธฐ ํ๋กํผํฐ๋ค์ ์ ์ ํ ์ฐ์ฐํด์ ๊ตฌํ ์ ์๋ค. (get) ๋ set์ผ๋ก ์ฌ๊ฐํ์ ์ค์ ์ ์ง์ ์ค์ ํ ์ ์๋๋ฐ, ์ด ๊ฐ์ ์ค์ ํ ๋ x, y ์ขํ๊ฐ ์ด๋ค ๊ฐ์ ๊ฐ์ ธ์ผํ๋์ง x, y์ ์ ์ ํ ์ขํ๊ฐ์ ๋ฃ์ด์ค๋ค.
square.center ์ ํตํด square ๋ณ์์ center ํ๋กํผํฐ์ ์ ๊ทผํ๋๋ฐ, ์ด๋ center์ getter์ ํธ์ถํ์ฌ ํ์ฌ ์์ฑ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ๊ธฐ์กด ๊ฐ์ ๋ฐํํ๋ค๊ธฐ ๋ณด๋ค๋, ์ Point๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐํํด์ค๋ค. ์์ฝ๋์์ ๋ณด๋ฉด, getter๋ (5,5)๋ผ๋ ์ค์ฌ์ ์ ๋ฐํํ๋ค.
๊ทธ ๋ค์, center ํ๋กํผํฐ์ (15, 15)๋ผ๋ ์๋ก์ด ๊ฐ์ ์ค์ ํ๋ค. ์ด๋ ์ ์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ์, ์๋ ๊ทธ๋ฆผ์์๋ ์ค๋ ์ง์ ์ ์ฌ๊ฐํ์ ์์น๋ก ์ด๋์ํจ๋ค. center ํ๋กํผํฐ๋ฅผ ์ค์ ํ๋ฉด center์ setter์ ํธ์ถํ๋๋ฐ ์ด๋ orgin์ด๋ผ๋ ์ ์ฅ ํ๋กํผํฐ์ x์ y๊ฐ์ ์์ ํ์ฌ ์ ์ฌ๊ฐํ์ ์ ์์น๋ก ์ด๋์ํจ๋ค.
square ๋ผ๋ ์๋ก์ด Rect ๋ณ์๋ฅผ ์์ฑํ๋ค. square๋ณ์๋ (0,0) ์ด๋ผ๋ ์์ ๊ณผ, (10, 10)์ด๋ผ๋ ํญ๊ณผ ๋์ด๋ก ์ด๊ธฐํ๋๋ค. ์๋ ๊ทธ๋ฆผ์ ํ๋์ ์ฌ๊ฐํ์ด ์ด ์ฌ๊ฐํ์ด๋ค.
Shorted Setter Declaration (Setter ์ ์ธ์ ๊ฐ๋ตํ ํํ)
์์ ์ฝ๋์์๋ Setter์ ์ธ์ ์ด๋ฆ์ ์๋์ ๊ฐ์ด set(newCenter)๋ผ๊ณ ๋ช ์ํ์ง๋ง, ๋ง์ฝ ์ด๋ ๊ฒ newCenter๋ผ๊ณ ์ธ์ ์ด๋ฆ์ ์ ํ์ง ์์ผ๋ฉด ์ธ์ ๊ธฐ๋ณธ ์ด๋ฆ์ธ newValue๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
struct AlternativeRect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
์ ์ฝ๋์์๋ set ๋ฉ์๋ ์์์ ์ธ์ ์ด๋ฆ์ ์ง์ ํ์ง ์์๋๋ฐ๋ newValue.x, newValue.y๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ณด์ค ์ ์๋ค.
Shorthand Getter Declaration
์ ์ฒด getter ๋ณธ๋ฌธ์ด ๋จ์ผ ํํ์์ด๋ฉด, getter์ ์์์ ์ผ๋ก ๊ทธ ํํ์์ ๋ฐํํ๋ค.
struct CompactRect {
var origin = Point()
var size = Size()
var center: Point {
get {
Point(x: origin.x + (size.width / 2),
y: origin.y + (size.height / 2))
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
getter์์ return์ ์๋ตํ๋ค. ์ด๋ ํจ์์์ return์ ์๋ตํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ท์น์ ๊ฐ๋๋ค.
์ฝ๊ธฐ์ ์ฉ ๊ณ์ฐ๋ ํ๋กํผํฐ (Read-Only Computed Properties)
getter๋ง ์๊ณ setter๋ฅผ ์ ๊ณตํ์ง ์๋ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ฅผ ์ฝ๊ธฐ์ ์ฉ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ผ๊ณ ํ๋ค. ์ฆ, ์ฝ๊ธฐ์ ์ฉ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ ๋ฐ๋์ ๋ฐํ ๊ฐ์ ์ ๊ณตํ๊ณ ๋ค๋ฅธ ๊ฐ์ ์ง์ ํ ์๋ ์๋ ํ๋กํผํฐ์ด๋ค.
NOTEโ๏ธ
์ฝ๊ธฐ์ ์ฉ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ฅผ ํฌํจํด ๊ณ์ฐ๋ ํ๋กํผํฐ๋ฅผ ์ ์ธ์์๋ ๋ฐ๋์ let์ด ์๋๋ผ var๋ก ์ ์ธํด์ผํ๋ค. ๋ณดํต ์ฝ๊ธฐ์ ์ฉ(read-only)์ด๋ผ ํจ์ ํ๋ฒ ๊ฐ์ด ์ ํด์ง๋ฉด ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ let์ผ๋ก ์ ์ธํ๋ ๊ฒ์ด ๋ง์ผ๋ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ ์ฝ๊ธฐ์ ์ฉ(read-only)์ด๋ผ ํ๋๋ผ๋ ๊ณ์ฐ ๊ฐ์ ๋ฐ๋ผ ๊ฐ์ด ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ var๋ก ์ ์ธํ๋ค.
ํ๋กํผํฐ ๊ด์ฐฐ์(Property Observers)
์์ฑ ๊ด์ฐฐ์๋ ์์ฑ ๊ฐ์ด ๋ฐ๋๋ ๊ฑธ ๊ด์ฐฐํ์ฌ ์๋ตํฉ๋๋ค. ์์ฑ ๊ด์ฐฐ์๋ ์์ฑ ๊ฐ์ ์ค์ ํ ๋๋ง๋ค(์ ๊ฐ์ด ํ์ฌ ์์ฑ ๊ฐ๊ณผ ๊ฐ์๋) ํธ์ถ๋ฉ๋๋ค.
- willSet : ๊ฐ์ด ์ ์ฅ๋๊ธฐ ๋ฐ๋ก ์ง์ ์ ํธ์ถ ๋จ
- didSet : ์ ๊ฐ์ด ์ ์ฅ๋๊ณ ๋ ์งํ์ ํธ์ถ ๋จ
willSet์์๋ ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ช
์ ์ง์ ํ ์ ์๋๋ฐ, ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ผ๋ก newValue๋ฅผ ์ฌ์ฉํฉ๋๋ค.
didSet์์๋ ๋ฐ๋๊ธฐ ์ ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ช
์ ์ง์ ํ ์ ์๋๋ฐ, ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ผ๋ก oldValue๋ฅผ ์ฌ์ฉํฉ๋๋ค.
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
'๐ฆ Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Subscripts (0) | 2022.07.04 |
---|---|
Methods (0) | 2022.07.04 |
Structures and Classes (0) | 2022.06.22 |
Enumerations (0) | 2022.06.15 |
Closures (0) | 2022.06.15 |