[저장 프로퍼티(Stored Property)]

저장 프로퍼티: 클래스와 구조체에서만 사용할 수 있고 값을 저장하기 위해 선언되는 상수 또는 변수

[지연 저장 프로퍼티(Lazy Stored Property)]

지연 저장 프로퍼티: 프로퍼티가 호출되기 전까지는 선언만 될 뿐 초기화되지 않고 있다가, 프로퍼티가 호출되는 순간에 초기화 되는 저장 프로퍼티

쉽게 말하자면 값이 사용되기 전까지는 값이 계산되지 않는 프로퍼티이다.

특징

  • lazy 프로퍼티는 항상 변수로서 선언. 즉, var로 선언

  • lazy로 선언했다고 해도 lazy 프로퍼티가 초기화 되지 않은 상태에서!! 여러 쓰레드가 동시에 이 lazy프로퍼티에 액세스 한다면, 이 프로퍼티가 단 한번만 초기화 된다는 것을 보장할 수 없다.

예제

class DataImporter {
    //DataImporter클래스는 외부파일에서 데이터를 가져오는 클래스!
    var filename = "data.txt"
    //데이터를 가져올 외부파일이름은 "data.txt"인가봐요 :)
}

class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    //DataManager클래스는 데이터 관리하는 클래스에요. importer가 위에서 선언한 DataImporter의 인스턴스이며, lazy로 선언되었네요.

}

let manager = DataManager()//DataManager의 인스턴스를 만듭니다. 참고로, DataManager의 저장프로퍼티들은 초기값이 있으므로 init이 없어도 됩니다.
manager.data.append("Some data")//DataManager의 저장프로퍼티 data라는 배열에 어떤 데이터를 집어넣고,
manager.data.append("Some more data")//또 집어넣어요.

//하지만 아직까지 DataImporter의 인스턴스인 importer프로퍼티는 생성되지 않았습니다. lazy 저장프로퍼티이기 때문이죠.

[연산 프로퍼티(Computed Property)]

연산 프로퍼티: 실제 값을 저장했다가 반환하지는 않고 다른 프로퍼티의 값을 연산처리하여 간접적으로 값을 제공한다.

[get, set]

  • get: 연산프로퍼티가 다른 프로퍼티의 값을 연산처리하여 간접적으로 값을 제공할 때 프로퍼티의 값을 참고하기위해서 사용하는 구문 / 함수와 비슷해서 return을 이용해서 반환하는데, 여기서 반환되는 값이 프로퍼티가 제공하는 값이 된다.

  • set: 연산 프로퍼티에 값을 할당하거나 변경하고자 할 때 실행되는 구문/ 연산프로퍼티는 값 자체를 저장하지 않기 때문에 이때 할당되는 값은 연산의 중요한 요소

set 구문이 없으면 외부에서 연산 프로퍼티에 할당할 수 없으며, 내부적인 연산 처리를 통해 값을 제공받는 읽기전용 프로퍼티가 만들어진다. 하지만 get 구문이 없으면 연산프로퍼티가 값이 반환하는 기능을 갖지 못하기 때문에 get 구문은 필수요소이다.

get, set 포멧

class test {

    var 프로퍼티명: 타입 {
    	get {
            //필요한 연산 과정
            return 반환값
        }
        set(매개변수명) {
            //필요한 연산구문 ex) 프로퍼티명 = 매개변수명
        }
    }
}

사용예시

class Point {
    var tempX : Int = 1 //get, set을 사용하기 위해서는 그 연산된 값을 저장할 변수가 반드시 있어야한다.
    var x: Int { //x의 역할은 tempX에 대해서 값을 연산해서 tempX에 할당하거나 리턴하는 역할만 한다. 
        get {
            return tempX
        }
        set(newValue) {
            tempX = newValue * 2
        }
    }
}

var p: Point = Point()
p.x = 12

[프로퍼티 옵저버(Property Observer)]

프로퍼티 옵저버: 특정 프로터피를 계속 관찰하고 있다가 프로퍼티의 값이 변경되면 이 값을 알아차리고 반응한다.

프로퍼티 옵저버는 우리가 프로퍼티의 값을 직접 변경하거나 시스템에서 자동 변경하는 경우에 상관없이 일단 프로퍼티 값이 설정되면 무조건 호출된다. (동일한 값이 재할당되어도 호출된다.)

예를 들면 저장 프로퍼티에 값을 저장하는 구문이 실행되거나 연산 프로퍼티에서 set구문이 실행되는 모든 경우에 프로퍼티 옵저버가 호출된다.

willSet: 프로퍼티의 값이 변경되기 직전에 호출되는 옵저버

  • 프로퍼티 값이 변경되기 전에 처리해야할 구문이 있다면 이 값을 이용해서 처리하면 된다.

  • 전달된 값은 참조만 가능(수정x)

  • 시스템에서 기본적으로 newValue라는 상수명 제공

var <프로퍼티명>: <타입> [= <초기값>] {
    willSet[(인자명)] {
        <프로퍼티 값이 변경되기 전에 실행할 내용>
    }
}
//대괄호[] 사이에 있는 구문은 생략 가능

didSet: 프로퍼티의 값이 변경된 직후에 호출되는 옵저버

  • 기존에 저장되어 있던 값이 매개상수 형태로 전달된다.

  • 프로퍼티 값이 변경된 후에 처리해야할 구문이 있다면 이 값을 이용해서 처리하면 된다.

  • 시스템에서 기본적으로 oldValue라는 상수명 제공

  • 새로 할당된 값이 필요할 때에는 프로퍼티 자체를 그냥 참조하면 된다. 새로운 값은 이미 프로퍼티에 저장되어 있는 상태이기 때문이다.

var <프로퍼티명>: <타입> [= <초기값>] {
    didSet[(인자명)] {
        <프로퍼티 값이 변경된 후에 실행할 내용>
    }
}
//대괄호[] 사이에 있는 구문은 생략 가능
\ 예전 값새로운 값
willSet프로퍼티를 참조newValue를 참조
didSetoldValue를 참조프로퍼티를 참조

참고

https://babbab2.tistory.com/118?category=828998
https://zeddios.tistory.com/243

profile
애플을 좋아하는 비전공생

0개의 댓글

Powered by GraphCDN, the GraphQL CDN