본문 바로가기
YAGOM CAREER STARTER

[TIL] 20221230: Computed Property, Static

by Rhode 2022. 12. 31.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


연산 프로퍼티 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를 제공한다.

연산 프로퍼티는 실제 값을 저장하는 프로퍼티가 아닌, 특정 상태에 따른 값을 연산하는 프로퍼티이다. 인스턴스 내/외부의 값을 연산하여 적절한 값을 돌려주는 접근자(getter)의 역할이나 은닉화된 내부의 프로퍼티 값을 간접적으로 설정하는 설정자(setter)의 역할을 할 수도 있다. 클래스, 구조체, 열거형에 연산 프로퍼티를 정의할 수 있다.
(읽기 전용 연산 프로퍼티를 포함한) 연산 프로퍼티는 항상 var 키워드를 가진 변수 프로퍼티로 정의되어야한다. 왜냐하면 그 값이 정해진 것이 아니기 때문이다. let 키워드는 한 번 인스턴스 초기화로 설정이 되면 값이 바뀌지 않는 상수 프로퍼티에만 사용된다.

메서드와의 비교

연산 프로퍼티 > 메서드

  • 인스턴스 외부에서 메서드를 통해 인스턴스 내부의 값에 접근하려면 메서드를 두 개(접근자, 설정자) 구현해야 한다.
  • 메서드를 두 개 구현하는 것을 감수하고 구현한다고 해도 두 메서드가 분산구현 되어 코드의 가독성이 나빠질 위험이 있다.
  • 타인의 코드를 보는 프로그래머의 입장에서는 프로퍼티가 메서드 형식보다 훨씬 간편하고 직관적이다.

메서드 > 연산 프로퍼티

  • 메서드로는 설정자 메서드만 구현하여 쓰기 전용 상태로 구현할 수 있지만, 연산 프로퍼티는 쓰기 전용 상태로 구현할 수 없다.

연산 프로퍼티의 작성 및 사용법

연산 프로퍼티는 다음과 같은 방법으로 사용할 수 있다.

class Rhode {
    var university: String = "Ewha"
    
    //값을 저장하는 것이 아니므로, 타입 추론 불가. 따라서 타입 명시 필수!
    var universityIntroduce: String {
        //접근자(getter): 다른 프로퍼티의 값을 연산하여 반환(return문 필수)
        get {
            return "get에 접근: I graduated \(university)!"
        }
        //설정자(setter): 다른 저장 프로퍼티에 값을 저장
        set(university) {
            self.university = "set에 접근: I graduated \(university)!"
        }
    }
}

위의 코드에서 university는 저장 프로퍼티이다. 연산 프로퍼티를 사용하기 위해서는 읽거나 쓸 수 있는 저장 프로퍼티가 먼저 존재해야하고, 연산 프로퍼티에서는 그 저장 프로퍼티의 값을 읽거나 쓰는 작업을 해야한다.

연산 프로퍼티는 일반적으로 사용하는 저장 프로퍼티처럼 사용할 수 있다.

let rhode: Rhode  = .init()

print(rhode.universityIntroduce)  //get에 접근: I graduated Ewha!

rhode.universityIntroduce = "Yonsei"
print(rhode.university)  //set에 접근: I graduated Yonsei!

연산 프로퍼티인 universityIntroduce에 접근하면, universityIntroduce의 getter가 실행되어 "get에 접근: I graduated Ewha!"가 출력된다. 그리고 university에 접근하면, universityIntroduce의 setter가 실행되어 "set에 접근: I graduated Yonsei!"가 출력된다.

읽기 전용 연산 프로퍼티 Read-Only Computed Property

getter는 있지만 setter는 없는 연산 프로퍼티를 읽기 전용 연산 프로퍼티라고 부른다. 읽기 전용 연산 프로퍼티는 항상 값을 반환하고, dot 문법을 통해서 접근될 수 있다. 하지만 다른 값으로 설정될 수는 없다. get 키워드와 중괄호를 없애는 방식으로 간단하게 읽기 전용 연산 프로퍼티를 정의할 수 있다.

class Rhode {
    var university: String = "Ewha"
    
    //값을 저장하는 것이 아니므로, 타입 추론 불가. 따라서 타입 명시 필수!
    var universityIntroduce: String {
        //접근자(getter): 다른 프로퍼티의 값을 연산하여 반환(return문 필수)
        return "get에 접근: I graduated \(university)!"
    }
}


Static

우리는 코드에서 static 키워드를 사용했다.

enum Menu {
    case end
    case rock
    case scissors
    case paper
    
    static func get(_ number: Int, type: Rule) -> Menu? {
        if type == .rockPaperScissors {
            switch number {
            case 0:
                return .end
            case 1:
                return .scissors
            case 2:
                return .rock
            case 3:
                return .paper
            default:
                return nil
            }
        } else {
        ...

여기

enum WinnerResult {
    static let user = "사용자"
    static let computer = "컴퓨터"
    static let noWinner = "무승부"
}

저기
static이 의미하는 것은 무엇일까?

타입 Type

static은 타입을 의미한다. func 앞에 붙으면 타입 메서드가 되고, let이나 var 앞에 붙으면 타입 프로퍼티가 된다. static말고 class를 통해서도 타입을 의미해줄 수 있다. static이 앞에 붙으면 인스턴스 메서드/프로퍼티가 아니기 때문에 인스턴스를 생성할 필요가 없이 내가 속해있는 타입만 알아도 호출하거나 접근할 수 있는 것이다.
<공부 더 필요..>



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

Properties — The Swift Programming Language (Swift 5.7)

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

https://babbab2.tistory.com/119

Swift) 프로퍼티 정복하기 (2/4) - 연산 프로퍼티(Computed Property)

안녕하세요!! 소들입니다 :) 저번 포스팅에서 프로퍼티의 종류엔 3가지가 있고, 그중 저장 프로퍼티에 대해 공부 했어요!!! 모른다면 이 포스팅 참조 이번에 공부할 내용은 연산 프로퍼티라는 것

babbab2.tistory.com

https://seolhee2750.tistory.com/119

[Swift] 프로퍼티 개념 정리 (2); 연산 프로퍼티

저번 저장 프로퍼티 포스팅에 이어서 오늘은 연산 프로퍼티에 대해 정리하려고 한다,, 저장 프로퍼티는 변수, 상수에 대한 개념으로 그나마 쉬운? 편이었는데 연산 프로퍼티는 비교적 어려웠당.

seolhee2750.tistory.com

https://babbab2.tistory.com/122

Swift) static? class? 메서드 완벽 정복하기

안녕하세요 :))) 소들입니다!!!! 저번 포스팅에서 프로퍼티의 종류와 특징에 대해 다 공부 해봤어요! 프로퍼티 종류엔 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티에 대해 알아봤져!? 프로퍼티

babbab2.tistory.com

http://www.yes24.com/Product/Goods/78907450

스위프트 프로그래밍  - YES24

문법을 넘어 프로그래밍 패러다임도 익히는 스위프트 5스위프트 5의 핵심 키워드는 ‘안정화’다. ABI 안정화 덕분에 버전과 환경에 크게 영향받지 않고 더 유연하게 스위프트를 사용할 수 있게

www.yes24.com