타입 속성

쏘스야·2023년 4월 13일
0

ios 개발자의 첫걸음

목록 보기
47/61
/**
 타입 속성
 - 인스턴스에 속한 속성이 아니고, 타입자체에 속한 속성이기에 내/외부에서 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
profile
개발자

0개의 댓글