class 와 struct

zoe·2021년 11월 5일
0

Swift

목록 보기
1/4

FruitStore 타입은 왜 클래스로 구현하라고 요구했을까요?

  • 과일 재고를 앱 내에서 계속 수정해나가야 하므로 참조타입인 클래스로 구현하는 것이 용이하다.
    • 값타입에서도 할 수는 있지만 mutating을 쓰나 class를 쓰나 메서드가 모두 mutating 키워드가 붙은걸로 가정한다면 동일하므로 class를 선택
  • 앱 내에서 과일 재고를 공통적으로 관리해주고 싶을 때, 싱글톤 패턴 구현을 필요로 할때 클래스를 사용할 수도 있겠다.
  • 과일 별 재고를 통합적으로 관리해줘야하기 때문에 재고에 변동이 생기면 바로 heap에 저장된 실체값이 변해야 한다
  • 따라서 인스턴스를 생설할 때 값을 복사하기 보단 참조하여 재고를 변경할 수 있는 클래스가 더 적합하다
  • 여러곳에서 인스턴스를 가지고 있을때 한군데에서 재고값이 수정되면 원본값도 바뀌어야 한다.

JuiceMaker 타입은 왜 구조체로 구현하라고 요구했을까요?

  • 참조 타입에 비해 시스템 리소스가 적게 들어가는 이유로, 즉 성능적인 측면으로 구조체를 사용
  • JuiceMaker는 주스를 만드는 함수만 가지고 있다. 즉 간단한 메서드들을 캡슐화 하는 것만이 목적이기 때문에 구조체를 사용했다
  • 클래스는 참조를 전달하게되는데, 원본 값을 변경하는건지 정확히 파악하기 어렵다. 반면에 구조체는 값만 전달하기 때문에 변경사항에 대해서 개발자가 직관적으로 파악하기 쉽다.
  • 클래스가 지원하는 추가 기능들은 복잡성을 증가시킨다 (상속, 힙할당 등 때문에)
  • 힙 할당을 피했다
  • 공식문서에 디폴트로 구조체를 사용하라고 나와있다
  • 메모리에 할당된 값 타입의 데이터를 다른 변수에 복사해도 각각의 인스턴스는 데이터의 유일한 복사값을 가진다.

구조체와 클래스를 선택할때 핵심

값 타입을 써서 원본을 지키고 복사본을 수정할 것 인가?
혹은 클래스 타입을 써서 원본까지 수정할 것인가?


스택은 왜 빠를까?

  • 스택은 한 방향으로만 데이터를 넣고 빼는 단순한 구조이기 때문에 스택 포인터를 사용하여 빠르게 접근할 수 있습니다. 그래서 스택 할당은 많은 시간을 필요로 하지 않습니다.

힙은 왜 느릴까?

  • stack에는 reference인 주소값을 할당하고, 실질적인 데이터는 heap에 할당합니다.
  • 하지만 힙은 할당할 때마다 적절한 메모리 공간이 있는지 확인한 후에 할당을 처리하는 동적인 구조입니다.
  • 이러한 과정은 스택보다 복잡하기 때문에 더 많은 오버헤드(Overhead)가 발생하게 됩니다. 그렇기 때문에 일반적으로 더 좋은 성능의 코드를 작성하기 위해서는 값 타입을 사용하는 것이 좋습니다.

Copy-on-Write

COW의 기본원리: 인스턴스를 복사할 때 먼저 참조를 통해 불필요한 복사를 줄이고, 수정이 발생하는 경우에만 실제로 복사를 하는 방식
스위프트에서는 기본적으로 Collection 타입에 COW가 구현되어있고, 타입에 직접 COW를 구현할 수도 있다
구조체가 복사를 한다고 하지만 실제로는 참조타입처럼 작동한다고 한다. 참조타입처럼 주소값을 가지고 있다가 값에 수정이 발생하는 경우 실제 복사가 일어나는 것이다.


SwfitUI에 struct타입이 많은 이유

UIKit의 view나 control의 데이터타입은 거의 class인데 SwiftUI의 데이터타입은 거의 struct 이네요.
프레임웍이 SwiftUI로 넘어오면서 struct로 전격 교체된 이유가 궁금합니다.

아직 SwiftUI는 접해보지 않아서 잘 모르겠지만 SwiftUI의 데이터타입은 거의 struct 라고 한다. 왜그럴까?
https://namocom.tistory.com/905 (SwiftUI에 struct 타입이 많은 이유)
여기에 적혀있긴 한데 왜인지 잘 모르겠다


(11월 22일 추가)

언제 구조체를 선택하고 언제 클래스를 선택해야할까?

Choosing Between Structures and Classes

  • 기본적으로는 구조체를 사용한다
    Use structures by default.

  • Objective-C interoperability가 필요하면 클래스를 사용한다
    Use classes when you need Objective-C interoperability.

  • 데이터의 identity를 컨트롤해야 한다면 클래스를 사용한다. (주소와 관련이 있는 듯)
    Use classes when you need to control the identity of the data you’re modeling.

  • 구현을 공유하기 위해서는 구조체와 프로토콜을 함께 사용한다
    Use structures along with protocols to adopt behavior by sharing implementations.


참고한 블로그

cory - 구조체와 클래스의 차이
https://corykim0829.github.io//swift/Understanding-Swift-Performance/#

profile
개발하면서 마주친 문제들을 정리하는 공간입니다.

0개의 댓글