Struct / Class / Enum

Jee.e (황지희)·2022년 2월 27일
0

Struct

  • Swift의 기본 데이터 타입은 모두 구조체이다.
  • 값 타입, 상속 불가
  • stack에 저장
  • 인스턴스 let 선언 시 → 구조체 내부 속성 변경 불가 (실제 값 고정)

Class

  • iOS 프레임워크의 대부분이 클래스이다.
  • 참조타입으로 일반적으론 단일 상속, 프로토콜 사용 시 다중 상속 가능
  • Heap에 저장, Stack엔 Heap을 가리키는 주소만 저장
  • Type casting(형변환)/ deinit(불필요한 리소스 해제) / 참조횟수계산은 클래스 인스턴스만 가능
  • 인스턴스 let 선언 시 → 속성 변경 가능 (주소 값)

Enum

  • 같은 성질을 가지는 것들에 대한 목록들을 case 별로 나열
  • 각 case 자체가 고유의 값이다.
  • 값 타입, 상속 불가
  • stack에 저장

공통점
• 계산 프로퍼티와 함수를 가질 수 있다.
• 서로 다른 타입(자료형)들을 하나로 묶을 수 있다.
• 묶은 자료형들을 새로운 타입처럼 사용 가능하다.
• 속성값에 접근할 수 있는 방법을 제공하는 서브스크립트(Subscript)를 정의할 수 있다.
• Extension 이 가능하다.
• 프로토콜을 채택할 수 있다.

차이점
• 클래스/구조체는 초기화 함수를 갖지만, 열거형은 갖지 않는다. (열거형은 연관값을 discrete values 에 할당)
• 클래스, 구조체와는 다르게, enum은 저장 프로퍼티를 가질 수 없다.
• 상속은 클래스만 가능하다.
• 클래스는 참조 타입, 구조체와 열거형은 값 타입 이다.클래스의 인스턴스 생성 시 Heap에 할당되고, Stack에 해당 Heap영역을 가르키는 주소가 저장된다. (그래서 상대적으로 느림) 구조체와 열거형은 값타입으로, Heap 사용 없이 Stack에만 할당된다.
• Type casting(형변환)/ deinit / 참조횟수계산은 클래스 인스턴스만 가능하다
• 구조체로 열거형이 하는 역할을 대체할 수 있으나, 열거형을 사용하면 컴파일 타임에 값이 맞는지 틀린지 확인이 가능하다. (구조체는 nil이나 index와 같은 런타임 에러가 발생할 가능성이 있다.)

✅ 생성자

Class는 자식 클래스에서만 생성자를 만들 수 있어, 필수적으로 초기화 구문이 생성되지 않는다.
Struct는 상속이 불가능해, 완전한 초기화가 필요 -> 자동으로 초기화 구문을 생성해준다.

✅ 아래 조건 중 하나 이상 해당하면 구조체 사용을 권장

• 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
• 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
• 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는 것이 합당할 때
• 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때 


참고문서

  1. https://roniruny.tistory.com/136
  2. https://velog.io/@hayeon/struct와-class와-enum의-차이를-설명하시오
  3. 성능 비교
profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글