본문 바로가기
iOS/Swift

[Swift] Class와 Struct의 차이

by Dani K 2022. 9. 29.

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

댓글