타입 프로퍼티
타입을 미리 정의하고, 해당 타입의 인스턴스가 생성되었을 때
사용하는 프로퍼티가 아닌,
타입 자체에 속하는 프로퍼티를 타입 프로퍼티라고 함
클래스, 구조체, 열거형에서 사용
인스턴스의 생성 여부와 상관없이
타입 프로퍼티의 값은 1개
타입 프로퍼티를 타입으로 하는 모든 인스턴스가 공통으로 사용하는 값
모든 인스턴스에서 공용으로 접근하고 값을 변경할 수 있는 변수 등을 정의할 때 유용
(싱글톤)
타입 프로퍼티는 저장 타입 프로퍼티, 연산 타입 프로퍼티가 있음
저장 타입 프로퍼티
변수, 상수로 정의 가능 및
선언할 당시 초기값을 가지고 있어야 함
이 때 지연 연산되는데, lazy 키워드를 붙일 필요 없음
연산 타입 프로퍼티
변수로만 정의
※여기서 저장, 연산 프로퍼티 앞에 "static" 키워드를 붙이면
저장 타입, 연산 타입 프로퍼티가 됨
타입 프로퍼티 사용
class Fruit {
static let name: String = "좋아하는 과일?"
static var answer: String {
return "맛 좋은" + name
}
}
★ 저장 타입 프로퍼티는 항상 선언할 때 초기값을 갖고 있어야 한다고 함
그래서 한 번 초기값을 주지 않고 선언해보니 오류 발생
초기값을 지정 또는 연산 타입 프로퍼티로 만들라는 오류 발생
클래스로 생성된 Fruit 안의 모든 프로퍼티는 이니셜라이저를 통해
초기화되어야 하는 게 아닌가? 싶지만
타입 프로퍼티는 메모리에 올라가기만 하면, 그 뒤로는 생성되지 않고
시점, 위치 상관없이 모두 이 타입 프로퍼티에 접근할 수 있음
따라서 만약에 내가 저장 타입 프로퍼티, 여기서는 name에 접근하려면?
Fruit.name = "사과"
let apple: Fruit = Fruit()
print(Fruit.name)
print(Fruit.answer)
let bananaa: Fruit = Fruit()
Fruit.name = "바나나"
print(Fruit.name)
print(Fruit.answer)
// 사과
// 맛 좋은사과
// 바나나
// 맛 좋은바나나
여기서 보면 인스턴스가 생성 유무와는 상관없이 타입 프로퍼티가 매번 생성되는게 아닌
타입 프로퍼티를 부르면 메모리에 올라가고,
그 뒤로는 어디서든 공유하는 형태
연산 타입 프로퍼티는 오버라이딩 가능
종류에는 2가지 있음
(class VS static)
이 둘의 큰 차이점은 오버라이딩이 가능 여부
class : 오버라이딩 가능
class Fruit {
class var apple: String {
return "apple is great"
}
}
class Food: Fruit {
override class var apple: String {
return "apple is not food"
}
}
print(Fruit.apple)
print(Food.apple)
// apple is great
// apple is not food
static: 오버라이딩 불가능
class Fruit {
static var apple: String {
return "apple is great"
}
}
class Food: Fruit {
override static var apple: String { // 오류 발생
return "apple is not food"
}
}
'Swift' 카테고리의 다른 글
인스턴스 생성 및 소멸 1편 (0) | 2024.01.29 |
---|---|
메서드 (0) | 2024.01.26 |
프로퍼티 3편 (프로퍼티 감시자) (0) | 2024.01.23 |
프로퍼티 2편 (연산 프로퍼티) (0) | 2024.01.22 |
프로퍼티 1편 (저장 프로퍼티) (0) | 2024.01.19 |