본문 바로가기

iOS/iOS 기술 면접

Struct와 Class와 Enum의 차이

swift에서 제공하는 주요 타입인 struct, class와 enum의 차이점과 공통점에 대해서 비교해보도록 하겠습니다.

Struct

struct는 기본적으로 값 타입(value type)으로 데이터 전달 시 값을 복사하여 전달합니다.

복사한 값을 이용해 새로운 인스턴스를 생성하고 이는 메모리의 Stack 영역에 저장합니다.

데이터를 복사하여 전달하기 때문에 데이터의 상태 변화를 방지할 수 있고, 코드 예측에도 유리합니다.

같은 이유로 스레드 간 동시성 문제에서도 안전하고, 메모리 관리 측면에서도 유리합니다.

-> 스레드 간 동시성 문제에 대해서도 알아봐야할듯 ㅠㅠ

 

메모리 관리 측면에서 유리한 이유는 다음과 같습니다.

복사한 값은 Stack 영역에 저장을 하게 되는데 Stack은 LIFO 방식으로 구조가 단순하고 할당과 해제가 빠름

값 타입으로 복사를 하기 때문에 참조 카운팅이 필요가 없음( 자동 해제가 되며 순환 참조등의 문제가 발생하지 않음)

 

그리고 구조체는 Copy-on-write라는 최적화 알고리즘을 사용함

모든 값 타입이 이 방식을 사용하는 것은 아니고, 구조체로 정의된 컬렉션(배열, 딕셔너리 등)이 이 방법을 씀.

이 내용은 따로 정리해보겠습니다!!!

 

Class

class는 참조 타입(reference type)으로 데이터 전달 시 메모리의 주소값을 전달합니다.

값은 메모리의 Heap 영역에 저장이 되며, 이로 인해 속도가 느림.

Heap 영역은 메모리 할당을 하지않은 영역을 찾아 동적할당을 수행하기 때문!!!!

-> 왜 Heap 영역에 동적으로 할당을 하는지에 대해서는 Static, Dynamic Dispatch 문제와 연관이 있음.

iOS 프레임워크의 대부분은 Class로 구성되어 있고, 이는 상속이 가능

 

Enum

Struct와 마찬가지로 값 타입임.

상속이 불가능하고, 저장 프로퍼티를 가질 수 없음

 


Struct와 Class의 공통점

서로 다른 타입을 하나로 묶어 새로운 타입으로 사용이 가능

내부에서 함수, 프로퍼티를 정의할 수 있음

Extention과 Protocol 채택이 가능

서브스크립트를 이용해 값에 접근할 수 있음

이니셜라이저를 사용할 수 있음

 

그럼 언제  Struct를 사용하고 언제 Class를 사용해야 할까

기본적으로는 Struct를 사용.

Struct는 값을 참조할 필요가 없거나, 상속이 필요없을 경우 사용.

objc를 함께 사용해야 할 경우 class를 이용하며

고유한 값을 제어할 필요가 없을 경우는 구조체를 사용하자!

        Class는 참조 유형이기 때문에 ID 개념이 내장되어 있음.

공유가 필요한 속성을 만들고 싶을 때는 구조체, 프로토콜을 사용하자

        상속은 클래스만 되지만, 프로토콜은 클래스, 열거형, 구조체 모두가 채택할 수 있음

 


Static Dispatch, Dynamic Dispatch 

위에서 잠깐 언급되었던 내용

Class를 사용하면 속도가 느리고, Heap에 동적 할당을 하는 이유에 대한 문제임

Class의 성능과도 관련이 있어서 다음 글에서 좀 더 깊게 설명해 보겠습니다~!

 

여기서 간단하게 설명하자면 Dispatch는 함수의 결정 방식을 말함

어떤 함수를 호출할지 컴파일 타임에서 결정하는지, 아니면 런타임 중에 결정하는지의 차이를 보입니다.

 

Static Dispatch의 경우 호출할 함수를 컴파일 타임에서 결정 후 런타임에서 바로 실행을 합니다.

따라서 속도적인 측면에서 이점이 있고,

Dynamic Dispatch의 경우 런타임에서 함수가 결정되기 때문에 손해를 보게 됩니다.

 

그러면 왜 Dynamic Dispatch를 쓰는지 생각할 수 있는데 이는 Reference Type 때문입니다!

 

Class는 참조 타입이고 dynamic dispatch를 사용합니다.

왜냐면 상속이 가능하고, 오버라이딩의 가능성이 가능하기 때문임!!

오버라이딩이 가능하기 때문에 어느 클래스의 함수를 사용해야 할 지 확인이 필요하고 이를 런타임 시점에서 결정함.

 

Struct는 값 타입이므로 상속이 불가능하고, 오버라이딩이 안되므로 static dispatch를 쓰는 것입니다~.

 

그래서 다음 글에서 말할려고 한건데 class에서의 성능을 높히기 위해서 상속을 하지 않을 경우 final로 선언하여 static dispatch를 사용하기도 함!

 


Choosing Between Structures and Classes | Apple Developer Documentation

 

Choosing Between Structures and Classes | Apple Developer Documentation

Decide how to store data and model behavior.

developer.apple.com

Everything is about mutation: Structs vs Classes

 

Everything is about mutation: Structs vs Classes

This is deep dive into structs and classes. We are going to talk about: Reference types vs value types, Memory management: stack vs heap…

medium.com

 

'iOS > iOS 기술 면접' 카테고리의 다른 글

Optional  (1) 2023.11.02
AnyObject  (0) 2023.11.02
Convenience init  (1) 2023.10.31
Copy On Write는 어떤 방식으로 동작할까?  (0) 2023.10.31
Class의 성능을 향상 시킬 수 있는 방법  (1) 2023.10.31