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는 상속이 불가능해, 완전한 초기화가 필요 -> 자동으로 초기화 구문을 생성해준다.
✅ 아래 조건 중 하나 이상 해당하면 구조체 사용을 권장
• 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
• 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
• 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는 것이 합당할 때
• 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
참고문서
- https://roniruny.tistory.com/136
- https://velog.io/@hayeon/struct와-class와-enum의-차이를-설명하시오
- 성능 비교