728x90
|
프로퍼티 (Property)
- 클래스, 구조체, 열거형 등에 관련된 값을 의미
- 저장 프로퍼티 (Stored Property), 연산 프로퍼티 (Computed Property), 타입 프로퍼티 (Type Property)로 크게 분류
1. 저장 프로퍼티 (Stored Property)
- 값을 저장하는 역할을 하는 인스턴스의 변수 or 상수를 의미
- var으로 변수, let을 상수 선언
- 구조체의 저장 프로퍼티는 옵셔널이 아니여도 저장 프로퍼티를 모두 포함하는 이니셜라이저를 자동으로 생성한다.
- 클래스의 저장 프로퍼티는 옵셔널이 아니라면 기본값 지정 or 사용자 정의 이니셜라이저를 생성해서 초기화 해주어야한다.
import Foundation
class Person {
var name : String
var age : Int
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
struct Animal {
var name : String
var age : Int
}
let animal = Animal(name : "Tiger", age : 34)
let person = Person(name : "Park", age : 25)
print(animal)
/* 결과
Animal(name: "Tiger", age: 34)
*/
2. 지연 저장 프로퍼티 (Lazy Stored Property)
- 프로퍼티가 호출 될 때 값을 초기화한다. (lazy 키워드 사용)
- 상수는 인스턴스가 완전히 생성되기 전에 초기화해야 되서 지연 저장 프로퍼티와는 맞지 않다.
- 그러므로 지연 저장 프로퍼티는 var로 선언한다.
import Foundation
class Person {
var name : String
var age : Int
lazy var pet : Animal = Animal(name : "dog", age : 15)
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
struct Animal {
var name : String
var age : Int
}
let person = Person(name : "Park", age : 25)
print(person.pet.name)//이 때 pet 프로퍼티 생성
/* 결과
dog
*/
3. 연산 프로퍼티 (Computational Property)
- 특정 상태에 따른 값을 연산하는 프로퍼티
- 변수 (var) 로만 선언
- getter, setter 선언 가능
- 메서드보다 연산 프로퍼티 사용이 더 낫다.
- 인스턴스 외부에서 메서드를 통해 내부 값에 접근하려면 접근자(getter), 설정자(setter) 총 2개의 메서드를 구현해야한다.
- 또한 메서드를 구현하는 것은 가독성이 나빠질 위험이 있다.
- 단, 연산 프로퍼티는 set만 선언(쓰기 전용)하는 것이 불가능
import Foundation
class Person {
var name : String
var age : Int
var nextYearAge : Int {
get {
return age + 1
}
set (value) {
age = value - 1
}
}
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
let person = Person(name : "Park", age : 25)
print(person.nextYearAge)
person.nextYearAge = 30
print(person.age)
/* 결과
26
29
*/
4. 프로퍼티 감시자 (Property Observers)
- 프로퍼티의 값이 변경됨에 따라 적절한 작업을 취할 수 있다.
- 프로퍼티의 값이 새로 할당될 때마다 호출됨.
- 변경된 값이 같아도 호출됨.
- willSet : 프로퍼티 값이 변경되기 직전에 호출되는 메서드
- newValue : 변경될 값
- didSet : 프로퍼티 값이 변경된 직후에 호출되는 메서드
- oldValue : 변경되기 전 값
- 매개변수들은 따로 이름을 지정하지 않으면 newValue, oldValue로 생성됨
import Foundation
class Person {
var name : String
var age : Int {
willSet {
print("\(age)살에서 \(newValue)살로 변경될 예정")
}
didSet {
print("\(oldValue)살에서 \(age)살로 변경됨")
}
}
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
let person = Person(name : "Park", age : 25)
person.age = 30
/* 결과
25살에서 30살로 변경될 예정
25살에서 30살로 변경됨
*/
5. 타입 프로퍼티 (Type Property)
- 각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티
- 모든 인스턴스에서 공통으로 접근하고 사용하는 프로퍼티를 의미한다.
- 자바의 클래스 프로퍼티와 동일한 개념이지만 Swift에서는 타입을 선언할 수 있는 방법이 여러 개이기에 타입 프로퍼티로 부름
- static을 통해서 선언
- 타입 프로퍼티는 저장 타입 프로퍼티 (변수 or 상수), 연산 타입 프로퍼티 (변수) 2가지이다.
import Foundation
class Person {
//타입 프로퍼티
static var typeName : String = "Person"
//인스턴스 프로퍼티
var name : String
var age : Int
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
let p1 = Person(name : "Park", age : 25)
let p2 = Person(name : "Kim", age : 30)
print("\(p1.name), \(p2.name)")
print(Person.typeName)
/* 결과
Park, Kim
Person
*/
728x90
'Swift' 카테고리의 다른 글
[Swift] 타입캐스팅 (Type casting) (0) | 2020.12.28 |
---|---|
[Swift] 메서드 (Method) (0) | 2020.12.26 |
[Swift] Extension (0) | 2020.12.26 |
[Swift] 열거형 (Enumeration) (0) | 2020.12.20 |
[Swift] 컬렉션형 (0) | 2020.12.20 |
댓글