Apple/Swift

[iOS/Swift] 계산 속성(Computed Properties) 이란?

59date 2024. 8. 11. 00:09

계산 속성(Computed Properties)

계산 속성이란, 값을 저장하지 않고 다른 속성이나 로직을 기반으로 동적으로 계산되는 속성입니다. get 접근자를 통해 값을 계산하여 반환하며, set 접근자를 통해 새 값을 설정하고 그에 따라 속성을 수정할 수 있습니다. 

추가적으로 계산 속성은 내부적으로 값을 저장하지 않기 때문에, 별도의 메모리 공간을 차지하지 않습니다.

 

 

문법

계산 속성을 정의하는 일반적인 구조입니다.

var propertyName: PropertyType {
    get {
        // 값을 계산하여 반환
        return computedValue
    }
    set(newValue) {
        // newValue를 사용하여 속성의 값을 설정
        // 필요한 경우 다른 속성이나 변수에 값을 할당하거나 계산
    }
}

 

절대 상수(let)로는 선언할 수 없습니다. 선언할 수 없는 이유는 계산 속성이 동적으로 값을 계산하고 반환하기 위해 설계되어 있기 때문입니다. 

상수(let)로 선언할 수 없기에 변수(var)로 시작하고 get과 set 접근자를 통해 동작을 정의할 수 있습니다.

 

 

여기서 get과 set의 차이점은

get

  • 역할 : 속성의 값을 읽을 때 호출됩니다.
  • 동작 : 속성의 현재 값을 계산하거나 반환합니다. get 블록 안에서는 다른 속성이나 변수를 기반으로 동적으로 값을 생성할 수 있습니다.
  • 예시 : 사용자가 속성에 접근할 때, get 블록이 실행되어 해당 값을 반환합니다.

set

  • 역할 : 속성에 새로운 값을 할당할 때 호출됩니다.
  • 동작 : 사용자가 제공한 값을 사용하여 속성의 값을 설정하거나 내부 상태를 변경합니다.
  • 예시 : 사용자가 속성에 값을 할당하면, set 블록이 실행되어 그 값을 기반으로 다른 속성이나 변수를 조정할 수 있습니다.

요약하자면 

  • get : 값을 읽고 반환하는 역할.
  • set : 새로운 값을 설정하는 역할.

이렇게 정의할 수 있습니다.

 

 

둘의 차이점을 잘 파악할 수 있는 코드를 확인해 보겠습니다.

struct Rectangle {
    var width: Double
    var height: Double
    
    // 계산 속성: 면적 (area)
    var area: Double {
        get {
            // 면적을 계산하여 반환
            return width * height
        }
        set {
            // 새 면적 값을 사용하여 높이를 조정
            height = newValue / width
        }
    }
}

// 사각형 인스턴스 생성
var rect = Rectangle(width: 5.0, height: 10.0)

// 면적 출력
print("height: \(rect.height)") // height: 10.0
print("area: \(rect.area)") // area: 50.0

// 면적 변경
rect.area = 100.0

// 변경된 면적에 따라 높이 조정 후 면적 출력
print("New height: \(rect.height)") // New height: 20.0
print("Updated area: \(rect.area)") // Updated area: 100.0

 

height: 10.0

area: 50.0

New height: 20.0

Updated area: 100.0

위 코드의 출력값입니다. 왜 이러한 결과가 나오는 것인지 get과 set이 어떠한 차이를 가지고 있는지 알아보겠습니다.

 

get

처음 면적을 출력하는 print("area: \(rect.area)") // area: 50.0 구문에서

rect.area에 접근할 때, get 접근자가 호출됩니다.

 

get접근자는 계산 속성의 값을 읽을 때 호출됩니다. rect.area를 읽는 작업이므로 get접근자가 실행되는 것입니다.

현재 width와 height의 값을 사용하여 면적을 계산하게 됩니다.

여기서 width는 5.0, height는 10.0입니다. 따라서 계산된 면적 50.0이 출력됩니다.

 

set

set 접근자는 값이 변경되려고 할 때 호출이 됩니다.

그래서 값이 변경되는 구문 rect.area = 100.0에서 set이 호출되게 됩니다.

 

set 접근자가 호출되어 area를 100.0으로 설정하게 되면서 height를 100.0 / 5.0으로 업데이트하여 20.0으로 설정합니다.

 

get

print("Updated area: \(rect.area)") 이 구문을 통하여 다시 get을 호출합니다.

변경된 height를 사용하여 면적을 다시 출력합니다.

get 접근자가 호출되어 변경된 height와 기존 width를 사용하여 새로운 면적 100.0을 계산하고 출력하게 됩니다.

 

 

읽기 전용 계산 속성

읽기 전용 계산 속성은 값을 직접 저장하지 않고, 다른 속성이나 로직을 기반으로 동적으로 계산하여 제공하는 속성입니다. 이 속성은 오직 get 접근자만 가지고 있으며, set 접근자가 없어 값을 변경할 수 없습니다.

 

요약하자면

  • 값 저장 X
  • 오직 get 접근자
  • 동적 계산

이렇게 요약할 수 있습니다.

 

위 코드를 그대로 활용하여 읽기 전용 계산 속성을 만들어보자면

struct Rectangle {
    var width: Double
    var height: Double
    
    // 읽기 전용 계산 속성: 면적 (area)
    var area: Double {
        get {
            // 면적을 계산하여 반환
            return width * height
        }
    }
}

// 사각형 인스턴스 생성
var rect = Rectangle(width: 5.0, height: 10.0)

// 면적 출력
print("height: \(rect.height)") // height: 10.0
print("area: \(rect.area)") // area: 50.0

이렇게 만들 수 있습니다.

set 접근자와 계산 속성의 값을 변경하는 코드를 삭제하면 됩니다.

 

만약 set을 삭제한 상태에서 계산 속성의 값을 변경하는 시도를 한다면

Cannot assign to property: 'area' is a get-only property 라는 오류가 발생합니다.

 

해석하자면

“Cannot assign to property”: 해당 속성에 값을 할당하거나 변경할 수 없다는 의미입니다. 즉, 속성의 값을 직접적으로 수정할 수 없다는 것을 나타냅니다.

”‘area’ is a get-only property”: 'area' 속성은 오직 get 접근자만 제공되며, set 접근자가 없다는 뜻입니다. 이로 인해 이 속성은 읽기 전용 속성이며 값을 설정할 수 없습니다.

 


 

잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)