[WWDC] Understanding Swift Performance(3) - Generic Code
2023. 8. 8. 02:59
iOS/Swift
이번 포스팅에선 Generic을 사용할 때 Method Dispatch는 어떻게 동작하는지, Generic Type의 변수는 어떻게 저장되고 Copy되는지 알아보자. Generic Method Mechanism 왼쪽은 Drawable의 Protocol Type을 파라미터로 전달받는 함수이고, 오른쪽은 Drawable Type을 만족하는 Generic Type을 파라미터로 전달받는 함수이다. 별반 다를게 없어 보이지만, Geric코드는 Parametric Polymorphism(다형성)이라 불리는 Static한 형태의 Polymorphism을 제공한다. 즉, 오른쪽의 Generic한 함수는 왼쪽의 함수 형태보다 Static한 형태의 Polymorphism을 제공한다. Static한 형태의 Polymorph..
[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)가 가능하..
[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..
[Swift] Memory Leak(2) - Closure의 [weak self]
2022. 11. 26. 00:24
iOS/Swift
저번 포스팅에서 순환 참조와 ARC에 대해서 알아보았다. 이제 이러한 순환 참조가 실제로 일어나는 예시에 대해 살펴보자 Clousuer 우리는 흔히 클로져 에 [weak self] 키워드를 쓰는 것을 알 수 있다! 이것을 왜 사용하는 지 알아보기 전에 "Closure Capture"라는 것에 대해 알 필요가 있다. Closure Capture Closure는 주변 Context로 부터 상수나 변수를 Capture할 수 있는데, 먼저 예제를 살펴보자! func makeIncrementer(forIncrement amount: Int) { var runningTotal = 0 let closure = { runningTotal += amount print(runningTotal) } closure() clo..
[Swift] Memory Leak(1) - 약한 참조, 강한 참조, unowned 참조
2022. 11. 25. 18:03
iOS/Swift
이번 포스팅에서는 ARC와 메모리 누수가 언제 일어나는지 알아 보도록 하자 ARC ARC란 Automatic Reference Counting의 약자로, 말 그래도 Reference를 counting 하여, 자동으로 메모리를 관리 한다. 또한 Reference라는 키워드에서 볼 수 있듯이, 클로져나, 클래스와 같은 Reference 타입에 대해서만 관리 하며, enum, struct와 같은 Value 타입에 대해서는 관리하지 않는다. 이들은 retain 이라는 함수를 호출하여 Reference Count를 증가 시키고, release라는 함수를 호출하여 Reference Count를 감소 시킨다. 최종적으로 reference count가 0이 될때 자동으로 메모리에서 해제 해준다. class Person..
[Swift] Initializer(3) - required init?(coder:)
2022. 11. 10. 16:57
iOS/Swift
UIView와 UIViewController에서 designated Initializer를 정의하게 되면, 아래와 같은 에러를 보게된다. 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView' 이 required init?(coder:)에 대해서 알아보도록 하자! 에러가 나는 이유 UIViewController와 UIView는 NSCoding이라는 protocol을 채택하고 있는데, NSCoding protocol은 아래의 method를 구현하도록 한다. func encode(with coder: NSCoder) { } required init?(coder: NSCoder) { } 저번 포스팅에서 말했듯이, requir..
[Swift] Initializer(2) - Class Initializer의 상속
2022. 11. 10. 00:27
iOS/Swift
Default Initializer가 Compiler에 의해 제공되는 경우 우선, default initializer가 제공되기 위해서는! class 내부에 initializer가 구현되어 있지 않아야 한다. 또한, initializer를 구현하지 않기 위한 조건은 모든 저장 프로퍼티들이 초기화되어 있어야 한다. class A { var num1 = 1 var str: String? //nil로 초기화 } 위의 조건을 만족하였을 때, Compiler에 의해 Default initializer를 제공받게 되고, Super Class의 모든(convienence, required, designated) initializer를 상속! 받게 된다. class Person { var age: Int init(ag..
[Swift] Initializer(1)
2022. 11. 9. 18:56
iOS/Swift
Swift에서 initializer란 객체를 초기화 하는것으로 initializer가 끝나게 되면, 저장 프로퍼티가 모두 값을 가지고 있어야 한다. 또한, Swift에서의 initializer는 값을 return 하지 않는다! Default Initializer Default initializer란, parameter로 아무것도 전달하지 않는 Initializer이다. 만약, 객체의 모든 저장 프로퍼티가 값을 가지는 경우 default initializer가 제공이 된다. class A { var num: Int init(){ self.num = 10 } } class B { var num: Int? let num2 = 10 } let a = A() //구현한 default initializer let ..
[Swift] KVO, Delegate and Notification
2022. 10. 8. 22:07
iOS/Swift
KVO Delegate Notification 앞서 3개의 post에서 KVO, Delegate, Notification에 대해서 알아보았다. 실제로 Applicatoin에서, 객체간의 interaction이 필요한 경우가 많다. 하지만 interaction을 위해 객체간의 종속되는 것은 "재사용성", "독립적인 기능요소"로의 가치를 잃게 된다! 예시로, ViewController는 특정 View를 관리하는 것이 아닌, 다른 ViewController에 종속되어 동작하는 것은 독립적인 기능요소의 가치를 잃게 된다. 이러한 interaction을 위해 excessive coupling(과도한 결합) = 종속 없이 event를 전달 및 처리 하기 위해 3가지 pattern을 사용한다. 이번 포스트에서 이 3..
[Swift] Notification
2022. 10. 8. 21:03
iOS/Swift
Notifications은 Cocoa의 Observer pattern중 하나로, broadcast 방식으로 여러 객체에 이벤트를 전달 할 수 있다. 동작부터 알아보자면 event를 보내는 Object는 Notification 객체를 만들어 post한다 이 Notification 객체는 NotificationCenter로 가게 된다. 해당 event를 받고 싶은 객체는 Observer를 통해 NotificationCenter에 등록한다. NotificationCenter는 등록된 객체에게 broadcast방식으로 Notificatoin 객체를 보낸다. Notification Object 앞서 살펴보았듯이, event를 보내기 위해서는 Notification 객체를 생성 해야 한다. Notification ..