계산 속성(Computed Properties)
- 계산 속성은 값을 정의하지 않고, 다른 저장 속성을 이용해 계산된 값을 제공하는 속성이다
- 저장 공간을 사용하지 않으며, 값을 요청할 때마다 계산을 수행한다
- 함수처럼 동작하지만, 속성처럼 사용되기 때문에 더 깔끔하게 표현할 수 있다
계산 속성이 필요한 이유
기존 방식의 문제점(계산 속성이 아닌 방식으로 구현)
class Car {
var model: String = "자동차"
var fuelEfficiency: Double = 15.0
var fuelAmount: Double = 40.0
func calculateDistance() -> Double {
return fuelEfficiency * fuelAmount
}
}
let myCar = Car()
myCar.fuelEfficiency = 18.0
myCar.fuelAmount = 45.0
print(myCar.calculateDistance())
문제점
- 주행 가능 거리를 확인하려면
calculateDistance() 메서드를 호출해야 한다
- 마치 속성처럼 사용하기 어렵고, 이해하기도 직관적이지 않다
- 읽고 쓰는 방식이 일관되지 않기 때문에 코드의 가독성이 떨어진다
계산 속성으로 구현(Read-only, 읽기 전용)
읽기 전용 계산 속성 - get 블록 사용
class Car1 {
var model: String = "자동차"
var fuelEfficiency: Double = 15.0
var fuelAmount: Double = 40.0
var possibleDistance: Double {
get {
return fuelEfficiency * fuelAmount
}
}
}
let myCar1 = Car1()
myCar1.fuelEfficiency = 18.0
myCar1.fuelAmount = 45.0
print(myCar1.possibleDistance)
possibleDistance 속성은 읽기 전용 계산 속성이다
get 블록은 값을 얻기 위해 계산된 결과를 반환한다
- 메서드 호출 방식이 아닌, 속성처럼 사용하는 방식으로 개선되었다
읽기 전용 계산속성(get 블록 생략 가능)
class Car3 {
var model: String = "자동차"
var fuelEfficiency: Double = 15.0
var fuelAmount: Double = 40.0
var possibleDistance: Double {
return fuelEfficiency * fuelAmount
}
}
let myCar3 = Car3()
myCar3.fuelEfficiency = 18.0
myCar3.fuelAmount = 45.0
print(myCar3.possibleDistance)
get 블록이 단순히 값을 반환하기만 하면 생략할 수 있다
- 더 간결하고 깔끔하게 표현할 수 있다
읽기 - 쓰기 가능한 계산 속성(get / set 모두 사용)
class Car2 {
var model: String = "자동차"
var fuelEfficiency: Double = 15.0
var fuelAmount: Double = 40.0
var possibleDistance: Double {
get {
return fuelEfficiency * fuelAmount
}
set(newDistance) {
fuelAmount = newDistance / fuelEfficiency
}
}
}
let myCar2 = Car2()
myCar2.fuelEfficiency = 18.0
myCar2.fuelAmount = 45.0
print(myCar2.possibleDistance)
myCar2.possibleDistance = 900
print(myCar2.fuelAmount)
get과 set 블록을 사용하여 읽기와 쓰기 모두 가능한 계산 속성으로 구현한다
set 블록은 newDistance라는 파라미터를 사용하여 값을 설정한다
- 값을 지정하는 것이 아닌, 저장 속성의 값을 변경하는 로직을 포함한다
newValue 사용(set의 파라미터 생략)
class Car4 {
var model: String = "자동차"
var fuelEfficiency: Double = 15.0
var fuelAmount: Double = 40.0
var possibleDistance: Double {
get {
return fuelEfficiency * fuelAmount
}
set {
fuelAmount = newValue / fuelEfficiency
}
}
}
let myCar4 = Car4()
myCar4.fuelEfficiency = 18.0
myCar4.fuelAmount = 45.0
print(myCar4.possibleDistance)
myCar4.possibleDistance = 900
print(myCar4.fuelAmount)
set 블록에서 파라미터 이름을 지정하지 않으면, 자동으로 newValue라는 이름을 사용한다
- 이 방식으로 더 간결하게 작성할 수 있다
계산 속성의 특징(주요 사항)
- 메모리에 값이 저장되지 않는다
var로만 선언 가능
- 값을 변경할 수 있기 때문에
let으로 선언할 수 없다
- 자료형을 반드시 선언해야 한다
- Swift의 컴파일러는 계산 속성의 자료형을 추론하지 않는다
get 블록은 필수, set 블록은 선택 사항이다
- 값을 읽어오는
get 블록은 반드시 존재해야 하고, 값을 설정하는 set 블록은 필요할 때만 구현한다
- 클래스, 구조체, 열거형에서 사용 가능
요약
- 계산 속성(Computed Properties): 값이 저장되지 않고 다른 저장 속성을 이용해 계산된 값을 제공
- 읽기 전용 속성:
get 블록만 구현하면 되며, get 블록은 생략 가능하다
- 읽기 - 쓰기 속성:
get과 set 블록 모두 구현하여 설정 가능하다
set 블록에서의 기본 파라미터 이름은 newValue이다