728x90
Class, Struct
- 데이터를 캡슐화하기 위한 모델
- 클래스와 구조체 공통점
- 속성 정의(property), 기능 정의(method), 첨자 구문 정의(subscript), 초기화 구문 정의(init), 확장 가능(extension), 프로토콜
- 관련 문서: Properties, Methods, Subscripts, Initialization, Extensions, Protocols
- 클래스만 가진 기능
- 상속 가능
- 타입 캐스팅 사용으로 런타임에 클래스 인스턴스 타입 확인 및 해석
- deinit
- 참조 카운팅으로 두 개 이상의 참조 허용
- 관련 문서: Inheritance, Type Casting, Deinitialization, Automatic Reference Counting
- 클래스와 구조체
- 일반적으로 클래스가 지원하는 기능을 다루는 건 복잡성이 증가한다.
- 따라서 구조체를 선호하고, 필요시 클래스를 사용한다.
- 클래스와 구조체 사이의 선택
- 기본적으로 구조체를 선택
- 스위프트의 구조체는 다른 언어에서 클래스로 제한되는 많은 기능이 포함
- 구현(implementation)을 위한 프로토콜 채택 가능
- 앱의 전체 상태를 고려할 필요 없이 쉽게 추론 가능
- 값 타입이기 때문에 구조체에 대한 로컬 변경 사항은 앱의 나머지 부분에 표시되지 않음
- 변경이 명시적임
- Objective-C를 사용해야 할 때 클래스를 선택
- Objective-C에서 제공하는 기능이 필요한 경우 데이터 모델링 혹은 상속을 위해 클래스를 사용해야 할 수 있음
- Identify를 제어해야 할 때 클래스를 선택
- 클래스는 참조 타입이기 때문에 Identify에 대한 개념이 내장되어 있음
- 이는 두 개의 서로 다른 클래스 인스턴스가 각각 동일한 값을 가진 속성을 지닐 때, === 연산자에 의해 다른 것을 판단할 수 있다.
- 앱 전체에서 클래스 인스턴스를 공유할 때, 해당 인스턴스에 대한 변경이 인스턴스에 대한 참조를 보유하는 모든 부분에 표시된다.
- 클래스는 참조 타입이기 때문에 Identify에 대한 개념이 내장되어 있음
- Identify를 제어하지 않아도 될 때 구조체를 선택
- 예를 들어, 원격 데이터베이스를 참조하는 앱에서 인스턴스의 id는 외부 개체에 의해 소유되고, 식별자에 의해 전달된다.
- 앱 모델의 일관성이 서버에 저장되면, let id 속성을 지닌 구조체를 모델링할 수 있다.
- 사용자에 의해 인스턴스가 변경되고 이를 서버에 업데이트 할 때, 실수로 다른 레코드를 변경하지 않는다.
- 모델 상속과 기능 공유가 필요할 때 구조체와 프로토콜을 선택
- 구조체와 클래스는 모두 상속의 형태를 지원
- 구조체와 프로토콜은 프로토콜만 채택 가능
- 클래스로부터 상속받을 수 없음
- 하지만 클래스 상속으로 구현할 수 있는 상속 계층은 구조체와 프로토콜의 상속을 통해 구현할 수 있다.
- 처음부터 상속 관계를 구축하는 경우, 프로토콜 상속을 선호
- 프로토콜은 클래스, 구조체, 열거형의 상속이 가능하지만 클래스 상속은 클래스만 호환
- 기본적으로 구조체를 선택
Value Type, Reference Type
- 값 타입
- 값 타입이란 변수 또는 상수에 할당되거나 함수에 전달될 때 값이 복사되는 타입
- 모든 구조체와 열거형은 값 타입
- 전달될 때 항상 복사된다는 것을 의미
- 배열, 딕셔너리, 문자열과 같은 Swift 표준 컬렉션은 복사 비용을 줄이기 위해 최적화를 사용
- COW
- 복사본을 만드는 대신, 원본 인스턴스의 메모리를 공유
- 컬렉션의 복사본 중 수정 사항이 생기면, 수정 직전에 요소를 복사해 분기
- 열거형 또한 동일
- 참조 타입
- 변수 또는 상수에 할당되거나 함수에 전달될 때 기존 인스턴스에 대한 참조 생성
- 참조 타입은 코드가 멀리 떨어져 있다면 추론하기 어려울 수 있다.
- 또한 하나의 인스턴스를 다룰 때 다른 인스턴스도 고려해야 할 수 있다.
- 값 타입은 상호 작용하는 코드가 소스 파일 상 가깝기 때문에 추론하기 쉽다.
- let이여도 변경 가능
- 인스턴스를 저장하는 게 아니라 참조하고 있음
- 따라서 속성에 대한 변경은 참조 값이 아니라 참조하고 있는 대상의 값을 변경하는 것
- 깊은 복사, 얕은 복사
- 깊은 복사
- 값 타입
- 데이터를 복사할 때, 그대로 복사하여 각각의 메모리를 가짐
- 얕은 복사
- 참조 타입
- 값의 주소를 복사하여 같은 값을 가리킴
- 구조체 내부의 클래스의 경우
- 속성은 깊은 복사
- 참조는 얕은 복사
- COW
- 구조체는 깊은 복사가 일어나서 복사가 일어날 때마다 깊은 복사를 한다면 비용이 큼
- 따라서 복사시 얕은 복사를 유지하다가 값의 변화가 생기면 깊은 복사를 하는 개념 탄생
- 깊은 복사
Collection Type
- Genereic implement로 구현됨
- Array: 정렬된 값의 모음
- Set: 정렬되지 않은 고유 값의 모음
- Dictionary: 정렬되지 않은 키-밸류 쌍의 모음
- Hashable
- 기본적으로 Int, Double, String, ... 등의 원소는 Hashable
- 만약 원소 타입이 Hashable하지 않다면 자체적으로 해시 값을 계산하는 방법을 제공해야 함
728x90
'Swift > Basic' 카테고리의 다른 글
프로젝트가 프로세스가 되기까지 - 1 (1) | 2024.12.06 |
---|---|
Generic, Protocol (2) | 2024.11.07 |
Concurrency (0) | 2024.11.07 |
GCD (0) | 2024.10.31 |
Memory Management (0) | 2024.10.31 |