본문 바로가기

프로그래밍/Swift

저장 속성(Stored Properties), 계산 속성(Computed Properties)

Swift에서 속성을 선언하는 방법은 크게 저장과 계산 속성으로 구분 지을 수 있다. 

 

가장 쉽고 간단하게 선언할 수 있는 저장 속성(Stored Properties)은 변수나 상수에 값을 저장할 때 사용한다. 다른 언어에서 제공하는 기본적인 속성과 크게 다르지 않아 가장 익숙한 속성이다. Swift에서 저장 속성을 선언하는 방법은 다음과 같다. 

  • var [변수 이름]: 자료형
    ex) var storedNum1: Int
  • let [상수 이름]: 자료형
    ex) var storedNum2: Int

변수는 말 그대로 변하는 값을 저장하기 위한 속성이고, 상수는 변하지 않는 값을 저장하기 위한 속성이다. 이 둘은 서로 구분해서 사용하는 것을 권고하는데 이유는 다음과 같다. 

 

첫 번째, "안전한 프로그래밍을 위해"

상수를 선언한다는 말은, 자신의 소스코드 내에서 해당 속성이 변하지 않을 것이라고 공공연하게 말하는 것과 같다. 따라서 상수에 다른 값이 할당될 가능성을 쉽게 찾아 주고, 해당 오류를 미연에 방지할 수 있어 보다 안전한 프로그래밍을 가능하게 한다. 

 

두 번째, "빠른 프로그래밍을 위해"

컴파일에게 있어, 변수와 상수를 구분하는 것 자체가 컴파일러 성능에 영향을 미친다. 앞에서도 말했지만, 상수로 선언한다는 것은, 앞으로 해당 속성이 변경될 가능성이 없다는 말과 같기 때문에, 컴파일러는 해당 속성에 대해 더 이상 신경을 쓰지 않아도 되고, 그에 따라 컴파일 속도가 빨라진다. 

 

이러한 이유 때문에, Xcode에서는 변하지 않는 값을 변수로 선언하거나, 변하는 값을 상수로 선언하면 경고 또는 에러 메시지를 띄운다. 

 

 

다음으로 계산 속성에 대해 알아보자. 계산 속성이라는 개념 자체를 Swift를 통해 처음 접했기 때문에 많이 생소했고, 그렇기 때문에 잘 활용을 못하는 것 같아 이번 기회에 확실히 짚고 넘어가려고 한다. 계산 속성(Computed Properties)은 단순히 값을 저장하는 저장 속성과 달리, 특정 구문을 실행시키고 계산 속성을 정의하거나(get 구문 이용), 계산 속성을 통해 추가적인 구문(set 구문 이용)을 실행시키고자 할 때 사용된다. 이러한 특성 때문에, 고정된 값을 위한 상수로는 계산 속성을 선언할 수 없다. 계산 속성의 선언 방법은 다음과 같다. 

  • var [속성 이름]: 자료형 {
        get {
            ...
            return ...
        }
        set([파라미터]) {
            ...
        }
    }

저장 속성과 두드러진 차이는 자료형 뒤에 중괄호가 붙고, 그 안에 get 구문(getter)과 set 구문(setter)이 온다는 것이다. 

get 키워드 이하 중괄호 구문은 프로그램 내에서 계산 속성이 쓰일 때마다 수행되고 return을 통해 계산 속성 값을 반환한다. 계산 속성을 참조할 때마다 특정 구문이 실행되기 때문에, 참조할 때마다 변하는 값을 정의하고 싶을 때 사용할 수 있다. 

set 키워드 이하로 소괄호와 중괄호가 나오게 되는데, 소괄호 안의 값은 중괄호 내에서 사용할 수 있는 파라미터 역할을 한다. 계산 속성 뒤에 '=' 연산자를 통해 계산 속성을 할당하고 set 이하 중괄호 구문이 실행된다. 

 

텍스트로 설명하기에는 한계가 있어 예제 코드를 살펴보자. 

첫 번째 줄에 저장 속성 storedNum가 선언됨과 동시에 0으로 초기화되었고, 그다음 계산 속성 computedNum가 정의되어 있다. 그 뒤로 print함수를 통해 computedNum를 참조하여, storedNum는 최종적으로 2가 되었고(2번 참조하였기 때문에 0 + 1 + 1 = 2), 해당 값이 계산 속성으로 반환되었다. 그리고 computedNum의 set 구문을 실행하기 위해 계산 속성에 10을 할당하여 storedNum는 2 * 10 = 20이 되었다. 

 

이처럼 계산 속성은, 참조할 때마다 추가적으로 실행시킬 구문이 있을 때나, 할당과 동시에 실행시키고 싶은 구문이 있을 때 쓸 수 있다. 

 

계산 속성은 앞에서 설명한 전형적인 선언 이외에도 Shorthand Setter Declaration(set 뒤에 소괄호를 생략하고 기본 값인 newValue 사용), Shorthand Getter Declaration(getter구문에 return 이하밖에 없을 때, return 생략), Read-Only Computed Properties(setter 생략)이 있다.