Swift는 클래스와 구조체를 제공한다.
그렇다면 언제 구조체를 사용해야 하고 언제 클래스를 사용해야 할까?
클래스와 구조체의 가장 큰 차이는 '메모리 저장 방식의 차이'이다.
클래스(Class)
- 참조 타입 (Reference Type)
- 인스턴스 데이터는 힙(Heap)에 저장, 해당 힙을 가리키는 변수는 스택에 저장하고 메모리 주소값이 힙을 가리킨다.
- 복사 시 값을 전달하는 것이 아니고, 저장된 주소를 전달한다.
- 힙(Heap)의 공간에 저장, ARC 시스템을 통해 메모리를 관리한다.
- 상속이 가능하다.
구조체(Struct)
- 값 타입 (Value Type)
- 인스턴스 데이터를 모두 스택(Stack)에 저장한다.
- 복사 시 값을 전달할 때마다 복사본을 생성한다. (다른 메모리 공간 생성)
- 스택(Stack)의 공간에 저장하고, 스택 프레임 종료 시 메모리에서 자동 제거된다.
- 상속이 불가능하다.
클래스(Class) 복사 시 메모리 주소값을 복사하는 것이기 때문에 동일한 데이터를 가리키게 된다.
class Person {
var name = "Rose"
}
var p = Person()
var p2 = p
p.name = "Lisa"
print(p.name) // Lisa
print(p2.name) // Lisa
let person = Person()
person.name = "Jennie"
print(person.name) // Jennie
구조체(Struct) 복사 시 값이 직접 복사되고 두 변수가 독립적으로 작동한다.
struct Person {
var name = "Rose"
}
var p = Person()
var p2 = p
p.name = "Lisa"
print(p.name) // Lisa
print(p2.name) // Rose
let person = Person()
person.name = "Jennie" // Error! 'person' is a 'let' constant
언제 클래스, 구조체를 사용해야 할까?
클래스는 데이터가 메모리에 오래 저장되는 반면에 구조체는 메모리에 오랫동안 저장하지 않고 상속 없이 사용할 수 있다. 애플은 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는것을 권장한다.
- 연관된 데이터들을 캡슐화(묶는)하는 것만이 목적일 경우
- 캡슐화한 값을 참조하는 것보다 복사해서 사용하는 것이 효율적일 때
- 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는것이 합당할 때
- 다른 타입으로부터 상속받거나, 자신을 상속할 필요가 없을 때
추가적으로 해당 모델을 serialize 해서 전송하거나 파일로 저장할 경우가 발생하면 클래스를 사용해야 한다.
클래스는 구조체보다 여러가지 면에서 속도가 느릴 수밖에 없으므로 굳이 필요한 경우에만 클래스를 사용한다.
'iOS > Swift' 카테고리의 다른 글
[Swift] Copy-on-Write(CoW) 알아보기 (0) | 2022.10.02 |
---|---|
[Swift] 옵셔널 패턴(Optional Pattern) (0) | 2022.09.28 |
[Swift] 옵셔널 바인딩(Optional Binding) (0) | 2021.11.24 |
댓글