SWIFT

    코딩테스트를 위한 Swift 필수 자료구조 구현하기

    코딩테스트는 취업에 있어 꼭 필요한 과정 중 하나입니다. 저도 익숙하게 사용했던 Python 언어를 활용하여 코딩 테스트를 준비했었는데요. 하지만 최근에 점차 많은 회사들이 포지션에 맞게 코딩테스트 언어 제한을 두었습니다. Swift는 Type-Safe 언어이고 문법도 간결해서 iOS 개발할 때에 무척 편리하게 사용하고 있습니다. 하지만 Python과 달리 별도의 Built-in 자료 구조가 없어서 코딩테스트에 필요한 부분은 직접 구현해야 합니다. 이번 게시글에서는 Swift를 통해 필요한 자료구조를 직접 구현하는 방법에 대해 기술하고자 합니다. Queue Queue 는 FIFO 방식으로 동작하는 자료구조입니다. 프린터, 작업 대기열 같은 문제에 활용되고 더 나아가 SPFA 같은 최단 거리 알고리즘에 사..

    Swift Reference Count 고찰 ( with side table )

    Swift ARC 의 기본적인 개념은 아래 포스팅을 참고해주시면 감사하겠습니다. Swift ARC ( Automatic Reference Counting ) 정리 추상적으로 "메모리를 관리해주는 것" 으로 이해하고 있었지만, JAVA 의 GC ( 가비지 컬렉터 ) 와의 차이점을 명확하게 설명하게 어려워서 포스팅을 작성했습니다. 프로그래밍 언어의 메모리 관리 linux-studying.tistory.com 필자는 iOS 를 처음 공부하며 클로저 캡처리스트를 작성할 때 unowned 를 남발했던 기억이 있습니다. 그 후 앱 크래시를 유발할 수 있다는 조언을 듣고 강한 순환 참조가 발생할 수 있는 상황에서는 weak 키워드를 사용했습니다. weak 와 unowned 를 사용하면 레퍼런스 카운트가 올라가지 않고..

    iOS URLSession Test Double 만들기

    iOS 에서 네트워크를 테스트하는 방법은 크게 두가지가 있습니다. 1. 실제 서버(혹은 테스트 서버) 에 직접 요청하기 2. Stub 을 통해 실제 네트워크에 요청하지 않고 테스트하기 네트워크 요청은 느리고, 실패 가능성이 있으며 불확실성이 높은 요소입니다. 이런 경우에는 일정한 요청을 return 하는 Stub 을 제작하는 2번으로 주로 테스트를 진행하게 됩니다. URLSessionDataTask vs URLSession 어떤 것을 Stubbing 할까? 테스트 코드 학습을 위해 가장 처음 접했던 포스팅은 배달의 민족 기술블로그 조원님의 "iOS Networking and Testing" 입니다. ( Moya 기반의 test code 코드 작성법도 기술되어 있으니, 꼭 읽어보시면 좋습니다. ) 위에서는..

    iOS 에서 Void Observable 테스트 코드 작성하기

    RxSwift 에서 다음 이벤트로 값을 전달할 필요가 없는 경우에는 Void Observable 를 사용합니다. 그리고 테스트 코드를 작성하기 위해서는 RxTest 에 있는 TestScheduler 를 이용하여 가상 시간의 이벤트들을 방출하는 옵저버블을 만들고, XCTAssertEqual 을 통해 events 를 비교하게 됩니다. Bool Observable 은 문제 없이 테스트 가능하지만 여기서 Void Observable 에서 문제점이 발생하게 됩니다. .next 로 들어가는 요소는 Equatable 을 준수해야 하기 때문입니다. RxSwift 저장소에서 해당 문제가 논의되며 PR이 올라왔었지만, 현재는 메인 저장소에 반영되지 않았습니다. 이를 해결하는 방식은 크게 2가지가 있습니다. 1. 별도의 테..

    iOS 에서 Call Stack 으로 버그 해결하기

    Xcode 는 프로그램이 실행되는 동안 "Call Stack" 이라고 하는 데이터 구조에 수행중인 정보를 저장합니다. 이는 개발자가 어떤 코드에서 메서드가 호출되고 해당 동작이 다른 부분과 어떻게 상호작용하는지 파악할 수 있도록 도와줍니다. 이번 예시에서는 RxSwift 에서 synchronizationError 를 해결해보겠습니다. * 꼭 런타임 에러가 아니더라도 특정 코드 라인에 Break Point 를 걸면 Call Stack 를 활용할 수 있습니다. 위는 구독 클로저에서 바로 값을 방출하므로 재진입 에러가 발생하게 됩니다. 이런 런타임 에러 상황 혹은 Break Point 걸린 부분에서 Call Stack 을 확인하면 어떤 메서드가 순서대로 호출되었는지 파악할 수 있습니다. 차례대로 Threads..

    iOS 에서 Pinterest Layout 구현하기 ( UIKit, Custom Layout )

    위와 같은 Layout 을 구성해야할 때 어떤 방식을 사용해야 할까요? 단순하게 한 열에 두 개의 아이템이 있으므로, UICollectionView 를 기반으로 하고 이미지 크기 만큼 셀 사이즈를 지정하면 되지 않을까 생각했습니다. min cell-spacing 과 line-spacing 을 0으로 주어도 이상하게 셀 사이에 공백이 발생하고, 생각대로 동작하지 않게 됩니다. CollectionViewFlowLayout 위와 같은 문제점이 발생하는 이유를 알기 위해서는 먼저 Flow Layout 의 동작 방식을 이해해야 합니다. CollectionView 에 기본적으로 사용되는 CollectionViewFlowLayout 은 특정 Line 에 따라서 Cell 을 배치하게 됩니다. 선을 따라서 Cell 을 ..

    지금까지 받았던 코드 리뷰 정리 ( iOS, Swift )

    부스트코스 iOS 과정을 수료하면서 조언 받았던 내용을 정리합니다. 1. 프로퍼티/메서드를 private 로 선언 후 필요에 따라 Access Control 를 조정한다. OOP 정보은닉과도 관련되어 있는 내용입니다. 소프트웨어 유연성을 늘리기 위해서는 객체간의 의존성을 낮추는 것이 중요한데요. 모든 프로퍼티/메서드가 Internal 로 설정되어 있다면, 어떤 부분이 외부에서 접근 가능한지 파악하기 어렵지만, 필요한 부분만 Access Control 를 조정한다면 개발자가 이를 파악하기 쉬운 장점이 있습니다. 2. Retain Sycle 을 방지하기 위해 Weak, Unowned 키워드를 적절하게 사용한다. Swift 는 ARC 를 통해 메모리를 관리합니다. GC 보다 효율적이지만, 개발자의 오판에 의해..

    반응형 (Reactive) 프로그래밍을 위한 기초 지식 - 1 (Functional Programming)

    함수형 프로그래밍 ( Functional Programming ) 수학적 함수를 중심으로 개발하여 "Side-Effect" 를 최소한으로 하는 프로그래밍 패러다임 명령형 프로그래밍을 할 때 사용하는 Function 은 실제로 수학의 함수의 다른점이많습니다. 이유는 외부 요인에 의하여 Return 값이 변경 될 수 있기 때문입니다. 이를 Side-Effect 라고 합니다. Side-Effect 가 커질수록 소프트웨어의 불확실성이 높아지고, 심각한 버그를 발생시킬 가능성이 높아집니다. 이에 따라 Pure Function 이라는 개념이 등장하게 됩니다. 직역하면 "순수 함수" 로서 수학의 함수와 동일하게 동일 인자에 대해서 같은 출력값을 가지게 됩니다. 또한 아래와 같은 Immutable 데이터를 참조하여도 ..

    Swift Optional ( enum, wrapped ) 정리

    Swift 는 다른 언어와 다르게 Optional 이라는 타입으로 nil 을 처리 합니다. ( nil == Null ) 일반 변수에 nil 값은 대입이 불가하고 nil 사용이 필요할 때 Optional 타입을 사용합니다. 내부 구현은 Enum (열거형) 으로 이루어져 있고, 값이 없는 none 케이스와 값이 존재하는 some 케이스를 가지고 있습니다 * 은 Generic 이다. * @frozen 어노테이션은 Swift 4.2 에 추가된 기능으로 Enum Type 에 더이상 추가될 Case 가 존재하지 않음을 명시해준다. ( Default Case 필요 X, 컴파일 속도 향상 ) Optional 선언 선언은 다음과 같습니다. Optional 으로 선언하고 값이 존재한다면 some 존재하지 않다면 none ..

    Swift ARC ( Automatic Reference Counting ) 정리

    추상적으로 "메모리를 관리해주는 것" 으로 이해하고 있었지만, JAVA 의 GC ( 가비지 컬렉터 ) 와의 차이점을 명확하게 설명하게 어려워서 포스팅을 작성했습니다. 프로그래밍 언어의 메모리 관리 C, C++ 과 같은 언어는 Heap 영역에 할당된 메모리를 개발자가 직접 관리하지만 대부분의 현대적인 언어들은 포인터를 언어 내부적으로 사용하고 ( 감추고 ) 메모리를 자동적으로 관리합니다. 이에 크게 두가지 방식이 있습니다. RC ( Reference Count ) 사용 언어: Swift, Rust ... 참조 시점: Complie time 특정 객체가 참조되면 Count 를 1 증가시키고, 반대로 참조 해제되어 Count 가 0이 되면 메모리에서 객체를 해제하는 기술입니다. 장점 : 컴파일 시점에 적용되므..