[Swift] 어떻게 구조체 이름이 Data냐구요
개발🧑‍💻/Swift

[Swift] 어떻게 구조체 이름이 Data냐구요

⚠️ 공식문서를 읽고 제가 해석(파파고), 의역한 정보도 포함되어 있으니, 잘못된 정보는 댓글로 알려주시면 감사하겠습니다 🙇‍♂️

개인적인 학습을 위해 작성한 글입니다. 이 글에는 정확하지 않은 정보가 포함되어 있을 수 있습니다.

서론

이번 주에 iOS에서 네트워킹을 하는 방법 즉, URL을 통해 데이터를 가져오고 보내는 것을 공부했는데, URLSession 클래스의 여러 메서드에 서 Data라는 타입이 자주 등장했다. 그래서 궁금증을 해결하기 위해 글을 써본다!

장문이 될 것 같지만 그럼 시작!


사건의 발단,,,

애플 개발자 문서에 나온 dataTask 메소드의 설명

dataTask 메서드는 completionHandler의 파라미터로 Data, URLResponse, Error를 가지고 있는데,
data는 우리가 해당 URL로 요청을 보냈을 때 서버로부터 돌려받은 데이터를 말한다. 돌려받을 때 Data라는 타입으로 돌려받는다.

어떻게 타입 이름이 Data 냐고 아,,,

Data 구조체

출처: 애플 개발자 문서 (클릭시 이동)

설명이 너무 짧은데,,, 아,,,,, 메모리에 있는 byte buffer,,,?

음,,, 메모리에 있는 byte단위의 정보를 Swift의 Data라는 구조체에 담는 것일까? 더 읽어보자,,,

이하 개발새발 번역 ON

Data 값 타입은 byte buffer가 Foundation 객체의 동작을 수행하도록 한다. 다양한 source에서 비어있거나 미리 채워진 buffer를 만들 수 있고, 나중에 바이트를 추가하거나 제거할 수 있다. 내용을 필터 하거나 정렬, 혹은 다른 버퍼와 비교할 수 있다. 바이트의 하위 범위를 조작하고 일부 혹은 전체를 반복할 수 있다.

Data는 NSData 클래스와 mutable 한 자식 클래스인 NSMutableData에 연결된다. Objective-C API와 상호작용하는 코드에서 이러한 것들을 상호 교환하여 사용 가능하다.

내용을 읽어보니 위에서 유추한 내용과 얼추 맞아떨어지는 것 같긴 한데, 더 찾아보아야겠다고 생각했다.

Byte Buffer가 뭔데,,,

출처: SwiftNIO document, 클릭시 이동

Byte Buffer에 대해 검색하다가 SwiftNIO라는 프레임워크 (애플의 non-blocking networking 라이브러리라고 한다. 자세한 건 나도 몰라잉)의 공식문서에서 ByteBuffer에 대한 내용을 찾았다.

ByteBuffer는 연속적으로 할당된 raw byte를 저장한다. 0 혹은 그 이상의 바이트(옥텟)으로 이루어진 랜덤 하고 순차적으로 접근 가능한 시퀀스이다.

"0 혹은 그 이상의 바이트(옥텟=8비트)로 이루어진 랜덤하고 순차적으로 접근 가능한 시퀀스" 를 풀어서 생각해보면

0 혹은 그 이상의 바이트: 1바이트=8비트, 1바이트가 표현 가능한 수는 0~255 이다.

랜덤 하고 순차적으로 접근 가능한 시퀀스: 배열

즉, 0~255의 수들로 이루어진 배열이 된다. 과연 이게 맞을까?

문서를 더 읽어보자,,,

ByteBuffer에서 다양한 유형의 읽기/쓰기가 가능하다. Swift의 extension을 사용하여 사용자 정의 데이터 타입에 대한 ByteBuffer 지원을 쉽게 만들 수 있다. 아래는 ByteBuffer가 지원하는 타입들이다. (전체 목록이 아님)

  • String/StaticString
  • Swift의 다양한 UInt
  • FoundationData <- !!!
  • [UInt8] 및 일반적으로 모든 UInt8의 Collection <- 0~255의 수들로 이루어진 배열

!!!!! 결국 Data는 byte buffer를 사용하여 바이트 단위의 정보의 배열 를 담고 있는 구조체였던 것이다 !!!!!

마무리

이제 그동안 URLSession으로 네트워킹하여 JSON 데이터를 받아 프린트했을 때,,, 왜 아래처럼 ~~bytes 라고 나왔는지 이해할 수 있게 되었다,,, 그리고 그 data를 Array 생성자에 넣으면,,, UInt8의 배열로 나타나게 되고(위에서 말했던 raw bytes의 모습,,,) 배열의 각 요소는 1 byte의 크기를 가진 유니코드인 것 같다.

따라서 유니코드를 utf-8로 인코딩하면 다음과 같이 string을 얻어낼 수 있다~~

Reference

SwiftNIO docs

Apple Developer Documentation - Data

Apple Developer Documentation - dataTask

누군가에게 도움이 되거나 흥미롭게 읽은 글이 되었길 바라면서 그럼 이만,,,

'개발🧑‍💻 > Swift' 카테고리의 다른 글

[Swift] final 파헤치기  (1) 2022.11.14
[Swift] 구조체와 클래스, 열거형 - 사용자 정의 타입  (0) 2021.11.17
[Swift] 옵셔널  (0) 2021.11.12
[Swift] 함수  (0) 2021.11.09
[Swift] 데이터 타입 (1) - 기본  (0) 2021.10.20