본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.
연산 프로퍼티 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
https://babbab2.tistory.com/119
https://seolhee2750.tistory.com/119
https://babbab2.tistory.com/122
http://www.yes24.com/Product/Goods/78907450
'YAGOM CAREER STARTER' 카테고리의 다른 글
[TIL] 20230103: CaseIterable, 반복문을 통해 딕셔너리 key와 value 가져오기 (0) | 2023.01.03 |
---|---|
[TIL] 20230102: MVC, Initialization, 쥬스 메이커, 연결 리스트 (0) | 2023.01.03 |
[TIL] 20221229: H.I.G, Extension, Enum (0) | 2022.12.29 |
[TIL] 20221227: git reset --hard, namespace, Implicitly Assigned Raw Values (0) | 2022.12.28 |
[TIL] 20221226: 접근제어(캡슐화,은닉화) (0) | 2022.12.27 |