프레임워크와 라이브러리의 차이에 관련한 게시글을 보고 작성하는 글(주소가 어딘지까먹,,)
이 의문은 내가 처음 UIKit, SwiftUI를 접했을 때의 들었던 의문과 비슷한 의문이라고 생각이 든다. 얘네는 어떻게 셀이 등장할것을 알고 메소드를 호출하는건가?, 난 그런 메소드를 작성한 적이 없는데? 등등...
이런 의문들이 있었고 내부 시스템이 알아서 해준다 라는 결론을 내리고 다른 공부를 하던 중 프레임워크아 라이브러리에 관한 글을 보다가 우연히 내 결론에 뒷받침? 이라고 해야하나 확실히 좀 더 이해가 되는 설명을 발견해서 적어보려고 한다.
프레임워크는 제어의 역전
이라는 개념이 필수적으로 들어가야한다. 이 제어의 역전
이란 어떠한 일을 하도록 만들어진 프레임워크에 제어의 권한을 넘김으로써 클라이언트 코드가 신경 써야 할 것을 줄이는 전략이다.
제어를 역전시키는(프레임워크가 나의 코드를 호출 할 수 있게 하는) 가장 쉽게 생각할 수 있는 접근 방법은 프레임워크의 event, delegate
에 나의 메소드를 등록하는 것이다.
전달되는 인자와 반환 형식만 일치한다면, 프레임워크 코드는 내가 작성한 객체와 타입을 고려하지 않는다. 등록된 메소드만 감지하여 실행 invoke 하는 것이다.
다른 방법은 프레임워크에 정의 되어 있는 인터페이스, 추상타입을 나의 코드에서 구현, 상속한 후 프레임워크에 넘겨주는 것이다.
프레임워크는 인터페이스와 추상타입을 알고 있으므로 내가 하고자 하는 일련의 작업을 처리할 수 있따. 이는 객체를 프레임워크에 주입하는 것이고, 이를 의존성 주입(dependency injection)이라고 한다.
라이브러리는 기능 모음을 가져다가 쓰는 것이고, 프레임워크는 특정 디자인 패턴이나, 전처리 후처리에 필요한 동작과 기능들을 수행하기 위해 프레임워크가 실행되다가 중간 중간에 특정 비지니스나, 특정 구현 단에서만 사용자의 코드를 lookup(검색)하여 사용하는 형태라고 할 수 있다
예를 들면, 라이브러리는 도구입니다. 망치, 가위, 삽 등등
반면, 프레임워크는 탈 것입니다. 차, 비행기, 배 등등 사람이 엔진 켜고, 기어 넣고, 핸들 돌리고 등등을 해야합니다.