프로퍼티의 종류에 대해서 알아보겠다.
저장 프로퍼티
첫번째로 볼것은 저장 프로퍼티다.
let과 var를 사용하여
클래스 또는 구조체의 인스턴스와 연관된 값을
저장하는 가장 단순한 개념의 프로퍼티이다.
구조체에서는 저장 프로퍼티의 초깃값이 없고
옵셔널한 값이 아니어도
저장 프로퍼티를 모두 포함하는 이니셜라이저를 제공해준다.
하지만 클래스에서는 초깃값이 없고
옵셔널한 값도 아닌 저장 프로퍼티의 존재를 허용하지 않는다.
그리하여 옵셔널한 타입으로 지정해서 기본값을 nil로 설정해주던지
아니면 해당타입의 값으로 기본값 설정을 해주던지
사용자정의 이니셜라이저를 사용해서 초기화 시점에서 기본값을 설정해주던지 해야한다.
struct Music {
let artist: String
var like: Int
}
class Korean {
let name: String
let country: String = "KOREA"
var isCanSwim: Bool? // default는 nil로 설정
init (name: String) {
self.name = name
}
}
지연 저장 프로퍼티
추가적으로 저장 프로퍼티에는
지연 저장 프로퍼티라는게 있다.
lazy 키워드를 사용하여
필요할때 호출을 함으로써
값을 초기화 해주는 프로퍼티이다. (불필요한 성능 저하나 공간낭비를 줄일수 있다.)
여기서 상수(let)는 인스턴스가 완전히 생성되기 전에
초기화를 해야 하므로 지연을 사용할 수 없어
변수(var)를 사용해야한다.
class VC: UIViewController {
lazy var arr: [UIViewController] = [vc1, vc2]
let vc1 = MyVC1()
let vc2 = MyVC2()
}
연산 프로퍼티
두번째로는 연산 프로퍼티
말그대로 값을 저장하는게 아닌
특정 연산을 실행하는 프로퍼티이며
클래스, 구조체, 열거형에서 사용이 가능하다.
getter와 setter의역할로 나눌수 있으며
둘다 사용하던지 아니면 getter만 사용해서 읽기 전용으로 만들 수 있고
setter만 사용할수는 없다.
setter를 사용할때는
매개변수로 원하는 이름을 소괄호 안에
명시해줌으로써 set 메서드 안에서 전달받은 전달인자를 사용할 수 있다.(생략가능 - newValue로 대체됨)
class Person {
var currentAge : Int?
var tenYearsLaterAge : Int?
var age: Int {
get {
return currentAge // age의 값을 읽을때 currentAge의 값을 반환한다.
}
set(newValue) {
tenYearsLaterAge = newValue + 10 // age 값이 설정 되면 받은 값을 base로 tenYearsLaterAge의 값이 설정 된다.
}
}
init(age: Int) {
self.age = age
}
}
타입 프로퍼티
타입 프로퍼티는
특정 타입의 인스턴스에 사용되는것이 아닌
타입 자체에 속하게 되어
인스턴스를 생성하지 않고도
타입에서 바로 사용이 가능한 프로퍼티이다.
class SomeClass {
static let someTypeProerty1: Int = 0
static var someTypeProerty2: String = "vlaue"
}
print(SomeClass.someTypeProerty1) // 0
SomeClass.someTypeProerty2 = "changeValue"
print(SomeClass.someTypeProerty2) // "changeValue"
옵저버 프로퍼티
추가적으로 프로퍼티의 값이 변하는 것을
감지할 수 있는 옵저버 프로퍼티도 있다.
프로퍼티의 값이 변할 때 특정 작업을 실행하게 만들 수 있는 프로퍼티인데
이 옵저버 프로퍼티에는
값이 변경되기 직전에 호출되는 willSet 메서드
값이 변경된 직후에 호출되는 didSet 메서드 가있다.
그리고 매개변수가 하나씩 있는데
willSet에 전달되는 매개변수의 전달인자는 프로퍼티가 변경될 값이고 (newValue)
didSet에 전달되는 매개변수의 전달인자는 프로퍼티가 변경되기 전의 값이다. (oldValue)
class VC: UIViewController {
var myMoney: Int = 0 {
willSet {
print("\(newValue)로 변경될 예정입니다.")
}
didSet {
print("\(oldValue)가 변경되었습니다.")
}
}
}
'Swift_Grammar' 카테고리의 다른 글
[Swift_Grammar] Initialization (0) | 2021.01.12 |
---|---|
[Swift_Grammar] Method (0) | 2021.01.06 |
[Swift_Grammar] 구조체와 클래스 (0) | 2020.12.30 |
[Swift_Grammar] Optional (0) | 2020.12.28 |
[Swift_Grammar] 함수 (0) | 2020.12.27 |