2022. 1. 13. 22:16ㆍProgramming/iOS_Swift
연산프로퍼티란?
Swift 문서에 따르면, 연산프로퍼티는 클래스, 구조체, 열거형에서 정의되어질 수 있고 실제로 어떤 값을 저장하지 않으며, 대신 getter와 optional setter를 제공하고 다른 프로퍼티들과 값들을 간접적으로 set한다고 나와있다. 요약해서 쉽게 말하자면 연산프로퍼티란, 저장프로퍼티와 달리 특정한 값을 저장하지 않고 어떤 프로퍼티와 값들을 연산해서 새로운 값을 설정해주는 프로퍼티이다. 예시를 통해 이해해보자.
애플 예시를 활용해보려 했는데, 한번에 머릿 속에 팍 들어오는 예시는 아니어서 다른 간단한 걸로 만들었다. 구조체를 총 3개를 만들어줬고 군인의 총점수를 얻기 위한 연산프로퍼티를 구현했다. 연산프로퍼티는 위의 totalScoreCalculate처럼 표현해주면 된다. get 과 set으로 구성되어 있으며, get에는 return값으로 맞는 타입을 리턴해줘야 한다. set의 경우는 옵셔널로 없어도 무방하다.
연산 과정을 디테일하게 보면, 접근자(get)로 훈련점수 구조체 인스턴스의 저장프로퍼티값들을 받아주고 계산한 뒤 score1에 저장한다. 마찬가지로 체력점수 구조체 인스턴스의 저장프로퍼티값들도 받아주고 계산한뒤 score2로 저장한다. score1과 score2의 값을 더한 뒤 리턴해준다. 만약 Soldier 인스턴스의 totalScoreCalculate를 호출한다면, 접근자의 연산과정을 거친 score1과 score2를 더한 값이 출력될 것이다.
Soldier의 인스턴스 ethan을 만들어줬다. 프린트 결과를 보면 정상적으로 연산된 결과 값이 나온 것을 확인할 수 있다.
그러면, 설정자(set)는 뭘까, 한글 표현 그대로 다른 프로퍼티나 값에 어떤 값을 설정해주는 것이다. Soldier 구조체의 코드에서 set부분을 보면 정체모를 newScore라는 매개변수를 받고 있고 훈련점수의 저장프로퍼티에 해당 매개변수의 값을 저장하고 있다. 해당 매개변수의 값은 개발자가 입력한 값을 받는다.
위의 코드를 보면 연산프로퍼티에 값을 '설정(set)'했다. 연산프로퍼티에 저장된 것이 아니다!! 프린트 결과를 보면 알 수 있듯이 설정자 내부 로직에 의해 ethan의 훈련점수에서 알파부분에 50이 저장된 것을 확인할 수 있다!
연산프로퍼티의 특징
1. set의 경우는 optional이기에 get만 구현해도 된다! 다만, 주의해야 할 점은 그렇게 하면 get-only property가 되기 때문에 위 코드 처럼 연산프로퍼티에 값을 설정할 수 없다.
2. set의 매개변수는 생략이 가능하다. 단, 생략할 경우 설정된 값은 무조건 newValue로만 표현해야 한다.
3. get의 return도 생략이 가능하다! 단, get 내부 전체 바디가 한 가지의 표현으로 연산프로퍼티의 타입과 일치해야 한다.
4. 클래스와 구조체에서만 쓸 수 있는 저장프로퍼티와 달리, 연산프로퍼티는 클래스, 구조체 + 열거형에서도 사용 가능하다.
5. 변수로만 선언 가능하다. 예시 코드를 보면 알 수 있듯이 연산 결과가 저장 프로퍼티들의 값이나 설정자에 의해서 계속해서 변하기 때문이다.
왜 쓸까?
1. 메서드 2개를 연산프로퍼티 1개로 절약할 수 있다!
읽으면서 느꼈겠지만, 연산프로퍼티는 메서드의 느낌이 강하게 든다. get만 써야할 경우에는 사실 연산프로퍼티를 쓸 큰 메리트가 없을 수 있지만 만약 get과 set을 둘 다 써야한다면, 연산프로퍼티는 2개의 메서드를 사실상 하나의 프로퍼티에 담는 것이므로 코드가 절약될 수 있다.
2. 한 눈에 들어오고 직관적으로 확인할 수 있다.
아무래도 메서드의 경우 프로퍼티들과 떨어져 있는 경우가 많기 때문에 메서드 내부에 어떤 저장프로퍼티가 활용됐는지 확인하려면 해당 저장프로퍼티가 선언된 부분까지 올라가서 확인해야한다는 단점이 있다. 그러나 연산프로퍼티의 경우 저장프로퍼티 근처에 선언되기 때문에, 직관적으로 쉽게 확인할 수 있다.
** 왜 쓸까? 부분은 현재까지 제가 느낀 사견이기 때문에, 틀릴 수도 있습니다. 내용이 잘못됐다면 언제든 지적해주세요!
'Programming > iOS_Swift' 카테고리의 다른 글
[iOS_Swift] deinit이 호출되지 않는 이유 (0) | 2022.01.19 |
---|---|
[iOS] Delegate Pattern 이해하기 (0) | 2022.01.16 |
[iOS_Swift] 프로토콜(Protocol) (1) - Property Requirements (0) | 2022.01.10 |
[iOS_Swift] 옵셔널(Optional) 제대로 이해하기 (0) | 2022.01.05 |
[iOS_Swift] 클로저(3) - 탈출클로저(Escaping Closure) (0) | 2021.12.31 |