조앤의 기술블로그

[Swift] Property(프로퍼티) #2 본문

Study/Swift

[Swift] Property(프로퍼티) #2

쬬앤 2020. 2. 20. 17:02

속성 감시자(Property Observer), 형식 속성(Type Property)에 대해서 알아보겠습니다. 

 

<Property Observer>

속성의 값이 저장되기 전, 후에 호출되어 값이 변경되는지를 감시하는 속성 감시자입니다. 

var name: Type = DefaultValue {
	willSet(name) {
    	statements
        //newValue
    }
    didSet(name) {
    	statements
        //oldValue
    }
}

변수 저장 속성에 속성 감시자를 만들 수 있습니다. (상수는 값을 변경할 수 없으니 감시자의 의미가 없습니다. )

지연 저장 속성, 계산 속성에도 속성 감시자를 만들 수 없으나 예외는 존재합니다. 

(Subclass에서 계산속성을 오버라이딩하고 속성감시자 구현은 가능합니다. )

class Size {
	var width = 0.0 {
    	willSet {
        	print(width, "=>", newValue)
        }
        didSet {
        	print(oldValue, "=>", width)
        }
	}
}

willSet 블록은 속성에 값이 저장되기 직전에 호출되고 newValue로 값을 호출할 수 있습니다. 

didSet 블록은 값이 저장된 직후에 호출되고 oldValue로 값을 호출할 수 있습니다. 

let s = Size()
s.width = 123

// 0.0 => 123.0
// 0.0 => 123.0

 

<Type Property>

형식 속성은 모든 인스턴스가 공유하는 하나의 공간만 생성되는 속성입니다.

즉, 저장 속성이나 계산 속성처럼 모든 인스턴스가 개별 값을 가지는게 아니고, 공통적으로 하나의 값을 가집니다. 

 

클래스, 구조체, 열거형에서 사용 가능합니다. 

 

[Static Type Property]

// Variable Stored Type Property
static var name: Type = DefaultValue

//Constant Stored Type Property
static let name: Type = DefaultValue

TypeName.propertyName

선언할 때 항상 초기화를 해주어야 합니다. 

형식 속성에 접근할 때에는 인스턴스 이름이 아니라 형식 이름으로 접근해야 합니다. 

class Math {
	static let pi = 3.14
}

let m = Math()
Math.pi

m.pi가 아니라 Math.pi로 형식 이름으로 접근하고 있습니다. 

모든 인스턴스가 개별 값을 가지는게 아니라 공통적으로 하나의 값으로만 가집니다. 

 

 

 

[Computed Type Property]

static var name: Type {
	get {
    	statements
        return expr
    }
    set(name) {
    	statements
    }
}

class var name: Type {
	get {
    	statements
        return expr
    }
    set(name) {
    	statements
    }
}

static 키워드를 가진 계산 형식 속성은 오버라이딩을 할 수 없고,

class 키워드를 가진 계산 형식 속성은 클래스에서 제한적으로 사용되고, 오버라이딩을 할 수 있습니다. 

 

enum Weekday: Int {
	case sunday = 1, monday, tuesday, 
    	wednesday, thursday, friday, saturday
    
    static var today: Weekday {
    	let cal = Calendat.current
        let today = Date()
        let weekday = cal.component(.weekday, from: today)
        
        return Weekday(rawValue: weekday)!
    }
}
Weekday.today

어떤 인스턴스를 생성하더라도 Weekday.today에 접근하면 공통적으로 하나의 값이 나오겠죠. 

그리고 today는 기본 속성에서 얻어낸 값이므로 계산 속성입니다.

 

 

 

 

참고, 코드 인용 - KxCoding.com - Hello, Swift 강의 

'Study > Swift' 카테고리의 다른 글

[Swift] Inheritance and Polymorphism(상속과 다형성)  (0) 2020.02.24
[Swift] Method and Subscript  (0) 2020.02.21
[Swift] Property(프로퍼티) #1  (0) 2020.02.20
Tuples (튜플)  (0) 2020.02.18
[Swift] Functions #2  (0) 2020.02.18