앞으로 진행할 긇에서는, Library와 Framework에 대해서 알아볼 것이다. 첫번째 순서로는 Library이다.
일단 간단하게 Library와 Framework에 대한 차이를 알아보고 가자.
Library
를 클릭하면 만들 수 있다.Framework
를 클릭하면 만들 수 있다.여기서 알 수 있는 점은, 개념적으로 Framework가 library를 포함한다는 사실이다.
Static library는 아카이빙된 object file(.o
확장자)의 모음으로 .a
확장자 형태를 가진다. Static library는 Static archive library, static linked shared library라고도 불린다.
macOS/iOS 소스 코드를 컴파일하면 object files를 생성한다. object file은 Mach-O 형식의 binary 데이터로 다음과 같은 정보를 포함한다. Mach-O는 실행 파일 포맷의 일종이다. 해당 내용은 다음 글로 알아보도록 하겠다. 지금은 파일의 구성만 간단하게 알아보자.
우리가 실제로 앱을 빌드한 후, 앱 번들 경로로 찾아가서 "패키기 정보 보기"를 통해 열어보면 프로젝트 이름과 같은 실행파일이 있다.
파일 속성을 쳐보면, Mach-O 파일이라는 것을 확인할 수 있다.
위의 그림에서 사용하는 용어를 바탕으로 설명해보았다.
장점 | 단점 |
---|---|
- 앱의 주소 공간에 항상 로드되어 있기 때문에 라이브러리 코드 실행속도가 매우 빠름 | - 앱의 executble file에 항상 포함되어야 함 - 초기 런칭 속도 저하 - 앱의 초기 메모리 사용량 증가 - library의 버전 업데이트시 앱의 object files를 새로운 버전의 library로 변경해야 함. 즉, 새로 빌드되어야 업데이트된 라이브러리 사용가능 |
static library가 compile time에 executable file에 포함된다는 점은 앱이 커질 수록 더 큰 문제로 작용했다. 복잡도가 늘어나 추가적인 작업이 많이 요구되었기 때문이다. 이를 해결하기 위해 나온 것이 Dynamic library이다. 핵심은 executable files에 포함되지 않는다는 점이다. 즉, Dynamic library는 compile과 독립적으로 동작하며, 그렇기 때문에 compile 없이 dynamic library의 코드는 변경될 수 있다. 이런 속성 떄문에 dynamic shared libraries, shared objects, dynamically linked libraries라 불린다. (dll
, sodll
)
장점 | 단점 |
---|---|
- 앱의 compile과 별개로 동작하기 때문에 compile없이 library의 변화된 코드 반영가능 - 불필요하다면 memory에 로드되지 않음 - 엡 초기 실행 속도 개선 - 앱 메모리 사용량 감소 | - 런타임 앱 실행 속도 감소 - Library 사용할 수 없거나, 사용은 가능하나 버전 호환되지 않는 경우 앱이 죽을 수 있다. |
Xcode > Build Phase > Link Binary With Libraries
link 해야할 모든 libraries, Frameworks(다음글)를 적는다.
Xcode > Build Phase > Embed Frameworks
App Bundle에 묶여서 Copy 되어야 할 Frameworks를 적는다.
빌드가 완료된다면 products 폴더에 생기는데, 해당 번들의 package 폴더를 열어보면, frameworks 폴더가 있고, 이 안에 dynamic framework로 구성해둔 타겟의 실행파일이 위치해 있다. pod으로 설정한 것들은 pod project에 위치해있다.
Static | Dynamic (shared) | |
---|---|---|
사용 가능 타이밍 | Build time 이후 곧바로 가능 (application에 모두 반영됨) | Run tim에 메모리 올린 후 가능 (App Launch Time) |
binary 확장자 | .a | .dylib (Framework인 경우 특별한 확장자 없음) |
target file 크기 | target size 증가 사용하는 실행파일 각각에 컴파일되어 추가됨 | target size 변동 없음 |
공유 가능 여부 | 불가능 | 여러 프로세스에서 사용 가능 (여러 애플리케이션에서 사용은 불가능, sandbox내에 들어가 있어 보안적으로 막혀있음, 대신 app extension에서 사용가능) |
iOS 앱 크기 | 최소 (다 커질 수도 있음) 라이브러리 크기 만큼 증가 | 라이브러리 크기 만큼만 증가 앱 패키지에 embed 되어 사용되므로) |
처음 프로젝트를 만들었을 때 보이는 New target 설정의 Framework는 dynamic 라이브러리를 이야기 한다. iOS 8.0부터 사용이 가능했다. static library는 여전히 일반적으로 말하는 static library이라 말한다.
Library와 shell shockers Framework는 프로그래밍에서 자주 사용되는 용어로, 소프트웨어 개발에서 코드의 재사용성과 모듈화를 촉진하는데 사용됩니다.