이미 알고 이 페이지를 보는 것이겠지만..
우리가 지금까지 변수! 상수!라고 생각하면서 사용했던 것들이
실은 프로퍼티랍니다. (프로퍼티랑 속성이랑 같은 말임)
속성에는 저장속성, 계산속성, 지연저장속성… 이 있음
슉슉 정리해봅시다!!
저장속성 (클래스, 구조체에서 선언 가능)
클래스나 구조체에서 인스턴스가 가지는 공간으로 쉽게 우리가 지금까지 변수/상수로 선언했던 인스턴스에요.
인스턴스 초기화시 각 저장속성은 값을 가져야 하는건 다들 아시져?
지금 여서 resultCount랑 results 가 저장속성이라는 말을 하고 있는겁니다.
지연저장속성
초기화를 지연하는 것인데... 이게 무슨 말이야 싶으시죠
대충 일반 인스턴스가 최기화 된후에 나중에 개별적으로 초기화 된다고 생각하면 될듯..해요 저는 이렇게 이해했어요.
그래서 var(변수)로만 생성 가능하고 기본값 저장이 필수입니다.
(→ 구조체에서 사용 시 구조체 인스턴스 var로 선언 필수)
말로 예시를 풀어서 써보자면,,
저장속성을 클로저(변/상수)로 초기화 할때 다른 속성에 접근해야 하는 경우에 사용
위에서 속성 선언하고 클로저에 그거 받아서 사용할 때 동시에 접근 안 되니까 지연 저장해서 사용하면 된다는 말입니다..
계산속성
속성처럼 보이지만 실질적으로는 메서드라고 생각하면 돼요. 그래서 메모리 할당 되지 않아요.
보통 다른 속성에 저장된 값을 읽어서 실행 후 리턴하거나 속성으로 전달된 값을 다른 속성에 저장합니다.
“계산” → 항상 var로 선언해야 하며, 기본값과 자료형까지 선언해야 해요.(형식추론 사용 불가)
그리고 get, set으로 구성 되어 있음
get
- 속성 값을 읽는 역할, return은 필수 (근데 리턴문만 있으면 get, return 모두 생략 가능함)
- 계산 속성을 사용하겠다 하면 필수로 작성해야 함
- get만 작성 한다면 그것은 바로 읽기 전용 계산 속성
- ⭐️ 여기서 get만 선언했다면 == 읽기 전용 계산 속성
- 읽기 전용 계산 속성은 축약 가능함 (get 키워드와 {} 생략 가능함)
var name: Type { statements return expr }
set
- 값을 저장하는 역할
- 속성에 저장한 값은 set의 파라미터를 통해 전달됨
- 파라미터 직접 저장할 수 있지만, new value라는 기본 파라미터 제공
class Person {
var name: String
var yearOfBirth: Int
init(name: String, yearOfBirth: Int) {
self.name = name
self.yearOfBirth = yearOfBirth
}
var age: Int {
get {
return 2023 - yearOfBirth
}
set { // age에 전달된 값을 기반으로 출생년도 재설정
yearOfBirth = 2023 - newValue
// newValue = 새롭게 전달되는 값, age에 새롭게 값이 전달될 경우 set 실행
}
}
}
속성 감시자 (프로퍼티 옵저버)
⭐️ 옵저버 = 감시자, 프로퍼티 옵저버 = 속성의 변화를 감시하는 것
속성 값이 변경될 때 이 프로퍼티를 사용하여 활용할 수 있어요.
“변화”이기 때문에 var로만 선언 가능, 지연 저장 속성에서 사용 불가합니다.
저장 속성이 어떻게 변화하는지 보고 싶을 때.. 저장 속성의 변화시점을 확인하는 메소드를 사용해요. (didSet, willSet)
willSet
- 값이 변할 때, 속성에 값이 저장되기 직전에 호출됨 (속성은 원래값)
- 새로 저장되는 값이 파라미터로 전달됨 (== newValue)
didSet
- 값이 변할 때, 속성에 값이 저장된 직후에 호출됨 (속성에 새로운 값이 저장되어 있음)
- 그래서 파라미터로는 이전값이 전달됨 (== oldValue)
class Size {
var width = 0.0 {
willSet {
print("width의 newValue의 값 : ", newValue)
}
didSet {
print("width의 oldValue의 값: ", oldValue)
}
}
}
let s = Size()
s.width // 0.0 출력
s.width = 1.5 // 새로운 값 대입
s.width
// width의 newValue의 값 : 1.5 (get문을 탐)
// width의 oldValue의 값: 0.0 (set문을 탐)
타입속성
- 하나의 인스턴스에 속해있는것이 아니라, 모든 인스턴스들이 공유할 수 있는 저장속성입니다.
- 타입 자체에 속한 속성이자, 속성을 static이라는 것을 붙여서 생성하는 것
- 여기도 저장타입속성 / 계산타입속성이 있습니다.
- 접근은 Type.PropertyName으로 접근 가능해요.
- 속성에 처음 접근할 때 초기화 돼요.
저장타입속성
static으로 선언
상속시 재정의 불가
항상 초기화 필요
let, var 둘 다 가능
계산타입속성
static, class로 선언
static는 상속 시 재정의 불가를 의미
class는 상속 시 재정의 가능을 의미
var로만 생성 가능
'Swift > Swift 기초문법' 카테고리의 다른 글
[Swift 기초문법] @State, @Binding 을 알아보자 (0) | 2023.07.10 |
---|---|
[Swift 기초문법] Generics을 알아보자 (0) | 2023.07.10 |
[Swift 기초문법] Closure 를 알아보자 (2) | 2023.06.16 |
[Swift 기초문법] Optional Chaining에 대해 알아보자 (2) | 2023.03.02 |
[Swift 기초문법] Optional Binding을 알아보자 (3) | 2023.02.26 |