Choosing Between Structures and Classes

ios dev·2022년 3월 21일
0

Documentation

목록 보기
1/1

Choosing Between Structures and Classes

StructureClass는 Data를 저장하고 behavior를 모델링 하기 좋은 선택이지만 둘의 유사성으로 인해 어떤 것을 선택해야 하는지 결정하는 데 어려움을 겪게 된다.

App에 새 Data 유형을 추가할 때 적절한 옵션을 선택할 수 있도록 도움을 주는 몇 가지 권장 사항이 있다.

  • 기본적으로 Structure를 사용한다.
  • Objective-C interoperability가 필요한 경우 Class를 사용한다.
  • 모델링 중인 Data의 ID(identity)를 제어해야 하는 경우 Class를 사용한다.
  • behavior 구현을 공유함으로써 behavior를 채택하기 위해 protocol과 Structure를 함께 사용한다.

Choose Structures by Default

일반적인 종류의 Data를 나타내기 위해서는 Structure를 사용해야 한다. Swift의 Structure는 다른 언어의 경우 Class에서 사용하도록 제한된 기능인 stored properties, computed properties 그리고 methods를 포함할 수 있다.
또, Swift의 Structure는 default implementations을 통해 behavior를 얻기 위해 protocol을 채택할 수 있다. Swift 표준 라이브러리와 Foundation은 numbers, strings, arrays 그리고 dictionaries와 같이 자주 사용하는 타입에 Structure를 사용한다.

Structure를 사용하면 App의 전체 상태를 고려하지 않고도 코드에 대해 더 쉽게 추론할 수 있다. Structure는 Class와 달리 value 타입이기 때문에 변경 사항을 의도적으로 전달하지 않는 한 Structure에 대한 로컬 변경 사항은 App의 나머지 부분에 표시되지 않는다.

따라서, 연결된 함수에 의해 보이지 않게 변경이 이루어지는 것이 아니라 코드 섹션 내에서 명시적으로 인스턴스 변경이 이루어 질 것이라고 확신할 수 있다.
(class 참조와 반대되는 이야기인 것 같다.)


Use Classes When You Need Objective-C Interoperability

Data를 처리해야 하는 Objective-C API를 사용하거나 Data 모델을 Objective-C 프레임워크에 정의된 기존 Class 계층에 맞춰야 하는 경우, ClassClass 상속을 사용해 Data를 모델링해야 할 수도 있다.

예를 들어, 많은 Objective-C 프레임워크는 하위 Class로 예상되는 Class를 노출한다.


Use Classes When You Need to Control Identity

Swift의 Class는 참조 타입이기 때문에 identity 개념이 내장되어 있다. 이는 동일한 값을 저장하고 있는 프로퍼티를 가진 두 개의 다른 Class 인스턴스가 있을 때, 해당 Class들은 identity 연산자(===)에 의해 서로 다른 것으로 여겨진다는 것을 의미한다.

또한 App에서 Class 인스턴스를 공유할 때 해당 인스턴스에 대한 변경 사항을 해당 인스턴스에 대한 참조가 있는 모든 코드에서 확인할 수 있다.

일반적으로 file handles, network connections 그리고 CBCentralManager와 같은 shared hardware intermediaries에서 사용된다.

Important

App 전체에서 Class 인스턴스를 널리 공유하는 경우 논리 오류가 발생할 가능성이 높아지기 때문에 identity를 신경써서 다뤄야 한다.


Use Structures When You Don't Control Identity

제어할 필요가 없는 identity가 있는 entity Data를 모델링하는 경우 Structure를 사용한다.

예를 들어, App 모델의 consistency가 서버에 저장되는 경우 Structure 인스턴스는 identity를 제어하지 않기 때문에
로컬 인스턴스의 변경 사항이 실수로 데이터베이스의 값을 변경할 위험이 없다.
(내용 보충 필요)


Use Structures and Protocols to Model Inheritance and Share Behavior

StructureClass 모두 상속의 한 형태를 지원한다. Structure와 protocol은 protocol만 채택할 수 있다. (class 상속은 할 수 없다.)

그러나 Class 상속으로 구축할 수 있는 상속 계층의 종류는 protocol 상속과 Structure를 사용해 모델링할 수도 있다.

처음부터 상속 관계를 구축하는 경우 protocol 상속을 우선 적으로 사용하는 것이 좋다.

protocol은 ClassStructure(+ enum)가 상속에 참여할 수 있도록 하지만 Class 상속은 Class만 호환된다.

Data를 모델링하는 방법을 선택할 때, 먼저 protocol 상속을 사용해 Data의 계층 구조를 구축한 다음 Structure에 해당 protocol을 채택하는 것이 좋다.






cf.
https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes

0개의 댓글