1. Class VS Struct
스위프트(Swift)에서 클래스(class)와 구조체(struct)는 둘 다 데이터 모델링과 기능 정의에 사용되는 데이터 타입이지만, 몇 가지 중요한 차이점이 있다.
- 상속 (Inheritance):
- 클래스는 상속을 지원한다. 다른 클래스를 기반으로 새로운 클래스를 정의하고 부모 클래스의 속성과 메서드를 상속받을 수 있다.
- 구조체는 상속을 지원하지 않는다. 즉, 다른 구조체를 기반으로 새로운 구조체를 정의할 수는 없다.
- 참조 타입 vs. 값 타입:
- 클래스는 참조 타입(Reference Type)이다. 클래스 인스턴스를 생성하면 해당 인스턴스를 참조하는 포인터가 만들어지며, 여러 변수 또는 상수가 하나의 인스턴스를 가리킬 수 있다. 따라서 한 곳에서 수정하면 다른 곳에서도 영향을 받을 수 있다.
- 구조체는 값 타입(Value Type)이다. 구조체 인스턴스를 생성하면 해당 데이터가 복사되어 새로운 인스턴스가 만들어지며, 각각의 인스턴스는 독립적으로 존재한다. 이로 인해 데이터의 변경이 해당 구조체 인스턴스에만 영향을 미친다.
- 저장 방식:
- 클래스 인스턴스는 힙(Heap) 메모리에 저장된다. 힙은 동적 할당된 메모리 영역으로, 객체가 생성될 때 메모리가 할당되며, 객체가 더 이상 사용되지 않을 때 메모리가 해제된다.
- 구조체 인스턴스는 스택(Stack) 또는 힙(Heap) 메모리에 저장될 수 있다. 스택에 저장되는 경우, 인스턴스는 해당 스코프 내에서만 유효하며 스코프를 벗어나면 자동으로 제거된다. 힙에 저장되는 경우, 클래스와 유사한 방식으로 동작한다. 일반적으로 구조체 인스턴스는 값 타입이기 때문에 스택에 저장되며, 복사본이 만들어지므로 스택 사용량을 최소화하는데 도움이 된다. 그러나 크기가 큰 구조체나 구조체를 다른 객체에 저장해야 할 때 힙에 저장할 수도 있다.
- 메모리 관리:
- 클래스는 참조 타입이므로 메모리 관리를 고려해야 한다. 스위프트는 ARC(자동 참조 계산)를 사용하여 더 이상 사용되지 않는 인스턴스를 자동으로 정리한다.
- 구조체는 값 타입이므로 메모리 관리가 덜 복잡하다. 인스턴스가 스코프를 벗어나면 자동으로 메모리에서 제거된다.
- 초기화(Initialization):
- 클래스와 구조체는 모두 초기화자(Initializer)를 사용하여 인스턴스를 초기화할 수 있다. 그러나 클래스는 편의 이니셜라이저(convenience initializer) 및 지정 이니셜라이저(designated initializer)와 같은 초기화자의 복잡한 패턴을 지원한다.
- 타입 캐스팅(Type Casting):
- 클래스 인스턴스는 다른 클래스 타입으로 다운캐스팅할 수 있지만, 구조체 인스턴스는 타입 캐스팅을 지원하지 않는다.
일반적으로 구조체는 간단한 데이터 모델링 및 불변 데이터를 표현할 때 사용되며, 클래스는 복잡한 객체와 상속 관계를 다룰 때 사용된다.