GGURUPiOS

[Swift] Struct vs Class vs Enum 공통점과 차이점 본문

Swift/문법 파헤치기

[Swift] Struct vs Class vs Enum 공통점과 차이점

꾸럽 2023. 10. 30. 18:26

안녕하세요. 오늘은 구조체와 클래스, 열거형의 공통점과 차이점에 대해 알아보겠습니다.


일단 공식문서를 보겠습니다.
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures

 

Documentation

 

docs.swift.org


공식문서에서 따르면 구조체와 클래스는 많은 공통점을 가지고 있다고 말합니다.

  • 값을 저장할 프로퍼티를 정의한다.
  • 메서드를 정의한다.
  • 서브스크립트 구문을 통해 값에 접근할 수 있도록 서브스크립트를 정의한다.
  • 초기화 상태를 설정할 이니셜라이저(초기자)를 정의한다.
  • 프로토콜을 준수하여 특정 종류의 표준 기능을 제공 (프로토콜 채택 가능)

차이점은 아래와 같다.

  • 클래스는 상속이 되지만, 구조체는 상속이 불가하다.
  • 타입 캐스팅을 사용하면 클래스 인스턴스의 타입을 확인할 수 있다.
  • Deinitializer는 클래스의 인스턴스가 할당된 모든 리소스를 확보할 수 있습니다.
  • 참조 카운팅은 클래스 인스턴스에 대한 참조를 두 개 이상 허용합니다.

공식문서에서는 몇가지의 차이점만 소개하지만,
공식문서에서 나와있지 않은 차이점은 더 있습니다.

참조타입 vs 값 타입

구조체는 값 유형인 반면 클래스는 참조 유형으로, 모든 클래스 인스턴스는 여러 참조를 가질 수 있습니다.

mutable vs immutable 

클래스는 mutable하며, 구조체는 immutable 합니다.

Stack vs heap

구조체는 값 유형이므로 컴파일 타임에 크기를 결정할 수 있으며 호출 스택 메모리에 할당할 수 있습니다.
참조 유형인 클래스는 런타임에 크기를 계산해야 하므로 Swift는 동적 메모리 할당을 위해 메모리 힙을 사용합니다.

클래스는 mutable 하고, 동적 메모리 할당을 위해 힙을 사용.

Static vs Dynamic Dispatch

Static Dispatch와 Dynamic Dispatch는 무엇일까?
간단히 말하면 내가 호출할 함수를 실행하는 방식? 메커니즘 정도
간단한 차이점은 그 함수를 컴파일 할 때 결정할 것이냐, 런타임에 결정할 것인가 정도 이다.

구조체는 일반적으로 Static Dispatch 방식이다.
구조체가 값 타입이고, 구조체의 메서드를 오버라이드 할 수 없기 때문에 동적인 디스패치가 필요하지 않음

반면, 클래스는 Dynamic Dispatch 방식을 따른다.
클래스는 상속에 의해 오버라이드 될 수 있으며, 호출할 메서드 구현은 실제 하위클래스에 따라 동적으로 결정되기 때문입니다.

이런식으로 런타임에 결정 되기 때문에 구조체에 비해 느릴 수 밖에 없는것 같다.
그러나 클래스도 private이나 final 키워드를 써서 성능적으로 좋게 할 수 있다고 함. 

final -> 상속 불가 (오버라이딩 불가) -> Static Dispatch 로 동작.


Enum

Enum(열거형)도 마찬가지로 구조체와 같은 값타입이다.
상속이 불가능하다.
그리고 또한 enum에서는 구조체와 달리 저장프로퍼티를 선언할 수 없다.


출처

 

Swift Class vs. Struct

A detailed difference between these two

ajayamati.medium.com

 

 

Why Choose Struct Over Class?

Playing around with Swift, coming from a Java background, why would you want to choose a Struct instead of a Class? Seems like they are the same thing, with a Struct offering less functionality. ...

stackoverflow.com