- [Swift]νλ‘νΌν°
- Swiftμ νλ‘νΌν°μ λν μ΄ν΄
- The Swift Language Guide - Properties
- Properties - Stored Property(μ μ₯ νλ‘νΌν°)
- Properties - Computed Property(μ°μ° νλ‘νΌν°)
- Properties - Property Observers(νλ‘νΌν° μ΅μ λ²)
Property(νλ‘νΌν°): "μ¬μ°", "μμ λ¬Ό", "μμ±"
νλ‘νΌν°λ ν΄λμ€λ ꡬ쑰체, νΉμ μ΄κ±°νμ κ°μ²΄ μΈμ€ν΄μ€κ° κ·Έ λ΄λΆμ κ°μ§κ³ μλ, κ°μ²΄μ μνμ κ΄ν μ 보μ΄λ€.
μ΄λ¬ν νλ‘νΌν°μ μ’ λ₯μλ ν¬κ² 5κ°μ§κ° μλ€.
- Stored Property(μ μ₯ νλ‘νΌν°)
- Lazy Stored Property(μ§μ° μ μ₯ νλ‘νΌν°)
- Compute Property(μ°μ° νλ‘νΌν°)
- Property Observer(νλ‘νΌν° μ΅μ λ²)
- Type Property(νμ νλ‘νΌν°)
κ°μ₯ λ¨μν κ°λ μ νλ‘νΌν°λ‘μ¨ ν΄λμ€ λλ ꡬ쑰체μ μΈμ€ν΄μ€μ μ°κ΄λ κ°μ μ μ₯νλ νλ‘νΌν°.
ꡬ쑰체λ μ μ₯ νλ‘νΌν°μ μ΅μ λ μ¬λΆμ μκ΄μμ΄ μ μ₯ νλ‘νΌν°λ₯Ό λͺ¨λ ν¬ν¨νλ μ΄λμ λΌμ΄μ κ° μλμΌλ‘ μμ±λ¨
ν΄λμ€μ μ μ₯ νλ‘νΌν°λ μ΅μ λμ΄ μλ μ΄μ, νλ‘νΌν° κΈ°λ³Έ κ°μ μ§μ ν΄μ£Όκ±°λ μ¬μ©μμ μ μ΄λμ λΌμ΄μ λ₯Ό ν΅ν΄ λ°λμ μ΄κΈ°ν ν΄μ£Όμ΄μΌ ν¨
-
Struct(ꡬ쑰체)
struct MyPoint { var x: Int // μ μ₯ νλ‘νΌν° var y: Int // μ μ₯ νλ‘νΌν° } //ꡬ쑰체λ κΈ°λ³Έμ μΌλ‘ μ μ₯ νλ‘νΌν°λ₯Ό 맀κ°λ³μλ‘ κ°μ§λ μ΄λμ λΌμ΄μ Έκ° μλ€. let point: MyPoint = MyPoint(x: 10, y: 5)
μ€μν κ²μ ꡬ쑰체μ λ΄λΆ λ³μκ° MyPointμ²λΌ μ λΆ letμΌλ‘ μ μΈλκ² μλλλΌλ μΈμ€ν΄μ€λ₯Ό letμΌλ‘ μ μΈνκ² λλ©΄ Value TypeμΈ κ΅¬μ‘°μ²΄μ νΉμ±μ λ΄λΆ μ μ₯ νλ‘νΌν°λ€λ letμΌλ‘ μ μΈ λ κ² κ°μ΄ λλ€.
let point: MyPoint = MyPoint(x: 10, y: 5) point.x = 0 // error: cannot assign to property: 'x' is a 'let' constant point.y = 0 // error: cannot assign to property: 'x' is a 'let' constant
-
Class(ν΄λμ€)
class Position { var point: MyPoint // μ μ₯ νλ‘νΌν°(λ³μ) let name: String // μ μ₯ νλ‘νΌν°(μμ) // μ μ₯ νλ‘νΌν°λ€μκ² μ΄κΈ°κ°μ΄ μλ€λ©΄, ν΄λμ€λ initμ΄ λ°λμ νμνλ€. init(name: String, currentPoint: MyPoint) { self.name = name self.point = currentPoint } } //ν΄λμ€λ μ¬μ©μμ μ μ΄λμ λΌμ΄μ λ₯Ό νΈμΆν΄μΌλ§ νλ€. //κ·Έλ μ§ μμΌλ©΄ νλ‘νΌν° μ΄κΉκ°μ ν λΉν μ μκΈ° λλ¬Έμ μΈμ€ν΄μ€ μμ±μ΄ λΆκ°λ₯ νλ€. let position: Position = Position(name: "λκΈμ΄", currentPoint: point)
ν΄λμ€λ ꡬ쑰체μ λ€λ₯΄κ² Reference Typeμ΄λ―λ‘ μΈμ€ν΄μ€λ₯Ό letμΌλ‘ μ μΈνμ¬λ μλ³Έ κ°μ μ κ·ΌνκΈ° λλ¬Έμ varλ‘ μ μΈλ μ μ₯ νλ‘νΌν°κ° varμ νΉμ±μ μ μ§νλ€.
let position: Position = Position(name: "λκΈμ΄", currentPoint: point) position.point = MyPoint(x: 0, y: 0) position.name = "λ³κ²½ν λ" // error: cannot assign to property: 'name' is a 'let' constant
Lazy Stored Property(μ§μ° μ μ₯ νλ‘νΌν°)λ μ΄κΈ°ν μμ μ μ΄κΈ°κ°μ ν λΉνλ κ²μ΄ μλλΌ, ν΄λΉ νλ‘νΌν°κ° μ²μ μ¬μ© λλ μμ μΌλ‘ μ΄κΈ°νλ₯Ό 미루λ νλ‘νΌν°μ΄λ€.
νλ‘νΌν°λ₯Ό μ΄κΈ°ννλλ° λ§μ μ°μ° νΉμ λ©λͺ¨λ¦¬λ₯Ό νμλ‘ νκ±°λ, λ€νΈμν¬ μ μκ³Ό κ°μ΄ μκ°μ΄ μ€λ걸리λ μμ μ ν¬ν¨ν΄μΌ νλ€λ©΄ ν΄λΉ νλ‘νΌν°μ μ¬μ© μ¬λΆκ° λΆνμ€ν μν©μμ 무쑰건 ν¨κ» μ΄κΈ°ννλ κ²μ μ’μ§ μμ μ λ΅μ΄λ€.
λ³΄ν΅ λ³΅μ‘ν ν΄λμ€λ ꡬ쑰체λ₯Ό ꡬνν λ λ§μ΄ μ¬μ©λκ³€ νλ€.
struct MyPoint {
var x: Int = 0
var y: Int = 0
}
class Position {
lazy var point: MyPoint = MyPoint()
let name: String
init(name: String) {
self.name = name
}
}
//Positionμ΄λΌλ κ°μ²΄λ₯Ό μμ±λ¬μ§λ§ μμ§ MyPoint κ°μ²΄μ μμ±λμ§ μμ μν.
let position: Position = Position(name: "λκΈμ΄")
//μ΄ μ½λλ₯Ό ν΅ν΄ pointνλ‘νΌν°λ‘ μ²μ μ κ·Όν λ point νλ‘νΌν°μ CoordinatePointκ° μμ±λ©λλ€.
print(position.point)
μ΄λ¬ν νΉμ±μ μ΄μ©νμ¬ λΆνμν κ³΅κ° λλΉ μ μ±λ₯ μ νλ₯Ό ν΄κ²°ν μ μλ€.
νΉμ± μνμ λ°λ₯Έ κ°μ μ°μ°νλ νλ‘νΌν°. μΈμ€ν΄μ€μ λ΄/μΈλΆμ κ°μ μ°μ°νμ¬ μ μ ν κ°μ returnνλ getter
μ μν μ΄λ μλν(private)λ λ΄λΆμ νλ‘νΌν° κ°μ κ°μ μ μΌλ‘ μ€μ νλ setter
μ μν μ μνν μλ μλ€.
κ΅³μ΄ λ©μλκ° μλ μ°μ° νλ‘νΌν°λ₯Ό μ¬μ©νλ μ΄μ λ λ©μλλ‘ κ΅¬νμ getter μ stterμοΏ½ μν μ νλ λ©μλλ₯Ό λ°λ‘ λ°λ‘ ꡬνν΄μ£Όμ΄μΌ νκΈ° λλ¬Έμ΄λ€.
setterλ§ κ΅¬ννλ κ²μ λΆκ°νλ μ£Όμν κ²
-
λ©μλ μ¬μ©
struct MyPoint { var x: Int var y: Int // λμΉμ μ ꡬνλ λ©μλ - μ κ·Όμ(getter) func oppsitePoint() -> MyPoint { return MyPoint(x: -x, y: -y) } // setter mutating func setOppositePoint(_ opposite: MyPoint) { x = -opposite.x y = -opposite.y } } var position: MyPoint = MyPoint(x: 10, y: 20) // νμ¬ μ’ν 10, 15 print(position) // λμΉ μ’ν -10, -15 print(position.oppsitePoint()) // μ’νλ₯Ό (-15, -10)μΌλ‘ μ€μ ν λ position.setOppositePoint(MyPoint(x: 15, y: 10)) print(position) // -15, -10
-
μ°μ° νλ‘νΌν° μ¬μ©
struct MyPoint { var x: Int // μ μ₯ νλ‘νΌν° var y: Int // μ μ₯ νλ‘νΌν° // μ°μ° νλ‘νΌν° var oppsitionPoint: MyPoint { get { return MyPoint(x: x, y: y) } set (someParam) { x = -someParam.x y = -someParam.y } } } var position: MyPoint = MyPoint(x: 10, y: 20) print(position) // MyPoint(x: 10, y: 20) position.oppsitionPoint = MyPoint(x: 5, y: 10) print(position.oppsitionPoint) // MyPoint(x: -5, y: -10)
-
μ 리
-
ν΄λμ€, ꡬ쑰체, μ΄κ±°νμ μ¬μ©λλ€.
-
varλ‘ μ μΈν΄μΌνλ€.
-
ν΄λμ€, ꡬ쑰체, μ΄κ±°νμ κ°μ μ μ₯ν μ μ₯νλ‘νΌν°κ° νλ μμ΄μΌνλ€.==> μ°μ°νλ‘νΌν° μκΈ° μμ μ 리ν΄νκ±°λ κ°μ μ§μ ν μ μλ€.
-
get, setμ λμμ ꡬν κ°λ₯νλ©°, getλ§ κ΅¬ννλ κ²λ κ°λ₯(μ΄ λλ get ν€μλ μλ΅ κ°λ₯). νμ§λ§ setλ§ κ΅¬ννλ κ²μ μλλ€!
-
setμ νλΌλ―Έν°λ₯Ό μλ΅ν μ μμΌλ©°(μ½λμμ
someParam
) μλ΅νμ μ, newValueλΌλ ν€μλλ₯Ό μ¬μ©νλ€.
-
μ΅μ λ² νλ‘νΌν°λ₯Ό μ¬μ©νλ©΄ κ°μ΄ λ³κ²½λ¨μ λ°λΌ μ μ ν μ‘μ μ μ·¨ν μ μλ€. νλ‘νΌν°μ κ°μ΄ μλ‘ ν λΉλ λ λ§λ€, νΉμ λ³κ²½λλ κ°μ΄ νμ¬ κ°κ³Ό κ°λλΌλ νΈμΆλλ€.
μ€μ§ μ μ₯ νλ‘νΌν°μλ§ μ μ©ν μ μμΌλ©°, lazy νλ‘νΌν°μλ μ§μ ν μ μλ€.
-
μ 리
- willSet:
- νΈμΆ μκΈ°:
κ°μ΄ μ μ₯λκΈ° μ§μ μ νΈμΆ
- μ λ¬λλ μ λ¬ μΈμ:
νλ‘νΌν°κ° λ³κ²½λ κ°
- default 맀κ°λ³μ:
newValue
- νΈμΆ μκΈ°:
- didSet
- νΈμΆ μκΈ°:
μλ‘μ΄ κ°μ΄ μ μ₯λ μ§νμ νΈμΆ
- μ λ¬λλ μ λ¬ μΈμ:
νλ‘νΌν°κ° λ³κ²½λκΈ° μ μ κ°
- default 맀κ°λ³μ:
oldValue
- νΈμΆ μκΈ°:
- willSet:
-
μμ
class StepCounter { //totalStepsλ "μ μ₯ νλ‘νΌν°"μ λλ€!! var totalSteps: Int = 0 { // willSet μ λ¬λλ μ λ¬ μΈμ: "νλ‘νΌν°κ° λ³κ²½λ κ°" // newTotalSteps: 200 => 300 willSet(newTotalSteps) { print("totalStepsμ \(newTotalSteps)λ‘ μ€μ νλ €κ³ ν©λλ€") } // didSetμ μ λ¬λλ μ λ¬ μΈμ: "νλ‘νΌν°κ° λ³κ²½λκΈ° μ μ κ°" // oldTotalSteps: 0 => 200 didSet(oldTotalSteps) { if totalSteps > oldTotalSteps { print("\(totalSteps - oldTotalSteps)κ±Έμμ΄ μΆκ°λμμ΅λλ€.") } } } } let stepcounter = StepCounter() stepcounter.totalSteps = 200 stepcounter.totalSteps = 300 /** totalStepsμ 200λ‘ μ€μ νλ €κ³ ν©λλ€ 200κ±Έμμ΄ μΆκ°λμμ΅λλ€. totalStepsμ 300λ‘ μ€μ νλ €κ³ ν©λλ€ 100κ±Έμμ΄ μΆκ°λμμ΅λλ€. */
-
μ§μλ³μμ μ μλ³μ
νλ‘νΌν°λ₯Ό κ³μ°νκ³ κ΄μ°°νκΈ° μν΄μ μμμ μ€λͺ ν νλ‘νΌν° μ΅μ λ² κΈ°λ₯μ μ μλ³μμ μ§μλ³μμμλ μ¬μ©ν μ μλ€.- μ μλ³μ: ν¨μ, λ©μλ, ν΄λ‘μ λλ type context
μΈλΆ
μ μ μλλ λ³μ - μ§μλ³μ: ν¨μ, λ©μλ λλ closure context
λ΄μμ
μ μλλ λ³μ - μ μμμ(global constant)μ μ μλ³μ(global variable)μ νμ κ²μΌλ₯΄κ² μ°μ°λλ€. == μ¦, νμν λ μ΄κΈ°ν.
- μ μμμ(global constant)μ μ μλ³μ(global variable)μ μ°μ° νλ‘νΌν°μλ λ€λ₯΄κ² lazyν€μλκ° νμμλ€.
- μ§μμμ(local constant)μ μ§μλ³μ(local variable)μ κ²μΌλ₯΄κ² μ°μ°λμ§ μλλ€.
- μ μλ³μ: ν¨μ, λ©μλ, ν΄λ‘μ λλ type context
μ΄μ κΉμ§ μμλ³Έ νλ‘νΌν° κ°λ μ λͺ¨λ νμ μ μ μνκ³ κ·Έ νμ μ μΈμ€ν΄μ€κ° μμ±λμμλ μ¬μ©λ μ μλ μΈμ€ν΄μ€ νλ‘νΌν° μ΄λ€.
μΈμ€ν΄μ€ νλ‘νΌν°λ μΈμ€ν΄μ€λ₯Ό μλ‘ μμ±ν λ λ§λ€ μ΄κΉκ°μ ν΄λΉνλ κ°μ΄ νλ‘νΌν°μ κ°μ΄ λκ³ , κ° μΈμ€ν΄μ€λ§λ€ λ€λ₯Έ κ°μ μ§λ μ μκ² ν΄μ€λ€.
μ΄μ λ€λ₯΄κ², κ°κ°μ μΈμ€ν΄μ€κ° μλ νμ μ체μ μνκ² λλ νλ‘νΌν°λ₯Ό νμ νλ‘νΌν°λΌκ³ νλ€.
-
μ 리
-
νλ‘νΌν°λ₯Ό "νμ μ체"μ μ°κ²°ν μ μλλ°, κ·Έκ² νμ νλ‘νΌν°μ΄λ€.
-
νμ νλ‘νΌν°μλ, μ μ₯ νμ νλ‘νΌν°μ μ°μ° νμ νλ‘νΌν°κ° μλ€.
-
μ μ₯ νμ νλ‘νΌν°λ μμ/λ³μ μΌ μ μμΌλ©°((let / varλ‘ μ μΈμ΄ κ°λ₯), 무쑰건 κΈ°λ³Έκ°μ μ€μΌνλ€. κ·Έλ¦¬κ³ μ²μ μμΈμ€ ν λλ μ΄κΈ°νλ₯Ό κ²μΌλ₯΄κ²νλ€! νμ§λ§ lazyν€μλλ νμμλ€.
-
μ°μ° νμ νλ‘νΌν°λ 무쑰건 λ³μ(var)λ‘ μ μΈλμ΄μΌνλ€.
-
ν΄λμ€ νμ μ λν μ°μ° νμ νλ‘νΌν°(Computed type property)μ κ²½μ°, "class" ν€μλλ₯Ό μ¬μ©νμ¬ μλΈν΄λμ€κ° μνΌν΄λμ€μ ꡬνμ μ¬μ μ(override)ν μ μλ€.
-
-
μμ 1
class Aclass { // μ μ₯ νμ νλ‘νΌν° => 무쑰건 μ΄κΈ°νλ₯Ό ν΄μ£Όμ΄μΌ ν¨ static var typeProperty: Int = 0 // μ°μ° νμ νλ‘νΌν° => 무쑰건 varλ‘λ§ μ μΈλμ΄μΌ ν¨ static var typeComputedProperty: Int { get { return typeProperty } set { typeProperty = newValue } } } // μΈμ€ν΄μ€ μμ±μ΄ μμ΄λ μ κ·Ό κ°λ₯ Aclass.typeProperty = 123 print(Aclass.typeProperty) // 200 print(Aclass.typeComputedProperty) // 200
-
μμ 2
μΌλ° μ μ₯ νλ‘νΌν°λ ν΄λμ€/ꡬ쑰체μμλ§ λμ§λ§ μ μ₯ νμ νλ‘νΌν°λ μ΄κ±°νμμλ κ°λ₯
enum SomeEnumeration { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { return 6 } }
-
μμ 3
ν΄λμ€ νμ μ λν μ°μ° νμ νλ‘νΌν°(Computed type property)μ κ²½μ°, "class" ν€μλλ₯Ό μ¬μ©νμ¬ μλΈν΄λμ€κ° μνΌν΄λμ€μ ꡬνμ μ¬μ μ(override)ν μ μμ΅λλ€
class SomeClass { static var computedTypeProperty: Int { return 27 } // class ν€μλλ₯Ό μ¬μ©νμ¬ μλΈ ν΄λμ€μμμ μ¬μ μ νκ° class var overrideableComputedTypeProperty: Int { return 107 } } class ChildSomeClass : SomeClass{ override static var computedTypeProperty: Int { return 27 //error! cannot override static var } override static var overrideableComputedTypeProperty: Int{ return 2222 } }