앞의 포스트에선 클래스와 구조체의 특징과 차이점을 알아보았다.
그렇다면 언제 클래스를 사용하고 언제 구조체를 사용하는 것이 좋을까
apple문서에는 이렇게 나와있다.
구조체와 클래스는 데이터를 저장하고 모델링을 수행하는데 적합하지만
유사성때문에 둘 중 하나를 선택하기 어려울 수 있다.
앱에 새 데이터 유형을 추가할 때 적합한 옵션을 선택하는 데 도움이 되도록
다음 권장 사항을 고려해보라고 한다.
Struct
사용Class
사용Class
사용Protocol
과 Struct
사용Swift의 Struct
에는 다른 언어의 Class
로 제한된 많은 기능들이 포함되어 있다.
(stored properties, computed properties, and methods)
또한 Swift Struct
는 기본 구현을 통해 동작을 얻기 위해 Protocol
을 채택할 수 있다.
Struct
는 Class
와 달리 Value type이기 때문에 사용자가 앱 흐름의 일부로 이러한 변경 사항을 의도적으로 전달하지 않는 한 나머지 앱에는 구조의 로컬 변경 사항이 표시되지 않는다.
그 결과 코드 섹션을 살펴보고 해당 섹션의 인스턴스를 변경하더라도 잠재적인 함수 호출에서 보이지 않게 변경되는 대신 명시적으로 변경할 수 있다는 확신을 가질 수 있다.
데이터를 처리해야 하는 Objective-C API를 사용하거나 Objective-C 프레임워크에 정의된 기존 클래스 계층에 데이터 모델을 적합시켜야 하는 경우 클래스 및 클래스 상속을 사용하여 데이터를 모델링해야 할 수 있다.
Swift의 Class
는 reference type이기 때문에 identity 에 대한 기본 개념과 함께 제공된다. 즉, 두 개의 클래스 인스턴스가 저장된 속성 각각에 대해 동일한 값을 갖는 경우에도 ID 연산자(===)에 의해 서로 다른 값으로 간주된다.
예를 들어 로컬 데이터베이스 연결을 나타내는 유형이 있는 경우, 해당 데이터베이스에 대한 액세스를 관리하는 코드는 앱에서 볼 수 있는 데이터베이스 상태를 완전히 제어해야 한다. 이 경우 클래스를 사용하는 것이 적절하지만 공유 데이터베이스 개체에 액세스할 수 있는 앱 부분을 제한해야 한다."
중요
신분을 조심스럽게 다루는 것이 좋다. 클래스 인스턴스를 앱 전체에 걸쳐 광범위하게 공유하면 논리 오류가 발생할 가능성이 높아지기 때문이다.
사용자가 제어하지 않는 ID를 가진 엔티티에 대한 정보가 들어 있는 데이터를 모델링할 때 Struct를 사용하자
struct PenPalRecord {
let myID: Int
var myNickname: String
var recommendedPenPalID: Int
}
var myRecord = try JSONDecoder().decode(PenPalRecord.self, from: jsonResponse)
Struct
는 Class
상속을 지원한다.
struct는 class를 상속할 수는 없지만 protocol을 채택해 상속받을 수 있다.
class는 protocol과 struct를 사용해 모델링 할 수 있다.
Protocol은 Class, Struct 및 Enum이 상속에 참여할 수 있도록 허용하지만 Class 상속은 Class만 호환됩니다.
Protocol SomeProtocol: Class {
// class에서만 사용가능
}
데이터 모델링 방법을 선택할 때는 먼저 프로토콜 상속을 사용하여 데이터 유형의 계층을 생성한 다음 해당 프로토콜을 구조에서 채택해 보십시오.