* 본 포스트는 공부하며 기록용으로 작성한 포스트이기 때문에 정확하지 않은 정보가 있을 수 있습니다. 내용에 대한 피드백 환영입니다!
: 클래스, 구조체, 또는 열거형 등과 값을 연결
먼저, 값을 저장하거나 저장된 값을 제공하는 역할을 기준으로 하면, 저장프로퍼티와 연산프로퍼티로 나눌 수 있다.
그리고 예외적으로 일부 프로퍼티는 클래스와 구조체 자체에 소속되어 값을 가지기도 하는데, 이를 타입 프로퍼티라고 한다. 이는 인스턴스를 생성하지 않아도 사용할 수 있다.
1. 저장 프로퍼티: 값을 저장하는 프로퍼티
2. 연산 프로퍼티: 값 저장 x, 특정 연산을 실행한 결과값
3. 타입 프로퍼티: 특정 타입에서 사용되는 프로퍼티(특정 인스턴스 x)
: 저장 프로퍼티는 그동안 익숙하게 사용해 왔던 것들이다.
var name
let number
등등.. 선언을 통해서 값을 저장해왔던 것들.
개인적으로 이것 부터는 어려웠다!!
먼저 연산 프로퍼티는 말 그대로, 연산
을 하는 것이다.
값을 저장하는 것 대신에 getter
/setter
를 통해 값에 직접적으로 접근을 할 수 있다.
시급을 알려주는 클래스를 예로 들어 보자.
class HourlyWage {
// 저장 프로퍼티
var monthlySalary: Double
var workingHours: Double
// 연산 프로퍼티
var hourlyWage: Double { ... }
init(monthlySalary: Double, workingHours: Double) {
self.monthlySalary = monthlySalary
self.workingHours = workingHours
}
}
위의 코드에서는 값을 담고 있는 저장 프로퍼티(name, workingHours, hourlyWage)와
연산 프로퍼티 hourlyWage가 선언되어 있다.(초기화도 해 주었다)
연산 프로퍼티 hourlyWage를 조금 더 살펴 보면..
var hourlyWage: Double {
get {
}
set {
}
}
연산 프로퍼티는 getter
와 setter
로 이루어져있고, getter
만을 사용해서 읽기 전용으로도 만들 수 있다.
먼저 get은 hourlyWage가 호출되면 실행
이 되는 곳이다.
get을 통해서 한 달의 시급을 계산한 결과값을 도출할 것이기 때문에, 월급/일한 시간을 리턴해준다.
var hourlyWage: Double {
get {
//월급/일한 시간을 리턴
return workingHours * hourlyWage
}
set {
...
}
}
그리고 set은 hourlyWage의 값이 바뀌면 실행
이 되는 곳이다.
시급이 바뀌면 월급도 바뀌기 때문에, montlySalary = newValue * workingHours로 바꾸어 준다.
var hourlyWage: Double {
get {
return montlySalary / workingHours
}
set {
montlySalary = newValue * workingHours
}
}
*newValue는 새로 들어온 값이다. 따로 설정해 주지 않으면 디폴트가 newValue이다.
전체 코드
class HourlyWage {
var monthlySalary: Double
var workingHours: Double
var hourlyWage: Double {
get {
return monthlySalary / workingHours
}
set {
monthlySalary = newValue * workingHours
}
}
init(monthlySalary: Double, workingHours: Double) {
self.monthlySalary = monthlySalary
self.workingHours = workingHours
}
}
→ 그럼 여기에서 하나의 인스턴스를 선언해주고, 시급을 계산해 보자!
var myHourlyWage = HourlyWage(monthlySalary: 400000, workingHours: 40)
myHourlyWage.hourlyWage
그리고 시급이 12000원으로 올랐다고 알려주고, 월급을 찍어 보면
myHourlyWage.hourlyWage = 12000
myHourlyWage.monthlySalary
→ 480,000원으로 월급도 갱신되어 있는 것을 알 수 있다!
요런식으로 사용할 수 있는 것이 바로 연산 프로퍼티
이다.
willSet
/didSet
: 이는 프로퍼티를 감독하는 것이라고 생각하면 되는데, 언제 값이 바뀔 것인지, 또는 바뀌었는지를 감지한다.
방금 사용한 코드에서 시급hourlyWage을 달리 주었을 때, 월급monthlySalary가 바뀌었기 때문에, 월급을 선언한 부분으로 가서, 수정을 해주자.
class MyHourlyWage {
var monthlySalary: Double {
willSet {
print("월급이 \(monthlySalary)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("월급이 \(oldValue)원에서 \(monthlySalary)원으로 변경되었습니다.")
}
}
var workingHours: Int
var hourlyWage: Int { ... }
...
}
[결과] 월급이 400000.0에서 480000.0으로 변경될 예정입니다.
월급이 400000.0에서 480000.0으로 변경되었습니다.
willSet, didSet을 해 주면 값이 바뀜에 따라 함수가 실행되는 것을 알 수 있다.
→ 이는 tableView에서 값이 저장/삭제될 때마다 **tableView.reloadData()**
를 해주어야 하는 번거로움을 줄일 수 있다.
: 인스턴스를 생성하지 않고, 값에 접근할 수 있다.
struct YourStruct {
static var storedTypePropeerty = "Your Value"
static var computedTypeProperty: Int {
return 1
}
}
YourStruct.storedTypeProperty
YourStruct.computedTypeProperty
YourStruct.storedTypeProperty = "change value"
YourStruct.storedTypeProperty
-> YourStruct.storedTypeProperty가 "chane value"로 바뀌어 있는 것을 볼 수 있다.
이렇게 새로운 인스턴스를 생성(var myStruct = YourStrct..)하지 않고도,
값에 직접 접근할 수 있는 것을 타입 프로퍼티
라고 한다.