본문으로 건너뛰기

2장에서 다루는 내용

2장에서 다루는 내용은 다음과 같다.

  • 클래스랑 무엇이며 어떻게 사용하는가?
  • 구조체란 무엇이며 어떻게 사용하는가?
  • 열거형이란 무엇이며 어떻게 사용하는가?
  • 튜플이란 무엇이며 어떻게 사용하는가?
  • 값 타입과 참조 타입의 차이점은 무엇인가?

스위프트는 타입을 이름 있는 타입과 복합 타입으로 분류한다. 이름 있는 타입이란 타입을 정의할 때 이름을 부여한 타입을 말한다. 이름 있는 타입에는 클래스와 구조체와 열거형과 프로토콜이 있다. 사용자가 정의한 이름 있는 타입뿐 아니라 스위프트 표준 라이브러리에 배열, 셋, 딕셔너리를 포함해서 흔히 사용하는 이름 있는 타입도 다수 정의되어 있다.

스위프트에서는 일반적으로 다른 언어에서 원시 타입primitive type이라 불리는 데이터 타입의 대부분이 이름 있는 타입이며, 스위프트 표준 라이브러리는 구조체를 사용해 이러한 데이터 타입을 구현했다. 이러한 데이터 타입에는 숫자, 문자열, 문자, 불리언 타입이 있다. 이러한 타입은 다른 타입과 마찬가지로 확장을 사용할 수 있다. 이는 스위프트 언어가 가진 매우 강력한 기능이자 프로토콜지향 프로그래밍이 갖는 특징 중 하나이다.

복합 타입compound type이란 정의할 때 이름을 부여하지 않은 타입을 말한다. 스위프트에서 함수 타입과 튜플tuple 타입이 복합 타입에 해당한다. 함수 타입은 클로저closures, 함수, 메서드 형태로 나타내지만, 튜플 타입은 괄호로 둘러싸여 있으며 쉼표로 구분하는 리스트다.

typealias 를 사용하면 복합 타입에 별칭alias 을 부여할 수 있다. typealias 는 타입 자신을 호출하는 대신 별칭으로 복합 타입을 호출할 수 있게 해준다.

타입은 참조 타입과 값 타입의 두 가지 범주가 있다. 참조 타입 인스턴스를 전달한다는 것은 원본 인스턴스의 참조를 전달한다는 의미며, 두 참조가 같은 인스턴스를 공유한다는 뜻이기도 하다. 클래스는 참조 타입에 속한다. 값 타입 인스턴스를 전달한다는 것은 인스턴스의 새로운 복사본을 전달한다는 의미며, 이는 각각의 인스턴스가 유일한 사본이라는 의미이기도 하다. 구조체, 열거형, 튜플이 값 타입에 속한다.

스위프트에서 모든 타입은 이름 있는 타입이거나 복합 타입 중 하나이며, 프로토콜인 경우를 제외하고 참조 타입이거나 값 타입 중 하나이다. 프로토콜은 인스턴스를 생성할 수 없으므로 프로토콜은 참조 타입이나 값 타입이 될 수 없다.

프로토콜은 값 타입이나 참조 타입은 아니지만, 타입으로 사용할 수 있는 있는 이유는 1급 객체이기 때문이다.