ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Computed Property
    Programming/Swift 2021. 10. 25. 14:59

     

    안녕하세요 Beepeach입니다 :)

    오늘 공부해볼 주제는 Computed Property(연산 프로퍼티)입니다.

     

    Computed property는 class, struct, enum에서 사용할 수 있습니다.

    그리고 실제로 값을 저장하지 않습니다.

    그 대신에 다른 값들을 이용하고 계산하여 프로퍼티 값을 반환하거나 간접적으로 설정할 수 있습니다.

     

     


    왜 사용할까??

     

    다른 값을 이용하여 적절한 값을 반환해주고 간접적으로 프로퍼티의 값을 설정한다...

    생각해보면 메서드로도 가능한 작업입니다.

    그럼 왜 computed property를 사용하는 걸까요??

     

    메서드로 이 작업을 하려면 값을 반환해주는 메서드 1개, 값을 설정해주는 메서드 1개 이렇게 2개의 메서드가 필요합니다.

    하지만 computed property를 이용하면 이 작업을 하나의 프로퍼티로 나타낼 수 있으며 가독성도 좋아집니다.

     

    물론 단점도 존재하는데요.

    메서드로 만든다면 값을 설정하는 메서드만 따로 만들 수 있지만 computed property는 값을 설정하는 프로퍼티만을 만들 수 없습니다.

    값을 설정하는 프로퍼티를 만들려면 꼭 값을 반환해주는 프로퍼티도 같이 선언해줘야 합니다.

    값을 반환하는 프로퍼티만을 만드는 것은 가능합니다.

     

     


    Syntax

     

    Computed Property의 문법을 먼저 보겠습니다.

     

     

    Computed Property는 let으로 선언할 수 없습니다.

    그리고 잘 보면 = 할당 연산자가 없습니다. 

    Type을 적고 바로 {}가 옵니다. 이 부분이 stored property와의 차이입니다.

     

    {} 안에서는 getter와 setter가 오게 됩니다.

    getter는 읽기 setter는 쓰기라고 생각하면 쉽습니다.

     

    get {} 에는 return 키워드를 사용하여 원하는 반환 값을 리턴해주면 됩니다.

    set {} 에는 새로 들어온 값이 parameterName으로 전달되어 사용됩니다. 이 파라미터를 이용하여 프로퍼티 값을 새로 설정할 수 있습니다.

     

    그럼 computed property를 사용하지 않고 method를 사용한 예시부터 보도록 하겠습니다.

    (아직 메서드에 대해서는 자세히 다루지 않았습니다. 다음 포스팅에서 자세히 다루도록 하겠습니다. 지금은 그냥 함수라고 생각해주세요.)

     

     

    iOS에서 주로 사용하는 CGRect와 비슷하게 구현해보았습니다.

    위치를 나타내는 Point 구조체, 크기를 나타내는 Size 구조체를 선언했습니다.

    그리고 이를 이용하여 사각형 Rect 구조체를 정의했습니다.

     

    사각형의 중심점 center는 원점과 크기를 알고 있다면 자연스럽게 알 수 있는 값입니다.

    그럼 이 값을 굳이 메모리에 저장시킬 필요가 있을까요??

    이미 저장되어 있는 두 프로퍼티 값을 이용하여 계산만 하면 됩니다.

    그렇기 때문에 저장 프로퍼티로 만들지 않고 메서드로 구현을 했습니다.

     

    center값을 읽을 수 있는 center() 메서드와 새로운 center값을 지정해주면 당연히 원점의 위치도 변해야겟죠??

    그래서 새로운 center를 지정하는 setCenter(_:)라는 메서드를 선언했습니다.

     

     

    (0, 0)을 원점으로 하고 가로 세로 길이가 10인 사각형을 만들었습니다.

    center를 알고 싶어서 center() 메서드를 호출하여 값을 얻으니 (5, 5)인것을 확인할 수 있습니다.

     

    이번에는 center를 setCenter(_:) 메서드를 이용하여 (15, 15)으로 설정했습니다.

    그럼 원점은 (10, 10)이 되겠죠??

    확인해보니 우리가 원하는 대로 구현된 것을 확인할 수 있습니다.

     

     


    Computed Property

     

     

    위와 같이 구현해도 안 되는 건 아닙니다.

    하지만 이 부분을 center라는 computed property로 만들면 조금 더 직관적이게 됩니다.

     

     

    어떤가요??

    center가 프로퍼티로 되어있으니 조금 더 보기가 좋습니다.

     

     

    값을 읽고 쓸 때도 훨씬 더 간결해졌습니다.

    Line 5에서 center에 새로운 값을 할당하고 있죠??

    그럼 새로운 값인 Point(x: 15.0, y: 15.0)가 setter에 newCenter에 전달이 됩니다.

    이 값을 이용하여 origin의 값을 변경하게 됩니다.

     

     


    단축 문법

     

    Swift는 단축을 좋아합니다.

    그래서 computed property에도 단축 문법이 존재합니다.

     

    1. getter에서 단일 리턴문이라면 retrun 키워드를 생략 가능합니다.

    2. setter에서 paramaterName을 따로 설정하지 않으면 newValue라는 이름으로 제공됩니다.

     

     

    두 가지 단축 문법을 모두 적용시켰습니다.

    get에 return 키워드가 사라졌고 set뒤에 parameterName이 없고 {} 안에서 newValue라는 값으로 대체되었습니다.

     

     


    Read - Only Computed Property

     

    처음에 설명했듯이 computed property의 단점은 쓰기 전용 즉 setter만 설정할 수 없습니다.

    setter를 사용하려면 getter도 꼭 같이 사용해야 합니다.

     

    하지만 읽기 전용 getter만 설정하는 건 가능합니다.

    위에 Rect에서 set을 삭제해보겠습니다.

     

    이렇게 선언하면 읽기 전용 연산 프로퍼티가 됩니다.

    읽기 전용 연산 프로퍼티는 get을 생략할 수 있습니다.

     

     

     


    Global and Local Scope에서 사용하기

     

    Computed Property는 class, struct, enum 뿐만 아니라 Global 스코프나 Local 스코프에서 사용이 가능합니다.

     

     

    위와 같이 Global 스코프에서도 작성되는것을 확인할 수 있습니다.

    Local 스코프에서 사용되는 예도 한 번 보겠습니다.

     

     

    Local 스코프는 func, method, closure등을 의미합니다. (스코프의 개념을 잘 모르신다면 이 포스팅을 참고해주세요.)

     

     

     


     

    참고자료

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

    https://docs.swift.org/swift-book/LanguageGuide/Properties.html

     

    Properties — The Swift Programming Language (Swift 5.6)

    Properties Properties associate values with a particular class, structure, or enumeration. Stored properties store constant and variable values as part of an instance, whereas computed properties calculate (rather than store) a value. Computed properties a

    docs.swift.org

     

     

     

    728x90

    'Programming > Swift' 카테고리의 다른 글

    Swift - Type Property  (0) 2021.10.27
    Swift - Property Observer  (0) 2021.10.26
    Swift - Stored Property  (0) 2021.10.24
    Swift - Value type vs Reference type  (0) 2021.10.23
    Swift - Struct & Class  (0) 2021.10.20
Designed by Tistory.