Swift

swift: 저장 프로퍼티

소재훈 2022. 1. 21. 22:40

프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값을 뜻한다.

프로퍼티는 크게 세 가지로 나눌 수 있다.

  1. 저장 프로퍼티(Stored Properties): 인스턴스의 변수 또는 상수
  2. 연산 프로퍼티(Computed Properties): 값을 저장한 것이 아닌 특정 연산을 실행한 것의 결괏값. 클래스, 구조체, 열거형 등에 쓰인다.
  3. 타입 프로퍼티(Type Properties): 특정타입에 사용되는 프로퍼티. 저장 프로퍼티와 연산 프로퍼티가 특정 타입의 인스턴스에 사용되는 것을 뜻하는 것과는 다르다.

프로퍼티 감시자(Property Observers)는 프로퍼티의 값이 변하는 것을 감시하면서 프로퍼티의 값 변화에 따른 특정 작업을 실행한다. 저장 프로퍼티에 적용할 수 있고, 부모 클래스로부터 상속받을 수도 있다.

 

1. 저장 프로퍼티(Stored Properties)

클래스 또는 구조체의 인스턴스와 연관된 값을 저장하는 가장 단순한 개념의 프로퍼티 이다.

var 키워드를 사용하면 변수 저장 프로퍼티, let키워드를 사용하면 상수 저장 프로퍼티가 된다.

구조체는 저장 프로퍼티를 모두 포함하는 이니셜 라이저를 자동으로 생성한다.

클래스의 저장 프로퍼티는 옵셔널이 아니라면 프로퍼티의 기본값을 지정해주거나, 사용자 정의 이니셜 라이저를 통해 반드시 초기화해주어야 한다. 클래스 인스턴스의 상수 프로퍼티는 인스턴스가 초기화될 때 한 번만 값을 할당할 수 있다.

struct CoordinatePoint {
    var x: Int // 저장 프로퍼티
    var y: Int // 저장 프로퍼티
}

let firstPoint: CoordinatePoint = CoordinatePoint(x: 10, y: 5)

class Position {
    var point: CoordinatePoint
    let name: String
    
    init(name: String, currentPoint: CoordinatePoint) {
        self.name = name
        self.point = currentPoint
    }
}

// 클래스 생성시 초깃값을 주지 않기 때문에 사용자 정의 이니셜라이저를 호출하여야 한다.
let secondPoint: Position = Position(name: "jaehoon", currentPoint: firstPoint)

인스턴스를 생성할 때 프로퍼티에 값이 필요 없다면 프로퍼티를 옵셔널로 선언해 주면 된다.

지연 저장 프로퍼티(Lazy Stored Properties)는 호출이 있어야 값을 초기화하며, lazy 키워드를 사용한다.

struct CoordinatePoint {
    var x: Int = 0
    var y: Int = 0
}

class Position {
    lazy var point: CoordinatePoint = CoordinatePoint()
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

let jaehoonPosition: Position = Position(name: "jaehoon")
print(jaehoonPosition.point) //CoordinatePoint(x: 0, y: 0)

클래스 인스턴스의 저장 프로퍼티로 다른 클래스의 인스턴스나 구조체의 인스턴스를 할당할 때 인스턴스를 초기화 하면서 저장프로퍼티로 쓰이는 인스턴스를 한 번에 생성되도록 하고 싶거나 굳이 모든 저장 프로퍼티를 사용할 필요가 없을 때 사용한다.

'Swift' 카테고리의 다른 글

프로퍼티 감시자: Property Observers  (0) 2022.02.06
swift: 연산 프로퍼티  (0) 2022.01.21
swift: 구조체와 클래스의 차이  (0) 2022.01.21
swift: 클래스  (0) 2022.01.21
swift: 구조체  (0) 2022.01.21