안녕하세요 오늘은 속성 2번째 포스팅입니다. 바로 computed property인데요?
계산 속성은 평소 자주 사용하는 저장 속성과 많이 다릅니다. 그럼 바로 알아볼까요?

In addition to stored properties, classes, structures, and enumerations can define computed properties, which don’t actually store a value. Instead, they provide a getter and an optional setter to retrieve and set other properties and values indirectly.
계산 속성은 값을 저장하는 속성이 아닌 getter, setter를 통해 다른 속성에 의존하여 결과값을 반환하는 속성입니다. 사실 계산 속성은 메서드 묶음이라고 생각하시면 됩니다.
class ReportCard {
var language: Int
var math: Int
var english: Int
var average: Int {
get {
return (language + math + english) / 3
}
set {
language = newValue * 3 - math - english
}
}
init(language: Int, math: Int, english: Int) {
self.language = language
self.math = math
self.english = english
}
}
var robinReportCard = ReportCard(language: 60, math: 88, english: 90)
robinReportCard.average // get 블록 실행
robinReportCard.average = 76 // set 블록 실행
robinReportCard.language
성적표 클래스를 예시로 들어보겠습니다. 평균값을 계산 속성으로 구현했습니다. 평균값은 다른 국어, 수학, 영어 점수에 의존적이기 때문에 해당 값들이 하나라도 바뀐다면 평균값은 바뀌게되어 계산 속성을 사용하는게 적합합니다.
get 블록은 해당 속성 값에 접근할 때 실행됩니다. average 값에 접근할 때, 해당 인스턴스의 다른 속성 값들을 이용하여 값을 리턴합니다.
set 블록은 해당 속성에 값을 세팅할 때 실행됩니다. average값에 76로 저장할 때 해당 값을 기준으로 language 값을 변경합니다.
계산 속성은 속성이 아닌 실질적 메소드 묶음인 것을 알 수 있습니다. 그렇다면 메모리 상에서 어떻게 동작되는지 알아보겠습니다.
var average: Int {
get {
return (language + math + english) / 3
}
set{
language = newValue * 3 - math - english
}
}
var average: Int {
return (language + math + english) / 3
}
setter 블록은 생략가능하다고 말씀드렸죠! 이렇게 get 블록만 작성할 시 return으로만 작성할 수 있습니다. 이렇게 작성될 시, 해당 속성은 read-only 특징을 가집니다.
메모리는 코드, 데이터, 힙, 스택으로 이루어져 있습니다.
함수가 실행되는 원리는 데이터 영역에서 실행하려는 함수의 시작 주소를 얻고 코드 영역에서 얻은 시작 주소에 방문하여 코드를 차례대로 실행합니다.
계산 속성 또한 값에 접근하면 메서드가 실행되는 거와 같이 실행됩니다.
다만 클래스인지 구조체 인스턴지에 따라 차이점은 있습니다.