(Swift) Class vs Struct 그리고 Enum

박성민·2020년 10월 22일
0

iOS

목록 보기
3/31

구조체와 클래스?

  • 구조체와 클래스는 프로그래머가 용도에 맞게 코드블럭을 만들 때 용이합니다.
  • 구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있습니다. 새로운 사용자정의 데이터 타입을 만들어 주는 것입니다.

구조체와 클래스의 공통점

  • 프로퍼티와 메서드를 사용해서 구조화된 데이터와 기능 을 가진다.
  • 새로운 사용자 지정 타입 을 만들어 준다.
  • 초기화(initializer) init 를 정의해서 초기 상태를 설정할 수 있다.
  • 확장(extention) 할 수 있다.
  • 프로토콜(protocol) 사용이 가능하다.
  • 서브스크립트(subscript) 사용이 가능하다.
  • 프로퍼티값에 접근하고 싶다면 .을 사용

구조체와 클래스의 차이점

1. Struct

  • 값 타입(Value Type)
  • call by value: 할당 또는 파라미터 전달 시 value copy가 일어난다.
  • Value 이기에 multi-thread 환경에서 공유 변수로 인한 문제를 일으킬 확률이 적다.
  • Stack memory 영역에 할당 (속도가 빠름). 그러나 일정 크기 이상의 struct일 경우 heap 저장됨!
  • scope based lifetime: comfile time에 compiler가 언제 메모리를 할당/해제할지 정확히 알고 있다.
  • data loclity: CPU 캐쉬 히트율이 높다.
  • 상속 불가능 (protocol은 사용 가능)
  • AnyObject로 타입캐스팅이 불가

2. Class

  • 참조 타입(Reference Type)
  • call by reference: 할당 또는 파라미러 전달 시 객체를 가리키고 있는 메모리 주소값이 복사됨
  • Heap memory 영역에 할당 (속도가 느림)
  • 런타임에 직접 allocate하며 reference counting을 통해 deallocate가 필요
  • memory fragmentation등의 overhead가 존재
  • 상속 가능
  • 런타임에 타입캐스팅을 통해 클래스 인스턴스에 따라 여러 동작이 가능
  • deinitializer 존재

구조체를 사용하는 것이 유리한 경우

  • 연관된 값들의 집합을 캡슐화하는 것만이 목적 일 때
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
  • JSON의 필드와 1:1 mapping되는 간단한 모델이 필요할 때 (JSON대신 다른 데이터 encoder/decoder를 구현가능하지만 Swift에서는 JSON만 제공됨)

Enum

  • enum은 관련 값의 그룹에 대한 일반적인 유형을 정의
  • 각 case는 그 자체가 고유의 값
  • protocols 확장을 통해 케이스를 전부 가져올 수 있음(CaseIterable)
  • Associated Values
    • 서로 다른 타입의 값을 저장
  • Raw Values
    • 동일한 유형의 기본 값으로 미리 지정할 수 있음

+) 값의 존재 유무에 대한 Error를 확인하는 곳이 enum은 컴파일 단계에서 알 수 있고, struct, class에서 static 상수를 만들 경우 런타임에서 확인이 가능하다.
-> enum은 instance를 생성하지 않고 값에 접근하기 떄문

profile
iOS시작~

0개의 댓글