Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

iOS 개발일지

0826 새싹 39회차 정리 본문

SeSAC iOS 데뷔과정 2기

0826 새싹 39회차 정리

Lia's iOS 2022. 8. 26. 21:50
iOS 앱 개발자 데뷔 과정 39회차

 

 

 

 

#0. Memo

- Realm 관련 코드 분리 (Repository)

 

프로젝트를 진행하며 Realm에 관련된 코드가 많아졌다.

이 코드를 전부 메인 뷰컨트롤러에서만 관리하기에는 가독성이 안좋고, 사용성도 좋지 않다.

따라서 Repository 형식으로 코드를 분리하고 관리하는 것이 좋다.

 

extension을 이용한 방법과, class를 이용해 인스턴스로 접근하는 방법 등 여러 방법이 있다.

protocol을 활용하면 코드를 하나하나 읽어보지 않더라도 어떤 기능을 하는 메서드가 있는지 보기 쉽다.

 

 

 

 

- FSCalendar

 

오픈소스 라이브러리인 FSCalendar를 활용해 달력을 띄우고, 날짜별 이벤트를 관리할 수 있다.

collectionView기반이기 때문에 return에 따로 조건을 설정하지 않을 경우 모든 날짜에 반영된다.

numberOfEventsFor : 이벤트 갯수에 따라 포인트를 띄워주는 메서드 (최대 3개)

- 위에서 구현한 repository의 fetchDate 메서드를 활용해, 해당 날짜의 이벤트의 갯수를 반영하도록 설정했다.

 

subtitleFor : 날짜 하단에 서브타이틀을 띄워주는 메서드

- 파라미터 date를 그대로 비교할 경우, millisecond 단위까지 비교하게 되어 정상적인 구현이 불가능하다.

- 클로저를 활용해 DateFormatter 타입의 formatter를 미리 만들어 놓고, 이를 활용해 지정 날짜에만 서브타이틀을 설정했다.

 

didSelet : 캘린더에서 날짜를 선택했을 때 실행되는 메서드

- fetchDate 메서드를 활용해 tasks에 담아 보여줄 Realm 데이터를 선택한 날짜의 일기로 제한했다.

- 날짜를 선택할 때마다 해당 날짜에 작성한 일기만을 보여줄 수 있다.

 

 

 

 

 

#1. Checklist

- WMO

Apple Optimization Tips 참고

WWDC Understanding Swift Performance 참고

 

-Onone : 최소한의 최적화를 수행하고 모든 디버그 정보를 보존하기 때문에 주로 Debug 모드에서 사용

-O : 디버그 정보가 손실될 수 있지만 적극적인 최적화를 수행하기 때문에 주로 Production, Release 모드에서 사용

 

Build Settings에서 optimization으로 검색하면 위의 용도에 맞게 Default 값이 설정되어 있는 것을 확인할 수 있다.

 

 

그리고 WMO 란 전체 모듈 최적화 (whole-module-optimization) 를 의미한다.

기본적으로 Swift는 각 파일을 개별적으로 컴파일하지만 Whole Module이 설정되어 있다면 전체 프로그램을 하나의 파일인 것처럼 컴파일을 하고, 단일 컴파일 단위인 것처럼 프로그램을 최적화할 수 있다.

컴파일 자체의 시간은 오래 걸릴 수 있지만, 실행은 더 빨리 이루어질 수 있다.

 

 

 

- Dispatch

Method Dispatch란, 프로그램이 어떤 연산을 통해 어떻게 해당 메서드를 실행할지 정하는 메커니즘을 뜻한다.

 

- Static Dispatch (Direct Call)

컴파일 타임에 호출되는 함수가 무엇인지 결정되며, 런타임에서는 컴파일에 결정된 함수가 그대로 실행된다.

런타임에서 판단할 필요가 없기 때문에 성능 상 이점을 가질 수 있다.

값 타입과 참조 타입 모두 지원하며, 기본적으로 열거형과 구조체 등은 Static Dispatch를 지원한다.

 

- Dynamic Dispatch (Indirect Call)

런타임에 호출되는 함수가 무엇인지 결정되기 때문에 성능 상 오버헤드가 발생한다.

클래스를 상속받아 부모 클래스의 메서드를 재정의하여 사용할 때 어떤 메서드가 실행되는지 런타임에 결정이 되는데, 이때는 vTable (가상 메서드 테이블) 을 참조하여 실제 호출할 함수를 결정하게 된다.

 

컴파일 타임에 어떤 메서드가 실행되는지 결정하지 못하는 이유는 오버라이딩 때문으로, 하위 클래스에서 오버라이딩이 될 수 있는 가능성으로 인해 상위 클래스의 메서드를 참조해야 하는지 하위 클래스의 오버라이딩된 메서드를 참조해야 하는지 확인하는 작업을 런타임에서 진행하게 된다.

이는 실제 오버라이딩이 되어있는지 아닌지에 대해서는 확인하지 않고 항상 vTable을 확인해서 참조하기 때문이다.

참조 타입만 지원하며, 기본적으로 클래스의 경우 Dynamic Dispatch를 지원한다.

 

 

 

- final

Dynamic Dispatch로 실행되는 class를 Static DisPatch로 사용하게 하는 방법이다.

클래스에서 재정의와 오버라이딩이 필요없을 경우에 final을 추가함으로써 상속을 방지하며, 클래스 뿐만 아니라 클래스 내부의 프로퍼티와 메서드에서도 사용할 수 있다.

final로 선언된 경우에는 Static Dispatch로 직접 호출 (Direct Call) 되고, 그렇지 않은 경우에는 Dynamic Dispatch로 간접 호출 (Indirect Call) 된다.

 

 

 

 

#2. Assignment

[8주차 마무리] 참고