티스토리 뷰

Struct와 Class와 Enum의 공통점

  • 클래스(Class), 구조체(Struct), 열거형(Enum)은 Swift의 기본 자료구조 블럭이다.
  • 세가지 구조 모두 같은 방식으로 정의된다. ( 키워드 + 이름 + { } )
  • 세가지 자료구조 모두 프로퍼티(Properties)와 함수(Functions)를 가질 수 있다.
  • Extension을 통해 기능을 확장시킬 수 있다.
  • Protocol을 채택(Conform)할 수 있다.
  • 속성값에 접근할 수 있는 방법을 제공하는 Subscript를 정의할 수 있다.

 

Struct와 Class와 Enum의 차이점

  • Class
    • 참조 타입으로 Heap 영역에 인스턴스의 실제 내용이 저장되고 선언된 곳(Stack 일 수 도 있고 Heap일 수 도 있음)에 주소값이 저장된다.
      let 프로퍼티에 class 인스턴스를 할당한다면??
      → 주소값이 상수로 저장된다. (실제 내용이 상수로 저장된게 아니라 주소값이 상수로 저장!!!)
      → 내부에 var 로 선언된 프로퍼티는 인스턴스가 let 으로 선언되어도 변경이 가능하다. (아래 글 참고)
    • 상속 가능 (다중 상속은 지원하지 않음. 프로토콜 사용하면 다중 상속 가능)
    • 모든 프로퍼티에 기본값이 있는 경우가 아니면 initializer 를 구현해줘야한다.
      Class의 경우 상속이 가능하므로 특정 프로퍼티의 경우 SuperClass 혹은 SubClass에서 초기화 되는 경우가 있을 수 있으므로 memberwise init 기능을 제공하지 않음.
    • 인스턴스의 타입을 확인하거나, 슈퍼클래스 또는 서브클래스 타입처럼 다루기 위해 사용하는 Type Casting 사용 가능.
      → 상속 가능하니까
    • deinitializer 사용 가능
  • Struct
    • 값 타입으로 Stack 영역에 인스턴스의 실제 내용이 저장된다.
    • 상속 불가
    • initializer 자동으로 만들어주기도 하고 직접 만들 수 도 있다. (memberwise init 이라 부름)
      Struct는 상속이 불가하므로 초기화 될 곳이 한 곳으로 지정되어 있으므로 제공 가능.
  • Enum
    • 값 타입으로 Stack 영역에 인스턴스의 실제 내용이 저장된다.
    • 상속 불가
    • initializer 없이 상수로 사용가능. 또는 연관값을 사용.
    • Enum 은 저장 프로퍼티(Stored Property)를 가질 수 없다. 하지만 연산 프로퍼티(Computed Properties)는 가질 수 있고 연관값(associated value) 으로 값을 저장할 수 있다.

 

Struct와 Class와 Enum의 사용

  • Immutable해야할 경우 struct
  • 대입보다는 생성이 많이 되는 타입의 경우 struct

 

추가

동적 메모리 할당 (Heap): 프로그램 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말합니다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재할당을 받을 수 있습니다.

정적 메모리 할당 (Stack): 프로그램을 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 것을 말합니다. 해제하지 않음으로 인한 메모리 누수와 같은 문제를 신경쓰지 않아도 됩니다. 하지만 메모리의 크기가 하드 코딩되어 있어서 나중에 조절 할 수 없습니다. 또한 스택 영역에 할당된 메모리이므로 동적 할당에 비해 할당 받을 수 있는 최대 메모리에 제약을 받습니다.(StackOverFlow)

볼만한 글: https://sihyungyou.github.io/iOS-class-struct-enum/

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함