프로퍼티 옵저버 (didSet , willSet) , 타입 캐스팅 (is , as)

프로퍼티 옵저버

프로퍼티 옵저버는 프로퍼티의 값이 변경될 때 특정한 동작을 수행할 수 있게 해주는 기능이다.

프로퍼티의 값이 변경되기 전 (willSet) 과 변경된 후 (didSet) 에 호출됩니다. 이를 통해 값의 변화를 감지하고 추가 작업을 수행할 수 있다.

didSet

프로퍼티의 값이 변경된 후에 호출되는 옵저버, 이 옵저버는 이전 값과 새로운 값 사이의 변화를 감지하거나, 값에 따른 추가적인 동작을 수행할 수 있다. 매개변수로는 변경되기 전의 값이 전달된다.

willSet

프로퍼티의 값이 변경되기 전에 호출되는 옵저버, 이 옵저버는 새로운 값이 어떤 것인지 파악하거나, 변경 전 상태를 저장하는 등 작업을 수행할 수 있다. 매개변수로는 변경될 값이 전달된다.

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("새로운 값을 입력 \\(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue {
                print("Added \\(totalSteps - oldValue) steps")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.totalSteps = 200
stepCounter.totalSteps = 360

타입 캐스팅

타입 캐스팅은 swift 에서 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 프로세스를 의미한다. 이는 코드에서 다른 데이터 타입으로의 변환이 필요한 경우 유용하게 사용된다.

업캐스팅(Upcasting)

  • 서브클래스의 타입을 슈퍼클래스 타입으로 캐스팅하는 것
  • 슈퍼클래스 타입에는 서브클래스의 모든 멤버가 포함되지 않을 수 있다.
  • 안전하게 이루어지는 캐스팅
class Aniaml {}
class Dog: Animal {}

let dog = Dog()
let animal: Animal = dog // Upcasting

다운캐스팅(Downcasting)

  • 슈퍼클래스 타입의 인스턴스를 서브클래스 타입으로 캐스팅 하는 것
  • 다운캐스팅은 항상 옵셔널 타입으로 반환 된다.
  • 다운캐스팅 시 원래 타입이 캐스팅하려는 타입과 일치하지 않으면 런타임 오류가 발생한다.
let animal = Animal()
if let dog = animal as? Dog {
		print("Dog로 성공적인 다운캐스팅")
} else {
		print("Dog로 다운캐스팅 실패")
}

강제 다운캐스팅(Forced Downcasting)

  • as 연산자를 사용하여 강제로 다운 캐스팅
  • 강제 다운캐스팅은 옵셔널로 반환하지 않아 nil 값으로 반환이 불가하다.
  • 다운캐스팅에 실패 시 런타임 오류 발생
let animal = Animal()
let dog = animal as! Dog

is 연산자

is 연산자를 사용하여 인스턴스가 특정 클래스의 인스턴스인지 확인할 수 있다.

If someInstance is Dog {
		print("someInstance 는 Dog 클래스의 인스턴스 입니다.")
}

as 연산자

let dog = Dog()
let animal: Animal = dog as Animal // 업캐스팅

위 코드에서 dog 인스턴스를 Animal 타입으로 업캐스팅하고 있다.

이 경우 Dog 클래스가 Animal 클래스의 서브클래스 이기 때문에 가능

let animal = Animal()
if let dog = animal as? Dog {
		//다운캐스팅에 성공한 경우
		print("성공적")
} else {
		//다운캐스팅에 실패한 경우
		print("실패")
}

위 코드에서 as 연산자는 다운캐스팅을 시도하고 실패할 경우 nil 로 반환한다.

따라서 if let 구문을 사용하여 옵셔널 바인딩을 수행

let animal = Animal()
let dog = animal as! Dog // 강제 다운캐스팅

위의 코드에서 as! 연산자는 강제 다운캐스팅을 수행한다.

만약 다운캐스팅에 실패하면 런타임 오류가 발생하므로 주의

as 연산자는 업캐스팅과 다운캐스팅 모두 사용되며, 컴파일러에게 캐스팅을 명시적으로 지정한다.