프레임워크는 여러 가지 공유 자원을 하나의 패키지로 묶어주는 계층적 디렉터리 임. 여기에는 동적 공유 라이브러리, nib파일, 이미지파일, 로컬라이즈 문자열, 헤더 파일, 참고 문서 등이 포함될 수 있음. 이 자원들은 여러 애플리케이션에서 동시에 사용할 수 있고, 시스템은 필요할 때 메모리에 로드하고 가능한 한 번만 로드된 자원을 여러 애플리케이션이 공유함.
프레임워크는 하나의 번들(bundle)임. 번들(bundle)이란? → 여러 파일과 리소스를 하나로 묶어놓은 패키지임 iOS나 macOS에서는 Core Foundation Bundle Services나 Cocoa의 NSBundle 클래스를 사용하여 번들의 내용물을 접근할 수 있음
그러나!!🔥
프레임워크 번들은 일반적인 번들과 몇가지 차이점이 있음.
일반 번들 : 일반적으로 Finder(파일 탐색기)에서 하나의 파일처럼 보임. 사용자가 쉽게 내부를 볼 수 없도록 “불투명”하게 만들어져 있음.
프레임워크 번들 : Finder에서 하나의 파일처럼 보이지 않고, 디렉터리(폴더)처럼 보임. 그래서 사용자가 디렉터리를 열어 내부 파일과 폴더를 직접 탐색할 수 있음.
즉, 프레임워크 번들은 개발자가 쉽게 접근하고 사용할 수 있도록 만든 디렉토리 구조의 번들임. → 일반 번들과 달리 프레임워크 번들은 사용자가 직접 내부의 모든 것을 찾아볼 수 있음
프레임워크는 정적 및 동적 공유 라이브러리와 동일한 목적을 제공함. 특정 작업을 수행하기 위해 응용 프로그램이 호출할 수 있는 코드 묶음을 제공한다는 말임. ex) Cocoa 프레임워크의 Application Kit과 Foundation 프레임워크는 다양한 Cocoa 클래스와 메서드에 대한 프로그래밍 인터페이스를 제공함.
프레임워크의 장점 프레임워크는 정적 및 동적 공유 라이브러리에 비해 아래와 같은 장점이 있음. 1. 리소스 그룹화:
프레임워크는 관련 있지만 별개의 리소스들을 하나로 묶음으로 그롭 화함.
이 그룹화로 인해 리소스를 설치하고 제거하거나 위치를 쉽게 찾을 수 있음
2. 다양한 리소스 유형 포함
프레임워크는 라이브러리보다 더 다양한 리소스 유형을 포함할 수 있음
ex) 프레임워크에는 관련 헤더 파일과 문서도 포함될 수 있음
3. 버전 관리
같은 번들에 여러 버전의 프레임워크를 포함할 수 있음
이로 인해 오래된 프로그램과의 하위 호환성을 유지할 수 있음.
4. 메모리 사용 효율
프레임워크의 읽기 전용 리소스는 메모리에 물리적으로 하나의 복사본만 존재
이를 사용하는 프로세스의 수와 관계없이 리소스를 공유하여 시스템의 메모리 사용량을 줄이고 성능을 향상함
❗️프레임워크는 반드시 프로그래밍 인터페이스를 제공할 필요는 없음. 경우에 따라 리소스 파일만을 포함할 수 있음. 하지만 이런 사례는 흔치 않음.
라이브러리(Library)
라이브러리란?
→ 특정 기능을 수행하는 코드의 모음.
재사용 가능한 코드 묶음이기 때문에 개발자는 라이브러리를 이용하여 코드를 재사용하고 유지보수를 쉽게 가져갈 수 있음.
라이브러리는 정적 라이브러리와 동적 라이브러리로 구분할 수 있음
정적 라이브러리 (Static Library)
‘.a’ 확장자를 갖는 파일로 볼 수 있음
컴파일 시 프로그램에 복사되어 포함됨
모든 코드가 프로그램에 포함되기 때문에 프로그램(앱)의 크기가 커질 수 있음
추가적으로 로드할 필요가 없기 때문에 속도가 빠를 수 있음
외부 종속성이 없어 배포 및 관리에 용이
라이브러리를 업데이트할 경우 프로그램을 다시 컴파일해야 함
동적 라이브러리 (Dynamic Library)
‘.dylib’ 확장자를 갖는 파일로 볼 수 있음
런타임에 프로그램에 의해 로드됨
여러 프로그램이 동일한 라이브러리를 공유함
라이브러리가 업데이트 및 수정되더라도 다시 컴파일할 필요 없음
메모리 사용량을 줄일 수 있음 → 여러 프로그램이 동일한 라이브러리를 공유하기 때문
런타임에 로드가 되어야 하기 때문에 성능 저하가 올 수 있음
라이브러리가 없어지거나 변경되면 정상적으로 동작하지 않을 수 있음
라이브러리는~?
라이브러리는 여러 프로그램에서 동일한 기능을 재사용할 수 있음. 즉, 재사용성이 좋음
프로그램을 기능별로 나누어 관리할 수 있음. 즉, 모듈화가 가능!!
코드의 변경을 쉽게 하고, 버그를 수정하거나 기능을 추가할 때 전체 프로그램을 수정할 필요 없이 해당 라이브러리만 수정하면 됨. 즉, 유지보수성이 좋아짐
여러 프로그램이 동일한 코드를 공유함으로 메모리 사용량을 줄이고 일관성을 유지할 수 있음. 즉, 코드를 공유할 수 있따~
정적 및 동적 공유 라이브러리의 목적
정적 라이브러리 (Static Library)
정적 라이브러리는 프로그램이 빌드될 때 해당 라이브러리의 코드가 프로그램에 포함됨. 즉, 프로그램이 실행 파일로 만들어질 때 라이브러리의 코드도 함께 복사됨.
정적 라이브러리를 사용하면 프로그램이 라이브러리를 사용하기 위해 별도로 로드할 필요가 없지만, 모든 코드가 포함되므로 실행 파일의 크기가 커질 수 있음.
동적 라이브러리(Dynamic Library)
동적 라이브러리는 프로그램이 실행될 때 필요한 시점에 라이브러리가 메모리에 로드됨. 즉, 여러 프로그램이 동시에 하나의 동적 라이브러리의 코드를 공유하여 사용할 수 있음.
동적 라이브러리를 사용하면 메모리 사용량이 줄어들고, 라이브러리를 수정해도 프로그램을 다시 빌드할 필요가 없다는 장점이 있음.