[SWIFT] KVC (Key - Value - Coding)

2021. 9. 20. 16:50SWIFT

반응형

오늘은 KVC에 대해 포스팅을 해보려고 합니다. 

그 동안 iOS 개발을 하면서 많이 사용했던 기억은 없는데요. 그래도 더욱 깊게 알아가려면 알아야하는 필수 지식인 것 같아서 공부를 해보았습니다.

 

KVC란?

KVC란 우선 Key-Value-Coding의 약자입니다. 

 

그렇다면 Key-Value-Coding이 뭐냐? 일반적으로 객체의 프로퍼티에 대해 접근할 때 직접 접근하는 방법이 아닌 간접적으로 접근을 해서 값을 설정하거나 가져올 수 있는 방식입니다.

 

이렇게만 설명하면 '간접적이 뭐고 직접적 방법이 뭔데..?'라고 생각할 수도 있습니다. 

한번, 간단한 예제를 통해서 알아볼게요~

 

우선, 이렇게 설정되어있는 People이라는 객체가 있습니다.

여기에 NSObject, @objc dynamic이라는 키워드에 대해서는 간단하게 뒤에서 설명할게요.

class People: NSObject {
    @objc dynamic var name: String
    @objc dynamic var age: Int
    @objc dynamic var job: String
    
    init() {
        self.name = "동동"
        self.age = 15
        self.job = "iOS Developer"
        super.init()
	}
}

그렇다면 이 객체를 이용해서 직접적인 접근과 간접적인 접근을 해보겠습니다. 

 

크게, 직접적인 접근은 여러분들이 평소에 알고 있는 방식일거구요. 

간접적인 접근은 Key를 이용한 접근 Key Path를 이용한 접근 2가지 입니다.

let firstPeople = People()

// 직접적으로 접근하는 방법
firstPeople.name // "동동"
firstPeople.age // 15
firstPeople.job // "iOS Developer"

firstPeople.name = "다른 사람 이름"
firstPeople.age = 28
firstPeople.job = "Android Developer"

// 간접적으로 접근하는 방법 - Key
firstPeople.value(forKey: "name")
firstPeople.value(forKey: "age")
firstPeople.value(forKey: "job")

firstPeople.setValue("다른 사람 이름", forKey: "name")
firstPeople.setValue(28, forKey: "age")
firstPeople.setValue("Android Developer", forKey: "job")

// 간접적으로 접근하는 방법 - Key Path
firstPeople[keyPath: \People.name] // "동동"
firstPeople[keyPath: \People.age] // 15
firstPeople[keyPath: \People.job] // "iOS Developer"

firstPeople[keyPath: \People.name] = "동동"
firstPeople[keyPath: \People.age] = 27
firstPeople[keyPath: \People.job] = "Andoroid Developer"

일단 세 방법다 모두 같은 결과를 가져오고 있어요.

그냥 방법이 다른 것뿐입니다. 근데 그렇다면 왜 이렇게 굳이 사용할까요?

 

우선 잘 알려진 장점으로는 프로퍼티에 간접적으로 접근하고 있고 해당 key의 값이 런타임 중에 결정되기 때문에, 각 객체의 의존도는 낮출 수 있다는 장점이 있습니다. 

 

(주관적인 생각) 그러나 제가 생각하기로는 위의 장점보다는 아직까지 Swift에서 Objective-C의 기능을 사용하는 부분이 어느정도 남아있기 때문에, 해당 개념을 사용할 수 밖에 없는 부분이 남아서인 것 같습니다. 예로 Core Data, KVO(Key-Value-Observing), Cocoa binding과 같은 기능들입니다. 이런 기능들을 사용하기 위해서는 아직까지 필수적으로 KVC를 사용해야만합니다. 

 

그리고 이부분에서 왜 위의 People 객체에서 NSObject를 상속받고 내부의 프로퍼티들이 @objc dynamic 키워드를 prefix로 붙이고 있는지를 설명해줍니다. 아직까지 Swift에서 Objective-C의 기능을 차용하고 있는 부분들이 있기 때문에, 해당 기능도 Objective-C에서 전환되지(?) 못한 기능인 것 같습니다.

 

그렇기 때문에, 앞에 prefix를 붙임으로서 Objective-C 런타임 중에 사용하겠다는 것을 컴파일러에게 알려주고 있는 것입니다. 이렇게 prefix로 붙인 변수들은 dynamic dispatch로서 런타임 중에 값이 할당되고 결정되게 됩니다. dynamic dispatch가 무엇인지 감이 잘안온다면, 이전에 포스팅했던 글을 참고해주세요 :) 

 

[SWIFT] Swift Method Dispatch - Dynamic, Static

안녕하세요 :) 저희는 매주 월요일 주간 회의를 진행하는데, 희의를 진행할 때 리더님이 주제를 하나씩 가져와주셔서 대화의 장을 마련해주십니다. (덕분에 많은 것을 배우고 있습니다..) 그래서

dongminyoon.tistory.com

 

 

아 그리고 마지막으로 Key, Key Path를 이용하는 방법의 차이점은 Key는 하나의 값에 대해 String 값인 Key를 이용해서 접근하고 있고  Key Path의 경우는 .을 이용해서 체이닝을 하여 내부의 내부 값까지 접근이 가능하다는 차이가 있습니다 :)

 

크게 어려운 내용은 아니지만 오늘은 Swift에서 KVC에 대해서 간단하게 알아보았습니다.

다음은 KVO에 대해서 포스팅해보겠습니다 :)

감사합니다~

 

반응형