-
안녕하세요.
저번 시간에는 NSCoding을 알아봤으니
오늘은 Codable에 대해서 알아보겠습니다.
https://developer.apple.com/documentation/swift/codable
Codable은 공식문서에서 보이듯이 Decodable과 Encodable을 합친 프로토콜인데요.
워낙 두 프로토콜을 같이 쓰는 경우가 많다보니 아예 공식적으로 Codable을 만든 것 같아요.
설명을 보면 자기 자신으로 변환되거나 외부 표현으로 변환될 수 있는 타입이라고 하네요.
저희는 이 표현이 인코딩과 디코딩을 의미하는 것을 NSCoding을 학습하면서 배웠습니다.
그럼 Decodable과 Encodable을 알아봐야겠죠?
Decodable
https://developer.apple.com/documentation/swift/decodable
공식문서 설명에 따르면 외부 표현으로부터 자기 자신으로 디코딩 될 수 있는 타입이라고 하네요.
어떻게 사용하는지 한 번 직접 구현해보도록 하겠습니다.
우선 json 파일을 하나 만들어보겠습니다.
그리고 Decodable을 채택한 구조체를 만들었습니다.
CodingKeys 열거형은 프로퍼티의 이름과 json파일의 속성의 이름이 다를 경우 선언하여야 합니다.
number 속성을 testInteger에 할당한다는 의미입니다.
만약 프로퍼티의 이름이 json 파일의 속성과 같을 경우에는 선언할 필요 없습니다.
그럼 json 파일을 어떻게 이 구조체로 디코딩하느냐
먼저 json 파일의 경로를 찾고 이 파일을 data 타입으로 변환시킵니다.
그 후 JSONDecoder 타입의 인스턴스를 생성해 데이터를 직접 생성한 타입으로 디코딩하면 됩니다.
출력했을 때 제대로 보이는 것을 확인할 수 있습니다.
Encodable
https://developer.apple.com/documentation/swift/encodable
Decodable에 대해서 알았으면 Encodable은 간단합니다.
인코딩은 디코딩의 역순으로 진행하면 됩니다.
구조체에 Encodable 프로토콜을 채택하고
JSONEncoder 타입의 인스턴스를 이용해 encode를 진행해주면 됩니다.
JSON 형식으로 출력되는 것을 확인할 수 있습니다.
그럼 Codable과 NSCoding의 차이가 무엇이냐
Codable은 구조체와 클래스 모두 채택 가능하고 NSCoding은 클래스만 채택가능한 프로토콜입니다.
그럼 Codable이 무조건 좋은 것 아니냐? 이렇게 생각하실 수도 있습니다.
저도 Codable이 더 나중에 등장하기도 했고 구조체, 클래스 모두 사용가능하길래 그런 식으로 생각한 적이 있는데요.
다형성으로 동작하는 경우가 문제가 발생합니다.
이런 식으로 상위 클래스인 SuperTest를 상속받는 SubTest를 구현하였을 때
SuperTest 타입의 인스턴스를 가지는 배열을 생성할 수 있습니다.
당연히 SuperTest를 상속받는 subTest도 삽입이 가능합니다.
그러나 해당 배열을 인코딩 후 디코딩하게 된다면 SuperTest의 타입으로 디코딩되어 하위 타입으로 디코딩되지 않는 것을 확인할 수 있습니다.
따라서 좀 더 동적인 디코딩을 하기 위해서는 NSCoding이 적합합니다.
두 프로토콜 모두 동시에 채택이 가능하니 상황에 맞는 프로토콜을 채택하는 것이 중요하다고 생각됩니다.
'Swift' 카테고리의 다른 글
Property Wrapper (0) 2022.03.25 SOLID 원칙 (0) 2022.01.28 NSCoder (0) 2021.12.27 escaping closure(탈출 클로저) (0) 2021.12.23 Hashable (0) 2021.12.17