본문 바로가기

Swift/문법

[Swift] 프로퍼티

프로퍼티


프로퍼티는 클래스. 구조체, 열거형과 관련한 값입니다. 프로퍼티의 종류에는 저장 프로퍼티와 계산된 프로퍼티가 있습니다.

저장 프로퍼티는 값을 저장해 주는 프로퍼티이고 계산 프로퍼티는 계산된 프로퍼티의 값을 저장하지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티입니다. 계산 프로퍼티는 클래스, 주조체, 열거형 모두에서 사용가능하지만, 저장프로퍼티는 클래스와 구조체에서만 사용할 수 있습니다.

저장 프로퍼티?

  • 값을 저장하고 있는 프로퍼티
  • let 키워드를 이용해서 상수 혹은 var 키워드를 이용해서 변수로 선언할 수 있습니다.

상수 구조체 인스턴스의 저장 프로퍼티

  • 구조체를 상수로 선언하면 구조체 인스턴스의 프로퍼티를 변경할 수 없습니다.
  • 구조체를 let으로 선언하면 프로퍼티를 변경할 수 없습니다.
  • 구조체가 아닌 클래스는 let으로 선언하더라도 프로퍼티가 변경가능합니다.
  • 클래스 인스턴스는 참조 타입이기 때문에 let을 쓰더라도 프로퍼티 변경 가능

지연 저장 프로퍼티

  • 지연 저장 프로퍼티는 값이 처음으로 사용되기 전에는 계산되지 않는 프로퍼티입니다.
  • 지연 저장 프로퍼티를 선언하기 위해서는 프로퍼티의 선언 압에 lazy를 붙이면 됩니다.
  • 지연 프로퍼티를 선언하면 실제 프로퍼티를 사용하기 전에는 복잡하고 시간이 오래 소요되는 연산을 할 필요가 없다는 것입니다.

지연 프로퍼티는 반드시 변수로 선언해야 합니다. 이유는 상수는 초기화가 되기 전에 항상 값을 같은 프로퍼티인데, 지연 프로퍼티는 처음 사용되기 전에는 값을 갖지 않는 프로퍼티이기 때문입니다.

만약 지연 프로퍼티가 여러 스레드에서 사용되면 지연 프로퍼티가 한 번만 실행되는 걸 보장하지 않습니다. 만약 지연 프로퍼티가 단일 스레드에서 사용되면 초기화는 한번만 합니다.

저장 프로퍼티와 인스턴스 변수

  • 프로퍼티의 이름, 타입, 메모리관리 등의 모든 정보를 프로퍼티를 선언하는 한 곳에 정의하게 됩니다.

계산프로퍼티

  • 클래스, 구조체, 열거형은 계산된 프로퍼티를 선언할 수 있습니다.
  • 계산된 프로퍼티는 실제 값을 저장하고 있는 것이 아니라 getter와 optional 한 setter를 제공해 값을 탐색하고 간접적으로 다른 프로퍼티 값을 설정할 수 있는 방법을 제공합니다.

Setter 성언의 간략한 표현

  • Setter의 인자 이름을 set()라고 명시하는 것과 그냥 이름을 지정하지 않으면 인자 기본 이름인 newValue를 사용할 수 있습니다.

읽기 전용 계산된 프로퍼티

  • getter만 있고 setter를 제공하지 않는 계산된 프로퍼티를 읽기 전용 계산된 프로퍼티라고 합니다
  • 읽기 전용 계산된 프로퍼티는 반드시 반환 값을 제공하고 다른 값을 지정할 수는 없는 프로퍼티입니다.

읽기 전용 프로퍼티는 let이 아니라 var로 선언해야 합니다. 보통 읽기전용이라 함은 한번 값이 정해지면 변하지 않기 떄문에 let으로 선언하는 것이 맞으나 계산된 프로퍼티는 읽기전용이라 하더라도 계산 값에 따라 값이 변할 수 있는 var로 선언해야합니다.

struct Cuboid {
        var width = 0.0
        var height = 0.0
        var depth = 0.0

        var volume: Double {
                return width * height * depth
    }
}

let cuboid = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print(cuboid.volume) // 40 출력

프로퍼티 옵서버

  • 프로퍼티는 새 값이 될 때마다 이벤트를 감지할 수 있는 옵서버를 제공합니다.

  • 프로퍼티 옵서버는 새 값이 모두 값이 이전과 같더라도 항상 호출합니다.

  • 지정 저장 프로퍼티는 사용할 수 없습니다.

  • 계산된 프로퍼티는 setter에서 값의 변화를 감지할 수 있기 때문에 옵서버를 정의할 필요 없습니다.

  • 두 가지 옵서버가 존재합니다.전역변수와 지역변수

    • wilSet: 값이 저장되기 바로 직전 호출됨

    • didSet: 새 값이 저장되고 난 직후 호출

    • (willSet에서는 새 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 newValue를 사용합니다.)

    • (didSet에서는 바뀌기 전에 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 oldValue를 사용합니다.)

      서브 클래스에서 특정 프로퍼티의 값을 설정할 때, 슈퍼클래스의 초기자가 호출된 후 willSet, didSet 프로퍼티 옵서버가 실행됩니다.

    • 전역변수: 함수, 메소드, 클로저 혹은 타입 컨텍스트 밖에 정의된 변수입니다.

    • 지역 변수: 그안에 선언된 변수를 말합니다.

      전역 상수와 변수는 지연 저장 프로퍼티와 같이 지연 계산 됩니다. 하지 마 지연 저장 프로퍼티와 다르게 lazy 키워드를 붙일 필요 없습니다. 반면 지역 상수와 변수는 지연 계산될 수 없습니다.

    • 인스턴스 프로퍼티는 특정 인스턴스에 속한 프로퍼티를 말합니다.

    • 새로운 인스터스가 생성될 때마다 새로운 프로퍼티도 같이 생성합니다.

    • 타입 프로퍼티는 특정 타입에 속한 프로퍼티로 그 타입에 해당하는 단 하나의 프로퍼티만 생성합니다.

      인스턴스 프로퍼티와는 다르게 타입 프로퍼티는 항상 초기값을 지정해서 사용해야 합니다. 이유는 초기자가 없어서 초기화할 곳이 없지 때문입니다.

    • 타입 프로퍼티를 선언할려면 static 키워드를 사용해야합니다.

      • 클래스에서 static과 class 이렇게 2가지 형태로 선언할 수 있습니다.
        • class로 선언된 프로퍼티는 서브 클래스에서 오버라이딩이 가능합니다.
  • 타입 프로퍼티 구문

  • 타입 프로퍼티

  • 만약 in-out 파라미터로 선언된 함수의 인자에 프로퍼티를 넘기면 willSet과 didSet이 항상 실행됩니다. 이유는 in-out 파라미터이기 때문에 프로퍼티가 항상 복사하기 때문에 in-out 파라미터의 항상 원래 값에 새 값을 다시 덮어쓰게 됩니다.

위의 계산된 타입 프로퍼티는 읽기 전용이지만, 같은 문법으로 계산된 인스턴스 타입 프로퍼티에서는 읽고 쓸 수 있는 프로퍼티로 사용 가능합니다.

'Swift > 문법' 카테고리의 다른 글

[Swift] ARC  (0) 2023.06.11
[Swift] 함수  (0) 2023.06.09
[Swift] 흐름 제어  (0) 2023.06.08
[Swift] 데이터 타입  (0) 2023.06.07
[Swift] 프로퍼티  (0) 2023.03.19