본문 바로가기
iOS/Swift

[Swift] struct, class, enum

by 최지철 2023. 8. 31.
728x90
반응형

struct, class, enum

스위프트의 기본 자료구조 블럭이다.

 

세가지 모두 같은 방식으로 정의 된다.

class jife {
}

struct jife{
}
enum jife{
}

 

구조체와 클래스는 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 용이하다.

스위프트에서는 구조체와 클래스의 모습과 문법이 흡사하다.

하지만, 구조체struct와 enum의 인스턴스는 값 타입이고, 클래스class 의 인스턴스는 참조 타입이다. 

 

구조체 struct

값 타입이란? 힙을 전혀 사용하지 않고 Stack에만 값이 쌓인다는 것이다.

또한 값 타입이기에, 힙을 사용하는 class보다 더 빠르다.

상속은 불가하나, 이니셜라이저를 자동으로 만들어준다.

구조체는 memberwise init을 통해 자동으로 초기화 구문을 생서하고, 값이 정의 되어있지 않는 프로퍼티가 존재할 때 혹은 자동으로 인스턴스를 생성 할 때, 해당 프로퍼티의 값을 입력받는 init을 생성한다.

 

클래스 class

참조 타입 인스터스로 Heap영역에 할당된다.

Heap영역에 저장된 실제 정보는 Stack영역에 해당 힙영역을 가르키는 참조(주소)가 저장된다.

상속이 가능하며, 이니셜라이저가 없다

클래스는 실행시, 컴파일러가 클래스 인스턴스의 타입을 미리파악하고 검사 할 수 있다.

init을 따로 정의해주지 않으면 오류가 발생한다.

 

열거형 enum   (네이넘?! ㅎㅎ)

enum의 경우 상속이 불가하며, 연관된 값들을 한 곳에 묶어놓은 타입이다.

case들에 값을 정해주지 않아도 하나하나가 고유의 값이 된다. 특정값을 지정된값으로 사용하고 싶다면 원시 값으로 존재 가능하다.


차이점

  • 초기화 함수 (이니셜라이저) :
    • class와 struct는 초기화함수를 갖지만, enum은 초기화 함수를 갖지 않는다. 이유는 열거형은 연관값을 구별되는 값들을 할당하기 때문이다. 클래스나 구조체에서 인스터스를 생성할 때, 프로퍼티가 초기화 되지 않으면 인스턴스를 생성할 수 없는 등의 문제가 발생해서 기본적으로 초기화에 필요한 정보들을 셋팅할 함수가 필요하다.
      하지만, enum의 경우 각 case가 애초부터 구별되는 rawvlaue를 가지며, 설정이 안되더라도 기본으로 정수값이 할당되기 때문이다.
    • *rawvlaue = 원시값
  • 상속
    • class는 상속이 가능하지만, enum과struct는 상속불가
  • 값타입 vs 참조 타입
    • struct와 enum의 값은 타입이지만, class는 참조 타입이다. class는 참조 타입으로, 포인터로 전달되고 정보는 heap메모리 영역에 저장된다.
728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] Concurrency [1]  (1) 2023.10.23
[Swift] Optional  (1) 2023.10.17
[Swift] Protocol 프로토콜 [2]  (0) 2023.10.16
[Swift] Protocol 프로토콜 [1]  (0) 2023.09.01
[Swift] Final 키워드 왜 쓰는 걸까?  (0) 2023.08.06