[swift]TIL_Properties[2]

Jeff·2024년 11월 15일
1

오늘은 어제에 이어서 남은 타입 속성 프로퍼티와 속성 감시자에 대해서 공부해보았다.

Type Properies(타입 프로퍼티)

타입 프로퍼티는 타입 자체에 속한 프로퍼티로, 클래스나 구조체, 열거형의 모든 인스턴스가 공유하는 프로퍼티이다. 즉, 특정 인스턴스에 속하는게 아닌 타입 전체에 속한다.

# 특징

  • 모든 인스턴스가 같은 타입 프로퍼티에 접근할 수 있으며, 그 값이 변경되면 모든 인스턴스에서 공유가 된다.

  • 내/외부에서 접근이 가능하며, 인스턴스를 생성하지 않아도 타입 이름으로 바로 접근할 수 있다.
    -> Type.property로 접근해야한다.

  • 두가지의 타입이 존재하는데 하나는 저장 타입 속성, 다른 하나는 계산 타입 속성이 있다.

    • 저장 타입 속성 : 타입에 속하며 초기값이 저장되고 이후 필요에 따라 수정할 수 있다.

      • static 키워드를 사용해서 선언
      • let, var 선언이 둘다 가능하고, 항상 기본값(초기값)을 할당해줘야 한다.
      • 모든 인스턴스가 동일하게 가져야하는 보편적인 속성이나, 공유해야하는 성격에 가까운 저장 속성을 사용하려고 할 때 좋다.
      • 자체적으로 지연(lazy) 속성의 성격을 가지고 있어 호출시 메모리에 한번만 할당이 된다.
    • 계산 타입 속성 : 계산된 결과를 반환하며, 항상 최신 상태의 값을 제공한다.

      • static 키워드 또는 class 키워드를 사용해서 선언 (class 키워드는 subClass에서 재정의 할 수 있다.)
      • var만 사용이 가능하다 (계산 속성이기에)
      • 메서드이기 때문에 타입에 메모리 공간을 할당되어있지 않는다(계산 속성이기에)

# 사용하는 이유

  • 모든 인슨터스가 공유하는 데이터가 필요할 때 주로 사용하며, 예를 들면 최대, 최소값, 상수 값등에 사용이 된다.
  • 인스턴스가 생성되지 않았을 때도 사용해야하는 데이터가 있을 때, 예를 들어 통계나 전역 상태 저장 등에 유용하다.
  • 계산 타입 정보를 제공해야하는 경우, 예를 들어 타입 수준에서 특정 상태나 설정값 등을 계산해 제공할 때

# 예시 코드


Property Observers(속성 감시자)

프로퍼티의 값이 변경되는지 관찰하고 응답한다. 프로퍼티 관찰자는 프로퍼티의 현재 값이 새로운 값과 같더라도 프로퍼티의 값이 설정될 때 호출된다. 즉, 저장 프로퍼티의 값이 변경될 때 실행되는 코드 블록이다.

# 특징

  • 저장속성 자체는 var로만 선언 가능하다. -> let은 관찰할 필요가 없고, 지연저장 속성은 관찰이 안되기 때문이다.
  • 자료형을 선언하는 것은 일반 변수와 동일하다. -> 기본 값을 넣으면 타입 추론이 가능하다.
  • 저장 속성의 변화시점을 관찰하는 실질적 메서드이며, 타입/인스턴스 둘다 사용 가능하다.

  • willSet
    • (값이 변할때) 새 값이 저장되기 직전에 호출됨
    • 새로운 값에 접근할 수 있으며, 기본적으로 newValue라는 매개변수로 전달된다.
  • didSet
    • (값이 변할때) 새 값이 저장된 직 후에 호출됨
    • 이전 값에 접근할 수 있으며, 기본적으로 oldValue는 매개변수로 전달된다.
  • willSet 또는 didSet 중에서 한가지만 구현하면 된다(일반적으론 didSet을 구현)
  • 변수가 변하면, 업데이트 하려는 패턴 구현할 때 사용
    - 예를 들어, 상태메세지, 프로필 사진 서버에서 변화 -> (화면) 업데이트

# 사용 시점

  • 값이 변경되면 UI를 동기화해야하는 경우
  • 값 변경 시 유효성을 확인하거나 변경 이력을 기록하는 경우
  • 값 변경에 따라 다른 작업을 수행해야 할 떄
  • 저장 프로퍼티의 값이 변경을 제어하거나 변경된 값을 기반으로 작업할 때 매우 유용

# 의문점

  • lazy 저장 프로퍼티에서는 관찰자를 사용할 수 없다.(값이 설정되기 전까지 초기화되지 않기 때문)
    • 초기값 설정에서 프로퍼티 관찰자가 호출되지 않는다는 건 프로퍼티의 초기값을 설정하거나 이니셜라이저에서 값을 할당할 때는 willSet, didSet을 호출되지 않는다.
    • 즉, 이 과정은 값이 변경되는게 아니라 처음으로 설정되는 것이기에 프로퍼티 옵저버는 반응을 하지 않는다는 것이다.
  • didSet과 willSet은 값이 변경될 때 행동을 취한다는데 그럼 에러처리도 가능할까?
    • didSet은 값이 변경된 후에 호출을 하기에 변경된 값을 기반으로 작업을 하기에 값을 강제로 원래 상태로 되돌리거나, 에러르 던지는 작업에 적합하지 않는다.
    • 그렇다면 willSet은 값이 변경되기 직전에 가능하지 않을까 했지만, 조건을 검사하고 특정 동작을 하게 해줄 순 있지만 이미 값은 변경이 되어서 되돌릴 수가 없기 때문에 부적절하다.

# 예시코드

profile
기본에 충실한 개발자가 목표!

1개의 댓글

comment-user-thumbnail
2024년 11월 15일

오... 스테틱,, 아직도 스테틱이랑 private 볼 때마다 낯설어요

답글 달기