[Study 3회차] Swift 계산 타입 속성과 속성 감시자

yxxjxn·2023년 1월 25일

swift study

목록 보기
2/8

계산 타입 속성

특징

    1. 상속시 재정의가 가능하다. → class 키워드를 사용해야한다.

      class Shape {
          static var length: Double = 0, width: Double = 0
          
          class var area: Double{
              return length * width
          }
      }
      
      class Circle: Shape{
          
          static override var area: Double{
              return length * length * 3.14
          }
      
      }
    • class 키워드를 사용해야한다.
    1. var 키워드만 사용 가능하다. → 그때그때 계산을 하기 때문에, var로만!
    1. 계산 속성 → 메서드이기 때문에 메모리 공간 할당 x

      class Circle {
      	static var multiPi: Double{
      		return pi * 2
      	}
      }

주의점

  • 인스턴스에 속한 속성이 아니므로 인스턴스 이름으로 접근이 불가능하다.
    • 타입 이름 + 속성
  • 어떤 경우에 타입 속성을 선언해야하나?
    • 보편적인 속성이거나, 모든 인스터에서 공유해야하는 성격 등
    • 예 ) 해당 클래스에 접근하는 횟수 count 등
  • 상속에서 재정의
    • 저장 타입 속성 ⇒ 불가능
    • 계산 타입 속성 ⇒ 가능
  • 타입 끼리는 이름만으로 접근이 가능하지만, 타입이 아닌것은 Circle.pi 이런식으로 같은 클래스 내부에 선언되어있더라도 풀네임으로 접근해야한다!

속성 감시자

  • 변화 시점을 관찰하는 메서드, 변경 내용 반영
  • (저장) 속성 감시자라고 생각하는게 편하다.
    • 계산 속성에도 감시자를 붙일 수 있지만, 상속해서 재정의 하는 경우에만 가능하므로 계산 속성은 본래 계산 속성의 get set을 이용하는 것이 유리하다.
  • 어떤 속성이 변하는 시점을 알아차리도록 시점에 제약을 만드는 코드를 짜기는 어려움 → 어플 만들때 활용하기 좋은 수단이다.
  • willSet / didSet 중에 하나만 구현하면 된다. → 일반적으로 didSet
    • willSet : 저장되기 직전에 호출
    • didSet : 저장된 직후에 호출
class Profile1 {
    var statusMessage: String {
        willSet(message) {  // 바뀔 값이 파라미터로 전달
            print("메세지가 \(statusMessage)에서 \(message)로 변경될 예정입니다.")
            print("상태메세지 업데이트 준비")
        }
        didSet(message) {   // 바뀌기 전의 과거값이 파라미터로 전달
            print("메세지가 \(message)에서 \(statusMessage)로 이미 변경되었습니다.")
            print("상태메세지 업데이트 완료")
        }
    }
    
    init(message: String) {
        self.statusMessage = message
    }
}

let profile1 = Profile1(message: "기본 상태메세지")  
profile1.statusMessage = "기분 좋아졌으"
  • 초기화시, willSet/didSet이 호출되지는 않음
    메세지가 기본 상태메세지에서 기분 좋아졌으로 변경될 예정입니다.
    상태메세지 업데이트 준비
    메세지가 기본 상태메세지에서 기분 좋아졌으로 이미 변경되었습니다.
    상태메세지 업데이트 완료
let profile1 = Profile1(message: "기본 상태메세지")
profile1.statusMessage = "기본 상태메세지"
  • 속성 감시자 호출 ? or Not?

파라미터의 생략

  • 파라미터로 넘겨주는게 부담스러울 수도 있다.

  • willSet이 실행될때는 기존 값이 변경되기 전인 상태이다 → 변경될 값을 - newValue 이용

  • didSet이 실행될대는 새로운 값으로 변경된 상태이다 → 기존값을 oldValue 이용

class Profile2 {
    var statusMessage = "기본 상태메세지" {
        willSet {
            print("메세지가 \(statusMessage)에서 \(newValue)로 변경될 예정입니다.")
            print("상태메세지 업데이트 준비")
        }
        didSet {
            print("메세지가 \(oldValue)에서 \(statusMessage)로 이미 변경되었습니다.")
            print("상태메세지 업데이트 완료")
        }
    }
}
profile
macos

0개의 댓글