야매 iOS
[Swift] Dispatch
the Cosmos
2023. 8. 7. 08:07
컴퓨터 동작방식
코드로 작성한 함수는 컴퓨터 명령어로 변형되어 메모리에 저장된다
함수를 호출한 다는 것은 컴퓨터가 해당 함수가 있는 메모리로 “점프”해서 명령어를 실행시키는 것을 의미한다
Static Dispatch (Compile Time)
컴퓨터가 코드를 컴파일할 때 함수의 코드가 어디에 있는지 명확하게 알고 있고 “점프”하는 것을 의미한다
- 함수의 위치를 “찾기” 위해 추가적인 연산이 필요없다
Dynamic Dispatch (Run Time)
컴퓨터가 어떤 추가적인 연산을 통해 함수의 위치를 찾아 해당 함수의 명령어를 실행한다
witeness table을 확인해서 어떤 함수를 실행해야 하는지 알 수 있다
2가지 종류가 있다
- table dispatch
- message dispatch
Table Dispatch
부모 클래스가 있고 자식 클래스가 있다
클래스마다 테이블이 존재하고 해당 테이블은 offset을 통해 접근할 수 있다
부모에게 상속받아 정의되지 않은 함수는 부모의 테이블 중에서 그 항목을 가져온다
Message Dispatch
런타임에 클래스 계층을 올라가면서 어떤 함수가 호출되어야 하는지 결정한다
- Table Dispatch보다 느리다
Swift에서 Dynamic Dispatch → Static Dispatch
Dynamic Dispatch가 필요없는 상황에선 안 쓰는 것이 성능적으로 이점을 가진다
final
클래스, 메서드, 그리고 프로퍼티를 제한하는 키워드
- override될 수 없음을 의미한다
- 그러므로 컴파일러는 이 키워드를 통해 dynamic dispatch가 아닌 static dispatch를 사용할 수 있다
- 메서드, 프로퍼티를 오버라이드 해서 재정의할 가능성이 없기 때문에 현재 구현된 그대로를 사용하면 되기 때문
class ParticleModel {
final var point = ( x: 0.0, y: 0.0 )
final var velocity = 100.0
final func updatePoint(newPoint: (Double, Double), newVelocity: Double) {
point = newPoint
velocity = newVelocity
}
func update(newP: (Double, Double), newV: Double) {
updatePoint(newP, newVelocity: newV)
}
}
private
private 키워드를 사용하면 메서드와 프로퍼티의 정의가 다른 곳에서 노출되지 않는다
그렇기 때문에 해당 메서드와 프로퍼티는 오버라이딩될 수 없다는 것을 내포하고 이는 컴파일로부터 하여금 final 키워드롤 유추할 수 있게 한다
- indirect call(메서드, 프로퍼티 접근)을 줄일 수 있다.