Notice
Recent Posts
Recent Comments
Link
大器晩成
계산/연산 속성(Computed property) 본문
계산/연산 속성(프로퍼티)
- 연산 프로퍼티(Computed property)는 필요한 값을 제공한다는 점에서 저장 프로퍼티와 같지만, 실제 값을 저장했다가 반환하지는 않고 대신 다른 프로퍼티의 값을 연산 처리하여 간접적으로 값을 제공합니다.
- 프로퍼티의 값을 참조하기 위해 내부적으로 사용하는 구문이 get 구문입니다.
- 함수와 비슷해서 내부적으로 return 키워드를 사용하여 값을 반환하는데, 여기서 반환되는 값이 프로퍼티가 제공하는 값이 됩니다.
- 변수만 사용해서 정의 가능합니다. (값이 변경되는 속성이기 때문에, let은 불가능합니다.
- 연산 프로퍼티는 선택적으로 set 구문을 추가할 수도 있습니다.
- 선택적이라는 조건이 붙은 만큼 set 구문은 필요에 따라 연산 프로퍼티에서 생략할 수 있습니다. set 구문이 생략되면 외부에서 연산 프로퍼티에 값을 할당할 수 없으며, 내부적인 연산 처리를 통해 값을 제공받는 읽기 전용의 프로퍼티입니다. 하지만 get 구문은 연산 프로퍼티에서 필수 요소입니다.
- 연산 프로퍼티는 항상 클래스나 구조체, 또는 열거형 내부에서만 사용 가능합니다.
연산프로퍼티 생성
class/struct/enum 객체명 {
var 프로퍼티명 : 타입 {
get {
필요한 연산 과정
return 반환값
}
set(매개변수명) {
필요한 연산구문
}
}
연산프로퍼티 활용 예시
// 계산 속성이 아닌 방식으로 구현
class bmi {
var name: String = "사람"
var height: Double = 175.0
var weight: Double = 70.0
func calculateBMI() -> Double {
let bmi = weight / (height * height) * 10000
return bmi
}
}
let p = bmi()
p.calculateBMI() // 22.85714285714286
// 계산 속성으로 바꾸어서 구현하기
class bmi2 {
var name: String = "사람"
var height: Double = 175.0
var weight: Double = 70.0
var bmi: Double {
get {
let result = weight / (height * height) * 10000
return result
}
}
}
let q = bmi2()
q.bmi // 22.85714285714286
// 연산 프로퍼티 사용 예시 : 나이 게산
struct UserInfo {
//저장 프로퍼티: 태어난 연도
var birth: Int!
//연산 프로퍼티: 올해가 몇넌도인지 계산
var thisYear: Int! {
get {
let df = DateFormatter()
df.dateFormat = "yyyy"
return Int(df.string(from: Date()))
}
}
//연산 프로퍼티 : 올해 - 태어난 연도 + 1
var age: Int {
get {
return (self.thisYear - self.birth) + 1
}
}
}
let info = UserInfo(birth: 1995)
print(info.age)
읽기/ 쓰기가 모두 가능한 계산속성
class bmi {
var name: String = "사람"
var height: Double = 175.0
var weight: Double = 70.0
var bmi: Double {
get { //getter ==> 값을 얻는다는 의미
let result = weight / (height * height) * 10000
return result
}
set(bmi) { //setter ==> 값을 세팅한다는 의미
weight = bmi * height * height / 10000
}
}
// 만약에 쓰기 계산속성(set)을 메서드로 구현했다면
func setWeightWithBMI(bmi: Double) {
weight = bmi * height * height / 10000
}
}
let q = bmi()
q.bmi // 22.85
q.weight // 70
q.bmi = 19.0
q.weight // 58.18
q.setWeightWithBMI(bmi: 18.0)
q.weight // 55.12
- q.bmi 는 값을 얻는 get의 과정입니다.
- q.bmi = 19.0은 값을 설정하는 set의 과정입니다.
읽기만 가능한 계산속성(Read-Only)은 get 블록을 생략 가능
class bmi {
var name: String = "사람"
var height: Double = 175.0
var weight: Double = 70.0
var bmi: Double {
get { //getter ==> 값을 얻는다는 의미
let result = weight / (height * height) * 10000
return result
}
}
var bmi2: Double { //get 블록 생략 가능
let result = weight / (height * height) * 10000
return result
}
}
- set 구문이 정의되어 있지 않으면 프로퍼티를 통해 값을 읽기만 할 뿐 할당은 할 수 없습니다.
- 읽기만 가능하고 쓰기는 불가능한 프로퍼티를 read-only 프로퍼티 또는 get-only 프로퍼티라고 하고 우리말로 읽기 전용 프로퍼티라고 합니다..
set 블록의 파라미터를 생략하고 'newValue' 대체가능
class bmi {
var name: String = "사람"
var height: Double = 175.0
var weight: Double = 70.0
var bmi: Double {
get { //getter ==> 값을 얻는다는 의미
let result = weight / (height * height) * 10000
return result
}
set {
weight = newValue * height * height / 10000
}
}
}
계산속성 정리
- 관련이 있는 두 가지 메서드(함수)를 한 번에 구현할 수 있습니다.(get/set)
- 실제로, 계산 속성은 겉모습은 속성(변수) 형태를 가진 메서드(함수)입니다.
- 계산 속성은 실제 메모리 공간을 가지지 않고, 해당 속성에 접근했을 때 다른 속성에 접근해서 계산한 후 그 계산 결과를 리턴하거나 세팅하는 메서드입니다.
- 항상 변하는 값이므로, var로 선언해야 함(let으로 선언불가)
- 자료형 선언을 해야 합니다.(타입 추론 불가)
- 메서드이기 때문에, 파라미터, 리턴형이 필요합니다
- get은 반드시 선언해야 하며, get 블록만 선언하면 읽기 전용(Read-Only) 계산 속성이 됨 (필수 구현)
- set블록은 선택적으로 구현할 수 있습니다(set만 구현하는 것은 불가능)
- set 블록에서 기본 파라미터 newValue가 제공됩니다.(직접 파라미터 이름 설정도 가능)
728x90
'iOS > Swift 문법' 카테고리의 다른 글
속성감시자(프로퍼티 옵저버, Property Observer) (0) | 2024.11.25 |
---|---|
타입속성 (Type Properties) (0) | 2024.11.22 |
지연 저장 속성 (Lazy Stored Properties) (0) | 2024.11.21 |
저장속성(Stored Properties) (0) | 2024.11.21 |
초기화(initializer) (0) | 2024.11.21 |