Property의 개념
Object = Property + Method
Property는 객체의 데이터를 의미한다.
struct professor: {
let name: String
let lecturename : String
let studentCount : Int
}
Stored Property- 저렇게 스트럭쳐가 담고있는 데이터를 프로퍼티 라고한다.
Computed Property - 어떠한 값을 직접 저장하지는 않고 저장된 정보를 이용해서 가공 혹은 계산된 값을 사용할때에
쓰게 됩니다, 스트럭쳐 안에 함수가 있을 경우
Type property - 생성된 인스턴스에 상관없이 그 스트럭트의 타입자체의 속성을 정하고 싶을때 사용하는 것.
Property의 종류
1. Stored Property
- 객체가 담고 있는 데이터를 Stored property라고 한다.
- Property Observer
- willSet, didSet을 활용하여 데이터가 바뀌는 것을 확인 할수 있다
- 변수 또는 상수로 선언됩니다.
- 변수, 상수 값을 인스턴스의 일부로 저장합니다.
- 클래스와 구조체 에서만 사용됩니다
struct Person {
var firstName: String {
willSet {
print("willSet: \(firstName) --> \(newValue)")
}
didSet {
// didSet은 변수가 바뀔경우 어떻게 바뀌어가는지를 출력할수있는 기능이다. Store Property에서만 사용가능하다
// 값이 세팅되고나서 확인 didSet, 값이 세팅되기 직전에 확인 willSet
print("didSet: \(oldValue) --> \(firstName)")
}
}
//-------- Store Property
var lastName: String
2. Computed Property
- 객체의 정의 안에서 Stored Property가 가지고 있는 데이터를 이용 또는 가공해서 계산된 값을 사용하게 할수있다.
- 클래스, 구조체, 열거형에 사용됩니다
- 항상 변수로 선언됩니다.
- getter, setter = 연산 프로퍼티 ( 값을 검색하고 세팅하는 데에 이용됩니다)
- getter와 setter을 사용하려면 변수 값을 담을 변수를 반드시 지정해 주어야한다. ( 연산된 값을 담을 변수가 필요하기 때문), 자기 자신을 호출하거나 값을 지정할수 없다
- 호출 될 때마다 값을 재계산 하게된다
- get하나 만을 가질수는 있지만 , set하나만을 가질수는 없다
- get 만 있다면 Read Only Computed Property (읽기전용)
- set의 (parameter)를 생략하면 newValue로 써주어야한다.
var fullName: String {
// computed store는 var로만 쓸수있다.
// computed store는 실제로 값을 저장하는 용도가 아닌 읽기 전용으로
//쓰이지만 이렇게 get set을 활용하여 읽기 쓰기 기능을 사용할수 있다.
get { // get은 read only!
return "\(firstName) \(lastName)"
}
set { // set은 새로 쓰기가능!!
if let firstName = newValue.components(separatedBy: " ").first {
self.firstName = firstName
}
// 위 코드를 설명하자면 새로운 newValue가 설정되었을때 " "를 기준으로 문자열을
//나누고 나눈 문자열의 첫번째가 firstName이 된다고 하는것이다.
//마찬가지로 아래코드 역시 마지막이 lastName이 된다고 하는 것.
if let lastName = newValue.components(separatedBy: " ").last {
self.lastName = lastName
}
}
}
}
3. Type Property
- Property를 타입자체에 연결할수있다.
- Type Property에는 저장 타입프로퍼티, 연산 타입프로퍼티가 있습니다
- 저장 타입프로퍼티는 변수 또는 상수로 선언되며 기본값을 지정해 주어야합니다
- 연산 프로퍼티는 변수로만 선언되어야 한다.
- enum[열거형]에서 사용될수 있습니다
struct SomeStructure {
static var storedTypeProperty = "Some value."
// 기본값을 선언해준 형태
// 저장 타입프로퍼티
static var computedTypeProperty: Int {
return 1
}
// 연산 타입프로퍼티
// 읽기전용 ( get(생략됨))
//var로만 선언
}
4. Lazy Property
- 엔지니어링 측면에서 Optimizing 하기 위해서 사용
- 값이 사용되지 않으면 읽히지 않는다
- 항상 변수로 선언하여야 합니다
- 잘 사용하면 성능과 공간낭비를 줄일수 있습니다
- 변수가 레이지 프로퍼티로 선언되었다면 이 변수가 실행될때 코드가 읽혀집니다
- 여러 스레드가 프로퍼티가 초기화되지 않은 상태에서 액세스 하려고 하면 초기화를 한번만 한다고 보장할수 없습니다
- 기본적으로 프로퍼티는 함수가 선언되었을때 읽히게 되는데 레이지 프로퍼티는 레이지 키워드가 호출이 되어야 읽히게 된다.
5. Property와 Method 언제 사용해야 할까?
- 기본개념
- Property - 호출시 (저장된) 값을 하나 반환한다.
- Method - 호출시 어떤 작업을 한다
- Method가 그냥 값을 리턴하는 일을 한다면?
- Setter가 필요한가? (yes) —> Computed Property
- Setter가 필요한가? (no)
- 계산 혹은 DB access나 file io가 많이 필요한가 (yes)
- Method
- 계산 혹은 DB access나 file io가 많이 필요한가 (no)
- Compute Property
- 계산 혹은 DB access나 file io가 많이 필요한가 (yes)
'IOS > Swift' 카테고리의 다른 글
[TIL] Swift. Class 1편 (0) | 2020.10.07 |
---|---|
[TIL] Swift. Method (0) | 2020.10.06 |
[TIL] Swift. Structure(Class, Struct, Enum) (0) | 2020.09.30 |
[TIL] Swift. Function Expression (0) | 2020.09.29 |
[TIL] Swift. Collection (0) | 2020.09.29 |