직접 작성한 소스 이외에 다른 사람이 작성한 코드를 사용하고 싶을 때 우리는 라이브러리 또는 프레임워크를 추가한다.
라이브러리 / 프레임워크
코드 및 리소스의 번들이다. (라이브러리에 리소스를 추가한 것을 프레임워크라고 설명하는 글도 있다.)
라이브러리와 프레임워크는 소스 코드의 제어권이 어디에 있냐의 차이이다.
라이브러리는 제어권이 나(개발자)에게, 프레임워크는 내가 아닌 프레임워크(ex. UIKit)가 갖는다.
이렇게 추가한 라이브러리를 내 소스 코드에 연결(Link) 하는 방식에 따라 static과 dynamic으로 구분한다.
static library는 .a
소스 코드 + 라이브러리 코드를 merge 한 executable file을 만들어낸다. 이 때, 소스 코드와 라이브러리 코드가 copy 된다.
앱이 실행되면 복사된 이 executable file이 메모리에 로드된다.
많은 static lib를 사용할수록 executable file의 용량이 커짐 → 앱 실행 시 더 많은 메모리가 사용됨 → launch time이 길어짐
dynamic library는 .dylib
컴파일 시 static lib처럼 코드를 copy 하는 것이 아니라 dynamic lib에 대한 참조(references)만 executable file에 포함한다. (executable file이 Static Library에 비해 조금 더 가볍다)
앱이 실행되면(=런타임에) 참조에 따라 lib의 코드를 메모리에 load 한다.
(.dylib를 로드 하는 로더를 Dynamic Loader라고 부르고 .dyld)
dynamic lib가 많아질수록 executable file을 실행할 때(런타임에) 많은 메모리가 사용됨 → launch time 길어짐
WWDC17 에서 앱의 시작 시간을 개선하기 위해서 dylib를 줄일 것을 권장했기 때문에,
dylib를 많이 사용하는 것이 static lib을 사용하는 것보다 앱 실행속도가 더 느리다고 볼 수 있다.
또한, copy 이냐 reference 이냐 linking 방식의 차이이기 때문에 static은 라이브러리의 코드가 업데이트 되면 내 소스코드에서는 반영되지 않지만,
dylib의 경우에는 다시 컴파일 하지 않아도 업데이트 된 기능을 사용할 수 있다.
Static vs Dynamic은 Linking 방식의 차이이다.
https://zeddios.tistory.com/1308
Overview of Dynamic Libraries
⬇️ about Swift modules, libraries, packages, closed source frameworks, command line tools and more.
https://theswiftdev.com/deep-dive-into-swift-frameworks/