본문 바로가기
개발서적 읽으며 끄적끄적/POP with Swift

스위프트에서의 '타입'

by 토끼찌짐 2019. 12. 26.

존 호프만의 Protocol-Oriented Programming with Swift(스위프트 프로토콜지향 프로그래밍) 2장 메모글 (요약 아님)


스위프트에서의 타입의 분류

1) 이름 있는 타입

- 타입을 정의할 때 이름을 부여한 타입

- 클래스, 구조체, ENUM, 프로토콜 등

- Primitive type 대부분(Number Bool 문자열 등) - 따라서 이런 원시타입에도 확장을 사용할 수 있다는 장점


2) 복합 타입(compound type)

- 이름을 부여하지 않은 타입

- 함수 타입(클로저, 함수, 메서드 등)과 튜플 등

- typealias 로 별명을 붙일 수 있음

 

스위프트에서의 타입의 범주

- 참조타입: 인스턴스 전달 시 원본의 참조를 전달. 클래스 등

- 값 타입: 인스턴스 전달 시 원본의 사본을 전달. 구조체, ENUM, 튜플 등

 

스위프트에서의 ENUM의 장점

- 각 케이스에 Raw value 할당 가능(String, Int 등)

- associated value 로 커스텀 정보 같이 다룰 수 있음

- Computed Property, initializer, method 만들 수 있음

 

참조 타입으로만 할 수 있는 것 (값 타입으로는 못 하는 것)

1) 재귀적 데이터 타입

예를 들면, Linked List 를 아래처럼 값 타입으로는 생성할 수 없다.

에러 메시지는 "값 타입은 재귀적으로 자기 자신을 Stored 프로퍼티로 가질 수 없다"

스위프트가 재귀적 값 타입을 허용하지 않는 이유에 대한 공식적인 답변은 없지만, 만약 허용한다고 하더라도 의도치 않았던 오류에 시달리게 될 것이다. 예를 들어, 만약 허용한다고 가정하고 값 타입으로 생성한 Linked List 를 다루어보자.

struct LinkedList {
    var value: T
    var next: LinkedList? { return nil }
}

var first = LinkedList(value: 1)
var second = LinkedList(value: 2)
var third = LinkedList(value: 3)
fist.next = second // second의 원본 인스턴스에서 새롭게 Copy된 값이 넘어감 (원본이 next로 연결된 것이 아님!)
second.next = third // third의 원본 인스턴스에서 새롭게 Copy된 값이 넘어감 (상동)
// 따라서, first가 가진 next(second의 새로운 카피값)의 next에는 아무것도 없다
// first와 third는 연결되지 않음 (의도한 것과 다르다)

 

2) 상속

상속은 참조 타입(클래스 등)으로만 가능