Struct & Class(2)

E_H·2021년 4월 4일
0

Swift

목록 보기
5/11

앞의 포스트에선 클래스와 구조체의 특징과 차이점을 알아보았다.
그렇다면 언제 클래스를 사용하고 언제 구조체를 사용하는 것이 좋을까

Choosing Between Classes and Structures

apple문서에는 이렇게 나와있다.

구조체와 클래스는 데이터를 저장하고 모델링을 수행하는데 적합하지만
유사성때문에 둘 중 하나를 선택하기 어려울 수 있다.

앱에 새 데이터 유형을 추가할 때 적합한 옵션을 선택하는 데 도움이 되도록
다음 권장 사항을 고려해보라고 한다.

  • 기본적으로 Struct 사용
  • Objective - C를 사용하며 상호 운용시에는 Class 사용
  • 모델링하는 데이터의 identity를 제어할때는 Class 사용
  • 구현부를 공유하면서 동작을 채택할때는 ProtocolStruct 사용

Choose Structures by Default

Swift의 Struct에는 다른 언어의 Class 로 제한된 많은 기능들이 포함되어 있다.
(stored properties, computed properties, and methods)
또한 Swift Struct는 기본 구현을 통해 동작을 얻기 위해 Protocol을 채택할 수 있다.

StructClass와 달리 Value type이기 때문에 사용자가 앱 흐름의 일부로 이러한 변경 사항을 의도적으로 전달하지 않는 한 나머지 앱에는 구조의 로컬 변경 사항이 표시되지 않는다.

그 결과 코드 섹션을 살펴보고 해당 섹션의 인스턴스를 변경하더라도 잠재적인 함수 호출에서 보이지 않게 변경되는 대신 명시적으로 변경할 수 있다는 확신을 가질 수 있다.

Use Classes When You Need Objective-C Interoperability

데이터를 처리해야 하는 Objective-C API를 사용하거나 Objective-C 프레임워크에 정의된 기존 클래스 계층에 데이터 모델을 적합시켜야 하는 경우 클래스 및 클래스 상속을 사용하여 데이터를 모델링해야 할 수 있다.

Use Classes When You Need to Control Identity

Swift의 Class는 reference type이기 때문에 identity 에 대한 기본 개념과 함께 제공된다. 즉, 두 개의 클래스 인스턴스가 저장된 속성 각각에 대해 동일한 값을 갖는 경우에도 ID 연산자(===)에 의해 서로 다른 값으로 간주된다.
예를 들어 로컬 데이터베이스 연결을 나타내는 유형이 있는 경우, 해당 데이터베이스에 대한 액세스를 관리하는 코드는 앱에서 볼 수 있는 데이터베이스 상태를 완전히 제어해야 한다. 이 경우 클래스를 사용하는 것이 적절하지만 공유 데이터베이스 개체에 액세스할 수 있는 앱 부분을 제한해야 한다."

중요
신분을 조심스럽게 다루는 것이 좋다. 클래스 인스턴스를 앱 전체에 걸쳐 광범위하게 공유하면 논리 오류가 발생할 가능성이 높아지기 때문이다.

Use Structures When You Don't Control Identity

사용자가 제어하지 않는 ID를 가진 엔티티에 대한 정보가 들어 있는 데이터를 모델링할 때 Struct를 사용하자

struct PenPalRecord {
    let myID: Int
    var myNickname: String
    var recommendedPenPalID: Int
}

var myRecord = try JSONDecoder().decode(PenPalRecord.self, from: jsonResponse)

Use Structures and Protocols to Model Inheritance and Share Behavior

StructClass 상속을 지원한다.
struct는 class를 상속할 수는 없지만 protocol을 채택해 상속받을 수 있다.
class는 protocol과 struct를 사용해 모델링 할 수 있다.
Protocol은 Class, Struct 및 Enum이 상속에 참여할 수 있도록 허용하지만 Class 상속은 Class만 호환됩니다.

Protocol SomeProtocol: Class {
	// class에서만 사용가능
}

데이터 모델링 방법을 선택할 때는 먼저 프로토콜 상속을 사용하여 데이터 유형의 계층을 생성한 다음 해당 프로토콜을 구조에서 채택해 보십시오.

0개의 댓글