순서
이 글에는 2가지 내용이 들어있다.
모듈에 대한 내용과 접근제한자에 대한 내용
1. 모듈화와 프레임워크
2. 접근제한자
3. open과 public의 차이
4. fileprivate과 private의 차이
5. Custom Framework 생성하기
6. Custom Framework 프로젝트에 추가하기
7. Custom Framework를 통해 접근제한자 알아보기
모듈화, 그리고 프레임워크
모듈화 : 앱에서 공통적으로 사용하는 UI 또는 기능이 있을텐데, 각각 수행하는 일에 따라 모아서 기능별로 하나로 모아놓은 것을 말하고, 앱을 모듈화할 시에 빌드 속도를 줄이고, 협업 시에 좋은 환경, 각 기능 별 의존성을 명확하게 지정할 수 있고, 기능 간 결합도를 낮춰서 유연한 서비스를 제작할 수 있다고 한다. 대표적으로 오픈소스가 하나의 예시다. 그리고 우리는 이걸 프레임워크라고 부른다.
찾아보니, 카페 iOS 앱에서도 규모 있는 프로젝트의 빌드 속도 등 개발 개선을 위해 SPM을 도입해 모듈화를 결정했다고 한다.
Q. 그렇다면, 프레임워크와 라이브러리의 차이는 뭘까?
A. 애플이 만들어둔 UIKit이 프레임워크, 라이브러리는 toast, swiftyJSON 등이 있는데
프레임워크는 틀이 정해져있고, 라이브러리는 코드를 조절하고 바꿀 수 있어서 자율적인 측면에서 차이가 있다.
더 깊게 파보면, Inversion of Control이라고 제어권의 역전 어쩌구.. 저쩌구 하며 딥한 내용이 나오는데 이해가 안돼서 우선 잠시 미루겠다..
결론적으로, 앞서 주저리주저리 말했지만 프레임워크는 결합도coupling는 낮추고, 응집도cohesion는 높인 것이다.
결합도
여러 모듈과 모듈
라이브러리 하나를 설치했는데 여러 라이브러리가 딸려오는 경우, 결합도가 높다라고 볼 수 있다. 이 경우에 하나를 바꾸게 될 시에 다른 것에도 영향을 줄 것이다. 그래서 결합도가 낮은 정도로 설계를 하는 게 좋을 것이다.
응집도
같은 기능과 목적을 가진 코드가 모여있는 것(animation은 animation framework, map은 mapkit - 응집)
나중에 새로운 애니메이션을 도입할 때 응집도를 높여서 코드 관리 이슈를 적게 가지고 갈 수 있을 것이다.
- 즉, 응집도는 모듈 내부에서 하나의 목적을 가지고 연관되어 있는 정보
Access Control
모듈하면 따라 나오는 접근제한자는 공식 문서를 통해 보면, 특정 코드의 접근을 다른 소스 파일이나 모듈에서 제한하는 것이라고 설명한다.
문서에도 나와있는데,, 단일타겟의 앱에서는 특별히 접근레벨을 전혀 명시하지 않아도 된다고 한다.;;..ㅋㅋ 나 왜 써줌..?
여하튼 코드에 대한 접근을 제한하면 좋은 점은
추후에 해당 코드가 어디까지 사용할 수 있는지 알 수 있는 기본 인터페이스를 제공할 수 있다는 것
코드에 대해서 은닉화를 할 수 있는 것 = 즉, 다른 코드에 대해 노출시키지 않아도 되는 것
5개의 접근레벨
- open
- public
- internal : 항상 사용하는 것
- fileprivate
- private : 가장 제한적
프로젝트 내에서 효과가 있는 것은 : internal, fileprivate, private 정도
다른 프로젝트가 우리의 프로젝트에 들어왔을 때 추가적으로 사용할 수 있는 것 : open, public
서로 다른 프레임워크 간 공유하고 싶은 경우에는 open, public을 쓴다.
모듈을 쓰지 않을 경우에는 default 값으로 internal을 쓴다.
프로젝트 내에서는 결국 open과 public은 쓸모없다. 그동안 알지도 못하면서 마구잡이로 사용하던 나자신. 뒤져라.
open과 public의 차이점?
open은 다른 모듈에서 오버라이딩과 서브클래싱이 가능하다.
public은 불가능하다.
HureeUIFrameWork 모듈에서 HureeView 클래스를 만들어줬다.
클래스와 메소드 앞에 open 키워드를 작성해줬기 때문에 Diary 프로젝트에서 HureeView를 서브클래싱이 가능하고, changeBackgroundColor도 오버라이딩이 가능한 것이다.
Q. 만약 HureeView를 public으로 바꾸면?
open이 아니기 때문에 상속할 수 없다고 에러창이 뜬다.
Q. 만약 changeBackgroundColor 앞의 접근제한자를 지우면?
internal 이기 때문에 접근이 불가능하다고 뜨고, 동시에 superclass에서 오버라이드한 메소드가 없다고 뜬다.
HureeView 클래스를 상속한 것에 대한 문제는 없다.
제법 신기하다..
이렇게 open과 public의 차이를 명확하게 알게 됐다..!
별개로, 클래스나 오버라이드 가능한 클래스 멤버만 open을 쓸 수 있다.
즉, 상속 가능한 class만 open을 쓸 수 있다.
(단, extension 자체에서는 애초에 오버라이딩이 불가능하다. 오버라이딩을 하려면 @objc를 붙여줘야 한다.)
접근제한자를 얼마나 써줘야 하는가?
혼자 프로젝트를 할 경우에는 중요치 않지만 협업할 시에는 중요하다.
웬만한 내용은 다 private하게 사용될 것이다.
외부에서 사용되지 않은 경우는 다 private.
일반적으로 자주 사용하는 건 private이고, internal은 명시할 필요는 없다.
private은 다른 범위의 클래스, 구조체에서는 사용하지 못하게, 호출하지 못하게 막고 싶을 때 사용한다.
접근제한자는 이렇게 이유가 있이 써야 한다. 이유 없이 마구잡이로 쓰지 않도록 하자.
그래 private은 알겠다, 그러면 fileprivate은 언제 쓰냐?
Fileprivate과 private의 차이점을 좀 더 자세하게 알아보자!
internal : 다른 파일에서 해당 타입 선언 후 프로퍼티에 접근해도 오류가 나지 않는다.
fileprivate, private : 둘 다 다른 파일에서는 오류가 나지만, 같은 파일에서 차이가 발생한다.
- fileprivate : 같은 파일 내 다른 타입에서 접근 가능
- private : 같은 파일 내 같은 타입에서만 접근 가능
private : 같은 파일 내에서 같은 타입(구조체, 클래스...) 가능, 다른 타입은 불가능
fileprivate : 같은 파일 내에서 다른 구조체, 클래스 사용 가능하나, 다른 파일에서는 불가능
Custom Framework 생성하기
Custom Framework Github : https://github.com/heerucan/iOS-Begin-Again/tree/main/7week/HureeUIFrameWork
접근제어를 이해하기 위해 프레임워크를 만드는 것임을 잊지 말자.
header 파일인데 오브젝트 씨 기반임..그냥 그렇다고..응..
프로젝트에 Custom Framework 추가하기
프로젝트의 TARGETS - General 로 이동해서 플러스 버튼 선택
이렇게 추가한 프레임워크 파일은 프로젝트에 추가된 후에는 프로젝트 파일에서는 변경하지 않도록 하자.
Custom Framework를 사용하면서 접근제한자에 대해 알아보기
alert를 켜주는 함수 앞에는 public keyword를 붙여줬다.
다른 제한자는 테스트용으로 함수를 만들어줬다.
프로젝트에서 프레임워크를 import하고 각 함수를 사용하려고 하면 어떻게 되는지 봐보자,,
예상대로 open과 public만 사용가능하다.
static으로 선언하는 것은 암묵적으로 더 이상 상속하지 않겠다는 것을 의미하기 때문에 open 대신에 public으로 선언해줘야 한다.
open을 사용하면 오버라이드를 통해 상속받은 메소드랑 프로퍼티를 재정의해주기 때문에 불가능한 것 이 아닐까,
타입 프로퍼티/메소드는 무조건 값이 하나로 같고, 메모리에 올라가면 값이 변경되지 않는데...
그래서 open이 아닌 public으로 선언해야 하는 것 같다.
이번 수업은 (8/16) 멘토링 때 물어볼 질문 중 하나로 접근제한자와 관련된 부분을 해소시켜주었다.
접근제한자 같은 경우는 동아리에서 곁눈질하면서 본 걸 줍줍해서 써먹거나, 공부해도 정확한 차이를 이해하고 쓰지 않아서 private이 아니면 죄다 public을 붙여버렸던 나 자신을 돌아보게 되던 순간이었다.. public 도대체 왜 써준 것인가..?
모듈 같은 경우는 윤아언니 따라서 spm을 만들었다가 약간 후회하고 있었는데 라이브러리가 아닌 framework를 만들어 줄 수도 있다는 점이 신기한 포인트(WalKit을 프레임워크로 갈아엎고 싶은 충동이 드는 순간...)였다.
다만, 한 가지 궁금한 점은 내 spm은 프로젝트에 추가 시에 프로젝트에서 자율적으로 코드 수정이 불가한데 라이브러리가 아닌가? (일단, 아닐 수는 없으나,,, 궁금하니 질문지에 추가해야지...)
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] UIView의 초기화 구문 다시 알자! (0) | 2022.08.19 |
---|---|
[iOS] CodeBase로 가보자고 (0) | 2022.08.17 |
[iOS] UIPageViewController (0) | 2022.08.16 |
[iOS] pngData(), jpegData(compressionQuality:) (0) | 2022.08.12 |
[iOS] cell에 delegate, datasource 코드를 작성하지 않는 이유... 어쩌구...저쩌구... (0) | 2022.08.12 |