ESTsoft KDT 부트캠프 (iOS 2기) 수강 후기 및 회고

안녕하세요. 김소월입니다. 2025년 6월부터 9월까지 약 4개월 동안 ESTsoft KDT 부트캠프 iOS 2기를 수료하며, 그 소회를 간단하게 정리하고자 합니다. 처음 KDT 과정 소식을 접하고 많은 고민이 있었습니다. 초심자를 대상으로 하는 과정이라는 점에서 우려가 있었고, 무엇보다 국비 출신 개발자라는 꼬리표가 달라붙을까 두려웠던 것도 사실입니다. 하지만 결론적으로 말씀드리자면, 매우 만족스럽고 유익한 시간이었습니다. 그동안 영어 원서와 Udemy 강의로만 UIKit과 SwiftUI를 독학했는데, 이번 과정을 통해 내가 올바른 길을 걷고 있는지, 놓친 부분은 없는지 확실하게 점검할 수 있었습니다. 또한 빠른 속도로 핵심 개념을 익히고, Photos, AVFoundation, ActivityKit처럼 독학하기 어려운 영역도 체계적으로 학습할 수 있었습니다. ...

September 15, 2025 · 8 min · 1537 words · Me

Data Race vs. Race Condition (Swift)

동시성 프로그래밍(Concurrent Programming)은 작업이 언제 끝날지 알 수 없는 비동기 작업(예: 네트워크 통신, 파일 I/O 등)을 효율적으로 처리하는 기술입니다. 이 기법은 여러 작업을 번갈아 실행하여 마치 동시에 수행되는 것처럼 보이도록 하는 방식으로 동작합니다. 이를 통해 시간이 오래 걸리는 작업이 진행되는 동안에도 다른 작업을 실행할 수 있어 애플리케이션의 응답성을 향상시킬 수 있습니다. 예를 들어, 네트워크에서 데이터를 가져오는 동안 UI가 멈추지 않고 사용자가 원활하게 앱을 조작할 수 있도록 하려면 동시성 프로그래밍이 필수적입니다. ...

March 13, 2025 · 5 min · 963 words · Me

CALayer의 anchorPoint 톺아보기

개요 CALayer는 이미지 기반의 콘텐츠를 관리하고, 해당 콘텐츠에 애니메이션을 적용할 수 있도록 하는 객체입니다. 레이어는 뷰의 백킹-스토어(backing-store) 역할을 할 뿐만 아니라, 뷰 없이도 콘텐츠를 직접 표시할 수 있습니다. 레이어의 주요 역할은 제공된 시각적 콘텐츠를 관리하는 것이지만, 배경 색상, 테두리와 그림자를 설정할 수 있는 자체적인 시각적 속성도 가지고 있습니다. 이뿐만 아니라 CALayer는 다양한 속성을 활용하여 이동(Translate), 크기(Scale)나 회전(Roate) 등 레어어에 변형을 가할 수 있습니다. 그리고 이러한 변형은 모두 기본적으로 레이어의 정중앙을 기준으로 일어나게 됩니다. 일반적으로 이 기준은 크게 문제가 되지 않지만, 항상 예외가 존재하기 마련입니다. 이 기준점을 변경하는 데 도움을 주는 anchorPoint와 position 속성 및 그 관계에 대해 자세히 살펴보겠습니다. ...

February 28, 2025 · 4 min · 675 words · Me

[번역] 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도 순환 참조를 유발합니다. ...

November 5, 2024 · 3 min · 511 words · Me

[번역] You don't (always) need [weak self] (Besher AI Meleh)

사이클.. 아니, 위 그림에 보이는 그런 사이클이 아닙니다. 강한 순환 참조(strong reference cycles)를 의미하며, iOS 앱에서 뷰 컨트롤러가 메모리 누수를 유발하는 원인이 됩니다. 더 구체적으로, 참조 사이클을 피하기 위해 Swift 클로저 내부에서 [weak self]의 사용법과 self를 약하게 캡처(capture)하는 게 필요하거나 필요없는 경우에 대해 살펴보고자 합니다. 이 글에서 다루는 주제는 애플 공식 문서, 다양한 블로그 포스트와 튜토리얼을 읽고, 시행착오와 실험을 통해 배웠습니다. 어딘가 실수가 있다고 생각이 되면, 자유롭게 댓글이나 트위터로 알려주세요. 또한, 메모리 누수가 일어나는 다양한 시나리오와 어디서 [weak self]를 불필요하게 사용하는지 보여주는 작은 앱도 첨부합니다. ...

October 30, 2024 · 12 min · 2511 words · Me

Swift 불투명한 타입(some) 알아보기

개요 Swift 5.1에 새롭게 등장한 불투명한 타입(opaque type)은 프로토콜을 준수하는 실제 타입(underlying type)에 대한 자세한 정보를 숨깁니다. 불투명한 반환 타입을 가지는 함수는 자신이 반환하는 타입에 대한 구체적인 정보를 외부에 드러내지 않습니다. Swift는 프로토콜을 준수하는 실제 타입을 불투명한 타입과 박스형 프로토콜 타입으로 외부에 드러내지 않고 감출 수 있습니다. 겉으로 보이는 기능은 동일해 보이지만, Swift 컴파일러가 해당 타입을 처리하는 내부 방식에는 큰 차이가 있으며, 이는 성능에도 큰 영향을 끼칩니다. 따라서 이러한 차이를 정확히 이해하고 적재적소에 적용할 필요가 있습니다. ...

September 3, 2024 · 7 min · 1468 words · Me

[번역] iOS: 왜 UI는 메인 스레드에서만 업데이트를 해야 할까? (Dywanedu)

개발을 하는 동안에, 우리는 종종 UIKit 컴포넌트를 백그라운드 스레드(Background Thread)에서 호출해 본 적이 있습니다. 백그라운드 네트워크 콜백에서 imageView.image = anImage 구문을 실행하거나, UIApplication.sharedApplication을 백그라운드 스레드에서 호출하는 일을 꼽을 수 있습니다. 이러한 일이 발생하면, 런-타임 에러가 발생하고, 우리는 해당 에러를 고치게 됩니다. 한번 생각해봅시다. 왜 UI는 메인 스레드에서만 업데이트를 해야 할까요? UI를 백그라운드 스레드에서 업데이트하게 된다면 어떤 일이 벌어질까요? 메인 스레드를 블록킹(Blocking)하는 걸 막기 위해 UI를 백그라운드 스레드에서 업데이트하는 게 더 좋지 않을까요? 본 글은 이 질문을 기초로 하고 있습니다. ...

May 25, 2024 · 4 min · 827 words · Me