스위프트에서의 데이터 타입
다른 프로그래밍 언어를 작성해본 적이 있따면, 해당 데이터에서 기본 제공하는 원천적인primitive 데이터 타입에 대해 잘 알고 있을 것이다.
원천 데이터 타입이라고 하면 단일 값을 지는 스칼라 타입scalar type을 일컫는 경우가 많다.
대표적인 스칼라 타입 데이터로는 int, float, double, char, bool 이 있다.
하지만 스위프트에서 원천 데이터 타입은 스칼라 타입으로 구현되어 있지 않다.
스위프트 데이터 타입이 다른 프로그래밍 언어와 어떤 차이가 있는지 알아보자.
값 타입과 참조 타입
스위프트의 기본 데이터 타입은은 값 타입value type과 참조 타입reference type 두가지다. 값 타입은 오직 하나의 소유 객체만을 지니며, 해당 타입의 데이터가 변수 또는 상수에 할당되었을 때 혹은 함수에 전달되었을 때, 지니고 있던 값을 복사한다. 값 타입에는 구조체와 열거형 두 가지 유형이 있으며, 스위프트의 모든 데이터 타입은 기본적으로 구조체다.
반면 참조 타입은 값 타입과 달리 값을 복사하지 않고 공유한다. 즉 참조 타입은 변수에 할당하거나 함수에 전달할 때 값을 복사하여 제공하는 대신, 동일한 인스턴스를 참조값으로 활용한다. 참조 타입은 여러개의 소유 객체가 참조라는 방식으로 공유할 수 있다.
스위프트의 표준 라이브러리에서 int, double, flat, string, character, bool, array, dictionary, set 등
다양한 네이티브 데이터 타입이 정의되어 있다.
주의할 점은 데이터 타입은 다른 언어에서와 같이 원천 데이터 타입은 아니라는 점이다. 데이터 타입은 스위프트 표준 라이브러리에서 구조체 타입으로 정의되고 구현된 기명 타입named types이다.
기명 타입과 복합 타입
스위프트의 또 다른 데이터 타입 분류 체계는 기명 타입named types과 복합 타입compound types이다. 기명 타입은 사용자가 정의할 수 있는 데이터 타입이자, 해당 타입이 정의될 당시 특정한 이름을 부여할 수 있는 타입이다. 기명 타입에는 클래스, 구조체, 열거형, 프로토콜이 있다. 스위프트 라이브러리에는 배열, 딕셔너리, 세트, 옵셔널과 같은 기명 타입이 별도로 작성되어 있다. 기명 타입은 확장 구문을 통해 기본 동작을 확장할 수 있다.
복합 타입은 별도의 이름이 붙여지지 않은 타입이며, 스위프트에서는 함수 타입과 튜플 타입 등 두 개의 복합 타입이 정의되어 있다. 복합 타입은 기명 타입을 물론 또 다른 복합 타입을 포함할 수 있다.
타입 알리아스
타입 알리아스는type alias는 기존의 타입을 또 다른 이름으로 부를 수 있는 방법이다.
스위프트의 typealias 키워드는 C 기반 언어의 typedef 와 유사하다고 할 수 있다.
어떤 작업 중 특정 타입의 이름을 좀 더 해당 작업적 맥락에 적합하게 부르고 싶을 때 사용한다.
typealias TCPPacket = UInt16
타입 알리아스를 정의한 이후에는 해당 타입명으로 원본 타입을 사용할 수 있다.
스위프트 표준 라이브러리 컬렉션 타입
스위프트는 배열array, 딕셔너리dictionary, 세트set 등 세 가지의 컬렉션 타입을 제공한다. 정식 컬렉션 타입은 아니지만 수, 문자열 등 복합적인 값을 한꺼번에 묶어서 편리하게 사용할 수 있는 튜플tuple도 있다.