<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jhk.log</title>
        <link>https://velog.io/</link>
        <description>Dart Night</description>
        <lastBuildDate>Fri, 10 Mar 2023 01:41:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jhk.log</title>
            <url>https://velog.velcdn.com/images/jhk-im/profile/1fb19b99-c9d6-4a3b-b705-3103e88bc65f/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jhk.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jhk-im" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[UIPasteboard]]></title>
            <link>https://velog.io/@jhk-im/UIPasteboard</link>
            <guid>https://velog.io/@jhk-im/UIPasteboard</guid>
            <pubDate>Fri, 10 Mar 2023 01:41:47 GMT</pubDate>
            <description><![CDATA[<h3 id="pasteboard">Pasteboard</h3>
<ul>
<li>앱 간에 데이터를 공유하기 위해 사용</li>
<li>모든 앱이 공유 데이터에 액세스</li>
<li>동일한 팀 ID를 가진 앱 사이에 공유가 필요한 경우 앱 그룹 구성</li>
<li><code>일반적으로 사용자가 복사, 잘라내기, 복제 작업을 수행할 때 앱의 객체가 Pasteboard에 데이터를 작성함</code></li>
</ul>
<blockquote>
<p>iOS 14부터 사용자 의도 없이 다른 앱에서 생성된 Pasteboard 데이터를 수신할 때 마다 사용자에게 알리도록 변경되었다. 알림을 피하려면 특정 속성 및 메서드를 사용하여 임시보드 여부를 결정할 수 있다. <code>사용자에게 알림을 보내지 않고 조용하게 데이터를 처리할 수 있다.</code></p>
</blockquote>
<p>시스템은 <code>generic</code>이라는 이름을 사용하여 모든 유형의 데이터를 공유하는데 사용할 수 있는 시스템 전반의 generic pasteboard를 식별한다. 이외에도 앱에서 동일한 팀 ID를 가진 다른 앱으로 데이터를 공유하기 위해 명명된 UIPasteboard를 만들 수 있다. (<code>init(name:create:) 및 withUniqueName()</code>을 사용)</p>
<h3 id="uipasteboard">UIPasteboard</h3>
<p>해당 클래스는 pasteboard 항목을 읽고 쓰기 위한 메서드를 제공한다. 개별 pasteboard 혹은 한번에 여러개의 pasteboard 항목을 읽거나 쓸 수 있다. 데이터를 작성할 땐 3가지 방법중 하나를 사용할 수 있다.</p>
<ol>
<li>데이터가 NSItemProbiderWriting을 준수하는 객체의 경우 -&gt; <code>setItemProviders(_:localOnly:expirationDate:)</code></li>
<li>NSString, NSArray, NSDictionary, NSDate, NSNumber, UIImage, NSURL과 같은 공통 객체로 데이터를 나타낼 수 있는 경우 -&gt; <code>setData(_:forPasteboardType:)</code></li>
<li>데이터가 바이너리인 경우 -&gt; <code>setData(_:forPasteboardType:)</code></li>
</ol>
<blockquote>
<p>pastebaord에서 특정 데이터 유형을 읽기 전에 원하는 유형의 데이터가 있는지 확인해봐야 한다. UIPasteboard 클래스의 유형 검사 방법을 사용하여 이를 수행할 수 있다. 읽기전에 특정 유형의 데이터가 있는지 확인하면 오류를 방지하고 앱이 페이스트보드 데이터를 올바르게 처리하는지 확인할 수 있다.</p>
</blockquote>
<p><code>hasString</code>과 같은 UIPasteboard 클래스에서 제공하는 속성을 사용하여 문자열 데이터가 있는지 확인할 수 있다. </p>
<pre><code class="language-swift">let pasteboard = UIPasteboard.general
if pasteboard.hasStrings {
    // Present string-data paste option to user
} else {
    // Do not present string-data paste option to user
}</code></pre>
<p>사용자의 의도 없이 pasteboard의 데이터에 액세스할 때 사용자 알림을 트리거하지 않으려면 UIPasteboard 클래스에서 제공하는 특정 속성 및 메서드를 사용할 수 있다. 아래 속성과 메서드를 사용하면 불필요한 알림을 트리거하지 않고 필요한 경우에만 pasteboard 데이터에 액세스 할 수 있다.</p>
<ul>
<li>numberOfItems: pasteboard 항목 수를 반환</li>
<li>types, types(forItemSet:): 사용할 수 있는 pasteboard 유형의 배열을 반환</li>
<li>itemSet(withPasteboardTypes:): 지정된 pasteboard 유형에 대해 사용할 수 있는 pasteboard 항목 집합을 반환</li>
<li>hasColors, hasImages, hasStrings, hasURLs: pasteboard에 지정된 유형의 항목이 포함되어 있는지 여부를 나타내는 부울 값을 반환</li>
<li>canLoadObject(ofClass:), canLoadObject(ofClass:): pasteboard에 지정된 클래스의 객체로 로드할 수 있는 데이터가 포함되어 있는지 여부를 나타내는 부울 값을 반환</li>
</ul>
<h3 id="pasteboard-items-and-representation-types">Pasteboard items and representation types</h3>
<ul>
<li>pasteboard에 저장되는 객체는 key-value 값으로 저장</li>
<li>key 값은 representation type (혹은 pasteboard type)을 식별</li>
<li>UTI(Uniform Type Identifier)는 JPEG의 UTTypeJPEG와 같은 표현 유형의 키 역할</li>
<li>com.myCom.myApp.myType과 같은 고유성을 보장하기 위한 표현 유형을 지정할 수 있음</li>
</ul>
<p>데이터 공유의 유연성을 제공하기 위해 복사 혹은 잘라내기 작업을 활용할 때 앱 내의 다양한 context에서 적절한 표시 유형을 사용할 수 있다. 예를 들어 사용자가 이미지를 복사하면 앱에서 PNG, JPEG, 및 GIF 데이터 형식과 같은 여러 표현 유형을 페이스트보드에 쓸 수 있다.</p>
<h3 id="sharing-pasteboards-between-devices">Sharing pasteboards between devices</h3>
<p>사용자가 iCloud에 로그인하면 generic pasteboard 콘텐츠가 동일한 iCloud 계정을 사용하는 주변 기기로 자동 전송될 수 있다. 핸드오프 동작 및 항목 만료와 같은 옵션을 설정하여 generic pasteboard에 작성 할 때 이 동작을 제어할 수 있다.</p>
<ul>
<li><code>setItemProviders(_:localOnly:expirationDate:)</code>: 이 메서드를 사용하여 NSItemProviderWriting 프로토콜을 준수하는 임시 보드 항목을 작성하고 필요에 따라 localOnly 및 expirationDate 매개 변수를 지정하여 Handoff 및 만료 동작을 제어</li>
<li><code>setObjects(_:localOnly:expirationDate:)</code>: 이 메서드를 사용하여 개체 리스트를 pasteboard에 쓰고 필요에 따라 localOnly 및 expirationDate 매개 변수를 지정</li>
<li><code>setItems(_:options:)</code>: 이 메서드를 사용하여 대지 항목의 배열을 작성하고 localOnly 및 expirationDate 옵션과 같은 옵션을 설정</li>
</ul>
<blockquote>
<p>임시 보드 항목의 만료 시간을 설정하려면 expriationDate 매개변수를 제공하거나 expriationDate 옵션과 함꼐 setItems(:option:)메서드를 사용하여 만료 시간에 도달하면 시스템이 pasteboard에서 항목을 자동으로 제거하도록 할 수 있다.</p>
</blockquote>
<h3 id="using-pasteboards-with-other-objects">Using pasteboards with other objects</h3>
<p>다음을 포함하여 다른 클래스 및 프로토콜을 활용하여 복사, 붙여넣기, 복제 작업을 사용할 수 있다.</p>
<ul>
<li><code>UIEditMenuInteraction</code>: 복사, 잘라내기, 붙여넣기, 선택 및 모두 선택과 같은 편집 작업이 포함된 메뉴를 표시</li>
<li><code>UIActivityItemsConfigurationReading</code>: 이 프로토콜을 구현하는 개체는 데이터 복사 및 공유를 지원할 수 있음</li>
<li><code>UIPasteConfigurationSupporting</code>: 이 프로토콜을 구현하는 개체는 특정 UIPasteConfiguration을 사용한 붙여넣기를 지원하는지 여부를 나타냄</li>
<li><code>UIResponder</code>: 응답자는 canPerformAction(_:withSender:)을 구현하여 현재 컨텍스트에 따라 메뉴에서 명령을 활성화 또는 비활성화</li>
<li><code>UIResponderStandardEditActions</code>: 응답자는 복사 및 붙여넣기와 같은 선택된 메뉴 명령을 처리하기 위해 이 비공식 프로토콜에 선언된 메서드를 구현</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[복잡도]]></title>
            <link>https://velog.io/@jhk-im/%EB%B3%B5%EC%9E%A1%EB%8F%84</link>
            <guid>https://velog.io/@jhk-im/%EB%B3%B5%EC%9E%A1%EB%8F%84</guid>
            <pubDate>Sun, 26 Feb 2023 06:59:42 GMT</pubDate>
            <description><![CDATA[<p><em>해당 글은 나동빈님의 &#39;이것이 취업을 위한 코딩테스트다 with Python&#39;을 학습하며 정리한 글 입니다. 
수정일 2023.02.26</em></p>
<hr>
<h3 id="복잡도-complexity">복잡도 (Complexity)</h3>
<ul>
<li>알고리즘 성능을 나타내는 척도이다.</li>
<li>시간복잡도 (Time Complexity)<ul>
<li>알고리즘을 위해 필요한 연산의 횟수</li>
</ul>
</li>
<li>공간복잡도 (Space Complexity)<ul>
<li>알고리즘을 위해 필요한 메모리의 양</li>
</ul>
</li>
<li>시간 복잡도와 공간 복잡도는 일종의 거래 관계(Trade-off)가 성립한다.</li>
<li>메모리를 더 많이 사용하여 시간을 비약적으로 줄이는 Memoization 기법이 있다.</li>
</ul>
<hr>
<h3 id="시간-복잡도-time-complexity">시간 복잡도 (Time Complexity)</h3>
<blockquote>
<p> 알고리즘에서 단순히 <code>복잡도</code>라고 표현하면 보통 시간 복잡도를 의미한다. 코딩 테스트 에서 <code>시간 제한</code>이란 작성한 프로그램이 모든 입력을 받아 이를 처리하고 실행 결과를 출력하는데 걸리는 시간을 의미한다. <code>시간 제한</code>안에 동작하는 프로그램을 작성하지 못하면 <code>Time Limit Exceeded</code> 메시지와 함께 오답처리 된다.</p>
</blockquote>
<h4 id="시간-복잡도는-big-o-표기법을-사용한다">시간 복잡도는 Big-O 표기법을 사용한다.</h4>
<pre><code># O(N) -&gt; O(5)
array = [1, 2, 3, 4, 5] # N = 5
summary = 0
for x in array :
    summary += x # 모든 데이터를 확인하여 합계 계산

# O(1)
a = 5
b = 7
a + b

# O(25)
array = [1, 2, 3, 4, 5] # N = 5
for i in array:
    for j in array:
        temp = i * j </code></pre><table>
<thead>
<tr>
<th>빅오 표기법</th>
<th align="left">명칭</th>
</tr>
</thead>
<tbody><tr>
<td>O(1)</td>
<td align="left">상수 시간</td>
</tr>
<tr>
<td>O(logN)</td>
<td align="left">로그시간</td>
</tr>
<tr>
<td>O(N)</td>
<td align="left">선형시간</td>
</tr>
<tr>
<td>O(NlogN)</td>
<td align="left">로그 선형시간</td>
</tr>
<tr>
<td>O(N²)</td>
<td align="left">이차시간</td>
</tr>
<tr>
<td>O(N³)</td>
<td align="left">삼차시간</td>
</tr>
<tr>
<td>O(2ⁿ)</td>
<td align="left">지수시간</td>
</tr>
</tbody></table>
<ul>
<li>소스 코드 내부적으로 다른 함수를 호출한다면 모든 이중 반복문 시간 복잡도가 O(N²)가 아닐수 있다.</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th align="left">N이 1000일 때의 연산 횟수</th>
</tr>
</thead>
<tbody><tr>
<td>O(N)</td>
<td align="left">1000</td>
</tr>
<tr>
<td>O(NlogN)</td>
<td align="left">10000</td>
</tr>
<tr>
<td>O(N²)</td>
<td align="left">1000000</td>
</tr>
<tr>
<td>O(N³)</td>
<td align="left">1000000000</td>
</tr>
</tbody></table>
<ul>
<li>일반적인 코딩테스트에서 상수를 고려해야 하는 경우는 적지만, 빅오 표기법이 항상 절대적인 것은 아니라는 점을 기억할 것.</li>
<li>코딩 테스트 환경에서 O(N3)를 넘어가면 문제 풀이에 사용하기 어렵다.</li>
</ul>
<blockquote>
<p>보통은 시간 복잡도에서의 <code>연산</code>은 프로그래밍 연산에서 지원하는 사칙 연산, 비교 연산 등과 같은 기본 연산을 의미한다.
<code>시간 복잡도 분석</code>은 문제 풀이의 핵심이다. 문제의 조건부터 확인하면 문제를 풀기 위해 얼마나 효율적인 알고리즘을 작성해야 하는지 눈치 챌 수 있다.</p>
</blockquote>
<p>시간 제한이 1초인 문제 예시</p>
<ul>
<li>N의 범위가 500인 경우 -&gt; 시간 복잡도가 O(N³)인 알고리즘을 설계하면 풀 수 있음</li>
<li>N의 범위가 2000인 경우 -&gt; 시간 복잡도가 O(N²)인 알고리즘을 설계하면 풀 수 있음</li>
</ul>
<hr>
<h3 id="공간-복잡도-space-complexity">공간 복잡도 (Space Complexity)</h3>
<blockquote>
<p>시간 복잡도를 표기했던 것처럼 빅오 표기법을 이용한다. 시간 복잡도에서 1초라는 절대적인 제한이 있었던 것 처럼 일반적으로 MB단위로 기준이 제시된다. <code>시간 제한 1초, 메모리 제한 128MB</code>
코딩 테스트 문제는 대부분 리스트(배열)를 사용해서 풀어야 한다. 대부분의 문제는 다수의 데이터에 대한 효율적인 처리를 요구하기 때문이다. 코딩 테스트에서는 보통 128-512MB 정도로 제한한다. 일반적으로 데이터의 개수가 1000만 단위가 넘어가지 않도록 알고리즘 설계를 해야 한다는 의미이다.</p>
</blockquote>
<ul>
<li>int a[1000]: 4KB</li>
<li>int a[1000000]: 4MB</li>
<li>int a[2000][2000] : 16MB</li>
</ul>
<h4 id="시간과-메모리-측정">시간과 메모리 측정</h4>
<p>실질적으로 알고리즘의 소요시간을 확인해야 자신이 제대로 알고리즘을 작성하고 있는지 체크할 수 있다. 실제 프로그래밍 수행 시간을 측정하는 것은 알고리즘의 효율성을 측정하는 가장 기본적인 방법이다.</p>
<h4 id="선택-정렬과-기본-정렬-라이브러리-수행-시간-비교">선택 정렬과 기본 정렬 라이브러리 수행 시간 비교</h4>
<pre><code class="language-swift">import Foundation

var arr:[Int] = []

for _ in 1...100 {
    arr.append(Int.random(in: 1..&lt;100))
}

let startTime = CFAbsoluteTimeGetCurrent() // 측정시작

for i in 0...arr.count - 1 {
    var minIndex = i
    for j in 1...arr.count - 1 {
        if arr[minIndex] &gt; arr[j] {
            minIndex = j
            arr.swapAt(minIndex, i)
        }
    }
}

let durationTime = CFAbsoluteTimeGetCurrent() - startTime // 측정 종료

print(&quot;선택정렬 경과 시간: \(durationTime)&quot;) // 선택정렬 경과 시간: 0.5592410564422607</code></pre>
<pre><code class="language-swift">import Foundation

var arr:[Int] = []

for _ in 1...100 {
    arr.append(Int.random(in: 1..&lt;100))
}

let startTime = CFAbsoluteTimeGetCurrent() // 측정시작

arr.sort()

let durationTime = CFAbsoluteTimeGetCurrent() - startTime // 측정 종료

print(&quot;기본정렬 경과 시간: \(durationTime)&quot;) // 기본정렬 경과 시간: 0.0007879734039306641</code></pre>
<p>_이처럼 자신이 설계한 알고리즘의 성능을 실제로 확인하기 위해서, 시간 측정 라이브러리를 사용해 보는 습관을 기르는 것이 좋다. 코딩 테스트에서 문제를 풀 때는 가독성을 해치지 않는 선에서 최대한 복잡도가 낮게 프로그램을 작성해야 한다. &#39;소스코드가 복잡하게 생겼다&#39;와는 다른 말로 사용된다. _</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cocoa Touch Framework(2) UIViewController / AutoLayout]]></title>
            <link>https://velog.io/@jhk-im/Cocoa-Touch-Framework2-UIViewController-AutoLayout</link>
            <guid>https://velog.io/@jhk-im/Cocoa-Touch-Framework2-UIViewController-AutoLayout</guid>
            <pubDate>Tue, 21 Feb 2023 02:36:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>UIViewController를 알아보기 전에 UIView에 대해서 알아보자. </p>
</blockquote>
<h3 id="uiview">UIView</h3>
<ul>
<li>앱 사용자 인터페이스의 기본 구성요소</li>
<li>사각형 내에서 콘텐츠를 렌더링하고 해당 콘텐츠와의 모든 상호작용을 렌더링 하는 개체</li>
<li>그리기, 애니메이션, 레이아웃 및 하위 뷰 관리, 이벤트처리 등</li>
<li>View 안에 View를 중첩하여 콘텐츠를 구성하는 계층 구조를 만들 수 있음</li>
<li>frame, bounds, center properties는 각 View의 Geometry를 정의</li>
</ul>
<p>View는 라이브러리에서 캔버스로 드래그하거나 프로그래밍 방식으로 뷰의 초기 크기 및 위치를 지정하여 스토리보드에서 생성할 수 있다. UIView 클래스는 frame, bounds, center, transform, alpha, backgroundColor를 포함하여 애니메이션이 가능한 여러 속성을 정의한다. </p>
<p><a href="https://developer.apple.com/documentation/uikit/uiview">https://developer.apple.com/documentation/uikit/uiview</a></p>
<h3 id="uiviewcontroller">UIViewController</h3>
<ul>
<li>해당 클래스는 ViewController에서 사용되는 동작을 정의</li>
<li>뷰 업데이트 -&gt; 데이터 변경에 응답하여 업데이트</li>
<li>사용자 상호작용에 대응</li>
<li>뷰의 크기를 조절하고 전반적인 인터페이스의 레이아웃 관리</li>
<li>앱의 다른 ViewController와 협력</li>
<li>관리하는 뷰에 엄격하게 바인딩 되며, 뷰 계층 구조에서 이벤트 처리에 참여</li>
<li>UIResponder 객체</li>
</ul>
<p>이외에도 ViewController는 관리하는 View의 생명 주기를 관리하는 데 중요한 역할을 한다. </p>
<p>ViewController가 메모리에 로드 -&gt; <code>viewDidLoad()</code>
View가 표시되거나 숨겨지기 직전 / 직후 -&gt; <code>viewWillAppear(_:)</code> / <code>viewWillDisAppear(_:)</code>
View가 표시되거나 숨겨진 직후 / 직전 -&gt; <code>viewDidAppear(_:)</code> / <code>viewDidDisappear(_:)</code></p>
<p>표준 UIController이외에도 <code>UITableViewController</code>, <code>UINavigationController</code> 등의 특수 기능을 제공하는 하위 클래스가 있다.</p>
<p>앱 동작을 정의하기 위해 UIViewController의 사용자 정의 하위 클래스를 만드는 것이 일반적이다. 이러한 Custom ViewController는 앱의 모양 및 사용자 상호작용에 응답하는 방식을 정의하는 역할을 한다. </p>
<blockquote>
<p><code>ViewController</code>가 View와 하위 View를 생성하면 해당 View의 유일한 소유자되어 생성, 수정, 제거를 포함하여 해당 View의 생명주기를 관리한다. View를 수동으로 만드는 경우 각 ViewController는 고유한 View 세트를 만들어야 한다. 서로 다른 ViewController간에 View를 공유하는 것은 불가능하다. 또한 ViewController가 할당 해제될 때 하위 View에 대한 참조를 해제해야 메모리 누수 및 기타 문제를 방지할 수 있다.</p>
</blockquote>
<p><a href="https://developer.apple.com/documentation/uikit/uiviewcontroller/">https://developer.apple.com/documentation/uikit/uiviewcontroller/</a></p>
<h3 id="autolayout">AutoLayout</h3>
<p><code>AutoLayout</code>은 앱의 내부 변경에 대한 동적 응답을 허용한다. 레이블이 긴 텍스트 문자열을 표시하거나 이미지가 다른 크기로 대체되는 경우와 같이 뷰 내부 콘텐츠가 변경되는 경우 추가 코드 없이 새 콘텐츠를 수용할 수 있도록 뷰 계층 구조의 레이아웃을 조정할 수 있다. </p>
<p>예를 들어 가변적인 텍스트를 표시하는 레이블이 있는 경우 레이블의 위치와 크기에 제약을 설정하여 컨테이너 뷰에 맞도록 지정한다. 레이블의 텍스트양이 변경되면 AutoLayout은 라벨의 크기를 동적으로 조정하여 지정된 제약조건을 유지하여 컨테이너에 맞추도록 할 수 있다.</p>
<p>텍스트가 레이아웃에 영향을 미치는 것 외에도 글꼴 크기를 변경하면 다른 요소의 레이아웃에도 영향을 미칠 수 있기 때문에 이러한 변경 사항을 동적으로 처리하는 데 도움이 된다. </p>
<p><code>frame-based</code> 및 <code>autoresizing mask</code>에 비해 AutoLayout은 더 큰 유연성과 적응성을 제공한다. 다양한 장치 화면 크기 및 방향을 지원하고 다양한 언어 및 지역에 맞게 앱을 현지화하기 더욱 수월하다. 하지만 View와 제약이 많은 복잡한 사용자 인터페이스의 경우 구현이 복잡해질 수 있다.</p>
<p><a href="https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html">https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Cocoa Touch Framework(1) - UIKit / Foundation]]></title>
            <link>https://velog.io/@jhk-im/Cocoa-Touch-Framework1-UIKit-Foundation</link>
            <guid>https://velog.io/@jhk-im/Cocoa-Touch-Framework1-UIKit-Foundation</guid>
            <pubDate>Mon, 20 Feb 2023 06:09:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Cocoa Touch Framework</p>
</blockquote>
<ul>
<li>ios 개발환경을 구축하기 위한 최상위 프레임워크</li>
<li>다양한 기능 구현에 필요한 여러 개발도구를 포함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jhk-im/post/e743345a-1126-474f-bfa3-407b75d07b80/image.webp" alt="cocoa touch framework"></p>
<h3 id="uikit">UIKit</h3>
<ul>
<li>macOS, iOS, tvOS등에서 사용자 인터페이스를 구축하기 위해 Apple에서 제공하는 프레임워크</li>
<li>앱 개발을 위한 풍부한 대화형 인터페이스를 만들 수 있는 다양한 구성요소와 기능 포함 </li>
<li>앱 UI 시각적 요소를 구성하기 위한 계층 구조를 제공하는 window와 view 아키텍처</li>
<li>multi-touch 제스처 및 기타 유형의 입력을 포함하여 앱이 사용자 입력에 응답할 수 있도록 하는 이벤트 처리 인프라</li>
<li>앱, 사용자 및 시스템 간의 상호 작용을 관리하는 기본 실행 루프</li>
<li>버튼, 레이블, 텍스트 필드 등과 같은 다양한 UI 구성 요소</li>
<li>그리기 및 애니메이션 도구를 사용하여 사용자 지정 UI 생성</li>
</ul>
<p>UIKit은 또 다른 프레임워크인 SwiftUI와도 잘 작동한다. 두 프레임워크를 함께 사용하면 Apple의 모든 플랫폼에서 원활하게 작동하는 강력하고 유연한 UI를 만들 수 있다.</p>
<blockquote>
<p>UIKit은 기본적으로 MVC 디자인 패턴을 사용한다.</p>
</blockquote>
<p><a href="https://developer.apple.com/documentation/uikit/">https://developer.apple.com/documentation/uikit/</a></p>
<h3 id="foundation">Foundation</h3>
<ul>
<li>macOS, iOS, watchOS 및 tvOS에서 애플리케이션 구축을 위해 개발자에게 필수 기능을 제공하는 프레임워크</li>
<li>파일, 디렉토리 및 URL과 같은 다양한 유형의 데이터 저장 작업을 위한 클래스와 다양한 데이터를 읽고 쓰는 클래스 (XML/JSON)</li>
<li>문자열 인코딩, 서식 지정 및 조작을 비롯한 문자열 작업을 위한 클래스 (정규식 및 자연어 처리)</li>
<li>다른 시간대 간 변환 및 계산을 수행하여 날짜, 시간, 달력 작업을 위한 클래스</li>
<li>배열, 디렉토리, 정렬, 필터링하기 위한 클래스</li>
<li>HTTP, FTP, 데이터 전송 및 네트워크 연결 처리를 위한 클래스</li>
</ul>
<p>위 내용은 Foundation 프레임워크가 다루는 몇가지 예시이다. 이러한 필수 기능에 대한 공통 클래스 및 프로토콜 집합을 제공하여 Apple 플랫폼에서 안정적인 애플리케이션을 보다 쉽게 구축할 수 있도록 한다.</p>
]]></description>
        </item>
    </channel>
</rss>