티스토리 뷰
Codable
안녕하세요 토니입니다 :)
JSON 파싱을 들어보신 분이라면 한번쯤 접해봤을 키워드 Codable!
과연 이게 뭘까요?
그래서 오늘은 이 키워드에 대해 같이 알아볼까해요
도대체 Codable이 뭐냐!!

음.... 자기 자신을 변환하거나 외부적 표현으로 변환할 수 있는 타입이라고 쓰여있네요...
솔직하게 뭔 말인지는 이해가 안가요 그쵸?
외부적표현이 뭐지?? 싶죠..
일단은 뭐 대충 Codable은 변환을 해주는 거...라고 생각을 해보면 되겠네요

Codable이 어떻게 이루어져있는 지 봤더니 Decodable & Encodable로 이루어져있네요
자 그럼 이제 이 두개가 뭔지 알아야겠죵?


우선 알 수 있는 사실은 이 친구들은 프로토콜!!!!
그러면 Codable은 뭐다? Encodable & Decodable 프로토콜을 준수하는 프로토콜이다~!
그럼 각각 설명을 볼까여?
Encodable : 자기 자신을 외부적 표현으로 인코딩할 수 있는 타입이고
Decodable : 자기 자신을 외부적표현으로부터 디코딩할 수 있는 타입...
ㅎㅎ
뭐라는거야
이쯤 됐으면 외부적 표현이 뭔질 모르면 안되겠다 싶어서 찾아봤는데요

열심히 뒤적뒤적 해보니까 외부적표현은 JSON 같은 것이라고 이해하시면 될 것 같아요!!
아하 이제 JSON을 대입해서 읽어보면...
JSON으로 인코딩을 하거나 JSON으로부터 디코딩을 하겠군요!
조금씩 감이 오시나요??
그러면 이제 어떻게 사용을 하냐면 Codable은 프로토콜이죠???
고맙게도 Class, Struct, Enum에서 모두 사용할 수 있다고 하네요!
Encoding 부터 한번 같이 볼까요?
그러면 이제
Encoding은 내가 원하는 Class, Struct, Enum 등의 인스턴스를 JSON 형태로 만들어주는 것!
이라고 결론지을 수 있겠죠?
자 간단한 Struct를 만들어봤어요 Codable은 프로토콜이니까 채택을 했구요!

이렇게 Codable을 채택하면 Decodable과 Encodable을 둘다 모두 채택한 것과 마찬가지라는 것.. 이젠 아시겠죠?
그럼 이제 Codable을 채택한 Human은 위에서 말했듯이 외부적 표현(JSON) 으로 변환이 가능합니다!
이제 Encoding하고 싶은 Human 타입의 인스턴스를 하나 만들구요!

그 다음 Encoding을 해볼게요!

어렵지않죠???
JSONEncoder 클래스에 encode메서드를 호출해주는데, 이때 Codable 프로토콜을 준수하는 구조체 타입을 넣어주면
JSON데이터를 쉽게 만들수있어요!
결과도 한번찍어볼까요??

크.. 제대로 나오는 것을 볼 수가 있네요!
여기서 잠깐! eccode 메서드를 잠깐 짚고 넘어가자면

Generic으로 선언된 T. 즉, encode 안에 올 수 있는 값은 Encodable이라는 프로토콜을 준수해야만 하겠네요!
우리가 만든 건 Codable이니 당연히 준수하겠죠?
그리고 throws가 있는 것 보이죠?
Encoding 중 에러를 발생 시킬수도 있기 때문에 반드시 반드시 try 키워드와 함께 써야해요!
코드를 첨부할게요!
struct Human: Codable {
var name: String
var age: Int
}
let toni: Human = Human(name: "Toni", age: 200)
let jsonData = try? JSONEncoder().encode(toni)
if let data = jsonData, let jsonString = String(data: data, encoding: .utf8) {
print(jsonString)
}
여기까지 Encoding을 해보았는데요..
우리는 Decoding을 더 많이 다루니까...
바로 가볼까요?
먼저 Encoding은 내가 원하는 Class, Struct, Enum 등의 인스턴스를 JSON 형태로 만들어주는 것! 이라고 했던 것 기억나시나요?
그럼 Decoding은 반대로 JSON 형태의 Data를 Struct, Class, Enum 등의 인스턴스에 파싱! 이라고 하면 될 것 같지않나요?
순서도 반대로 하면 될것같구요!
그러면 왠지 JSONDecoder를 사용하면 될 것 같죠?
그러면 먼저 Decodable을 준수하는 구조체가 필요할 것 같아요!
서버에서 name과 age가 담긴 JSON 데이터를 줄거니까요!!

그리고 서버에서 줄 데이터...라고 할 JSON 데이터를 만들구요

바로 Decoding 가시죠!
이 JSON data를 Human이라는 구조체 변수에 Decoding을 하는거죠~

결과를 한번볼까요??

크.. 어떤가요? 어렵지않죠??
코드를 첨부할 건데요! 이렇게도 작성할 수 있답니다!
let jsonString = """
{
"name" : "Toni",
"age" : 200
}
"""
let decoder = JSONDecoder()
var data = jsonString.data(using: .utf8)
if let data = data, let human = try? decoder.decode(Human.self, from: data) {
print(human.name)
print(human.age)
}
그 리 고
끝마치기전에 여기서도 decode 메서드에 대해서도 잠깐 살펴볼게요!
궁금하신 분들이 있을 수도 있으니까요
원형은 이건데요!

저기 위에서 Human.self 가 들어간 자리가 타입의 자리인걸 확인할 수 있네요
이 타입은 Decode할 값의 타입!!! 이라서 Decodable을 준수해야만 해요!
역시나 Decoding 중 오류가 발생할 수 있기에 try키워드를 사용해주었구요!
게다가 우리가 JSON으로 만들고 싶었던게 Human 타입이였죠?? 그래서 Human.self가 들어가게 된거에요!
그래서 이걸 한문장으로 요약하자면 !!!!
Human 타입의 구조체를 하나 만들고, JSON Data의 Key값과 동일한 이름을 가진 프로퍼티에 value의 값을 파싱하고 리턴을 함!!
입니당..
어떠신가요 이해가 조금 되셨나요?
오늘은 Codable에 대해 좀 알아보았는데요!
질문이나 틀린점 지적은 언제든지 환영입니다!!!!
'Swift' 카테고리의 다른 글
| Swift - 스토리보드를 분할하고 화면 이동하기!!! (0) | 2021.12.19 |
|---|---|
| Swift - 의존성 주입 (Dependency Injection) ...? (0) | 2021.12.12 |
| Swift - Table View - DataSource, Delegate (0) | 2021.12.07 |
- Total
- Today
- Yesterday
- osi7계층
- 야곰 아카데미
- Codable
- 반효경
- Publisher
- subscriber
- 의존성 주입
- 롯데 렌탈
- 운영체제
- Decodable
- Operator
- 프로젝트에 적용
- 취준
- dataSource
- Encodable
- 개발자 취업
- ios
- 스토리보드 분할
- DIP
- 화면 이동
- 야곰
- Parse
- 코딩테스트
- 공개 채용
- Swift
- 롯데그룹 공개채용
- UITableViewDelegate
- 프로그래머스
- Combine
- UITableViewDataSource
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |