- [ Swift ][Swift] Clean Architecture2025-02-09 11:25:57Clean Architecture란소프트웨어(Software)란 제품이 출시되면 변경이 어려운 유형의 하드웨어(Hardware)와 다르게 유연한 변경과 확장이 가능하다.그러나 시스템 아키텍처를 고려하지 않고 만든 소프트웨어는 유연한 변경과 확장이 어렵고 이는 무형임에도 하드웨어와 다를바가 없어진다고 생각한다.이를 위해 나온것이 클린 아키텍처이며(즉, 유연한 변경과 확장이 가능하도록 설계하는 것), 클린 아키텍처는 소프트웨어를 계층으로 분리하여 시스템 구성요소들의 독립성을 강화하고 의존성을 약화하여 그 자체로 언제든 테스트 용이하게 만든다.이는 앞서 말한 소프트웨어의 유연한 변경과 확장을 가능캐한다.계층Swift에서 클린 아키텍처를 적용하면 보통 3가지 레이어로 구분한다.아래에서 말하는 컴포넌트는 각 계층..
- [ Swift ][Swift] Copy On Write2025-02-09 11:20:49Swift에서는 COW 방식이 적용되어있다.Copy On Write는 값 복사가 이루어질 때는 실제 복사가 아닌 값의 메모리주소를 참조하고 있다.그 이후 값 변경이 이루어질 때 실질적인 값 복사가 이루어지진다.그래서 값타입은 값복사가 이루어진다는 말은 반은 맞고, 반은 틀리다.실제로는 복사 후 변경이 있을 때 실질적인 복사가 이루어져 새로운 메모리를 할당하고, 값이 변경된다.
- [ Swift ][Swift] final 키워드와 Dispatch를 통한 성능 향상2025-02-09 11:18:53클래스의 override를 제한하거나 서브클래스가 더 이상 존재하지 않을 때 final 키워드를 사용한다.final을 통해 상속이 더 이상 필요없음을 명시할 수 있을 뿐더러, 런타임 성능이 향상된다.성능 향상은 왜 있을까?swift에는 어떤 메소드를 호출할 것인지를 결정하여 실행하는 메커니즘인 Dispatch라는 개념이 존재한다이 Dispatch는 다시 Static Dispatch와 Dynamic Dispatch로 구분된다.Static Dispatch컴파일 시점에 호출될 함수를 결정하여, 런타임 시 그대로 실행시킨다.이는 컴파일 시점에 이미 결정이 되기 때문에 성능 상 이점이 있다.Dynamic Dispatch런타임 시점에 호출될 함수를 결정하여, 실행시킨다.함수 호출 과정에서 vtable을 통해 간접호..
- [ Swift ][Swift] GCD 요약2025-02-09 11:16:06동시성 프로그래밍여러 작업을 동시에 실행Swift에는 이러한 동시성 프로그래밍을 가능캐 해주는 2가지 기능이 있다.Dispatch QueueOperation QueueGCD(Grand Central Dispatch)Dispatch Queue는 FIFO Queue형태로 작업을 순서대로 전달받는다.Serial / ConcurrentSerial이전 작업이 끝나면 다음 작업을 시작하는 직렬 형태아무런 설정을 하지 않으면 Serial로 동작Concurrent추가된 작업을 동시에 처리Sync / AsyncSync큐에 추가된 작업이 완료될때까지 기다림Async큐에 추가된 작업의 완료를 신경쓰지 않음Main / GlobalMainMain Thread가 해당 작업을 맡음Default는 Serial로 동작하나 Concur..
- [ Swift ][Swift] Any와 AnyObject의 차이2025-02-08 17:27:51Any와 AnyObject의 차이Swift에는 Any와 AnyObject라는 타입이 존재한다. 단어에서 알 수 있듯 어떤 타입이든 저장할 수 있을 것만 같다.AnyAny는 모든 타입에 대한 인스턴스를 담을 수 있다. 여기서 모든 타입은 클래스, 구조체, 열거형 모든 타입을 포함한다.var temp: [Any] = [0, 0.1, "가나다", true, { (a: Int,b: Int) -> Int in return 1}]위와 같이 Int, Float, String, Bool, Closure 등 타입에 상관없이 모든 타입을 설정할 수 있다.모든 타입을 저장할 수 있기 때문에 컴파일 시에는 어떤 타입을 요소로 가지고 있는지 알 수 없다. 런타임 시 결정되어 해당 타입의 멤버에 접근할 수가 없다.편리한듯 불편한..
- [ Swift ][Swift] ARC2025-02-08 17:26:40ARC(Automatic Reference Counting)란?swift는 ARC(Automatic Reference Counting)를 통해 앱의 메모리를 관리한다. ARC는 어떤 클래스의 인스턴스가 필요하지 않을 때 자동으로 참조 카운트를 체크하여 인스턴스에 할당된 메모리를 해제하여 관리하는 시스템이다.우선 모르는 단어가 투성이다. 인스턴스, 참조, 메모리 등...메모리 영역우선은 프로그램의 메모리 영역에 이해가 필요할 것이다.프로그램이 실행되면 RAM에서 해당 프로그램의 메모리가 할당되어 사용할 수 있게 된다.그렇게 할당받은 메모리는 총 4개의 영역으로 구분된다.코드(Code) - 코드가 입력되는 부분데이터(Data) - 전역 변수힙(Heap) - 동적할당변수스택(Stack) - 지역 변수, 파라미..
- [ Swift ][Swift] final2024-08-07 16:44:18finalfinal은 Swift에서 class, method, property의 재정의 및 상속이 될 가능성이 없을 때 사용된다. final 키워드를 사용하는 이유final을 통해 기대할 수 있는 효과는 다음과 같다. 코드 안정성성능 개선코드 안정성기본적으로 class, method, property는 아래와 같이 재정의가 가능하다.class Animal { var age: Int = 10 func changeAge() { age = .random(in: 0 ... 100) }}class Dog: Animal { // 저장 프로퍼티는 getter/setter를 모두 사용해주어야 상속이 가능하다. override var age: Int { ..
- [ Swift ][Swift] App Life Cycle2023-06-11 13:44:52APP LIfe Cycle1. 개요앱이 실행되고 종료되기 전까지 많은 상태가 존재한다고 한다.그 상태는 무엇이 있고, 그 역할에 대해 알아보려고 한다.애플 공식 개발 문서를 토대로 내가 이해한 내용을 정리하였다.2. App Life Cycle이란?기본적으로 IOS에서 App의 현재 상태에 따라 무엇을 할 수 있고 할 수 없는지 결정된다.UIKit은 적절한 delegate 객체의 메소드를 호출하여 앱의 상태가 변한 것을 알려준다. 이렇듯 각 상태 별 적절한 조치를 취할 수 있도록 만들어진 것이 App Life Cycle 개념이다.IOS 12 이 전 버전에서는 UIApplicationDelegate 객체를 통해 Life Cycle 이벤트에 대응한다. IOS 13 이 후 버전에서는 다중 창(multi-win..
- [ Swift ][Swift] 고차함수2023-06-11 13:15:451. 개요고차함수의 종류와 사용 방법 Swift에서 함수는 일급객체로 취급하여 다른 함수를 다른 함수의 전달인자로 사용 가능이때 매개변수로 함수를 갖는 함수가 고차함수 대표적인 고차함수mapfilterreduce2. map1. 매개변수로 전달된 함수를 실행2. 함수로 인하여 변형된 결과를 반환 적용 가능 타입배열, 딕셔너리, 세트, 옵셔널 컨테이너가 담고 있는 각 원소의 값을 매개변수를 통해 받은 함수에 적용한 후, 다시 컨테이너에 포장하여 반환let numbers = [1,2,3,4,5]// 후행 클로저// 매개변수(클로저) : (number: Int) -> Intlet doubleNumbers1 = numbers.map() { (number: Int) -> Int in return number ..
- [ Swift ][Swift] 값타입과 참조타입 차이점2022-08-17 16:42:36swift에 자료구조들은 두가지 타입으로 존재한다 값 타입 (Value Type)참조 타입(Reference Type)- 구조체 (Struct)- 열거체 (Enum)- 튜플 (Tuple)- 클래스 (Class)- 클로저 (Closure) 값 타입 대표 '구조체' 와 참조 타입 대표 '클래스'를 통해 자세히 알아보자 구조체 (값 타입)//구조체 (값 타입)struct User { var ID: String var level: Int init(ID: String, Lv: Int) { self.ID = ID self.level = Lv }}var userHong: User = User(ID: "hong", Lv: 20) ID와 level 이라는 저장 프로퍼티..