[Swift] Structures and Classes

“Swift에서 Struct와 Class 중 어떤 걸 어떤 상황에 쓰나?” 라는 질문에 대한 명확한 대답을 하지 못했고, 공식문서를 참고하게 되었습니다.

문서 내용과 다른 점이 없고, 같은 내용의 번역이 대부분이지만 학습과 내용 정리를 위해 이 글을 작성합니다.

자세하고 구체적인 내용 파악을 위해선 참고 링크들을 눌러주시길 바랍니다.

제가 영어를 잘 못하기 때문에, 해석이 힘든 부분은 번역기의 힘을 빌렸으니 참고용으로만 봐주세요~

다른 프로그래밍 언어와 달리 Swift는 Struct와 Class를 위한 별도의 인터페이스와 구현파일을 만들 필요가 없습니다. Swift에서는 struct나 Class를 하나의 파일로 정의합니다. 해당 Class나 Struct에 대한 외부 인터페이스는 다른 코드가 사용할 수 있도록 자동 제공됩니다.

Comparing Structures and Classes

Struct와 Class는 많은 공통된 특징을 가지고 있습니다.

  • value들을 저장하기 위해 많은 property를 정의할 수 있다.
  • 기능들을 제공하기 위해 method를 정의할 수 있다.
  • 구문을 사용하여 value의 접근을 정의할 수 있다.
  • 초기값 설정을 위한 initializers를 정의할 수 있다.
  • 기본 구현 이상으로 기능들을 확장시킬 수 있다.
  • 특정 종류의 표준 기능을 제공하기 위한 protocol을 따른다.

Class는 Struct가 가지고 있지 않은 추가적인 기능들을 가지고 있습니다.

  • 한 클래스가 다른 클래스의 특성을 상속받을 수 있다.
  • 런타임에 클래스 인스턴스의 타입을 설명하고, 체크하기 위해 type casting이 가능하다.
  • 할당된 리소스를 해제하기 위해 클래스 인스턴스를 deinit할 수 있다.
  • 클래스 인스턴스에 대한 참조 카운트가 2개 이상 가능하다.

추가적인 기능들은 복잡성이 증가했을 때를 서포트하기 위해서 입니다.

일반적인 guideline으로서, 추론하기 쉽기 때문에 Structure를 더 선호하고, 적절하거나 필요할 때 Class를 사용해주세요. 따라서 실제로 정의하는 사용자 정의 데이터 유형은 대부분 Structure나 Enumeration이 됩니다.

Choosing Between Structures and Classes

앱에 새로운 데이터 유형을 추가할 때 적절한 옵션을 선택하려면 다음 권장사항을 고려하세요!

  • 기본적으로 Structure를 사용한다.
  • Objective - C의 상호운영이 필요하다면 클래스를 사용한다.
  • 모델링한 데이터의 id를 제어해야한다면 class를 사용한다.
  • 구현을 공유함으로써, behavior를 채택하기 위해 protocol과 함께 struct를 사용한다.

Choose Structures by Default

일반적인 종류의 데이터를 표현하기 위해 Structure를 사용합니다. Swift에서의 Structure는 다른 언어의 클래스로 제한되는 많은 기능을 포함합니다.

Structure를 사용하면 앱의 전체 상태를 고려할 필요 없이 코드의 일부를 쉽게 추론할 수 있습니다.

Structure는 value type이기 때문에 앱 흐름에 의도적으로 Structure의 변화를 전달하지 않는 이상 다른 앱에 전달되지 않습니다. (직역한 거긴한데, value type이라서 값의 변화에 대해 다른 부분에 영향을 주지 않고 독립적이다라고 받아들였어요.)

결과적으로, code section을 보고 해당 section의 인스턴스 변경이 눈에 보이지 않게 관련된 함수를 호출해서 이루어지는 것이 아니라 명시적으로 이루어질 것이라는 확신이 있습니다.

Use Structures and Protocols to Model Inheritance and Share Behavior

Struture와 Class 모두 상속을 지원합니다. Structure와 Protocol은 Protocol만 채택할 수 있으며, Class는 상속 받을 수 없습니다. 그러나 Class 상속으로 작성할 수 있는 상속 계층 구조는 Protocol 상속 및 Structure를 사용하여 모델링할 수 있습니다.