<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Apple Platforms on @yeniful blog</title><link>http://yeniful.github.io/tags/apple-platforms/</link><description>Recent content in Apple Platforms on @yeniful blog</description><generator>Hugo -- 0.155.3</generator><language>en-us</language><lastBuildDate>Sun, 08 Feb 2026 00:00:00 +0900</lastBuildDate><atom:link href="http://yeniful.github.io/tags/apple-platforms/index.xml" rel="self" type="application/rss+xml"/><item><title>[Apple Platforms] scenePhase</title><link>http://yeniful.github.io/posts/2026/apple-scenephase/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/apple-scenephase/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;앱 개발 중 네트워크 상태 확인이나 인증 토큰 갱신 같은 로직을 포그라운드 복귀 시점에 실행해야하는 경우
&lt;ul&gt;
&lt;li&gt;UIKit에서는 &lt;code&gt;SceneDelegate&lt;/code&gt;의 &lt;code&gt;sceneWillEnterForeground&lt;/code&gt;, &lt;code&gt;sceneDidBecomeActive&lt;/code&gt;, &lt;code&gt;sceneDidEnterBackground&lt;/code&gt; 등 구현 필요&lt;/li&gt;
&lt;li&gt;SwiftUI에서는 &lt;code&gt;\.scenePhase&lt;/code&gt;라는 Environment 값으로 간단하게 처리할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;h2 id="scenephase란"&gt;scenePhase란?&lt;/h2&gt;
&lt;p&gt;SwiftUI가 제공하는 &lt;code&gt;Environment&lt;/code&gt; 값으로, 현재 Scene의 상태를 나타낸다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.active&lt;/code&gt; 앱이 포그라운드에 있고 사용자와 상호작용 가능&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.inactive&lt;/code&gt; 앱이 포그라운드에 있지만 상호작용 불가 (예: 멀티태스킹 전환 중)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.background&lt;/code&gt; 앱이 백그라운드로 이동한 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="사용"&gt;사용&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@Environment(&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;.scenePhase) &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; scenePhase
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; body: some View {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ContentView()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .onChange(of: scenePhase) { oldPhase, newPhase &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; newPhase {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .active:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;앱 활성화&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .inactive:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;앱 비활성화&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; .background:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;백그라운드로 이동&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @unknown &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;참고
&lt;code&gt;onChange(of:)&lt;/code&gt; 클로저에서 &lt;code&gt;oldPhase&lt;/code&gt;, &lt;code&gt;newPhase&lt;/code&gt; 두 파라미터를 받는 형태는 &lt;strong&gt;iOS 17+&lt;/strong&gt; 문법이다. iOS 16 이하를 지원해야 한다면 단일 파라미터 형태(&lt;code&gt;{ phase in ... }&lt;/code&gt;)를 사용해야 한다.&lt;/p&gt;</description></item><item><title>[Apple Platforms] SoC (System on a Chip)와 AP (Application Processor)</title><link>http://yeniful.github.io/posts/2026/apple-soc/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/apple-soc/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;컴퓨터 구조를 공부하면서 스마트폰의 AP, SoC가 어떤 것에 대응되는지 궁금.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;컴퓨터의 CPU와 대응되는 것이 스마트폰의 AP, SoC ?
&lt;ul&gt;
&lt;li&gt;하지만 컴퓨터 구조와 스마트폰에서의 컴퓨터 구조는 약간 다름&lt;/li&gt;
&lt;li&gt;Apple Silicon이 SoC에 해당&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;목차
&lt;ul&gt;
&lt;li&gt;컴퓨터 시스템 구조&lt;/li&gt;
&lt;li&gt;SoC와 AP의 관계&lt;/li&gt;
&lt;li&gt;Apple Silicon (Apple SoC)&lt;/li&gt;
&lt;li&gt;iPhone 구조와 PC 구조의 대략적인 비교&lt;/li&gt;
&lt;li&gt;Apple Silicon 구조&lt;/li&gt;
&lt;li&gt;정리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="컴퓨터-시스템-구조"&gt;컴퓨터 시스템 구조&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart LR
subgraph COMPUTER[&amp;#34;Computer&amp;#34;]
CPU[&amp;#34;CPU&amp;#34;]
MODE[&amp;#34;Mode&amp;lt;br/&amp;gt;Bit&amp;#34;]
DMA[&amp;#34;DMA&amp;lt;br/&amp;gt;Controller&amp;#34;]
TIMER[&amp;#34;Timer&amp;#34;]
MEM_CTRL[&amp;#34;Memory&amp;lt;br/&amp;gt;Controller&amp;#34;]
subgraph MEMORY[&amp;#34;Memory&amp;#34;]
PROG1[&amp;#34;Program&amp;#34;]
PROG2[&amp;#34;Program&amp;#34;]
OS[&amp;#34;O/S&amp;#34;]
end
CPU --- MODE
MODE --- DMA
DMA --- TIMER
MODE --- MEM_CTRL
MEM_CTRL --- MEMORY
end
subgraph IO[&amp;#34;I/O Device&amp;#34;]
subgraph HD[&amp;#34;Hard Disk&amp;#34;]
DC1[&amp;#34;Device&amp;lt;br/&amp;gt;Controller&amp;#34;] --- BUF1[&amp;#34;Buffer&amp;#34;]
end
subgraph KB[&amp;#34;Keyboard&amp;#34;]
DC2[&amp;#34;Device&amp;lt;br/&amp;gt;Controller&amp;#34;] --- BUF2[&amp;#34;Buffer&amp;#34;]
end
subgraph PR[&amp;#34;Print&amp;#34;]
DC3[&amp;#34;Device&amp;lt;br/&amp;gt;Controller&amp;#34;] --- BUF3[&amp;#34;Buffer&amp;#34;]
end
subgraph MO[&amp;#34;Monitor&amp;#34;]
DC4[&amp;#34;Device&amp;lt;br/&amp;gt;Controller&amp;#34;] --- BUF4[&amp;#34;Buffer&amp;#34;]
end
end
TIMER --- DC1
TIMER --- DC2
TIMER --- DC3
TIMER --- DC4
style COMPUTER fill:#fff,stroke:#1976d2,stroke-width:2px
style IO fill:#fff,stroke:#1976d2,stroke-width:2px
style CPU fill:#ffcdd2,stroke:#c62828,stroke-width:2px
style MEMORY fill:#ffcdd2,stroke:#c62828,stroke-width:2px
style HD fill:#ffcdd2,stroke:#c62828,stroke-width:2px
style MODE fill:#fff,stroke:#333
style DMA fill:#fff,stroke:#333
style TIMER fill:#fff,stroke:#333
style MEM_CTRL fill:#fff,stroke:#333
style KB fill:#e8f5e9,stroke:#388e3c
style PR fill:#e8f5e9,stroke:#388e3c
style MO fill:#e8f5e9,stroke:#388e3c
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;컴퓨터 시스템 구조:
&lt;ul&gt;
&lt;li&gt;컴퓨터&lt;/li&gt;
&lt;li&gt;I/O 디바이스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;우리가 흔히 말하는 &lt;a href="https://wikidocs.net/111325"&gt;컴퓨터 구조&lt;/a&gt; 핵심 요소:
&lt;ul&gt;
&lt;li&gt;CPU (중앙처리장치)&lt;/li&gt;
&lt;li&gt;메모리 (주기억장치)&lt;/li&gt;
&lt;li&gt;디스크 (보조기억장치)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="soc와-ap의-관계"&gt;SoC와 AP의 관계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SoC (System on Chip)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lsquo;시스템을 한 칩에 통합&amp;rsquo;&lt;/li&gt;
&lt;li&gt;CPU/GPU/NPU(신경망)/ISP(카메라)/DSP/메모리 컨트롤러/보안 영역 같은 것들이 들어있는 &lt;strong&gt;통합 칩 전체&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AP (Application Processor)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lsquo;앱을 돌리는 메인 프로세서(연산 중심)&amp;rsquo;&lt;/li&gt;
&lt;li&gt;모바일 업계에서 보통 메인 칩(=사실상 SoC)을 AP라고 부르는 관행이 생김.&lt;/li&gt;
&lt;li&gt;특히 한국/스마트폰 맥락에서 “AP 뭐야?” 하면 대개 &lt;strong&gt;그 폰의 메인 SoC&lt;/strong&gt;를 뜻함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;퀄컴 Snapdragon, 삼성 Axynos를 보통 “AP”라고도 부르지만, 기술적으로는 전형적인 SoC&lt;/li&gt;
&lt;li&gt;Apple은 문서/기술 설명에서 SoC라는 표현을 많이 사용하며, 공식 용어집에서 SoC를 “여러 구성요소를 단일 칩으로 통합한 IC”로 정의 &lt;a href="https://support.apple.com/ko-kr/guide/security/sec93292bfa6/1/web/1"&gt;Apple 용어집 참고&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="apple-silicon-apple-soc"&gt;Apple Silicon (Apple SoC)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Apple의 SoC
&lt;ul&gt;
&lt;li&gt;A-시리즈(iPhone)&lt;/li&gt;
&lt;li&gt;M-시리즈(Mac)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Application Processor, Secure Enclave 등 구성 요소를 SoC 일부로 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="iphone-구조와-pc-구조의-대략적인-비교"&gt;iPhone 구조와 PC 구조의 대략적인 비교&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart TB
subgraph PC[&amp;#34;🖥️ PC&amp;#34;]
PC_CPU[&amp;#34;CPU&amp;#34;]
PC_GPU[&amp;#34;GPU (별도)&amp;#34;]
PC_RAM[&amp;#34;RAM&amp;#34;]
PC_SSD[&amp;#34;SSD&amp;#34;]
end
subgraph iPhone[&amp;#34;📱 iPhone&amp;#34;]
subgraph AP[&amp;#34;SoC ( ⊃ AP)&amp;#34;]
IP_CPU[&amp;#34;CPU&amp;#34;]
IP_GPU[&amp;#34;GPU&amp;#34;]
IP_NPU[&amp;#34;NPU&amp;#34;]
end
IP_RAM[&amp;#34;RAM&amp;#34;]
IP_FLASH[&amp;#34;Flash Storage&amp;#34;]
end
style PC fill:#e3f2fd
style iPhone fill:#fff8e1
style AP fill:#fce4ec
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="apple-silicon-구조"&gt;Apple Silicon 구조&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph TD
subgraph SoC[&amp;#34;SoC (System on Chip)&amp;#34;]
AP[&amp;#34;AP&amp;lt;br/&amp;gt;(CPU:&amp;lt;br/&amp;gt;P-core + E-core)&amp;#34;]:::cpu
GPU[&amp;#34;GPU&amp;#34;]:::gpu
NPU[&amp;#34;Neural Engine&amp;lt;br/&amp;gt;(NPU)&amp;#34;]:::npu
ISP[&amp;#34;ISP&amp;lt;br/&amp;gt;(Image Signal Processor)&amp;#34;]:::isp
MEM[&amp;#34;Memory Controller&amp;lt;br/&amp;gt;(UMA: LPDDR5X)&amp;#34;]:::mem
SEC[&amp;#34;Secure Enclave&amp;#34;]:::sec
MOD[&amp;#34;Modem&amp;lt;br/&amp;gt;(5G Baseband 등)&amp;#34;]:::mod
end
classDef cpu fill:#ffcdd2,stroke:#c62828,stroke-width:2px
classDef gpu fill:#f3e5f5,stroke:#7b1fa2
classDef npu fill:#e8f5e9,stroke:#388e3c
classDef isp fill:#fff3e0,stroke:#f57c00
classDef mem fill:#e0f2f1,stroke:#00695c
classDef sec fill:#fce4ec,stroke:#c2185b
classDef mod fill:#f5f5f5,stroke:#424242
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="정리"&gt;정리&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;제품 스펙에서 &lt;strong&gt;AP ≈ SoC&lt;/strong&gt; 로 흔하게 인식되지만&lt;/li&gt;
&lt;li&gt;엄밀하게 구분하면 &lt;strong&gt;AP는 SoC 중 앱/연산을 담당하는 중심 칩&lt;/strong&gt; (&lt;strong&gt;SoC ⊃ AP&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Apple 플랫폼에서는 SoC 표현을 더 많이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="references-"&gt;References 👀&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/ko-kr/guide/security/sec87716a080/web"&gt;Apple SoC 보안&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/ko-kr/guide/security/sec93292bfa6/1/web/1"&gt;용어집&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Apple Platforms] Testing 🖋️</title><link>http://yeniful.github.io/posts/2026/apple-testing/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/apple-testing/</guid><description>&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;h3 id="기능을-완전하게-구현하려면"&gt;기능을 완전하게 구현하려면?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;최근 과제 전형을 마치고 제출했던 코드를 다시 살펴보았다.&lt;/li&gt;
&lt;li&gt;요구사항에 따라 동작하게 만들었지만 에러 핸들링, 예외 처리, 효율 측면에서 놓친 부분이 많았다는 걸 깨달았다.&lt;/li&gt;
&lt;li&gt;단순히 기능을 구현하는 것과, 예상하지 못한 동작과 상태를 대비해서 잘 만드는 건 전혀 다른 문제였다.&lt;/li&gt;
&lt;li&gt;과제에서 크게 신경을 쓰지 못한 Testing 영역이 눈에 들어왔고 &amp;lsquo;코드과 테스트 코드의 순서를 바꿨었더라면?&amp;lsquo;이라는 생각이 들었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="code-first"&gt;Code First&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;요구사항 확인 → 기능 개발 → 테스트 코드 작성 → 테스트&lt;/p&gt;</description></item><item><title>[Apple Platforms] Apple 플랫폼 개발에서의 캐싱 (Caching) 🖋️</title><link>http://yeniful.github.io/posts/2026/apple-caching/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/apple-caching/</guid><description>iOS ViewController의 생명주기 메서드와 Push/Pop, Present/Dismiss 상황별 호출 순서를 정리합니다.</description></item><item><title>[UIKit] ViewController 생명주기 (View Controller Life Cycle)</title><link>http://yeniful.github.io/posts/2026/uikit-view-controller-life-cycle/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/uikit-view-controller-life-cycle/</guid><description>iOS ViewController의 생명주기 메서드와 Push/Pop, Present/Dismiss 상황별 호출 순서를 정리합니다.</description></item><item><title>[Apple Platforms] 앱 생명 주기 (App Life Cycle) 🖋️</title><link>http://yeniful.github.io/posts/2026/apple-app-life-cycle/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/apple-app-life-cycle/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;앱 생명주기: 앱이 실행되는 시점부터 종료되는 시점까지 거치는 여러 상태의 순환 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ios-앱의-5가지-상태"&gt;iOS 앱의 5가지 상태&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Not Running (실행되지 않음)&lt;/li&gt;
&lt;li&gt;Inactive (비활성)&lt;/li&gt;
&lt;li&gt;Active (활성)&lt;/li&gt;
&lt;li&gt;Background (백그라운드)&lt;/li&gt;
&lt;li&gt;Suspended (일시 중지)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="swiftui에서의-앱-생명주기"&gt;SwiftUI에서의 앱 생명주기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SwiftUI에서 앱은 &lt;code&gt;@main&lt;/code&gt; attribute로 표시된 구조체에서 시작.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UIApplicationMain&lt;/code&gt;의 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Swift" data-lang="Swift"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyApp&lt;/span&gt;: App {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; body: some Scene {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; WindowGroup {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ContentView()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>[Swift] 딕셔너리 (Dictionary) 🖋️</title><link>http://yeniful.github.io/posts/2026/swift-dictionary/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0900</pubDate><guid>http://yeniful.github.io/posts/2026/swift-dictionary/</guid><description>&lt;h2 id="설명"&gt;설명&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Key-Value 저장하는 컬렉션 타입&lt;/li&gt;
&lt;li&gt;해시 테이블로 구현되어있음
&lt;ul&gt;
&lt;li&gt;빠른 속도로 접근, 수정, 추가, 키 존재 여부 확인 가능 O(1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;let scores = [&amp;#34;roy&amp;#34;: 95, &amp;#34;gucci&amp;#34;: 82, &amp;#34;yeni&amp;#34;: 90]
// 모두 O(1) 시간
let royScore = scores[&amp;#34;roy&amp;#34;] // 95
let gucciScore = scores[&amp;#34;gucci&amp;#34;] // 82
scores[&amp;#34;terry&amp;#34;] = 75 // 추가
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="유의"&gt;유의&lt;/h2&gt;
&lt;h3 id="제거시-on의-가능성"&gt;제거시 O(n)의 가능성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;값 제거 (removeValue(forKey: key))의 경우 기술적으로는 O(1)로 구현되어 있음&lt;/li&gt;
&lt;li&gt;하지만 Copy-On-Write 최적화 때문에 O(n) 복잡도를 가질 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// 첫 번째 Dictionary
var dict1 = [&amp;#34;a&amp;#34;: 1, &amp;#34;b&amp;#34;: 2, &amp;#34;c&amp;#34;: 3]
// dict2는 dict1과 메모리를 공유 (Copy-on-Write)
var dict2 = dict1
// 이 제거 연산은 dict1을 수정하기 전에 전체 복사가 필요할 수 있음 (O(n))
dict1.removeValue(forKey: &amp;#34;a&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="활용"&gt;활용&lt;/h2&gt;
&lt;h3 id="key-존재-확인"&gt;Key 존재 확인&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// 👍 O(1) : 직접 접근해서 확인
if dict[&amp;#34;key&amp;#34;] != nil { ... }
// 😱 O(n) : 배열로 변환 후 순회하기 때문에 비효율적이다.
if dict.keys.contains(&amp;#34;yeni&amp;#34;) { ... }
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="value-조회"&gt;Value 조회&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// 👍 O(1) : 해시 기반 직접 조회
let value = scores[&amp;#34;yeni&amp;#34;]
// 🤩 값이 없을 수도 있으므로 Optional 처리가 필요하다.
if let score = scores[&amp;#34;yeni&amp;#34;] {
print(&amp;#34;Alice&amp;#39;s score: \(score)&amp;#34;)
}
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>