Property
: class, struct, enum 등에서 사용되는 변수나 상수를 프로퍼티라고 함.
- 저장 프로퍼티
- 연산 프로퍼티
- 타입 프로퍼티
- 프로퍼티 옵저버
- 지연저장 프로퍼티
저장 프로퍼티(Stored Property)
- 데이터를 저장하는 프로퍼티.
- var, let 모두 사용할 수 있음.
- class, struct 등에서 데이터를 저장하기 위한 변수와 상수를 의미.
- enum에서는 저장 프로퍼티를 사용할 수 없음.(빌드 오류 발생)
- 초기값을 가질 수 있음.
struct Person {
var name: String // 값을 저장하는 저장 프로퍼티
var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
}
연산프로퍼티(Computed Property)
- 값을 직접 저장하지 않고 계산된 값을 제공하는 프로퍼티.
- class, struct, enum 등에서 사용가능함.
- var 만 사용 가능함.
- 동적으로 계산하여 값을 반환하기 때문에 상수 let은 사용할 수 없음.
- getter와 setter를 사용하여 동적으로 값을 계산함
- getter는 get 키워드를 사용하여 코드블록을 구현하여 사용함.
- setter는 set 키워드를 사용하여 코드블록을 구현하여 사용함.
- getter는 필수이고 setter는 구현하지 않아도 됨.
- setter를 구현하지 않았다면 get 키워드를 생략할 수 있음.
// Getter와 Setter 모두 있는 연산 프로퍼티
struct Person {
var name: String // 값을 저장하는 저장 프로퍼티
var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
var isAdult: Bool { // getter와 setter를 제공하는 연산 프로퍼티
get {
return age >= 20
}
set {
if newValue == true { // newValue는 할당한 새로운 값을 의미합니다.
age = 20
} else {
age = 19
}
}
}
}
var person = Person(name: "Brody", age: 100) // person 변수에 Person 구조체를 생성하여 할당합니다.
// name에는 "Brody"를 age에는 100을 할당합니다.
print(person.isAdult) // age가 20보다 크므로 isAdult는 true가 됩니다.
person.isAdult = false // isAdult를 false로 변경하면 isAdult 연산프로퍼티의 Set
// 코드블록이 실행되어 age를 19로 변경합니다.
print(person.age) // age가 19이므로 19가 출력됩니다.
// Setter 가 구현하지 않은 연산프로퍼티
struct Person {
var name: String // 값을 저장하는 저장 프로퍼티
var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
var isAdult: Bool { // getter만 제공하는 연산 프로퍼티
get {
return age >= 20
}
}
}
var person = Person(name: "Brody", age: 100) // person 변수에 Person 구조체를 생성하여 할당합니다.
// name에는 "Brody"를 age에는 100을 할당합니다.
print(person.isAdult) // age가 20보다 크므로 isAdult는 true가 됩니다.
person.isAdult = false // isAdult에는 Getter만 있기때문에 새로운 값을 할당할 수 없습니다.
// Compile Error 발생
// Setter가 구현되지 않았을 때는 get 키워드를 생략 할 수 있습니다.
struct Person {
var name: String // 값을 저장하는 저장 프로퍼티
var age: Int = 0 // 값을 저장하는 초기값이 있는 저장 프로퍼티
var isAdult: Bool { // get 키워드가 생략된 연산 프로퍼티 Only Get
return age >= 20
}
}
타입 프로퍼티(Type Property)
- 모든 인스턴스가 공유하는 프로퍼티로, 인스턴스를 만들지 않고 타입 자체에서 접근 가능함.
- static 키워드를 사용
- 타입이름.타입프로퍼티이름 형태로 접근 가능
struct Person {
static var structName = "Person" // static 키워드를 사용한 타입 프로퍼티 입니다.
// 타입 프로퍼티의 이름은 structName이고 "Person"을 할당합니다.
func logStructName() {
print(Person.structName) // 내부에서는 Self로 사용 가능
}
}
var person = Person()
person.logStructName() // "Person" 출력
Person.structName = "Changed!" // Person의 타입프로퍼티 structName의 값을 "Changed!"로 변경합니다.
person.logStructName() // "Changed!" 출력
print(Person.structName) // "Changed!" 출력
// enum 에서 사용하기
enum Season: String {
case spring
case summer
case autumn
case winter
static var enumName = "Season"
}
Season.enumName // "Season"
프로퍼티 옵저버(Property Observers)
- 저장 프로퍼티의 값이 변경되는 것을 감시하고 있다가 코드블록을 실행할 수 있는 기능.
- 저장 프로퍼티 타입 뒤에 코드블록을 작성하여 만들 수 있음.
- 저장 프로퍼티가 사용 가능한 struct, class 에서 사용 가능함.
- willSet, didSet을 제공함. 둘 중 하나만 작성해도 됨.
- willSet
- 값이 변경되기 전에 호출됨.
- 변경 될 값은 newValue를 통해 접근하며, 이름을 정할 수 있음.
- 이름을 정하려면 willSet(이름) 형식으로 작성하면 됨.
- didSet
- 값이 변경된 후 호출됨.
- 변경되기 전의 값은 oldValue를 통해 접근하며, 이름을 정할 수 있음.
- 이름을 정하려면 didSet(이름) 형식으로 작성하면 됨.
// 기본 사용 방법
struct Person {
var name: String {
willSet {
print("Person의 name이 변경될 예정입니다. 변경될 값은 \"\(newValue)\" 입니다.")
}
didSet {
print("Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.")
print("\(oldValue) -> \(name)")
}
}
var age: Int
}
var person = Person(name: "Brody", age: 10)
person.name = "Apple"
/* 출력 값
Person의 name이 변경될 예정입니다. 변경될 값은 "Apple" 입니다.
Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.
Brody -> Apple
*/
// newValue, oldValue 다른 이름으로 변경해서 사용하기
struct Person {
var name: String {
willSet(changeNewName) {
print("Person의 name이 변경될 예정입니다. 변경될 값은 \"\(changeNewName)\" 입니다.")
}
didSet(beforeName) {
print("Person의 name이 변경되어 didSet 코드블록이 호출되었습니다.")
print("\(name) -> \(beforeName)")
}
}
var age: Int
}
지연 저장 프로퍼티(Lazy Stored Property)
- 처음 사용하기 전까지 실제로 메모리에 값을 저장하지 않는 지연된 저장 프로퍼티.
- 사용하기 전까지 값을 저장하지 않기 때문에 메모리 효율을 높일 수 있음.
- lazy 키워드를 사용
- lazy var 프로퍼티이름 형태로 사용
- var 에서만 사용 가능
- 저장 프로퍼티를 사용할 수 있는 class, struct 등에서 사용할 수 있음.
class Person {
var name: String = "A"
var age: Int = 15
lazy var height = 175.7
}
let person = Person()
// Person의 height값에 접근하지 않았기 때문에 아직 메모리에 할당되지 않은 상태
print(person.height) // height값을 사용하기 때문에 이제 메모리에 할당하여 사용함.
struct Animal {
var name: String
var age: Int
lazy var color: String = "Black"
}
var animal = Animal(name: "Dog", age: 10) // color값에 접근하지 않았기 때문에 아직 메모리에 할당되지 않은 상태
print(animal.color) // color값을 사용하기 때문에 이제 메모리에 할당하여 사용함.
'문법' 카테고리의 다른 글
[iOS]2025.04.04 문법(옵셔널) (0) | 2025.04.04 |
---|---|
[iOS] 2025.03.21 문법(메소드) (0) | 2025.03.24 |
[iOS] 2025.03.18 문법(struct) (0) | 2025.03.18 |
[iOS] 2025.03.18 문법(class, init) (0) | 2025.03.18 |
[iOS] 2025.03.18 문법(인스턴스) (0) | 2025.03.18 |