[WWDC] Understanding Swift Performance(2) - Protocol Programming
2023. 8. 7. 17:48
iOS/Swift
앞선 포스팅에서 Polymorphic(다형성)을 사용하기 위해선, Class를 사용해야 했다. 하지만, Class는 아래와 같은 이유로 성능적으로 좋지 않았다. Heap Memory Allocation, Reference Counting, Dynamic Dispatch 그렇다면 Struct로 "Polymorphic(다형성)"을 사용할 수 없을까? 이는 Protocol Oriented Programming을 통해 가능하다. Dynamic Dispatch without V-Table Class의 경우 Common Inheritance Relationship(공통 상속관계)가 존재하기 때문에 V-Table이 필요했다. 하지만 Struct의 경우 Class와 달리 Common Inheritance Relatio..
[WWDC] Understanding Swift Performance(1) - Dimensions of Performance
2023. 8. 6. 18:17
iOS/Swift
Swift에서 "Abstration(추상화) 메커니즘이 성능에 미치는 영향"을 이해하기 위해 가장 좋은 방법은 기본 구현을 이해하는 것이다. Abstration 메커니즘을 설계하고, 선택할 때 다음과 같이 3가지를 고려해야 한다. Allocation Reference Counting Method Dispatch 이 3가지 요소들을 하나하나 살펴보도록 하자. Allocation (Stack vs. Heap) Swift는 자동으로 메모리를 할당하고, 해제한다. 이 중 일부는 Stack에 저장하기도 Heap영역에 저장한다. Stack "Stack"은 LIFO구조로 Static하게 메모리를 할당할 수 있는 매우 단순한 Data Structure이다. Top에서만 데이터의 삽입(Push)과 삭제(Pop)가 가능하..
[RxSwift] Single With Share Operator
2023. 7. 26. 00:41
iOS/RxSwift
Signle은 RxSwift의 Traits로 하나의 이벤트만 방출하는 Observable이다. Single에는 failure, success라는 2가지 이벤트가 존재한다. success는 일반 Observable의 next + completed와 같은 역할이고 failure은 error이벤트와 같은 역할이다. 다음과 같이 초기에 한번만 이루어지는 네트워크 요청에 자주 사용된다. static func featchAllData(_ url: String) -> Single { return Single.create { single in URLSession.shared.dataTask(with: URL(string: url)!) { data, res, err in if let err = err { single(...
[RxSwift] Relay vs. Signal vs. Driver
2023. 7. 25. 22:41
iOS/RxSwift
RxSwift를 사용해서 UI작업을 할 때 RxCocoa에 존재하는 Relay, Signal, Driver를 많이 사용하곤 한다. 이 3개의 차이점에 대해서 알아보자. Relay Relay는 Subject의 Wrapper Class이다. 이는 completed, error이벤트를 무시하며, next이벤트만 Subscriber에게 전달한다. UI Update를 위해 사용하는 Subject가 error 혹은 completed이벤트로 스트림이 끊기면 안 되기 때문에, Relay는 UI작업에 특화된 Subject이다. 더 자세한 내용은 해당 포스팅에 있으니 참고 바란다. Driver & Signal Driver와 Signal은 RxCocoa의 Trait로 Main Thread에서 동작하는 것을 보장하며, err..
[RxSwift] Operator(4) - Share
2023. 7. 24. 22:54
iOS/RxSwift
Observable은 구독되기 전까지는 동작하지 않다가, 구독이 이루어지면 한 번에 데이터를 방출한다. 이걸 Cold Observable이라 한다. Cold Observable은 UnitCast방식으로 동작하여, Subscriber마다 하나의 Stream이 생성이 된다. 반면 Subject와 같은 Hot Observable은 Multicast방식으로 동작하며, 하나의 Stream을 통해 데이터가 방출된다. 이 내용이 이해되지 않는 다면, 해당 포스팅을 보길 바란다. 하나의 Stream을 통해 데이터가 방출되는 Hot Observable과 달리 Subscriber마다 Stream이 생성되는 Cold Observable에서는 Stream이 여러개 생길 수 있다. 다음과 같은 함수가 있다고 가정해 보자. fu..
[iOS] Infinite Carousel
2023. 7. 23. 16:00
iOS/iOS
이번 포스팅에선 아래와 같이 무한히 스크롤되는 Infinite Carousel을 구현해보자. 전체 코드는 여기에서 확인해볼 수 있다. Collection View 우선 CollectionView를 생성해보자. private let collectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal // 스크롤 방향 설정 /// CollectionView를 생성할 때 layout을 Initialized해주어야 한다. let collectionView = UICollectionView( frame: .zero, collectionViewLayout: layout ) co..
[iOS] Floating Custom TabBarController
2023. 7. 22. 19:33
iOS/iOS
이번 포스팅에선 Floating TabBar를 구현해보고자 한다. 전체 코드는 여기에서 볼 수 있다. 처음에는 UIKit에서 제공하는 UITabBarController를 이용하고자 했다. https://stackoverflow.com/questions/65771446/how-to-create-floating-tab-bar-swift How to create floating Tab Bar Swift I'm trying to create a Pinterest style Tab Bar. Is it possible to customise UITabBar in that way or do you have to write a separate view to sit on top of everything if so how..
[Architecture Pattern] MVVM
2023. 5. 27. 17:45
iOS/Pattern
Architecture Pattern들은 Logic 측면에서 "관심사의 분리(SoC)"를 목표로 한다. 그중 MV(X) 계열의 Architecture Pattern들은 UI Logic(View)과 Business Logic(Model)을 분리를 중점으로 여겼다. UI Logic과 Business Logic의 분리로 인해, 둘 간의 중계자가 필요하게 되었고, 중계자에 따라 MVC, MVP, MVVM으로 나뉘게 된다. MVC 패턴은 중계자 역할을 Controller가 맡게 되었다. 하지만, Controller을 UIViewController가 담당하게 되면서, Controller는 View와 결합성이 강해, View의 일부 역할까지 담당하게 되었다. 이를 해결하고자, MVP 패턴에선 UIKit과 독립된 Pr..
[Architecture Pattern] SoftWare Architecture
2023. 5. 24. 11:52
iOS/Pattern
아키텍처(Architecture)란 위키피디아에 따르면 "소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙"을 의미한다. 말이 어렵지만, 아키텍쳐(Architecture)를 한국말로 직역하면 "구조"다. 즉, SW 아키텍쳐란 SW구조를 말한다. 좋은 집을 설계하기 위해 집의 구조(도면)를 잘 설게 해야 하듯이, 좋은 SW를 위해 SW 아키텍쳐를 잘 설계해야 한다. 그렇다면 좋은 SW, "좋은 품질의 SW"란 무엇일까? 일반적으로 사용자에게 좋은 서비스를 제공하는 것만으로는 "좋은 품질의 SW"라 부르지 않는다. SW의 품질은 2가지로 나뉘는데, 이는 단순히 External Quality를 만족한 것에 지나지 않는다. External Quality..
[iOS] Modularization(2) - Loose Coopling
2023. 5. 18. 01:31
iOS/iOS
"모듈화"란 Software를 각 기능별로 분할하여 설계하는 기법이다. 지난 포스팅에서 모듈화가 적용이 안된 모노리틱 앱 구조는 코드의 영향 범위를 파악하기 어렵고, 앱의 규모가 커질 경우 빌드시간이 오래 걸리게 된다. 이에 따라 Swift에서 모듈화를 진행하는 방법에 대해 알아보았다. 하지만, 이러한 물리적인 코드의 분리는 반쪽짜리 모듈화에 지나지 않는다. "좋은 모듈화"는 용도에 맞게 잘 구분된 기능을 가진 독립적인 모듈로 나누는 것이다.모듈의 독립성은 응집도와 결합도로 판단하게 된다. 모듈의 "응집도"란 모듈 내부의 기능적인 집중도를 의미한다.모듈의 "결합도"란 다른 모듈간의 상호 의존성을 의미한다. 즉, 좋은 모듈이란 응집도는 높고 결합도는 낮아야 한다. 이번 포스팅에선 모듈간의 느슨한 결합..
[Design Pattern] DI(Dependency Injection)
2023. 5. 8. 01:10
iOS/Pattern
"의존성 주입"이란, 객체가 의존관계에 있을 때 "직접 생성"하는 것이 아닌, DIP를 적용하여 "외부에서 제공"받는 패턴을 말한다. 한 번에 이해하기 어려우니 천천히 알아보자. Dependency 대부분의 프로그램에서 여러 객체들은 협력하게 되기 때문에, 객체 사이의 의존성은 존재하게 된다. 예를 들어, User의 정보를 Networking을 통해 가져와 이를 화면에 출력시키는 객체가 있다 하자. class UserRepository { func fetchUser() -> User { ... return User(name: "Jung", id: "111") } } class UsersPresentation { private let usersRepository = UserRepository() func ..
[iOS] Modularization(1) - Library, Framework, Swift Package
2023. 5. 4. 01:55
iOS/iOS
Xcode에서 Project를 생성하면, 하나의 App Target이 자동으로 생성된다. 이때의 App Target은 하나의 Module이 된다. 별도의 Framework를 추가하지 않는 이상,모든 코드는 Single Target에 추가되게 된다. 위와 같이 하나의 Module로 이루어진 App을 "Monolitic App"이라 부른다. 이러한 Monolitic App은 여러 가지 단점을 가지고 있다.하나의 모듈에 모든 소스코드가 들어있기 때문에 internal과 public을 구분할 수 없다. 이로 인해, 객체들은 무분별하게 참조될 가능성이 있으며, 이는 코드 변경의 영향 범위를 파악하기 어려워진다. 또한, 특정 기능만 테스트하고 싶다 해도 Project내의 모든 소스코드를 빌드해야 한다. App의..