/**
타입 속성
- 인스턴스에 속한 속성이 아니고, 타입자체에 속한 속성이기에 내/외부에서 Type.property로 접근해야함.
- 저장 타입 속성을 주로 사용
1. 저장 타입 속성
- 모든 인스턴스가 동일하게 가져야하는 보편적인 속성이거나, 모든 인스턴스가 공유해야하는 성격에 가까운 저장속성을 저장 타입 속성으로 선언
- static, (상속시) 재정의 불가( 메서드만 상속이 가능 - class 키워드 사용불가)
- let, var 선언 가능
- 항상 기본값(초기값) 필요
- 자체적으로 지연 속성의 성격을 가지므로, 호출시 메모리 할당(내무적으로 Thread-Safe 처리)
2. 계산 타입 속성
- (상속시)재정의 가능
- static 또는 class 키워드 사용
- var 키워드만 사용 가능
- 메서드이기 때문에 타입에 메모리 공간이 할당되어 있지 않음
*/
// 1. 저장 타입 속성
class Dog {
// 저장 타입 속성
static let species: String = "Dog"
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
}
let dog = Dog(name: "초코", weight: 15.0)
dog.name
dog.weight
Dog.species
Dog.species
class Circle {
// (저장) 타입 속성 (값이 항상 있어야 함)
static let pi: Double = 3.14 // pi 는 불변객체임.
static var count: Int = 0 // 인스턴스를 (전체적으로) 몇개를 찍어내는지 확인
// 저장 속성
var radius: Double // 반지름
// 계산 속성
var diameter: Double { // 지름
get {
return radius * 2
}
set {
radius = newValue / 2
}
}
init(radius: Double) {
self.radius = radius
Circle.count += 1
}
}
var circle1 = Circle(radius: 2)
circle1.radius
circle1.diameter = 6
circle1.radius
circle1.diameter * Circle.pi
Circle.count
let a = Circle.pi
var circle2 = Circle(radius: 3)
Circle.count // 인스턴스를 선언 할 때 마다 count + 1 이 된다.
// 실제 타입속성 사용 예
Int.min
Int.max
// 2. 계산 타입(형식) 속성
class Circle2 {
// 저장 타입 속성
static let pi: Double = 3.14
static var count: Int = 0
// (계산) 타입 속성(read-only)
static var multiPi: Double {
return pi * 2
}
// 저장속성
var radius: Double // 반지름
init(radius: Double) {
self.radius = radius
Circle.count += 1
}
}
let b = Circle2.multiPi
// 파이(3.14..)에 2배를 한 숫자가 만약, 많이 사용된다면
// 위와 같은 형태를 생각해 볼 수 있다.
// 단순히, 계산 타입 속성도 가능하다는 것을 살펴보기 위한 예시
class Circle3 {
// 2. 저장 타입 속성
static let pi: Double = 3.14
static var count: Int = 0
// 저장속성
var radius: Double // 반지름
init(radius: Double) {
self.radius = radius
Circle.count += 1
}
func getArea () -> Double {
let area = Circle3.pi * radius * radius
return area
}
}
let c1 = Circle3(radius: 3)
c1.getArea()
Circle3.count
let c2 = Circle3(radius: 2)
Circle3.count