[Swift] Computed Property (계산 속성)

어흥·2024년 5월 12일

Swift

목록 보기
11/28

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

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를 통해 다른 속성에 의존하여 결과값을 반환하는 속성입니다. 사실 계산 속성은 메서드 묶음이라고 생각하시면 됩니다.

특징

  • 인스턴스에 메모리 공간이 할당되지 않습니다. -> 메서드이기 때문에
  • var로만 선언 가능합니다. (let ❌)
  • type inference가 불가능하며 자료형을 꼭 명시해야합니다.
  • get블록(필수), set블록(선택 가능) 으로 구성됩니다.
  • get 블록만 선언하면 read-only 게산 속성이 됩니다.
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 값을 변경합니다.

계산 속성은 속성이 아닌 실질적 메소드 묶음인 것을 알 수 있습니다. 그렇다면 메모리 상에서 어떻게 동작되는지 알아보겠습니다.

문법 축약

  • setter 블록은 기본 parameter로 newValue를 제공합니다.( parameter를 생략 가능)
var average: Int {
        get {
            return (language + math + english) / 3
        }  
        set{
            language = newValue * 3 - math - english
        }
    }
  • getter 블록 생략하고 return으로 대체 가능합니다.
var average: Int {
        return (language + math + english) / 3
    }

setter 블록은 생략가능하다고 말씀드렸죠! 이렇게 get 블록만 작성할 시 return으로만 작성할 수 있습니다. 이렇게 작성될 시, 해당 속성은 read-only 특징을 가집니다.

메모리 동작

메모리는 코드, 데이터, 힙, 스택으로 이루어져 있습니다.
함수가 실행되는 원리는 데이터 영역에서 실행하려는 함수의 시작 주소를 얻고 코드 영역에서 얻은 시작 주소에 방문하여 코드를 차례대로 실행합니다.

계산 속성 또한 값에 접근하면 메서드가 실행되는 거와 같이 실행됩니다.
다만 클래스인지 구조체 인스턴지에 따라 차이점은 있습니다.

클래스 인스턴스

  1. 스택 영역에서 클래스 인스턴스 값을 저장하는 힙의 주소를 알아냅니다.
  2. 힙 영역에서 인스턴스에 접근합니다.
  3. 인스턴스에서 클래스가 선언된 주소를 참조해 데이터 영역에 방문합니다.
  4. 데이터 영역에 get, set 메소드의 시작 주소를 알아냅니다.
  5. 코드 영역에서 해당 함수의 코드를 차례대로 실행합니다.

구조체 인스턴스

  1. 스택 영역에서 구조체 인스턴스에 접근합니다.
  2. 인스턴스에서 구조체가 선언된 주소를 참조해 데이터 영역에 방문합니다.
  3. 데이터 영역에 get, set 메소드의 시작 주소를 알아냅니다.
  4. 코드 영역에서 해당 함수의 코드를 차례대로 실행합니다.

0개의 댓글