인기 글
- 프로그래머스) signal: illegal instruction (core dumped) 원인과 해결 (Swift 오류) 목차 프로그래머스에서 정답률이 매우 높은 두 정수 사이의 합이라는 문제를 풀다가 갑자기 처음 보는 오류를 발견해서 당황했다. 머리말 오류 발생 메시지 signal: illegal instruction (core dumped) 띠용…? 난이도가 높지 않은 문제인데 왜 틀린 걸까… 여기저기 찾아 봤다. 원인 해당 오류가 발생하는 이유는 크게 두 가지이다. index out of range (활용한 index 범위 연산자가 초과함.) 옵셔널에서 nil 값에 의한 오류 해결책 이 중에서 내 코드의 문제점은 1번의 경우이다. 주어진 데이터에서 index의 범위를 초과했기 때문이다. 내가 사용한 닫힌 범위 연산자(Closed Range Operator)에 대해 좀 더 자세히 알아 보자. 닫힌 범위(Closed Ra..
- 프로그래머스) sublime 자주 쓰는 단축키 (Mac) 프로그래머스의 sublime으로 코딩 테스트를 푸는데 중간에 편집하고 다듬는 과정은 여간 번거롭지 않다. 더군다나 sublime의 단축키는 기존에 쓰던 IDE의 단축키와 같은 것도 있고 다른 것도 있어 더 헷갈린다. Visual Studio Code에서 자주 쓰던 단축키 기능이 sublime에도 있나 해서 찾아 보며 정리해 봤다. 문제를 풀며 자주 쓰는 것들을 모아 봤는데, 유용한 것이 있으면 계속 업데이트 할 예정이다. 📌 한 줄 편집 단축키 설명 CTRL + CMD + ↑/↓ 줄 전체 위/아래로 한 줄 이동 CMD + SHIFT + D 줄 전체 복제 CMD + X 줄 전체 잘라내기 CMD + RETURN 커서부터 줄 처음까지 삭제 CMD + K 커서부터 줄 끝까지 삭제 📌 다중 커서 편집 단축키 설명..
- 인터럽트(Interrupt)와 실행 과정, 역할 프로세스에 대한 상태(Process State)를 공부하는데 인터럽트에 대해 더 자세히 알고 싶어서 이번 블로그를 작성했다. 인터럽트가 무엇인지 알아보고 이에 대한 종류와 실행 과정, 역할에 대해 알아 보자. 📌 인터럽트의 정의 인터럽트(Interrupt)는 시스템의 내부 또는 외부에서 발생하는 예기치 못한 사건에 의해, 프로세서(흔히 CPU)가 실행 중인 프로그램의 작업을 중단시키고 다른 프로그램을 수행하도록 하는 명령어이다. 여기서 말하는 예기치 못한 사건은 입출력(Input/Output or I/O)이나 에러의 발생, 타이머의 시간 만료 등을 의미한다. 📌 인터럽트의 종류 인터럽트의 종류는 두 가지인데, 하드웨어 인터럽트와 소프트웨어 인터럽트가 있다. 말 그대로 '하드웨어에 의한 인터럽트냐, 소프트..
- [Git] git 명령어 시 한글 깨짐 문제 머리말 Git 관련 문제 git status 명령어 입력 시 한글 깨짐 아래처럼 git status를 하는데 한글만 \354 \235처럼 이스케이프 문자로 깨져서 나오게 되어 알아볼 수 없는 문제가 발생했다. 원인 quotepath와 "unusal" 문자 quotepath는 경로의 이름(pathname)이 특별한(unusal) 경우에 이를 다르게 표현하는 git의 기본 설정이다. 특별한 경우는, 경로의 이름에 쌍따옴표("), 이스케이프 문자(\n, \t 등등)나 바이트의 크기가 0x80(8진법으로 80) 이상의 문자는 git에서 "unusal" 문자로 판단한다. 따라서 이를 수정해주면 된다. 해결책 명령어 입력 아래와 같은 명령어를 입력하면 해결이 된다. git config --global core.qu..
- 합병 정렬(병합 정렬; Merge Sort) in Python 지난 글에 분할 정복 알고리즘의 개념에 대해 알아 보았다. 이제는 실제로 이를 적용한 합병 정렬에 대해 알아 보자. [알고리즘] 분할 정복(Divide and Conquer) 개요 정렬 알고리즘에서 버블 정렬과 선택 정렬, 삽입 정렬에 대해 알아 보았다 이 세 가지 정렬 알고리즘은 코드가 직관적이긴 하지만 $n$(데이터의 크기)에 대한 이중 for 문으로 되어 있기에 굉장히 andy-archive.tistory.com 📌 정의 합병 정렬(merge sort)은 주어진 배열을 더 이상 쪼갤 수 없을 때까지 재귀적으로 데이터 크기의 절반으로 계속 나누고, 다시 정렬을 통합하여 정렬하는 알고리즘이다. 📌 동작 과정 합병 정렬은 요소가 하나가 될 때까지 계속해서 절반으로 나눈 뒤, 조합해 가면서 정렬해 나간다...
iOS 정리
- Swift) 프로토콜과 의존성 주입, 의존성 분리 원칙 (feat. DI & DIP) 목차 I. 머리말 (0) 요약 📝 4개의 주제표 아래와 같이 요약할 수 있다. 긴 글을 읽기 전에 일단 살펴 보고 가자. 용어 정의 문제 의존 관계 발생 1. 하위 모듈의 인스턴스를 상위 모듈 내부에 직접 생성할 경우 발생 2. 하위 모듈이 변경될 때마다 상위 모듈 또한 매번 대응해야 함 해결책 의존성 분리 1. Swift의 인터페이스인 프로토콜(Protocol)을 이용한 추상화 진행 2. 정의한 프로토콜을 실제 모듈에 채택하여 요구사항을 준수하도록 요구 수단 의존성 주입 (Dependency Injection) 1. 하위 모듈의 인스턴스를 외부에서 생성 2. 상위 모듈 내부에는 프로토콜을 프로퍼티로 정의하고 생성자를 통해 프로퍼티를 생성 원칙 의존성 역전 원칙 (DIP; Dependency Invers..
- RxSwift) 이메일 검증 네트워크 요청하기 (feat. withLatestFrom & flatMap) 머리말 구현 화면 이번에 구현한 화면은 아래와 같다. 이메일을 입력하여 확인 버튼을 누르면 해당 이메일이 사용가능한지 아닌지에 대한 반응형 화면이다. RxSwift Observable Flow 이번에 적용한 Observable에 대한 흐름을 아래처럼 그려보았다. 본문에서 주제 별로 끊어서 설명할 예정이다. GitHub PR 링크 회원 가입 - 이메일 검증 요청과 응답 메시지에 따른 반응형 UI 구현 #5 아마 아직 Private일테지만, 나중에 Public 전환 시 볼 수 있을 것 같다 :) 본문 0) ViewModel 구조 입력 값으로는 텍스트(이메일)과 버튼 클릭(확인 버튼 클릭)을 받고, 출력 값으로 해당 텍스트가 적절한지, 응답 메시지는 무엇인지를 다시..
- LSLP) RxSwift를 이용한 반응형 이메일 입력 화면 구현 (feat: MVVM & BehaviorRelay) 목차 머리말 구현 화면 MVVM 개념 복습 MVVM x Input-Output x RxSwift에 대한 블로그 링크 RxSwift로 MVVM 패턴에서 반응형 이메일 입력 화면 구현하기 0) 개요 ViewController(이하 VC)에서 화면으로 받은 입력 값을, ViewModel(이하 VM) Input의 인스턴스인 "input"으로 받고 있다. 입력 값은 viewModel(VM의 인스턴스)의 transform 메서드를 거쳐 가공되어 출력 값(output; Output의 인스턴스)이 된다. 출력 값은 다시 VC의 화면에 보여진다. 1) ViewController x input 화면의 입력 값을 뷰모델의 로직으로 전달하기 VM의 Input 타입에 대한 인스턴스를 input(텍스트 필드와 버튼 클릭)으로 받..
- AppStore) iOS 앱스토어 버전 체크 오류와 Git Flow (feat. hotfix & bundleId) 목차 머리말 문제 발생 오류 상황 설정 화면에서 최선 버전을 체크할 때, 최신 버전임에도 업데이트 하기라는 UILabel이 뜨는 문제가 발생했다. iOS 앱스토어 버전 체크와 Git Flow 긴급한 HOTFIX 브랜치 분기 아래와 같이 `HOTFIX` 브랜치를 만들었다. 앱 개발 하면서 처음으로 HOTFIX를 써 보았다. * HOTFIX/check-appstore-version develop (END) URL 요청 테스트 및 수정 문제) 번들 아이디에 대문자가 포함될 경우 버전이 아직도 `1.0`인 것을 알 수 있다... (도대체 왜...🥲) 해결-1) 번들 아이디의 대문자를 소문자로 변경할 경우 번들 아이디를 소문자로 바꾸면 해결-2) 번들 아이디가 아닌 애플 아이디로 변경할 경우 코드에서 URL 수..
- iOS MapKit) 저장 버튼 클릭 시 어노테이션 방문 처리 (feat. addObserver & removeObserver) 목차 머리말 구현 내용 기능 버튼 클릭 시 DB 저장 & 방문 처리 모달창 변화 & 어노테이션 선택 여부 GIF 내용 post 메서드에 의한 `addObserver` (1) annotation의 데이터 저장 `saveAnnotationToRealm` (2) annotation 변경 `toggleAnnotation` 뷰의 생명 주기에 따른 annotation의 선택 여부 결정 (1) 뷰가 나타나려고 할 때 (viewWillAppear) → selectAnnotation (2) 뷰가 사라지려고 할 때(viewWillDisappear) → annotation 선택 해제 deselectAnnotation GitHub PR 링크 annotation 저장 시 realm에 ..
- (앱 개발/MapKit) 사용자 위치와 annotation 사이의 거리에 따라 모달창 띄우기 or 내리기 머리말 포스팅 이유 GitHub에 올린 PR을 좀 더 자세히 풀어 쓰면 좋을 것 같아서 포스팅을 하게 되었습니다. 요약 (1) 사용자 위치와 가장 가까운 annotation과 거리를 계속 계산하여 도착 뷰가 뜨도록 구현했습니다. (2) 또한 도착 뷰의 생명 주기에 따라 annoaation의 선택 또는 선택 해제하도록 하였습니다. 기능 1 기능 2 Annoation에서 멀어지면 해당 Annotation을 선택 해제 및 모달창 내리기 Annoation에서 멀어지면 해당 Annotation을 선택 해제 및 모달창 내리기 📌 Annoation에서 멀어지면 해당 Annotation을 선택 해제 및 모달창 내리기 사용자 위치와 가장 가까운 Annoation과의 거리가 35m 이상일 경우 해당 Annotation을 ..
최신 글
- iOS) Push Notification Flow (feat. APNs) iOS Push 흐름도정의 Push (or Remote Notification)서버에서 디바이스로 알람을 전달하는 방법특징 iOS의 경우 Push 기능을 구현하려면 무조건 APNs를 거쳐야 한다.APNs (Apple Push Notification service) 개별 디바이스로 직접적으로 푸시 알림을 보낼수 있는 주체 (provided by Apple) 참고 자료Registering your app with APNs | Apple DeveloperNotification Overview | Apple Developer
- 운영체제) 프로세스 동기화와 경쟁 조건 머리말공유 데이터와 데이터의 비일관성(data inconsistency)멀티 스레드 / 멀티 프로세스의 환경에서는 여러 작업을 동시에 실행시키기 때문에, 효율성을 증가시킬 수 있지만, 공유하는 자원에 대한 접근에 주의를 기울여야 한다.concurrent access to shared data may result in data inconsistency.공유 데이터에 대한 비동기적인 접근은 데이터의 비일관성을 유발할 수 있다.본문동시성과 병렬성 (Concurreny & Parallelism)1. 동시성에서의 실행(Concurrent Execution)a process may be interrupted at any point in its instruction stream.하나의 프로세스의 실행 흐름에서 어느 ..
- RxSwift) Hot Observables vs Cold Observables 머리말Observables의 특징 따른 구분 (Hot vs Cold)RxSwift의 Observables의 특징을 구분하여 설명할 때 흔히 Hot과 Cold로 구분하여 이를 다룬다. 아메리카노도 아니고 무슨 Hot과 Cold가...이를 한번 비교해 보자.본문구분의 핵심시퀀스에 대한 방출 시점 (→ 자원의 사용 여부)Observable이 Hot인지 Cold인지 이를 구분하는 핵심은 아래와 같다.Observable이 아이템에 대한 시퀀스를 언제 방출하는가?여기서 짐작할 수 있는 따뜻하냐 차갑냐의 차이는, 이벤트의 방출은 곧 자원의 사용 (이벤트의 방출 → 열을 발생시킨다)의 여부 에서 착안한 것 같다.공식 문서에서도 Use resources ("produce heat") 라 설명되어 있다. ..
- Swift) inout 파라미터 머리말 Swift는 다른 언어와 다르게 함수의 파라미터가 상수여서 파라미터의 값을 변경하려면 "inout"이라는 키워드를 사용해야 한다. 우리말로 하면 "출입"이라는 키워드일텐데 도대체 이 키워드는 무엇인지 살펴 보자. 본문 공식문서의 inout 한번 공식문서에서 inout을 살펴 보자 In-Out Parameters in Functions You write an in-out parameter by placing the inout keyword right before a parameter’s type. An in-out parameter has a value that’s passed in to the function, is modified by the function, and is passed back ..
- 알고리즘) 선형 탐색 (Linear Search) in Swift 머리말 정렬이 되지 않은 배열을 효율적으로 탐색하려면? 하버드 대학교 CS50 수업에서 알고리즘에 대한 수업을 할 때 나오는 내용 중 하나가 바로 선형 탐색이다. 이에 대한 블로그는 여기에 정리해 두었다. 본문 이를 한번 Swift 언어의 코드로 구현해 보자. 코드 타입을 명확히 하지 않고 제네릭으로 추상화하였고, 구현에서 이를 실체화하기 위해 메타 타입을 이용했다. import Foundation func linearSearch( array: [T], value: T, type: T.Type ) -> T? { for element in array { if element == value { // 등호를 쓰기 위해 Equatable 프로토콜 채택 return element } } return nil } f..
- iOS 앱의 생명 주기 (App Life Cycle) Intro 앱의 생명 주기(App Life Cycle)란? 앱의 생명 주기는 어떠한 앱이 최초로 실행된 이후부터 해당 애플리케이션이 메모리에서 해제되어 종료되기까지의 상태와 상태 간의 이동을 의미한다. 앱 생명주기의 변화점 iOS 13.0+ & iPadOS의 스플릿 뷰 기존에는 한번에 하나의 화면만 보여주던 게 당연했지만, 아이패드에서 최소 두 개 이상의 앱을 하나의 화면에서 보여주어야 할 필요성이 생겼다. 그것이 바로 스플릿 뷰의 등장이다. App Delegate → Scene Delegate iOS 12 이전까지는 UIApplicationDelegate 객체를 통해 Life Cycle Event에 대응했지만, iOS 13 이후부터는 UISceneDelegate 객체를 통해 Life Cycle Even..
iOS
- iOS) Push Notification Flow (feat. APNs) iOS Push 흐름도정의 Push (or Remote Notification)서버에서 디바이스로 알람을 전달하는 방법특징 iOS의 경우 Push 기능을 구현하려면 무조건 APNs를 거쳐야 한다.APNs (Apple Push Notification service) 개별 디바이스로 직접적으로 푸시 알림을 보낼수 있는 주체 (provided by Apple) 참고 자료Registering your app with APNs | Apple DeveloperNotification Overview | Apple Developer
- RxSwift) Hot Observables vs Cold Observables 머리말Observables의 특징 따른 구분 (Hot vs Cold)RxSwift의 Observables의 특징을 구분하여 설명할 때 흔히 Hot과 Cold로 구분하여 이를 다룬다. 아메리카노도 아니고 무슨 Hot과 Cold가...이를 한번 비교해 보자.본문구분의 핵심시퀀스에 대한 방출 시점 (→ 자원의 사용 여부)Observable이 Hot인지 Cold인지 이를 구분하는 핵심은 아래와 같다.Observable이 아이템에 대한 시퀀스를 언제 방출하는가?여기서 짐작할 수 있는 따뜻하냐 차갑냐의 차이는, 이벤트의 방출은 곧 자원의 사용 (이벤트의 방출 → 열을 발생시킨다)의 여부 에서 착안한 것 같다.공식 문서에서도 Use resources ("produce heat") 라 설명되어 있다. ..
- Swift) inout 파라미터 머리말 Swift는 다른 언어와 다르게 함수의 파라미터가 상수여서 파라미터의 값을 변경하려면 "inout"이라는 키워드를 사용해야 한다. 우리말로 하면 "출입"이라는 키워드일텐데 도대체 이 키워드는 무엇인지 살펴 보자. 본문 공식문서의 inout 한번 공식문서에서 inout을 살펴 보자 In-Out Parameters in Functions You write an in-out parameter by placing the inout keyword right before a parameter’s type. An in-out parameter has a value that’s passed in to the function, is modified by the function, and is passed back ..
- iOS 앱의 생명 주기 (App Life Cycle) Intro 앱의 생명 주기(App Life Cycle)란? 앱의 생명 주기는 어떠한 앱이 최초로 실행된 이후부터 해당 애플리케이션이 메모리에서 해제되어 종료되기까지의 상태와 상태 간의 이동을 의미한다. 앱 생명주기의 변화점 iOS 13.0+ & iPadOS의 스플릿 뷰 기존에는 한번에 하나의 화면만 보여주던 게 당연했지만, 아이패드에서 최소 두 개 이상의 앱을 하나의 화면에서 보여주어야 할 필요성이 생겼다. 그것이 바로 스플릿 뷰의 등장이다. App Delegate → Scene Delegate iOS 12 이전까지는 UIApplicationDelegate 객체를 통해 Life Cycle Event에 대응했지만, iOS 13 이후부터는 UISceneDelegate 객체를 통해 Life Cycle Even..
- Swift에서타입에 상관없이 코드를 작성할 수 없을까? (feat. Swift Generics) 목차 I. 머리말 들어가기 전에 개발자 앤디는 두 요소를 바꾸는 함수를 작성하기 위해 아래와 같이 코드를 작성하였다. 코드 func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a a = b b = temporaryA } func swapTwoDoubles(_ a: inout Double, _ b: inout Double) { let temporaryA = a a = b b = temporaryA } 하지만, 앤디는 이렇게 작성하면서 의문점이 들었다. 어차피 두 요소를 바꾸는 함수인데, 하나의 함수로 정의할 수는 없을까? 함수의 중복 동일한 기능을 수행하는 여러 개의 함수 앤디는 타입에 상관없이 함수를 하나로 묶고 싶다...
- Swift) 프로토콜과 의존성 주입, 의존성 분리 원칙 (feat. DI & DIP) 목차 I. 머리말 (0) 요약 📝 4개의 주제표 아래와 같이 요약할 수 있다. 긴 글을 읽기 전에 일단 살펴 보고 가자. 용어 정의 문제 의존 관계 발생 1. 하위 모듈의 인스턴스를 상위 모듈 내부에 직접 생성할 경우 발생 2. 하위 모듈이 변경될 때마다 상위 모듈 또한 매번 대응해야 함 해결책 의존성 분리 1. Swift의 인터페이스인 프로토콜(Protocol)을 이용한 추상화 진행 2. 정의한 프로토콜을 실제 모듈에 채택하여 요구사항을 준수하도록 요구 수단 의존성 주입 (Dependency Injection) 1. 하위 모듈의 인스턴스를 외부에서 생성 2. 상위 모듈 내부에는 프로토콜을 프로퍼티로 정의하고 생성자를 통해 프로퍼티를 생성 원칙 의존성 역전 원칙 (DIP; Dependency Invers..
- SwiftUI) @ViewBuilder를 왜 쓸까 (feat. Property Wrapper) 머리말 결론 (애플이 아닌) 직접 만든 코드에는 하위 뷰를 담을 수 있게 하는 로직이 들어가 있지 않기 때문에 - `View` 프로토콜의 `body` 프로퍼티와 SwiftUI에 내장된 구조체에는 이미 `@ViewBuilder`가 구현되어 있어서 아무런 의심 없이 굳이 `@ViewBuilder` 프로퍼티 래퍼를 감싸지 않아도 된다. - 하지만 직접 프로퍼티를 만들거나 구조체를 만들어서 이를 child view로 넣고 싶다면, `@ViewBuilder`를 활용해야 한다. - Custom 구조체를 구현할 때 이니셜라이저에 `@ViewBuilder`를 넣어야 한다. 왜 Custom Wrapper의 이니셜라이저에 `@ViewBuilder`가 들어가는가 강의 시간에 커스텀 Wrapper를 이용하여 SwiftUI의..
- SwiftUI) "@State"로 구조체의 프로퍼티를 변경하기 (feat. 프로퍼티 래퍼; Property Wrappers) 목차 개념 @State를 왜 쓰는가? 구조체 안에서 프로퍼티 값을 변경하기 위해 struct 기반의 SwiftUI에서 인스턴스는 immutable 하기 때문에 @State 이전 @State 이후 정의 A property wrapper type that can read and write a value managed by SwiftUI. SwiftUI에 의해 관리되는 값을 읽고 쓸 수 있게 가능하는 프로퍼티 래퍼의 타입 중 하나 State | Apple Developer Documentation 프로퍼티 래퍼(Property Wrapper)? 프로퍼티를 감싸는 "포장지" A property wrapper adds a layer of separation between code that manages how a..
- Swift) static member cannot be used on instance of type 오류 (feat. 중첩한 타입) 요약 내용 상황 구조체와 클래스의 중첩된 타입(Nested Types) 상태에서, 인스턴스 멤버로 구조체/클래스 타입을 접근 시 static member 오류 접근 발생 원인 정적인 멤버(static member)는 인스턴스 멤버(instance member)로는 접근이 불가능하다 해결 중첩한 타입을 접근하려면 타입의 이름을 통해 접근해야 한다. 알게 된 내용 구조체와 클래스는 모두 "(커스텀) 타입"이다 타입은 정적 멤버(static member)이다. 중첩된 타입(nested types)을 접근하기 위해서, 바깥에 위치한 타입은 이름으로 접근해야 한다. 머리말 프로젝트의 MVVM 패턴 적용 프로젝트에서 ViewModel Input, Output 구조체를 ViewController에서 적용할 때 의문이..
- MVVM) Input-Output 패턴 적용하기 (feat. RxSwift) 머리말 요약 수업 시간에 배운 내용의 흐름을 위와 같이 정리해 보았다 (클릭하면 더 자세히 볼 수 있습니다) 본문 종류와 역할 및 특징 종류 역할 및 특징 View / ViewController 1. UI를 구성 2. 이벤트를 감지하여 ViewModel에 입력값으로 전달 3. ViewModel이 전달한 출력값을 화면에 띄움 Input View/ViewController의 이벤트를 감지하여 ViewModel에 보낼 데이터 ViewModel 1. UI 로직과 비즈니스 로직의 분리 2. MVC 패턴에서 과도한 기능을 분리 Output ViewModel에서 가공하여 View/ViewController에 표현할 데이터 bind 1. View/ViewController의 클래스 메서드 2. 나머지 요소 (View ..
반응형