
iOS 개발자를 위한 면접 질문 목록 (레벨 0)
1. 컴퓨터 시스템에서 CPU, RAM, 저장 장치의 역할과 이들이 어떻게 상호작용하는지 설명해주세요. 💡 힌트: 앱 실행 과정을 단계별로 생각해보세요. 저장 장치에서 앱 바이너리 로드 RAM에 코드와 초기 데이터 적재 CPU가 명령어 실행 필요시 추가 리소스 로드 답변: CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 장치입니다. RAM에는 현재 실행되는 프로그램의 명령어와 데이터를 저장합니다. 전원을 끄면 저장된 내용이 사라자는 휘발성 저장 장치입니다. 보조 기억 장치에는 전원이 꺼져도 보관할 프로그램을 저장합니다. RAM보다 느리지만 많의 양의 데이터를 저장할 수 있습니다. ...
[번역] UNUserNotifications / Handling Notifications and Notification Related Actions (애플 공식 문서)
Overview 알림은 주로 사용자에게 정보를 보여주기 위한 수단이지만, 앱이 알림에 응답할 수도 있습니다. 예를 들어, 다음과 같은 상황에 응답할 수 있습니다: 사용자가 알림 인터페이스에서 선택한 동작 앱이 포그라운드에서 실행 중일때 도착한 알림 무음(Slient) 알림 (Pushing background updates to your App을 참고) PushKit 프레임워크와 관련된 알림 (예를 들어, VolP나 WatchOS의 컴플리케이션(complication) 관련 알림) Handle user-selected actions 동작 가능한 알림은 사용자가 알림 인터페이스에서 직접 응답할 수 있게 해줍니다. 알림의 콘텐츠 외에도, 동작 가능한 알림은 사용자가 선택할 수 있는 하나 이상의 버튼을 표시합니다. 사용자가 버튼 중 하나를 탭하면 앱이 포그라운드로 전환되지 않고, 선택된 동작이 앱으로 전달됩니다. 앱이 동작 가능한 알림 타입을 지원한다면, 반드시 그에 연결된 동작을 처리해야 합니다. ...
[번역] UNUserNotifications / Declaring your actionable notification types (애플 공식 문서)
Overview 동작 가능한 알림(actionable notification)은 사용자가 해당 앱을 실행하지 않고도 전달된 알림에 응답할 수 있게 합니다. 일반 알림은 알림 인터페이스에 정보를 표시하고, 이 경우 사용자가 취할 수 있는 유일한 동작은 앱을 실행하는 것이 됩니다. 동작 가능한 알림의 경우, 시스템은 알림 인터페이스 외에도 하나 이상의 버튼을 표시합니다. 버튼을 누르면 선택된 동작이 앱으로 전달되고, 앱은 이를 백그라운드에서 처리합니다. Note: Apple Watch Series 9 또는 Apple Watch Ultra 2에서 알림을 보고 있는 동안 이중 탭(Double Tap) 제스처를 수행하면, 시스템은 첫 번째 비파괴(Non-Desctructive) 동작을 실행합니다. 비파괴 동작이란 destructive 옵션을 포함하지 않으며, 사용자가 데이터를 삭제하거나, 다시 되돌리기가 어렵지 않은 동작을 의미합니다. ...

ESTsoft KDT 부트캠프 (iOS 2기) 수강 후기 및 회고
안녕하세요. 김소월입니다. 2025년 6월부터 9월까지 약 4개월 동안 ESTsoft KDT 부트캠프 iOS 2기를 수료하며, 그 소회를 간단하게 정리하고자 합니다. 처음 KDT 과정 소식을 접하고 많은 고민이 있었습니다. 초심자를 대상으로 하는 과정이라는 점에서 우려가 있었고, 무엇보다 국비 출신 개발자라는 꼬리표가 달라붙을까 두려웠던 것도 사실입니다. 하지만 결론적으로 말씀드리자면, 매우 만족스럽고 유익한 시간이었습니다. 그동안 영어 원서와 Udemy 강의로만 UIKit과 SwiftUI를 독학했는데, 이번 과정을 통해 내가 올바른 길을 걷고 있는지, 놓친 부분은 없는지 확실하게 점검할 수 있었습니다. 또한 빠른 속도로 핵심 개념을 익히고, Photos, AVFoundation, ActivityKit처럼 독학하기 어려운 영역도 체계적으로 학습할 수 있었습니다. ...
[번역] UNUserNotifications / Asking permission to use notifications (애플 공식 문서)
Overview 로컬 및 원격 알림은 경고을 표시하거나, 사운드를 재생하거나, 앱 아이콘에 배지를 표시하여 사용자의 주의를 끌 수 있습니다. 이러한 상호작용은 앱이 실행 중이 아니거나 백그라운드에 있을 때 발생합니다. 이를 통해 사용자는 앱에 자신과 관련된 정보가 있다는 것을 알 수 있습니다. 그러나 알림 기반 상호작용은 사용자에게 방해 요소로 여겨질 수 있으므로, 이를 사용하려면 반드시 권한을 얻어야 합니다. Explicitly request autorization in context 권한을 요청하려면, UNUserNotificationCenter 공유 인스턴스를 가져와 requestAuthorization(options:completionHandler:) 메서드를 호출하세요. 앱이 사용하는 모든 상호작용 유형을 지정해야 합니다. 예를 들어, 알림을 표시하거나, 앱 아이콘에 배지를 추가하거나, 사운드를 재생할 수 있도록 권한을 요청할 수 있습니다: ...

CALayer의 anchorPoint 톺아보기
개요 CALayer는 이미지 기반의 콘텐츠를 관리하고, 해당 콘텐츠에 애니메이션을 적용할 수 있도록 하는 객체입니다. 레이어는 뷰의 백킹-스토어(backing-store) 역할을 할 뿐만 아니라, 뷰 없이도 콘텐츠를 직접 표시할 수 있습니다. 레이어의 주요 역할은 제공된 시각적 콘텐츠를 관리하는 것이지만, 배경 색상, 테두리와 그림자를 설정할 수 있는 자체적인 시각적 속성도 가지고 있습니다. 이뿐만 아니라 CALayer는 다양한 속성을 활용하여 이동(Translate), 크기(Scale)나 회전(Roate) 등 레어어에 변형을 가할 수 있습니다. 그리고 이러한 변형은 모두 기본적으로 레이어의 정중앙을 기준으로 일어나게 됩니다. 일반적으로 이 기준은 크게 문제가 되지 않지만, 항상 예외가 존재하기 마련입니다. 이 기준점을 변경하는 데 도움을 주는 anchorPoint와 position 속성 및 그 관계에 대해 자세히 살펴보겠습니다. ...
[번역] XCTest / Defining Test Cases and Test Methods (애플 공식 문서)
Overview 코드의 특정 측면을 검증하고자 하나 이상의 테스트 메소드를 작성하여 Xcode 프로젝트에 테스트를 추가하세요. 관련된 테스트 메서드들은 XCTestCase의 서브 클래스인 테스트 케이스로 그룹화하세요. 프로젝트에 테스트를 추가하려면: 테스트 타겟에 새로운 XCTestCase의 서브 클래스를 생성하세요. 테스트 케이스에 하나 이상의 테스트 메서드를 작성하세요. 각 테스트 메서드에 하나 이상의 테스트 검증(Assertion)을 작성하세요. 테스트 메서드는 XCTestCase 서브 클래스의 인스턴스 메서드로 매개변수와 반환값이 없으며, test라는 소문자 이름으로 시작합니다. 테스트 메서드는 XCTest 프레임워크에 의해 자동으로 감지됩니다. class TableValidationTests: XCTestCase { /// Tests that a new table instane has zero rows and columns. func testEmptyTableRowAndColumnCount() { let table = Table() XCAssertEqual(table.rowCount, 0, "Row count was not zero.") XCAssertEqual(table.columnCount, 0, "Column count was not zero.") } } 위 예제는 TableValidationTests라 불리는 XCTestCase 서브 클래스를 정의하고, 해당 클래스는 *testEmptyTableRowAndColumnCount()*라 불리는 단일 테스트 메서드가 포함되어 있습니다. 이 테스트 메서드는 Table이라 불리는 새로운 클래스 인스턴스를 생성하며, 해당 인스턴스가 초기화된 이후 rowCount와 columnCount 프로퍼티가 모두 0인지 확인합니다. ...

[번역] The Nested Closure Trap (Besher AI Maleh)
DispatchWorkItem 내부에 중첩된 애니메이션 클로저를 실행하는 코드가 있다고 가정해보겠습니다. 여기 세 가지 버전의 코드가 있습니다. 어느 코드가 순환 참조(retained cycle)를 유발하는지 말해주실 수 있나요? class ViewControllerA: UIViewController { var workItem: DispatchWorkItem? override func viewDidLoad() { let workItem = DispatchWorkItem { UIView.animate(withDuration: 1.0) { self.view.backgroundColor = .red } } self.workItem = workItem } } class ViewControllerB: UIViewController { var workItem: DispatchWorkItem? override func viewDidLoad() { let view = self.view let workItem = DispatchWorkItem { UIView.animte(withDuration: 1.0) { [weak self] in view?.backgroundColor = .red } } self.workItem = workItem } } class ViewControllerC: UIViewController { var workItem: DispatchWorkItem? override func viewDidLoad() { let workItem = DispatchWorkItem { UIView.animate(withDuration: 1.0) { [weak self] in self?.view.backgroundColor = .red } } self.workItem = workItem } } 정답은 세 가지 버전 모두입니다! 심지어 클로저 바깥에서 _view_에 대한 참조를 생성하는 버전 B도 순환 참조를 유발합니다. ...

[번역] You don't (always) need [weak self] (Besher AI Meleh)
사이클.. 아니, 위 그림에 보이는 그런 사이클이 아닙니다. 강한 순환 참조(strong reference cycles)를 의미하며, iOS 앱에서 뷰 컨트롤러가 메모리 누수를 유발하는 원인이 됩니다. 더 구체적으로, 참조 사이클을 피하기 위해 Swift 클로저 내부에서 [weak self]의 사용법과 self를 약하게 캡처(capture)하는 게 필요하거나 필요없는 경우에 대해 살펴보고자 합니다. 이 글에서 다루는 주제는 애플 공식 문서, 다양한 블로그 포스트와 튜토리얼을 읽고, 시행착오와 실험을 통해 배웠습니다. 어딘가 실수가 있다고 생각이 되면, 자유롭게 댓글이나 트위터로 알려주세요. 또한, 메모리 누수가 일어나는 다양한 시나리오와 어디서 [weak self]를 불필요하게 사용하는지 보여주는 작은 앱도 첨부합니다. ...
[번역] UIKit / Displaying and managing views with a view controller (애플 공식 문서)
Overview Model-View-Controller(MVC) 디자인 패턴에서 뷰 컨트롤러는 화면에 정보를 보여주는 뷰 객체와 앱의 콘텐츠를 저장한 데이터 객체 사이에 위치하고 있습니다. 조금 더 구체적으로 말하자면, 뷰 컨트롤러는 뷰를 항상 최신 상태로 유지시키기 위해 필요한 상태 정보와 뷰 계층(View Hierarchy)을 관리하고 있습니다. 모든 UIKit 앱은 콘텐츠를 보여주기 위해 뷰 컨트롤러에 많은 의존을 하고 있고, 개발자는 앱의 뷰와 UI와 관련된 로직을 관리하기 위해 커스텀 뷰 컨트롤러를 정의하고 있습니다. 개발자가 생성하는 대부분의 커스텀 뷰 컨트롤러는 콘텐츠 뷰 컨트롤러(Content ViewController)입니다. 이는 뷰 컨트롤러가 모든 뷰를 가지며 해당 뷰와의 상호 작용을 관리한다는 걸 의미합니다. 콘텐츠 뷰 컨트롤러를 사용해 앱의 커스텀 콘텐츠를 보여주고, 뷰 컨트롤러 객체를 사용해 커스텀 뷰로 데이터를 보내거나 받도록 관리할 수 있습니다. ...