struct와 class와 enum의 차이를 설명하시오.

French Marigold·2023년 6월 8일
0

면접 준비

목록 보기
1/9

Struct

  1. 스택 영역에 위치합니다.

  2. 값 타입입니다.

  • 인스턴스를 담은 변수를 다른 변수에 할당할 때 복사본을 전달하여 원본 인스턴스를 보존합니다.
  • 정확히 말하자면 struct는 Copy-On-Write 방식을 사용하여
    다른 변수에 할당할 때까지는 두 변수 모두 메모리 주소값을 가리키고 있지만
    struct의 값이 수정될 때에는 변수에 복사본을 전달합니다.
    struct가 Copy-On-Write 방식을 채택한 이유는 struct 내부에는 많은 프로퍼티나 메소드들이 들어갈텐데 다른 변수에 struct를 할당할 때마다
    복사해서 값을 전달해준다면 메모리가 쓸데없이 낭비될 수 있기 때문입니다.
  1. 상속이 불가능합니다.

  2. struct 내 메소드로 저장 속성을 원칙적으로는 바꿀 수 없습니다. (mutating 키워드를 통해서 바꿀 수 있긴 합니다)

  • struct는 원본에서 저장 속성을 변경하는 것이 아니라 복사본을 만들고 거기서 저장 속성을 변경합니다.
  • struct가 이러한 방식을 취하는 이유는 인스턴스의 값을 일일이 변경해주는 것보다 바로 복사본을 만들어내는 것이 스택 영역의 취지에 맞고 그것이 훨씬 더 메모리 구조적으로 빠르기 때문인 것으로 보입니다.
  1. 저장 속성 내 값을 할당하지 않아도, 멤버와이즈 초기화 구문을 통해 추후 값을 할당할 수 있습니다.

  2. let 상수에 struct 인스턴스를 담으면 해당 인스턴스의 저장 속성 또한 let (상수화)되어서 변경이 불가능해집니다.

  3. 소멸자가 존재하지 않습니다.
    struct는 스택 영역에 담겨서 실행이 종료되면 알아서 메모리를 빠져나가기 때문에 소멸자가 딱히 필요가 없습니다.

  4. 스택 영역에 담겨서 실행이 끝나면 스택을 빠져나가므로 메모리 관리를 할 필요가 없습니다.


Class

  1. 인스턴스를 생성하면 힙 영역에 담깁니다.

  2. 참조 타입입니다. 인스턴스를 담은 변수를 다른 변수에 할당할 때 원본의 메모리 주소값을 넘겨줍니다.

  3. 상속이 가능합니다.

  4. let 상수에 class 인스턴스를 담으면, 해당 인스턴스의 메모리 주소값을 변경할 수 없게 됩니다.

  5. class 내 메소드를 이용해서 저장 속성을 변경할 수 있습니다.

  6. convenience init을 사용할 수 있습니다.

  7. 저장 속성에 값을 반드시 할당해 주어야 합니다. 값을 할당하지 않을 경우 다음과 같이 처리해주어야 합니다.
    1) 저장 속성에 값을 할당하든지
    2) init 생성자를 통해서 초기화 구문을 만들어주든지
    3) 옵셔널 타입을 적어줘야 합니다.

  8. 소멸자가 존재합니다.

  9. 힙 영역에 존재하므로 ARC를 통해 메모리를 직접 관리해줘야 합니다.


Enum

  1. 타입을 한정된 case 안에서 정의할 수 있는 타입입니다.
    ex) 빨, 주, 노, 초, 파, 남, 보
    ex) 동, 서, 남, 북

  2. enum 내부에는 저장 속성을 만들 수 없습니다. 오직 case와 메소드 혹은 계산 속성만 사용할 수 있습니다.

  3. 값 타입입니다.


⭐️ Struct가 Class보다 빠를 수 밖에 없는 이유 3가지

1. struct가 class보다 더 빠르게 인스턴스가 만들어집니다.

  • class는 인스턴스가 만들어지기 전, 힙 영역을 한 번 스캔한 후에 빈 공간이 있으면 빈 공간에 인스턴스를 만듭니다.
  • struct는 바로 스택 영역에 인스턴스가 만들어집니다.

2. 메소드를 실행하는 데에 있어서 struct가 class보다 더 빠릅니다.

  • class는 런타임 (앱이 실행되고 있는 시점) 에 메소드의 위치를 파악하여 코드 영역에서 바로 메소드를 실행하지 못하고 코드 영역에서 인스턴스를 담은 변수를 찾아가고, 변수는 다시 힙 영역의 인스턴스를 찾아가고 힙 영역의 인스턴스는 데이터 영역에 존재하는 인스턴스의 메소드 테이블을 찾아간 뒤, 다시 코드 영역으로 돌아가서 실행한 후에야 스택 영역에서 메소드가 실행됩니다.
    메소드의 위치를 미리 파악하지 못하여 일일이 찾아가게 됩니다.
    (Dynamic Dispatch)
  • struct는 컴파일 타임 (Build Succeed가 뜨기 전에 코드를 점검하는 시점)에 이미 메소드 위치를 파악해서 런타임에는 바로 메소드가 실행됩니다.
    (Static Dispatch)

3. 메모리 관리 차원에서 struct가 class보다 더 빠릅니다.

  • class는 메모리를 자신을 가리키는 변수의 수를 가지고 관리합니다. 그래서 자신을 가리키는 변수가 없으면 그 때서야 힙 영역에서 사라지게 됩니다.
  • 반면 struct는 그런 메모리 관리 자체를 할 필요가 없기 때문에 메모리 구조적으로 struct가 class보다 더 빠를 수 밖에 없습니다.
profile
꽃말 == 반드시 오고야 말 행복

0개의 댓글