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
는 참조 타입이므로 같은 객체를 공유할 수 있어, 객체 간 상태 변경이 필요할 때 적합하다.