Swift에서는 데이터를 저장하고 관리하는 데 class와 struct를 사용할 수 있다.
하지만 두 가지는 메모리 관리 방식과 동작이 다르기 때문에 상황에 맞게 선택해야 한다.
| 특징 | Class | Struct |
|---|---|---|
| 메모리 할당 | Heap | Stack |
| 참조 방식 | 참조 타입 (Reference Type) | 값 타입 (Value Type) |
| 상속 | 가능 | 불가능 |
| 복사 방식 | 동일 객체를 참조 (Call by Reference) | 값 자체를 복사 (Call by Value) |
| Mutability | let으로 선언해도 내부 속성 변경 가능 | let으로 선언하면 내부 속성 변경 불가 |
| deinit 사용 | 가능 | 불가능 |
Class는 참조 타입이므로 인스턴스를 변수에 할당하거나 함수에 전달하면 같은 객체를 가리킨다.Struct는 값 타입이므로 복사본을 생성하며, 변경이 원본에 영향을 미치지 않는다.class Person {
var name: String
init(name: String) {
self.name = name
}
}
struct Animal {
var name: String
}
var person1 = Person(name: "Alice")
var person2 = person1 // 같은 객체를 참조
person2.name = "Bob"
print(person1.name) // "Bob"
var animal1 = Animal(name: "Dog")
var animal2 = animal1 // 값 복사
animal2.name = "Cat"
print(animal1.name) // "Dog"
deinit을 활용해 객체 해제 시점에 특정 동작을 수행해야 할 때struct는 값 타입이므로 복사할 때 독립적인 객체를 만든다. 이로 인해 상태 관리가 간편하고 스레드 안전성이 높다.class는 참조 타입이므로 같은 객체를 공유할 수 있어, 객체 간 상태 변경이 필요할 때 적합하다.