Swift Collection 타입을 안전하고, 효율적으로 사용해보자
Swift 2022. 12. 10. 20:54

HTML 삽입 미리보기할 수 없는 소스 Slice 활용하기! Swift의 Array는 Collection 프로토콜을 채택하고 있는 자료구조이다. 만약 Collection의 두 번째 원소를 얻으려고 하는 extension 코드를 작성해본다고 하자. 일단 가장 기본적인 로직으로! 일단 Collection 의 원소 갯수가 2개 이상인지 확인한다. 만약 두 개 이상이면, second 원소를 반환한다. 두 개 보다 적으면, nil을 반환한다. extension Collection { var second: Element? { // Collection의 원소 갯수가 2개 이상인지 확인한다. guard count >= 2 else { // 두 개 보다 적으면, nil을 반환한다! return nil } // 만약 두개..

weak와 unowned의 차이 (ARC)
Swift 2022. 11. 8. 22:41

HTML 삽입 미리보기할 수 없는 소스 Unowned와 weak의 라이프타임과 성능 기본적으로 swift 코드를 작성할 때, 객체 간의 순환 참조를 피하기 위해서 unowned와 weak 중 하나를 선택해야 한다. 그러나 두 개의 차이점에 대해선 알지만, 단순히 생각하면 옵셔널 언래핑 과정이 필요하더라도 weak를 사용하는게 좋다는 생각이 드는데, Swift에서 제공해주는 Null safety를 포기하면서까지 unowned를 사용하는 이유가 있지 않을까? 기초 많은 언어에서, 순환 참조에 의해 인스턴스가 메모리에서 할당되지 않는 문제를 해결하기 위해 weak 참조라는 개념이 존재한다. swift엔 두 가지의 weak 참조가 존재한다. unowned weak 두 가지는 같은 목적을 공유하지만, 관련된 객체..

Swift - DispatchQueue (1)
Swift 2022. 2. 24. 21:00

DispatchQueue란? DispatchQueue는 작업 항목의 실행을 관리하는 클래스다. 메인 쓰레드 혹은 백그라운드 쓰레드에서 작업을 연속적으로, 혹은 병렬적으로 실행할 수 있다. 이름에서 알 수 있듯이 Queue 자료구조의 형식을 띄고 있어, FIFO (First In First Out) 입출력 구조를 가진다. DispatchQueue 는 다음과 같이 두 가지 종류가 있다. Serial Queue 한 작업을 끝마쳐야 다음 작업으로 넘어갈 수 있다. Concurrent Queue 여러 작업을 동시에 실행할 수 있다. DispatchQueue 로 넣은 작업들은 시스템에 의해 관리되는 쓰레드 풀에서 실행되며, 앱의 기본 쓰레드를 의미하는 main 쓰레드를 담당하는 DispatchQueue 를 제외하곤..

Swift - ARC
Swift 2022. 2. 22. 14:02

구조체나 열거형처럼 전달할 때마다 값을 복사해서 새로운 인스턴스를 전달하는 값 타입과는 달리 참조 타입은 하나의 인스턴스가 참조를 통해 여러 곳에서 접근하기 때문에, 언제 메모리에서 해제되는지가 중요한 문제다. 만약 인스턴스가 더 이상 필요하지 않은데도 계속해서 메모리에서 해제되지 않으면 한정적인 메모리 자원을 낭비하게 되고 이는 성능의 저하로 이어진다. Java 나 Kotlin 같은 언어들은 가비지 컬렉션이란 기법을 사용해 메모리를 관리한다. Swift는 ARC 라는 기법을 사용하는데 이것에 대해 알아보도록 하자 ARC란? Automatic Reference Counting (ARC)는 이름에서도 알 수 있듯이 자동으로 메모리를 관리해주는 방식이다. ARC 는 더 이상 필요하지 않은 클래스의 인스턴스를..

Swift - where 절
Swift 2022. 2. 21. 19:43

스위프트의 where 절은 특정 패턴과 결합하여 조건을 추가하는 역할을 한다. where 절은 크게 두 가지 용도로 사용된다. 패턴과 결합하여 조건 추가 타입에 대한 제약 추가 즉 특정 패턴에 Bool 타입 조건을 지정하거나, 어떤 타입의 특정 프토코로 준수 조건을 추가하는 등의 기능이 있다. 예제를 통해서 알아보도록 하자 값 바인딩, 와일드카드 패턴과 결합한 where 절 let tuples : [(Int,Int)] = [(1,2),(1,-1),(1,0),(0,2)] for tuple in tuples { switch tuple { //값 바인딩 case let (x,y) where x==y : print("x==y") case let (x,y) where x == -y: print("x==-y") c..

Swift - 타입 중첩
Swift 2022. 2. 21. 10:02

Swift는 타입 내부에 타입을 정의할 수 있다. 예를 들어 열거형의 경우 특정 클래스나 구조체의 기능을 명확히 사용하기에 용이하다. 열거형을 기준으로 분기하거나, 기능을 달리할 수 있다. 또는 특정 데이터 타입들을 하나의 클래스나 구조체에 구현하여 외부와의 혼선을 피할 수도 있다. 중첩 데이터 타입 클래스 내부에 새 클래스, 구조체 내부에 새 구조체, 구조체 내부에 새 열거형 등 타입 내부에 타입을 계속해서 정의할 수 있다. struct Car { let model : String let fuel : Fuel enum Fuel { case LPG case GASOLINE case CNG case ELETRIC } } struct AirPlane { let model:String let fuel : Fu..

Swift - 제네릭
Swift 2022. 2. 20. 13:26

제네릭은 스위프트나 Java, Kotlin 같은 언어들의 강력한 기능으로, 어떤 타입에도 유연하게 대응할 수 있는 자료구조나 함수, 사용자 정의 클래스를 만드는데 아주 유용하게 사용되는 기능이다. 엄청나게 중요한 기능으로 꼭 익혀두어야 한다. 이미 우리가 사용한 많은 기능들이 이미 제네릭을 사용한 기능들이다. 예를 들어 Array 나 Set, Dictionary 의 경우 어떤 타입을 넣더라도 배열이나 집합, 사전으로 만들 수 있었다. 이것은 모두 제네릭이 적용되었기에 가능하다. 또 Optional 도 원래는 열거형으로 구현되있으며, 어떤 타입이든 Optional 로 표현할 수 있다. 제네릭이 적용된 Optional 의 정의를 보자 @frozen public enum Optional : Expressibl..

Swift - 프로토콜 1
Swift 2022. 2. 19. 11:51

Swift에선 프로토콜 지향 프로그래밍이 매우 중요하게 여겨진다. 이번 포스트에선 프로토콜에 대해 공부한 내용을 적어보도록 하겠다. Protocol이란? 프로토콜은 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진(설계도) 를 의미한다. 구조체, 클래스, 열거형은 정의된 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 직접 구현할 수 있다. 프로토콜의 요구사항을 모두 따르는 타입은 해당 프로토콜을 준수한다고 표현한다. 프로토콜은 설계도 역할을 할 뿐이므로, 스스로 기능을 구현하진 않는다. Protocol 정의 & 채택하기 Swift 에서 프로토콜은 protocol 키워드를 사용하여 정의할 수 있다. protocol 프로토콜 이름 { 프로토콜 요구사항 } 클래스, 구..