[Swift] Properties(2) - Wrappers, Type
2023. 1. 18. 23:40
iOS/Swift
Property Wrapper Property Wrapper는 프로퍼티가 저장되는 방식을 관리하는 코드와 프로퍼티가 정의되는 코드 사이에 분리된 계층을 추가해 준다. 즉, 도형의 각 변의 최대 길이를 정하고 싶다고 가정해 보자. 그렇다면 코드는 아래와 같이 구현해야 한다. class Rectangular { private var _width: Int = 10 private var _height: Int = 15 private var maxLegth: Int = 30 var width: Int { get { return _width } set { _width = min(maxLegth, _width) } // 저장하는 방식을 관리하는 코드 } var height: Int { get { return _hei..
[Swift] Properties(1) - Stored, Computed, Observer
2023. 1. 17. 21:03
iOS/Swift
Swift에서 Property는 크게 5가지로 나뉜다. Stored Properties(저장 프로퍼티) Computed Properties(연산 프로퍼티) Property Observers(프로퍼티 감시자) Property Wrappers(프로퍼티 래퍼) Type Properties(타입 프로퍼티) Stored Properties 가장 간단한 형태의 Stored Properties는 class 혹은 structure의 instance에만 관련된 값을 저장한다. variable Stored Property(변수 저장 프로퍼티)는 var 키워드를 사용하며, constant Stored Property(상수 저장 프로퍼티)는 let 키워드를 사용한다. struct SomeStruct { var variable..
[iOS] 동시성 프로그래밍(8) - OperationQueue
2023. 1. 17. 16:58
iOS/iOS
OperationQueue는 내부적으로 DispatchQueue를 기반으로 하여, 더 많은 부가적인 기능을 사용할 수 있는 Queue이다. 부가적인 기능으로는 "작업 취소 및 일시 정지", "작업 순서 지정", "CompletionBlock"등이 있다. GCD의 Dispatch Queue는 Task를 다음과 같이 클로져 형태로 추가하였다. DispatchQueue.global().async { ...}반면, OperationQueue의 작업의 단위는Operation이라는 추상 클래스를 구체화한 Object의 instance가 된다. Operation은 수행할 작업들을 캡슐화를 한다는 점에서 재사용에 대한 이점이 있다. Operation 앞서 말했듯이 Operation은 추상(abstrat) 클래..
[iOS] 동시성 프로그래밍(7) - Thread-Safe
2023. 1. 14. 22:47
iOS/iOS
지난 포스팅을 통해 Race Condition, DeadLock, Priority Inversion과 같은 Concurrency Problem들에 대해 알아보았다. Race Condition은 Thread-Safe하게 코드를 작성함으로써 해결할 수 있다고 언급하였는데, 우선 Thread-Safe가 무엇인지에 대해 알아보자. Thread-Safe란 멀티 쓰레딩 환경에서 어떤 함수, 변수 혹은 객체가 여러 Thread로부터 동시에 접근하여도 프로그램의 실행에 문제가 없음을 의미한다. 엄밀히 말하자면, 동시에 여러 Thread에서 접근하여도 결과에 이상이 없음을 의미한다. 이러한 Thread-Safe를 지키기 위해 여러 가지 방법이 존재하는데, 이 중 Mutual Exclusion(상호 배제)을 알아보자. M..
[iOS] 동시성 프로그래밍(6) - Concurrency Problems
2023. 1. 10. 22:29
iOS/iOS
concurrency problem(동시성 문제)란멀티 쓰레딩 환경에서 공유자원에 동시에 접근하여 발생하는 문제를 말한다. 동시성 문제에는 크게 3가지가 있다. Race Condition (경쟁 상태)DeadLock (교착 상태)Priority Inversion (우선순위 뒤바뀜) Race Condition Race Condition(경쟁상태)이란,공유자원에 여러 쓰레드가 동시에 접근하게 되어, 작업의 접근 순서에 따라 결과가 바뀌는 문제를 의미한다. 더 정확히 얘기하자면, 공유자원에 대한 쓰기 작업에 의해 발생한다. (읽기 작업은 상관없음)for i in 1...5 { print("--- \(i)번째 ---") let group = DispatchGroup() var s..
[RxSwift] Operator(3) - Combining
2023. 1. 8. 19:12
iOS/RxSwift
이번 포스팅에서는 sequence들을 모으고, 여러 sequence내의 데이터들을 병합하는 방법에 대해 알아보자. startWith(_:) subscriber가 Observable을 구독하고, 요소를 방출받을 때 초기값을 지정해 주는 연산자이다. Observable의 타입과 초기값의 타입이 같아야 한다. let observable = Observable.of("A", "B", "C") observable .startWith("alphabet will start to emit") .subscribe( onNext: { print($0) } ) .disposed(by: disposBag) /* prints: alphabet will start to emit A B C */ concat(_:) concat은 ..
[iOS] 동시성 프로그래밍(5) - DispatchSemaphore
2023. 1. 4. 21:35
iOS/iOS
Semaphore동시성 프로그래밍에서는 여러 작업들이 공유 자원을 사용하기 때문에, 여러가지 문제가 발생한다. 이러한 문제들은 둘 이상의 작업들이 공유자원에 접근하면 문제가 생기는 코드 영역인 Critical Section에서 발생하는데, 공유자원에 접근하여 발생하는 문제 중 하나로 두 작업의 접근 순서에 따라 결과가 바뀌는 문제가 있다.for _ in 1...5 { let group = DispatchGroup() var someNumber = 10 DispatchQueue.global().async(group: group) { someNumber *= 10 } DispatchQueue.global().async(group: group) { ..
[iOS] 동시성 프로그래밍(4) - DispatchWorkItem
2023. 1. 4. 17:28
iOS/iOS
기존의 DispatchQueue에서의 작업은 다음과 같이 클로저 형태로 작성하였다. DispatchQueue.global().sync { task(1) task(2) } DispatchQueue.global().async { task(1) task(2) } 하지만, 같은 작업이 반복되는 경우 똑같은 코드를 작성해야 하는데, DipsatchWorkItem을 사용하면 작업들을 캡슐화하여 재사용성을 늘릴 수 있다. DispatchWorkItem DispatchWorkItem은 작업들을 캡슐화 할 수 있는데, 사용은 다음과 같다. let workItem = DispatchWorkItem { task(1) task(2) } DispatchQueue.global().async(execute: workItem) Di..
[iOS] 동시성 프로그래밍(3) - DispatchGroup
2023. 1. 4. 00:15
iOS/iOS
지난 포스팅에서 알아본 GCD는Dispatch Queue에 작업을 추가하면해당 Queue에 연결된 Thread로 작업을 분배해 준다. 하지만, 비동기인 작업의 경우에 해당 작업을 기다리지 않기에 끝나는 시점을 알지 못한다.이번 포스팅에서 알아볼 Dispatch Group은 작업이 끝나는 시점을 알 수 있다. DispatchGroup이름에서 알 수 있듯이, DispatchGroup은 일련의 비동기적으로 수행할 작업(Task)을 그룹화를 한다.여기서 주의할 점은 비동기적으로 수행할 작업만 그룹화 할 수 있으며, 동기적으로 수행할 작업은 그룹화할 수 없다. 그룹화된 작업들은 각각 서로 다른 DispatchQueue를 통해 수행될 수 있다.즉, 서로 다른 Thread에서 수행될 수 있다. 또한, Dispat..
[iOS] 동시성 프로그래밍(2) - GCD(Grand Central Dispatch)
2023. 1. 2. 23:34
iOS/iOS
지난 포스팅에서 "iOS는 GCD, NSOperation를 통해 멀티쓰레딩을 통한 동시성 프로그래밍을 지원한다" 언급하였는데, 이 중 GCD에 대해 이번 포스팅에서 알아보자. 우선 GCD는 애플에서 제공하는 "멀티 쓰레딩" 처리를 쉽고 편하게 해주는 API이다. 또한 "큐에 넣기만 하면 알아서 쓰레드로 분배해 준다"라고 하였는데, GCD에서의 해당 큐가 Dispatch Queue이다. Dispatch Queue DispatchQueue는 아래와 같이 사용이 가능한데, "큐의 종류", "qos 옵션", "동기/비동기" 에 대한 설정이 가능한데, 이들에 대해 순차적으로 알아보자! Queue의 종류 Dispatch Queue의 종류에는 3가지가 있다. main Queue global Queue custom Q..
[iOS] 동시성 프로그래밍(1)
2022. 12. 30. 18:19
iOS/iOS
동시성 프로그래밍이란 "작업들을 동시에 처리하는 프로그래밍"을 의미한다. 이는 병렬 프로그래밍과 다른 개념인데, 동시성 프로그래밍은 하나의 processor가 A 작업과 B 작업을 왔다갔다 하며 동시에 처리하는 반면, 병렬 프로그래밍은 두개 이상의 processor가 A와 B를 하나씩 맡아 동시에 처리하는 것이다. processor에서 multi-core를 활용하기 위해, software에선 "수행해야 할 작업(Task)들을 동시에 처리"하는 동시성 프로그래밍이 필요하다. 동시성 프로그래밍은 크게 3가지를 통해 이루어질 수 있는데, 이번 포스팅에서는 이중 "멀티 쓰레딩"을 알아볼 것이다. 이에 앞서, Thread 개념에 대해 간단하게 알아보자. Thread Thread에 대해 이해하기 앞서 간단하게 Pr..
[RxSwift] Traits
2022. 12. 28. 16:47
iOS/RxSwift
Traits란 기존의 Observable의 wrapper 구조체로, 더 제한적인 기능을 수행하는 Observable이다. public typealias Single = PrimitiveSequence public typealias Completable = PrimitiveSequence public struct PrimitiveSequence { let source: Observable init(raw: Observable) { self.source = raw } } 즉, Observable보다 좁은 범위의 기능을 수행하기에, Traits를 사용하지 않고 Observable로 커버가 가능하지만, 코드가 더 명확해진다는 장점이 있다. Single 기존 Observable에서는 next, completed,..