Struct and Class
Swift에서 Struct와 Class는 유사한 점이 많습니다.
제공하는 기능에 대해서는 비슷할 수 있지만, 내부적으로는 차이점이 많이 있습니다.
본 내용은 CS193P - Developing Apps for iOS - lecture 3 MVVM 강의에 기반합니다.
공통점
- 변수(var)를 가질 수 있습니다.
- computed var를 가질 수 있습니다.
- 상수(let)을 가질 수 있습니다.
- 함수를 가질 수 있습니다.
- initializer를 가지고 있습니다.
차이점
1. value type(Struct) VS reference type(Class)
Struct는 struct가 복사될 때, 새로운 복사된 struct를 전달합니다.
Class는 인스턴스가 복사될 때, 인스턴스를 복사하지 않고 해당 인스턴스를 참조하게 만듭니다.
2. copy on write(Struct) - automatically reference counted(Class)
Struct는 Copy on write(데이터를 복사할 때는 값을 복사하지 않고 참조만 하다가 값을 변경할 때 데이터를 복사하고 값을 변경하는 방법)입니다.
Class는 인스턴스가 참조되는 개수를 가지고 있습니다. 인스턴스 참조 개수가 0이 되었을 때 인스턴스를 메모리에서 제거합니다.
3. funcational programming(Struct) VS OOP(Class)
Struct는 functional programming에 특화되어 있습니다.
Class는 OOP에 특화되어 사용되어왔습니다.
4. no inheritance(Struct) VS inheritance(Class)
Struct는 상속을 지원하지 않습니다.
Class는 단일 상속을 지원합니다. 상속으로 발생할 수 있는 instance의 타입 캐스팅과 타입 체크를 할 수 있습니다.
5. "Free" init initializes All vars(Struct) VS "Free" init initializes No vars(Class)
Free init이란 기본으로 제공되는 init을 의미하는 것 같습니다.
Struct의 기본 init은 선언된 모든 var(멤버변수)를 할당해야 합니다. 만약 var에 initial value가 할당되어 있다면 init에서 해당 변수는 초기화하지 않아도 됩니다.
Class의 기본 init은 멤버 변수를 초기화하지 않습니다.
6. Mutability must be explicitly stated VS Always mutable
Struct는 내부의 값 변경에 대해서 명시적으로 선언해줘야 합니다.
Class는 그러한 선언이 필요 없습니다.
7. you 'go to' data structure VS used in specific circumstances
본 항목은 기능적인 차이에 대해서 이야기하지 않고
Struct는 많이 사용될 것이고, Class는 특정한 상황에서만 이용될 것입니다.
표로 정리한 Strcut와 Class의 차이점
Strct | Class |
value type(call by value) | reference type(call by reference) |
copy on write | automatically reference counted |
functional programming | object-oriented programming |
no inheritance | inheritance (only single) |
"Free" init initializes All vars | "Free" init initializes No vars |
Mutability must be explicitly stated | Always mutable |
you 'go to' data structure | used in specific circumstances |
Struct와 Class 사용을 선택하는 기준
Struct와 Class가 워낙 비슷해서 언제 사용해야 될지 결정하기 모호한 경우가 있습니다.
Apple에서는 두 가지 구조체를 어떤 경우에 사용하면 좋을지에 대한 가이드를 제공합니다.
- default : Struct
- Object-C 상호 처리가 필요한 경우 : Class
- 인스턴스 간 동일성(identity, === 명령으로 다르다고 여겨지는 경우) 식별할 필요가 있는 경우 : Class
- 개발 초기에 inheritance 구조는 Struct-protocol을 이용해서 만들기를 권장한다.
Reference
https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
CS193P - Developing Apps for iOS - lecture 3 MVVM
https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes
'iOS > iOS' 카테고리의 다른 글
[iOS, concurrency] publishing changes from background threads is not allowed; (0) | 2021.11.25 |
---|---|
[iOS] GCD, multithreading in iOS (0) | 2021.11.25 |
[SwiftUI] some View의 some에 대해서 (1) | 2021.11.23 |
iOS 📱 개발에 유용한 사이트 정리 (0) | 2021.09.23 |