본문 바로가기
YAGOM CAREER STARTER

[TIL] 20230104: KVO

by Rhode 2023. 1. 4.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.

 


키-밸류 옵저빙 Key-Value Observing(KVO)

KVO는 프로퍼티의 다른 오브젝트가 변경되었을 때 오브젝트가 알림 받을 수 있도록 하는 메커니즘이다. 어플리케이션의 결합측면에 있어서 중요한 요소라고 볼 수 있다. MVC 디자인 패턴을 따르는 어플리케이션의 오브젝트끼리 상호작용을 할 수 있게 만드는 모드이다. 예를 들어서, model 오브젝트를 view나 controller 레이어의 오브젝트와 같이 움직이게 할 때 KVO를 사용할 수 있다. 전형적으로는, controller 오브젝트는 model 오브젝트를 관찰하고, view 오브젝트는 controller 오브젝트나 model 오브젝트를 관찰한다.

 

KVO를 적용하게 되면, 한 오브젝트는 일대일이나 일대다 관계로 다른 오브젝트의 속성이나 특성들을 관찰할 수 있다. 이 때, 오브젝트는 무엇이 프로퍼티에서 현재 우선시되는 값인지 찾아낼 수 있다. 다대다 관계에서 observer는 어떤 타입의 변화가 만들어졌는지 뿐만 아니라, 어떤 오브젝트가 그 변화에 기여하고 있는지를 전달받게 된다.

알림 메커니즘으로서, KVO는 NSNotifiction과 NSNotificationCenter 클래스에서 제공되는 메커니즘과 비슷한 성격을 가지는데, 뭐 차이점도 있다. observer로 등록된 모든 오브젝트에게 알림을 주는 중앙 오브젝트와는 달리, KVO 알림은 프로퍼티 값의 변화가 생겼을 때 옵저빙 오브젝트에게 바로 전달된다.

순수한 Swift 코드에서는 그리 썩 좋은 것은 아니다. 왜냐면 이것은 Object-C 런타임에 의존하기 때문이다. KVO를 사용하기 위해서는 NSObject에서 상속 된 @objc 클래스를 사용해야하고, 그 다음으로는 프로퍼티들에 @objc dynamic을 붙여줘야한다.

KVO 구현

근본 클래스인 NSObject는 상속할 필요가 거의 없는 KVO를 기본적으로 구현한다. 그래서 모든 Cocoa 오브젝트가 선천적으로 KVO가 가능하다고 볼 수 있다. KVO 알림을 받기 위해선, 다음과 같은 것들을 따라야한다:

  • 옵저브 하고자하는 프로퍼티에 대해서 observed 클래스가 KVO를 따르고 있다는 것을 확실하게 해야한다: 
    • 클래스는 KVC를 따르고 있어야한다.
    • 클래스는 자동 혹은 수동으로 알림을 보낼 수 있어야한다.
  • 다른 클래스의 프로퍼티를 옵저브 하기 위해 사용될 클래스를 observer로 설정해야한다.
    • addObserver:forKeyPath:options:context:를 사용해서 설정할 수 있다.
  • observer 오브젝트에 observeValueForKeyPath:ofObject:change:context: 메서드를 구현한다.

 

KVC

KVC는 오브젝트의 프로퍼티에 간접적으로 접근하도록 하는 코딩의 형태이다. 프로퍼티의 접근자를 사용하거나 직접적으로 변수에 접근하지 않고 String을 사용해서 접근한다. 이런 메커니즘을 가능하게 하려면 클래스가 NSKeyValueCoding라는 informal protocol을 따라야한다. 

informal protocol
암시적으로 거의 모든 오브젝트가 프로토콜을 채택하도록 만드는 NSObject의 한 범주이다. informal protocol에서 메서드의 구현은 필수적이지 않다(옵셔널하다). 메서드를 호출하기 전에, 호출하는 오브젝트는 타겟 오브젝트가 그것을 구현하고 있는지 확인한다. optional protocol 메서드가 Ojective-C 2.0에 도입되기 전까지, informal protocol은 Foundation과 AppKit 클래스가 delegation(델리게이션/위임)을 하는데에 있어서 필수적이었다.
NSKeyValueCoding informal protocol
KVC를 작동시키기 위해서 필수적인 프로토콜이다. KVC와 KVO를 사용하기 위해서는 클래스가 이 프로토콜을 따르고 있어야한다. 그래서 Foundation 프레임워크에서 정의된 모든 클래스와 NSObject를 상속하는 모든 클래스는 NSKeyValueCoding 프로토콜을 따르고 있다고 볼 수 있다.

 

 

 

 

 

 

 

참고

 

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html

 

Key-value observing

Retired Document Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid. Key-value observing Key-value observing is a mechanism that enables an object to be notified

developer.apple.com

https://hackernoon.com/kvo-kvc-in-swift-12f77300c387

 

KVO & KVC In swift | HackerNoon

Flow of the program depends on the value of the various variables we use in our code. Depending on the values of the variables in our program, we navigate the flow of execution as we needed / required.

hackernoon.com