Stack에 저장Immutability 유지)
Heap에 저장할 때 Heap 공간을 먼저 스캔해 빈공간을 찾음**struct** Animal {
var name = "Animal"
}
var a = Animal()
var b = a
a.name = "Dog"
a.name == b.name // false
Heap에 저장하고 해당 Heap의 메모리 주소를 담고 있는 변수는 Stack에 저장Heap 의 메모리 주소를 전달Heap에 저장된 인스턴스는 메모리에서 제거되지 않을 수 있음**class** Animal {
var name = "Animal"
}
var a = Animal()
var b = a
a === b // true
a.name = "Dog"
a.name == b.name // true
| 구분 | Struct | Class |
|---|---|---|
| 타입 | Value Type | Reference Type |
| 인스턴스 전달 | 복사한 값 전달 | 메모리 주소 전달 |
| 메모리 저장 위치 | Stack |
Heap |
| 메모리 관리 | 스택 프래임 종료 시 메모리에서 자동제거 | ‣ 관리 |
| 인스턴스 선언 | let의 경우 저장 속성이 전부 상수로 선언 및 |
|
저장속성이 var 선언 관계없이 변경 불가 |
let의 경우 가리키는 메모리 주소 변경 불가 |
|
저장속성은 자신의 let/var 선언에 다름 |
||
| 생성자 관련 | 멤버와이즈 이니셜라이저 제공 | 편의 생성자 제공 |
| 메소드 + 속성 | Mutating 메소드에서만 | |
| 메소드 내에서 속성값 변경 가능 | 메소드 내에서 속성값 변경 가능 | |
| 소멸자 | 없음 | 제공 |
| 상속가능여부 | 상속 불가 | 상속 가능 |
Table Dispatch 라고도 부르며 Class 가 메소드를 호출하는 방식을 말한다.Virtual Table 를 런타임에서 인스턴스가 참조한다.
Virtual Table 생성 시 상위 클래스의 Virtual Table 을 복사하여 자신의 메소드 정보와 함께 저장한다.Direct Dispatch 라고도 부르며 struct 가 메소드를 호출하는 방식을 말한다.
Struct 인스턴스는 Stack 영역에 저장된다.
메소드의 메모리 주소 값이 컴파일 타임 에 결정되어 인스턴스 생성과 함께 해당 주소 값에 대한 정보도 삽입된다.
컴파일 타임 에 메소드의 메모리 주소 값이 미리 결정 되고 모든 인스턴스는 같은 메모리 주소를 참조하기 때문에 Class 처럼 상속에 의한 재정의가 불가능하다.메소드 호출 시 바로(Direct) 해당 메소드의 메모리 주소에 접근하여 호출하기 때문에 빠르다.
final 키워드가 붙어 상속이 불가능한 Class 의 메소드는 메모리 주소값이 변경될 여지가 없기 때문에 컴파일러가 컴파일 시 Struct 처럼 Direct Dispatch 로 동작하게끔 최적화 작업을 한다.