스위프트에서 구조체(Struct)와 클래스(Class) 중 어떤 것을 선택할지는 **값 의미론(Value Semantics)**과 참조 의미론(Reference Semantics) 중 무엇을 따를지 결정하는 핵심 선택이며, 이는 성능 및 안전성에 직접적인 영향을 미칩니다.

핵심적인 성능 및 의미론적 차이는 다음과 같습니다.

1. 의미론적 차이 (Semantics)

구분 구조체 (값 타입, Value Type) 클래스 (참조 타입, Reference Type)
기본 동작 값을 복사하여 사용합니다. 레퍼런스(참조 주소)를 복사하여 사용합니다.
소유권/안전성 참조 계산이 필요 없으며, 자체 소유를 하기 때문에 안전합니다. 자동 참조 계산(ARC) 방식을 사용하며, 여러 곳에서 참조할 때 병렬 처리 제한이 발생할 수 있습니다.
패러다임 함수 중심 프로그래밍(Functional Programming)에 적합합니다. 객체 중심 프로그래밍에 사용됩니다.

값 타입(구조체)은 불변성(immutability)을 유지하며 예측 가능한 코드를 만드는 데 유리합니다. 스위프트 표준 라이브러리 대부분과 파운데이션의 주요 타입(예: Date, URL)도 구조체 기반으로 작성되어 있습니다.

2. 성능 및 메모리 관리 (Performance & Memory)

구분 구조체 타입 (Struct Type) 클래스 타입 (Class Type)
메모리 공간 주로 스택(Stack) 메모리 영역에 할당됩니다. 주로 힙(Heap) 메모리 영역에 할당됩니다.
참조 계산 참조 계산을 사용하지 않으므로 오버헤드가 없습니다. retain, release 등 참조 계산을 사용하므로 오버헤드가 있습니다.
메시지 디스패치 정적 디스패치(Static Dispatch) 방식으로 빠릅니다. 동적 디스패치(Dynamic Dispatch) 방식으로 느립니다.

예외 사항:

선택 기준

일반적으로 스위프트는 구조체 타입을 사용하여 코드를 작성하는 것이 더 효율적이고 성능상 이점이 있습니다. 하지만 객체 정체성(Identity)이나 상속(Inheritance)이 반드시 필요한 경우에는 클래스를 사용해야 합니다.

어떤 타입이 어떤 방식으로 메모리에 저장되는지 더 깊이 이해하고 싶으신가요? 아니면 새롭게 추가된 자료의 히치(Hitch)와 행(Hang) 개념에 대해 알아볼까요?