본문 바로가기

전체 글51

Main event loop와 Update cycle Main event loop 메인 이벤트 루프(Main event loop)는 메인 스레드의 런 루프이다. 메인 이벤트 루프는 애플리케이션이 시작될 때 생성된 애플리케이션(UIApplication) 객체에 의해 자동으로 생성되고 실행된다. 런 루프는 두 가지 종류의 입력 이벤트를 받을 수 있는데 메인 이벤트 루프는 유저로부터 입력 소스(Input Source) 이벤트를 받는다. 메인 이벤트 루프는 다른 런 루프와 다르게 멈추지 않는다. 따라서 입력 이벤트 핸들링과 애플리케이션의 상태와 뷰 업데이트를 계속해서 처리한다. 운영체제(iOS)는 유저로부터 입력받은 저 수준의 이벤트를 도착한 순서대로 이벤트 큐(Event Queue)에 넣는다. 애플리케이션 객체는 이벤트 큐에서 이벤트를 한 개 뽑아 이벤트가 발생.. 2023. 1. 31.
[WWDC 2021] ARC in Swift: Basics and beyond Automatic Reference Counting in Swift 스위프트의 참조 타입 인스턴스는 힙 메모리에 저장되고 Automatic Reference Counting (or ARC) 방식으로 관리된다. ARC 방식은 단순한데 어떤 한 참조 타입의 인스턴스는 refCount라는 참조값을 가지고 이 인스턴스가 참조되면 참조값을 늘리고 더 이상 참조되지 않으면 참조값을 줄인다. 만약 참조값이 0이 되면 인스턴스의 생명이 끝난 것으로 판단하여 메모리에서 해제한다. ARC 스위프트의 인스턴스는 생성자를 통한 초기화부터 마지막 사용될 때까지 메모리 위에 있다. 인스턴스의 참조 여부를 수동으로 계산해 retain 연산과 release 연산을 추가해야 하는 Objective-C의 Memory Reference .. 2023. 1. 31.
퀵소트의 시간복잡도 Time complexity of quick sort 퀵소트는 피봇을 정하는 파티션 과정과 2번의 분할 과정으로 이루어져 있다. \(n\)개의 원소를 퀵소트로 정렬하는 데 걸리는 시간을 \(T(n)\)이라 할 때 \(T(n)\)은 \(m\)개와 \(n-m\)개로 분할된 원소를 정렬하는 시간과 \(n\)개의 원소 중 피봇을 정하는 파티션 과정으로 나눌 수 있다. 아래 식을 활용해서 퀵소트의 시간복잡도를 구할 수 있다. $$T(n) = T(m) + T(n-m) + C(n) $$ Best case time complexity 퀵소트는 피봇이 항상 배열을 균등하게 분할하여 분할의 횟수가 \(\log n\)번 실행되는 경우에 \(O(n\log n)\)에 동작한다. 최선의 방법으로 퀵소트를 할 때 걸리는 시간을 \.. 2023. 1. 4.
Run Loop Run Loop란 런 루프(Run loop)는 스레드에 전달된 소켓, 파일, 키보드, 마우스 등의 입력과 타이머 객체를 처리하는 객체이다. 런 루프를 사용해 스레드의 활동 상태를 조정할 수 있으며 이것이 런 루프가 고안된 이유이다. 모든 스레드는 생성될 때 자신만의 런 루프를 갖는다. 메인 스레드에 생성된 메인 런 루프는 생성과 동시에 자동으로 실행(Start)되지만 그 외 스레드의 런 루프는 자동으로 실행되지 않는다. 따라서 개발자는 적절한 타이밍에 직접 런 루프를 실행시켜 이벤트를 처리해야 한다. 입력 이벤트의 종류 런 루프는 2가지 입력 이벤트를 받는다. Input source는 다른 스레드나 애플리케이션에서 비동기적으로 전달된 이벤트이다. Timer source는 예정된 시간 또는 반복된 Inte.. 2022. 11. 21.
Initialization (1) 초기화(Initialization) 인스턴스의 저장 프로퍼티는 사용하기 전에 반드시 특정 값 또는 nil로 초기화되어야 한다. 초기화(Initialization)는 클래스, 구조체, 열거형의 프로퍼티 초기 값을 설정하는 단계이다. 초기화 과정은 초기자(Initializer)를 정의해 구현할 수 있다. Struct Initializer 구조체의 초기자를 만드는 간단한 방법은 초기자 내부에서 저장 프로퍼티의 초기값을 지정해주는 방법으로 매개변수(parameter)가 없는 init 키워드를 사용하는 것이다. 저장 프로퍼티의 초기 값을 항상 미리 지정된 값으로 초기화한다. 만약 모든 저장 프로퍼티의 초기값이 설정되어 있고, 어떤 초기자도 정의하지 않았다면 스위프트는 모든 저장 프로퍼티를 초기값으로 초기화하는 기.. 2022. 11. 11.
[디자인 패턴] Decorator pattern 데코레이터 패턴이란? 데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브 클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다. - 위키 백과- 데코레이터 패턴은 객체 자신을 계속해서 감싸는 방식으로 객체에 추가 요소를 더하는 패턴이다. 상속을 사용하여 기능을 추가한 서브 클래스를 만들 수 있다. 하지만 상속에는 몇 가지 단점이 있다. 상속은 컴파일 시간에 기능이 결정되므로 정적인 기능 추가이고 기능이 추가될 때마다 서브 클래스를 만들어야 한다. 또한 서브 클래스가 슈퍼 클래스의 모든 기능을 상속받아야 한다. 이런 단점을 해결하는 데코레이터 패턴을 알아보자. 문제 상황 학교 앞에 덮밥 집을 개업한 A 씨는 초.. 2022. 11. 7.
[디자인 패턴] Observer pattern 옵저버 패턴이란? 옵저버 패턴이란 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 알리고 자동으로 내용을 갱신하는 방식으로 일대다(one-to-many) 의존성을 정의한다. 상태를 저장하고 있는 객체를 주제(Subject), 주제의 알림을 받는 객체를 옵저버(Observer)라고 한다. 한 개의 주제는 여러 개의 옵저버에 알림을 보낼 수 있기 때문에 일대다 관계를 갖는 것이 특징이다. 간단한 옵저퍼 패턴의 예시로 구독한 유튜브 채널에 영상이 올라왔을 때 구독자에게 알림을 보내는 과정을 생각할 수 있다. 영상이 올라올 때마다 변화하는 영상 목록의 상태를 저장하고 있는 유튜브 채널이 주제(Subject)이고 유튜브 채널을 구독하는 구독자가 옵저버(Observer)라고 할 수 있다. 옵저버 패턴 구.. 2022. 11. 2.
단조 스택(Monotonic Stack) 단조 스택(Monotonic Stack) 이란 단조 스택(Monotonic Stack)은 스택(Stack) 자료 구조의 변형 중 한 개로 스택의 원소들이 단조 증가 혹은 단조 감소 상태인 스택을 말한다. 겉보기에는 힙(Heap) 자료구조와 비슷하게 보이지만 다르다. 정확하게 말하자면 단조 스택이란 스택에 원소를 삽입할 때 스택의 상태가 단조 증가 혹은 감소를 유지되는 것을 말한다. 사실 단조 스택은 자주 쓰이지는 않는다. 하지만 특정 문제에서는 단조 스택이 힘을 발휘할 때가 있다. 그중 한 개는 자신보다 처음으로 크거나 작은 원소의 값을 찾는 문제(Next Greater or Smaller Element)이다. 예를 들어 배열 [2, 1, 2, 4, 3]가 주어졌을 때 자신보다 처음으로 큰 원소를 저장하.. 2022. 11. 1.