존 호프만의 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) 상속
상속은 참조 타입(클래스 등)으로만 가능
'개발서적 읽으며 끄적끄적 > POP with Swift' 카테고리의 다른 글
프로토콜 확장으로 기능을 추가하기 (0) | 2020.01.01 |
---|---|
프로토콜 컴포지션이 클래스 상속 구조보다 유용한 경우를 설명하기 좋은 예제 (0) | 2019.12.30 |
객체지향 프로그래밍과 프로토콜지향 프로그래밍 (feat. Swift) (2) | 2019.11.06 |