본문 바로가기

문법

[Swift] Class와 struct 중 어느것을 선택해야할까 ?

- Reference

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

 

Apple Developer Documentation

 

developer.apple.com

 

 

[정의]

- 프로그램 코드의 빌딩블록이되는 유연유연한 범용 구조이다.

NOTE

- 다른언어와 달리 언터페이스 파일을 만들지않고 사용하며 다른코드에서도 적용이 가능하다.

 

#  클래스와 구조체중 어떤걸 사용해야할까 ?

 

[두 타입중 하나를 선택하기위한 방법에 대한 애플의 권장사항]

- 기본적으로 구조를 사용해라(+구상하는 코드의 정체성을 모르겠을때)

- Objective-C 상호 운용성이 필요할때 클래스를 사용해라.

- 모델링 중인 데이터의 ID를 제어해야하는 경우 클래스를 사용해라.(두 클래스타입의 인스턴스가 같은 유형인지 파악하기 위함)

일반적인 사용사례) 파일 핸들, 네트워크 연결 및 CBCentralManager와 같은 공유 하드웨어 중개자입니다.

- 프로토콜과 함께 구조를 사용하여 구현을 공유하여 동작을 채택해라.

 

# 기본적으로 구조를 선택해라

- 구조를 사용하여 일반적인 종류의 데이터를 나타내라

- Swift의 구조에는 다른언어의 클래스로 제한되는 많은 기능이 포함되어있다.(데이터를 다루는 기능이 많이 들어있따?)

- 게다가 구조는 기본구현을 통해 동작을 얻기 위해 프로토콜을 채택할 수 있다.

- Swift표준 라이브러리와 Foundation은 숫자, 문자열, 배열 및 사전과 같이 자주 사용하는 유형에 대한 구조를 사용한다.

- 구조를 사용하면 앱의 전체상태를 고려할 필요없이 코드의 일부에 대해 더 쉽게 추론할 수 있다.

왜냐하면)

구조는 클래스와 달리 값 유형이기떄문에 구조에 대한 로컬변경사항은 앱 흐름의 일부로 이러한 변경사항을 의도적으로 전달하지않는 한 앱의 나머지 부분에 표시되지않는다.

- 결과적으로 코드 섹션을 볼 수 있고 접선 관련함수호출에서 보이지 않게 변경되는 것이 아니라 해당 섹션의 인스턴스에 대한 변경이 명시적으로 수행되것이라는 확신을 가질 수 있다.

 

Important

- identity를 주의깊게 다루어라.

앱 전체에 걸쳐 클래스인스턴스를 널리 공유하면 논리 오류가 발생할 가능성이 높아진다.

왜냐하면 많이 공유되는 인스턴스를 변경할 때의 결과를 예상하지 못할 수도 있으므로

이러한 코드를 올바르게 작성하는 것이 더 중요하다.

 

 

# 모델 상속 및 공유동작을 할때는 구조 및 프로토콜을 사용해라

- 구조와 클래스는 모두 상속 형식을 지원한다. 구조와 프로토콜은 프로토콜만 채택할 수 있다.

그것들은 클래스에서 상속할 수 없다. 그러나 클래스 상속으로 구축할 수 있는 상속 계층의 종류는

프로토콜 상속 및 구조를 사용하여 모델링 할 수도 있다.

 

# 상속관계를 처음부터 구축하는 경우 프로토콜 상속을 선호한다.

프로토콜을 사용하면 클래스, 구조 및 열거혀이 상속에 참여할 수 있지만 클래스 상속은 다른 클래스랑만 호환된다.

데이터를 모델링하는 방법을 선택할 때 먼저 프로토콜 상속을 사용하여 데이터 유형의 계층 구조를 구축한

다음 구조에서 해당 프로토콜을 채택해라.

 

 

# 애플문서 중 일부분의 내용만 추출하여 작성하였습니다.