<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Noah's curiosity]]></title><description><![CDATA[Swift, iOS 관련 기술과 개발 경험기를 공유하고 있습니다.]]></description><link>https://noah-ios.dev/</link><image><url>https://noah-ios.dev/favicon.png</url><title>Noah&apos;s curiosity</title><link>https://noah-ios.dev/</link></image><generator>Ghost 5.74</generator><lastBuildDate>Wed, 15 Apr 2026 13:42:22 GMT</lastBuildDate><atom:link href="https://noah-ios.dev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Clean-Swift, 무엇을 테스트 해야하는가]]></title><description><![CDATA[<p>&#xD604;&#xC7AC; &#xC9C4;&#xD589; &#xC911;&#xC778; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; <a href="https://clean-swift.com/?ref=noah-ios.dev">Clean-Swift</a> &#xB97C; &#xC774;&#xC6A9;&#xD574; &#xD654;&#xBA74; &#xB2E8;&#xC704;&#xB97C; &#xAC1C;&#xBC1C;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;&#xC694;,<br>Clean-Swift(VIP Pattern) &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0; &#xB300;&#xD55C; &#xB2E8;&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD558;</p>]]></description><link>https://noah-ios.dev/clean-swift-test/</link><guid isPermaLink="false">670d1ebec9efaff98fe3ce64</guid><category><![CDATA[Swift]]></category><category><![CDATA[Test]]></category><category><![CDATA[iOS]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Tue, 15 Oct 2024 06:23:04 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1441034281545-78296c3a6934?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI4fHx0ZXN0fGVufDB8fHx8MTcyODkxMzA5NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1441034281545-78296c3a6934?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDI4fHx0ZXN0fGVufDB8fHx8MTcyODkxMzA5NHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;"><p>&#xD604;&#xC7AC; &#xC9C4;&#xD589; &#xC911;&#xC778; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;&#xB294; <a href="https://clean-swift.com/?ref=noah-ios.dev">Clean-Swift</a> &#xB97C; &#xC774;&#xC6A9;&#xD574; &#xD654;&#xBA74; &#xB2E8;&#xC704;&#xB97C; &#xAC1C;&#xBC1C;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;&#xC694;,<br>Clean-Swift(VIP Pattern) &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC5D0; &#xB300;&#xD55C; &#xB2E8;&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC5B4;&#xB5A4; &#xBD80;&#xBD84;&#xC744; &#xACE0;&#xBBFC;&#xD588;&#xB294;&#xC9C0; &#xACF5;&#xC720;&#xD574;&#xBCF4;&#xB824;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</p><p><a href="https://clean-swift.com/?ref=noah-ios.dev">Clean-Swift</a> &#xC5D0;&#xC11C;&#xB294; Scene&#xC5D0; &#xB300;&#xD55C; &#xB2E8;&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD560; &#xB54C; &#xD06C;&#xAC8C; 3&#xAC00;&#xC9C0;&#xC758; &#xB2E8;&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD1B5;&#xD574; &#xAD6C;&#xD604;&#xC744; &#xAC80;&#xC99D;&#xD558;&#xB3C4;&#xB85D; <a href="https://github.com/Clean-Swift/CleanStore/blob/e13b868bda3ad1a5987aadbff249b557c1e82d27/CleanStoreTests/Scenes/CreateOrder/CreateOrderInteractorTests.swift?ref=noah-ios.dev">&#xAC00;&#xC774;&#xB4DC;</a>&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/6.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="2000" height="1208" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/6.png 600w, https://noah-ios.dev/content/images/size/w1000/2024/10/6.png 1000w, https://noah-ios.dev/content/images/size/w1600/2024/10/6.png 1600w, https://noah-ios.dev/content/images/size/w2400/2024/10/6.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">VIP Cycle</span></figcaption></figure><ol><li>ViewController =&gt; Interactor &#xD638;&#xCD9C; &#xD14C;&#xC2A4;&#xD2B8;</li><li>Interactor =&gt; Presenter &#xD638;&#xCD9C; &#xD14C;&#xC2A4;&#xD2B8;</li><li>Presenter =&gt; ViewController &#xD638;&#xCD9C; &#xD14C;&#xC2A4;&#xD2B8;</li></ol><p>&#xB2E4;&#xC2DC; &#xB9D0;&#xD574; Clean-Swift&#xC5D0;&#xC11C;&#xB294; Spy&#xAC1D;&#xCCB4;(&#xBAA8;&#xC758; &#xAC1D;&#xCCB4;)&#xC758; &#xD2B9;&#xC815; &#xBA54;&#xC11C;&#xB4DC;&#xAC00; &#xD638;&#xCD9C;&#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xB97C; &#xAC80;&#xC0AC;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD1B5;&#xD574; &#xAD6C;&#xD604;&#xC744; &#xAC80;&#xC99D;&#xD558;&#xB3C4;&#xB85D; <a href="https://github.com/Clean-Swift/CleanStore/blob/e13b868bda3ad1a5987aadbff249b557c1e82d27/CleanStoreTests/Scenes/CreateOrder/CreateOrderInteractorTests.swift?ref=noah-ios.dev">&#xAC00;&#xC774;&#xB4DC;</a>&#xD569;&#xB2C8;&#xB2E4;.</p><blockquote>1) &#xD654;&#xBA74; &#xB2E8;&#xC704;&#xB97C; Scene&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC81C;&#xAC00; &#xC0DD;&#xAC01;&#xD558;&#xB294; &#xAE30;&#xC874; &#xB2E8;&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xC758; &#xBB38;&#xC81C;&#xC810;&#xC740;, &#xD14C;&#xC2A4;&#xD2B8; &#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xD638;&#xCD9C;&#xD588;&#xB294;&#xC9C0;, &#xC5B4;&#xB5BB;&#xAC8C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xC9C0; &#xD558;&#xB098;&#xD558;&#xB098;&#xB97C; &#xB2E4; &#xAC80;&#xC99D;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAD6C;&#xD604; &#xB0B4;&#xC6A9; &#xD639;&#xC740; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xAC00; &#xBC14;&#xB00C;&#xAC8C; &#xB420; &#xACBD;&#xC6B0; &#xD14C;&#xC2A4;&#xD2B8;&#xAC00; &#xC27D;&#xAC8C; &#xAE68;&#xC9C8; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xC810;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; Scene&#xC5D0; &#xB300;&#xD55C; &#xB2E8;&#xC704; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD558;&#xAE30; &#xC704;&#xD574; &#xCD5C;&#xC18C; 3&#xAC1C;&#xC758; Spy&#xAC1D;&#xCCB4;(&#xBAA8;&#xC758; &#xAC1D;&#xCCB4;)&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xAD00;&#xB9AC;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xC810; &#xB610;&#xD55C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD558;&#xB294;&#xB370; &#xBD80;&#xB2F4;&#xC774; &#xB418;&#xB294; &#xC9C0;&#xC810;&#xC774;&#xB77C; &#xC0DD;&#xAC01;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/8.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="2000" height="2653" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/8.png 600w, https://noah-ios.dev/content/images/size/w1000/2024/10/8.png 1000w, https://noah-ios.dev/content/images/size/w1600/2024/10/8.png 1600w, https://noah-ios.dev/content/images/size/w2400/2024/10/8.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xD14C;&#xC2A4;&#xD2B8; &#xAD6C;&#xC870;&#xB3C4;</span></figcaption></figure><p>&#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xC810;&#xC744; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xC57C; &#xD6A8;&#xC728;&#xC801;&#xC774;&#xACE0;, &#xACAC;&#xACE0;&#xD55C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xC744;&#xC9C0;&#xC5D0; &#xB300;&#xD55C; &#xACE0;&#xBBFC;&#xC774; &#xB4E4;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xB294;&#xB370;&#xC694;,</p><p>&#xBAA8;&#xC758; &#xAC1D;&#xCCB4;&#xC758; &#xD2B9;&#xC815; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD588;&#xB294;&#xC9C0;&#xB97C; &#xAC80;&#xC99D;&#xD558;&#xB294; &#xAC83;&#xBCF4;&#xB2E4;, &#xC2E4;&#xC81C; <strong>&#xC2E4;&#xD589; &#xD6C4; &#xCD5C;&#xC885; &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD574; &#xAC80;&#xC99D;</strong>&#xD574;&#xC57C;&#xACA0;&#xB2E4;&#xB294; &#xC0DD;&#xAC01;&#xC744; &#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/Screenshot-2024-10-14-at-5.24.15-PM.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="1084" height="338" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/Screenshot-2024-10-14-at-5.24.15-PM.png 600w, https://noah-ios.dev/content/images/size/w1000/2024/10/Screenshot-2024-10-14-at-5.24.15-PM.png 1000w, https://noah-ios.dev/content/images/2024/10/Screenshot-2024-10-14-at-5.24.15-PM.png 1084w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;:&#xA0;</span><a href="https://sos-cer.github.io/testing/version/6.0.0/bbt?ref=noah-ios.dev" rel="nofollow"><span style="white-space: pre-wrap;">https://sos-cer.github.io/testing/version/6.0.0/bbt</span></a></figcaption></figure><blockquote>Black box test</blockquote><p>&#xB9C8;&#xCE58; &#xBE14;&#xB799;&#xBC15;&#xC2A4; &#xD14C;&#xC2A4;&#xD2B8;&#xCC98;&#xB7FC; &#xB0B4;&#xBD80; &#xAD6C;&#xD604;&#xBCF4;&#xB2E4;&#xB294; &#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xBCF4;&#xC774;&#xB294; &#xACB0;&#xACFC;&#xB97C; &#xC911;&#xC2EC;&#xC73C;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8;&#xD558;&#xB294; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; &#xB9D0;&#xC774;&#xC8E0;. </p><p>&#xC774;&#xB807;&#xAC8C; &#xD558;&#xBA74; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4; &#xBCC0;&#xACBD;&#xC5D0; &#xB530;&#xB978; &#xD14C;&#xC2A4;&#xD2B8; &#xC720;&#xC9C0;&#xBCF4;&#xC218; &#xBE44;&#xC6A9;&#xC744; &#xC904;&#xC774;&#xACE0;, &#xD14C;&#xC2A4;&#xD2B8;&#xAC00; &#xC27D;&#xAC8C; &#xAE68;&#xC9C0;&#xC9C0; &#xC54A;&#xACE0; &#xB354; &#xACAC;&#xACE0;&#xD558;&#xAC8C; &#xC720;&#xC9C0;&#xB420; &#xC218; &#xC788;&#xC744; &#xAC83;&#xC774;&#xB77C; &#xAE30;&#xB300;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74;, VIP Cycle&#xC5D0; &#xB300;&#xD55C; Output&#xC740; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;&#xC694;?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/9.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="2000" height="1446" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/9.png 600w, https://noah-ios.dev/content/images/size/w1000/2024/10/9.png 1000w, https://noah-ios.dev/content/images/size/w1600/2024/10/9.png 1600w, https://noah-ios.dev/content/images/size/w2400/2024/10/9.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">VIP Cycle output</span></figcaption></figure><p>&#xC81C;&#xAC00; &#xC0DD;&#xAC01;&#xD55C; VIP Cycle&#xC5D0; &#xB300;&#xD55C; output&#xC740; &apos;view&apos;&#xB77C;&#xACE0; &#xD310;&#xB2E8;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.<br>view&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xB41C; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC694;&#xCCAD;, &#xAC00;&#xACF5;&#xC744; &#xAC70;&#xCCD0; view&#xC5D0; &apos;<strong>&#xACB0;&#xACFC;&apos;</strong>&#xB85C;&#xC368; &#xB2E4;&#xC2DC; &#xD45C;&#xC2DC;&#xB418;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; VIP Cycle&#xC774; &#xC758;&#xB3C4;&#xD55C; &#xB300;&#xB85C; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xD758;&#xB7EC;&#xAC00;&#xB294;&#xC9C0; &#xAC80;&#xC99D;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; display logic&#xC744; &#xAC80;&#xC99D;&#xD558;&#xBA74; &#xB418;&#xACA0;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74;, display logic&#xC744; &#xAC80;&#xC99D;&#xD560; &#xC218; &#xC788;&#xB294; &#xD658;&#xACBD;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;?</p><p>&#xC81C;&#xAC00; &#xC0DD;&#xAC01;&#xD55C; &#xBC29;&#xBC95;&#xC740; VIP &#xC0AC;&#xC774;&#xD074;&#xC740; &#xADF8;&#xB300;&#xB85C; &#xC9C4;&#xD589;&#xB418;&#xB3C4;&#xB85D; &#xB450;&#xBA74;&#xC11C;,</p><p>Presenter&#xC758; display logic&#xC744; &#xC2A4;&#xD141;&#xC73C;&#xB85C; &#xB300;&#xCCB4;&#xD558;&#xC5EC; &#xADF8; &#xC2A4;&#xD141;&#xB41C; &#xAC1D;&#xCCB4;&#xC758; &#xD750;&#xB984;&#xC744; &#xAC80;&#xC99D;&#xD558;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB9C8;&#xCE58; &#xC544;&#xB798;&#xC758; &#xADF8;&#xB9BC;&#xCC98;&#xB7FC; &#xB9D0;&#xC774;&#xC8E0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/10.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="2000" height="2199" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/10.png 600w, https://noah-ios.dev/content/images/size/w1000/2024/10/10.png 1000w, https://noah-ios.dev/content/images/size/w1600/2024/10/10.png 1600w, https://noah-ios.dev/content/images/size/w2400/2024/10/10.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xAC80;&#xC99D;&#xD558;&#xACE0; &#xC2F6;&#xC740; &#xBD80;&#xBD84;</span></figcaption></figure><p>&#xC0AC;&#xC2E4;, &#xC774; &#xADF8;&#xB9BC;&#xC774; &#xC624;&#xB298; &#xC598;&#xAE30;&#xD558;&#xACE0; &#xC2F6;&#xC740; &#xAC83;&#xC758; &#xC804;&#xBD80;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7FC; &#xC0AC;&#xB840;&#xB97C; &#xD1B5;&#xD574; &#xD750;&#xB984;&#xC744; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">extension ShareGardenSceneInteractor: ShareGardenSceneBusinessLogic {
  func requestMyGarden() {
    self.tasks[TaskKey.requestMyGarden] = Task {
    defer { self.tasks[TaskKey.requestMyGarden] = nil }
    
      do {
        try Task.checkCancellation()
        let myGarden = try await self.shareGardenSceneWorker.requestMyGarden()
        try Task.checkCancellation()
        let response = ShareGardenScene.RequestMyGarden.Response(myGarden: myGarden)
        self.presenter?.presentMyGarden(response: response)
      } catch {
        // present error
      }
    }
  }</code></pre><p><code>interactor</code>&#xC5D0; &#xC774;&#xB7EC;&#xD55C; &#xBA54;&#xC11C;&#xB4DC;&#xAC00; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD588;&#xC744; &#xB54C;</p><p><code>presenter</code>&#xB294; interactor&#xC758; &#xD638;&#xCD9C;&#xC5D0; &#xB530;&#xB77C;</p><pre><code class="language-swift">  extension ShareGardenScenePresenter: ShareGardenScenePresentationLogic {
    func presentMyGarden(response: ShareGardenScene.RequestMyGarden.Response) {
     /* make view model */
      
      self.viewController?.displayMyGarden(viewModel)
    }
    
    func presentMyGardenRequestError() {
      self.viewController?.displayMyGardenRequestError()
    }
     /* present another error */
  }</code></pre><p>view&#xC5D0; &#xACB0;&#xACFC;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xAC8C; &#xB420; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB7EC;&#xD55C; &#xAD6C;&#xC870;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBD24;&#xB358; &#xAC83;&#xCC98;&#xB7FC; display logic&#xC744; &#xC2A4;&#xD141;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">@MainActor
final class ShareGardenSceneViewControllerStub {
  
  weak var viewController: ShareGardenSceneDisplayLogic?
  
  let (myGardenStream, myGardenStreamContinuation) = AsyncStream.makeStream(
    of: ShareGardenScene.RequestMyGarden.ViewModel.self,
    bufferingPolicy: AsyncStream.Continuation.BufferingPolicy.bufferingNewest(1)
  )
  
  let (myGardenRequestErrorStream, myGardenRequestErrorStreamContinuation) = AsyncStream.makeStream(
    of: Void.self,
    bufferingPolicy: AsyncStream.Continuation.BufferingPolicy.bufferingNewest(1)
  )
}

extension ShareGardenSceneViewControllerStub: ShareGardenSceneDisplayLogic {
  func displayMyGarden(_ viewModel: ShareGardenScene.RequestMyGarden.ViewModel) {
    self.myGardenStreamContinuation.yield(viewModel)
    self.viewController?.displayMyGarden(viewModel)
  }
  /* display another error */
}
</code></pre><blockquote>AsyncStream&#xC744; &#xC774;&#xC6A9;&#xD55C; &#xC774;&#xC720;&#xB294; Swift Concurrency&#xB97C; &#xC774;&#xC6A9;&#xD574; output&#xC774; &#xC900;&#xBE44;&#xB418;&#xAE30;&#xAE4C;&#xC9C0; &#xD14C;&#xC2A4;&#xD2B8;&#xC758; &#xD750;&#xB984;&#xC744; suspension point&#xC5D0;&#xC11C; &#xC911;&#xB2E8;&#xC2DC;&#xCF1C; &#xB193;&#xAE30; &#xC704;&#xD568;&#xC785;&#xB2C8;&#xB2E4;.</blockquote><p>AsyncStream.Continuation&#xC758; <a href="https://developer.apple.com/documentation/swift/asyncstream/continuation/yield(_:)?ref=noah-ios.dev"><code>yield(_:)</code></a> &#xB97C; &#xD1B5;&#xD574; suspend &#xB41C; &#xC791;&#xC5C5;&#xC744; &#xC7AC;&#xAC1C;&#xD558;&#xC5EC;suspend point&#xC5D0; &#xAC12;&#xC744; &#xBC18;&#xD658;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACE0;, &#xD574;&#xB2F9; &#xAC12;&#xC744; &#xAC80;&#xC99D;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">import Testing
import AsyncAlgorithms

extension ShareGardenSceneTests {
  @Test(arguments: [true, false])
  private func myGardenRequest(isSuccessful: Bool) async {
    // Given
    / ... /
    
    // When
    self.loadView()
    
    // Then
    enum RequestMyGardenResult {
      case success(ShareGardenScene.RequestMyGarden.ViewModel)
      case error
    }
    
    let mergedStream = merge(
      self.sut.myGardenStream.map { RequestMyGardenResult.success($0) },
      self.sut.myGardenRequestErrorStream.map {
        _ in RequestMyGardenResult.error
      }
    )
    
    for await result in mergedStream {
      switch result {
      case .success(let viewModel):
        #expect(viewModel.nickname == expectedMyGarden.nickname)
        #expect(viewModel.description == expectedMyGarden.description)
        #expect(viewModel.pomodoroRecords == expectedMyGarden.pomodoroRecords)
      case .error:
        #expect(true)
      }
      
      self.sut.myGardenRequestErrorStreamContinuation.finish()
      self.sut.myGardenStreamContinuation.finish()
      return
    }
  }</code></pre><blockquote>parameterized test&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xA0;<a href="https://developer.apple.com/xcode/swift-testing/?ref=noah-ios.dev"><code>Swift Testing</code></a>&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#xC774;&#xB97C; &#xD1B5;&#xD574; &#xC131;&#xACF5;, &#xC2E4;&#xD328; &#xC2DC;&#xB098;&#xB9AC;&#xC624;&#xC5D0; &#xB300;&#xD55C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC27D;&#xAC8C; &#xC9C4;&#xD589;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC704;&#xC640; &#xBE44;&#xC2B7;&#xD55C; &#xD750;&#xB984;&#xC73C;&#xB85C; &#xB2E4;&#xB978; &#xD14C;&#xC2A4;&#xD2B8; &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xC791;&#xC131;&#xD574; &#xC2DC;&#xB098;&#xB9AC;&#xC624;&#xC5D0; &#xB530;&#xB978; VIP Cycle&#xC744; &#xAC80;&#xC99D;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>AsyncStream Continuation&#xC758; &#xACB0;&#xACFC;&#xAC00; &#xC120;&#xD6C4; &#xAD00;&#xACC4;&#xB97C; &#xAC16;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; structured concurrency&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD574; &#xC8FC;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; VIP Cycle&#xC758; &#xB0B4;&#xBD80; &#xAD6C;&#xD604; &#xAC80;&#xC99D;&#xC744; &#xD53C;&#xD558;&#xACE0;, &#xC2E4;&#xC81C; &#xC2E4;&#xD589; &#xD6C4; &#xCD5C;&#xC885; &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD574; &#xAC80;&#xC99D;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xD14C;&#xC2A4;&#xD2B8;&#xAC00; &#xC27D;&#xAC8C; &#xAE68;&#xC9C0;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%F0%9F%A7%AA-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B2%B0%EA%B3%BC">&#x1F9EA; &#xD14C;&#xC2A4;&#xD2B8; &#xACB0;&#xACFC;</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/scenario.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="942" height="197" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/scenario.png 600w, https://noah-ios.dev/content/images/2024/10/scenario.png 942w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">&#xBC31;&#xB85C;&#xADF8;</span></figcaption></figure><p>&#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC785;&#xB825;&#xD558;&#xACE0; &#xBCF4;&#xAC8C; &#xB418;&#xB294; &#xCD5C;&#xC885; &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD574; &#xAC80;&#xC99D;&#xC744; &#xD558;&#xAC8C; &#xB428;&#xC73C;&#xB85C;&#xC368; &#xAE30;&#xD68D; &#xB2E8;&#xACC4;&#xC5D0;&#xC11C; &#xBC31;&#xB85C;&#xADF8;&#xC5D0; &#xC791;&#xC131;&#xD55C; &#xC2DC;&#xB098;&#xB9AC;&#xC624;&#xC5D0; &#xB300;&#xD55C; &#xD589;&#xC704; &#xAE30;&#xBC18; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xD55C; &#xB208;&#xC5D0; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;&#x1F389;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah-ios.dev/content/images/2024/10/Screenshot-2024-10-14-at-4.24.51-PM.png" class="kg-image" alt="Clean-Swift, &#xBB34;&#xC5C7;&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xAC00;" loading="lazy" width="2000" height="131" srcset="https://noah-ios.dev/content/images/size/w600/2024/10/Screenshot-2024-10-14-at-4.24.51-PM.png 600w, https://noah-ios.dev/content/images/size/w1000/2024/10/Screenshot-2024-10-14-at-4.24.51-PM.png 1000w, https://noah-ios.dev/content/images/size/w1600/2024/10/Screenshot-2024-10-14-at-4.24.51-PM.png 1600w, https://noah-ios.dev/content/images/size/w2400/2024/10/Screenshot-2024-10-14-at-4.24.51-PM.png 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">VIP &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8; &#xD14C;&#xC2A4;&#xD2B8; &#xCEE4;&#xBC84;&#xB9AC;&#xC9C0;</span></figcaption></figure><p>&#xC774;&#xC640; &#xB354;&#xBD88;&#xC5B4; VIP Cycle &#xD14C;&#xC2A4;&#xD2B8;&#xC758; &#xACB0;&#xACFC;&#xB85C; VIP &#xCEF4;&#xD3EC;&#xB10C;&#xD2B8;&#xC758; &#xD575;&#xC2EC; &#xAC1D;&#xCCB4;&#xC778; View, Interactor, Presenter&#xC758; &#xD14C;&#xC2A4;&#xD2B8; &#xCEE4;&#xBC84;&#xB9AC;&#xC9C0;&#xB294; &#xD3C9;&#xADE0;&#xA0;<code>94.8%</code>&#xB97C; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>VIP Cycle&#xC744; &#xD14C;&#xC2A4;&#xD2B8; &#xD568;&#xC73C;&#xB85C;&#xC368; VIP Cycle&#xACFC; &#xBCC4;&#xAC1C;&#xB85C; &#xBCC4;&#xB3C4;&#xC758; &#xB85C;&#xC9C1; &#xD14C;&#xC2A4;&#xD2B8;&#xAC00; &#xD544;&#xC694;&#xD55C; &#xBD80;&#xBD84;&#xC740; &#xAC1C;&#xBCC4;&#xC801;&#xC73C;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC791;&#xC131;&#xD574; &#xB85C;&#xC9C1;&#xC758; &#xC815;&#xD655;&#xC131;&#xC744; &#xD655;&#xBCF4;&#xD574; &#xB098;&#xAC00;&#xB294; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8;&#xB97C; &#xC9C4;&#xD589;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBAA8;&#xB4E0; &#xAE30;&#xB2A5;&#xC744; &#xAC1C;&#xBC1C;&#xD55C; &#xB4A4;&#xC5D0; VIP Cycle&#xC744; &#xD1B5;&#xD574; &#xC2DC;&#xB098;&#xB9AC;&#xC624;&#xC5D0; &#xB9DE;&#xAC8C; &#xD14C;&#xC2A4;&#xD2B8;&#xAC00; &#xC9C4;&#xD589;&#xB418;&#xB294; &#xAC78; &#xBCF4;&#xB2C8; &#xC870;&#xAE08; &#xB354; &#xC790;&#xC2E0; &#xC788;&#xAC8C; &#xC0C8;&#xB85C;&#xC6B4; &#xAE30;&#xB2A5;&#xC744; &#xAC1C;&#xBC1C;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB41C; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4; :)</p><p>Clean-Swift&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA70;, &#xC5B4;&#xB290; &#xBD80;&#xBD84;&#xC744; &#xD14C;&#xC2A4;&#xD2B8;&#xD574;&#xC57C; &#xD558;&#xB294;&#xC9C0; &#xACE0;&#xBBFC;&#xD55C; &#xACBD;&#xD5D8;&#xC744; &#xC791;&#xC131;&#xD574; &#xBCF4;&#xC558;&#xB294;&#xB370;&#xC694;,</p><p>&#xC544;&#xC9C1;&#xC740; &#xD604;&#xC7AC;&#xC758; &#xD14C;&#xC2A4;&#xD2B8; &#xAD6C;&#xC870;&#xC5D0;&#xC11C; &#xD06C;&#xAC8C; &#xBD80;&#xC871;&#xD568;&#xC744; &#xB290;&#xB07C;&#xC9C0; &#xBABB;&#xD588;&#xC9C0;&#xB9CC;,</p><p>&#xB354; &#xBCF5;&#xC7A1;&#xD55C; &#xCF00;&#xC774;&#xC2A4;&#xAC00; &#xB4F1;&#xC7A5;&#xD558;&#xAC70;&#xB098;, &#xD14C;&#xC2A4;&#xD2B8; &#xAD6C;&#xC870;&#xC5D0;&#xC11C; &#xAC1C;&#xC120;&#xC758; &#xC5EC;&#xC9C0;&#xB97C; &#xB290;&#xB07C;&#xAC8C; &#xB41C;&#xB2E4;&#xBA74;, &#xAE00;&#xC744; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xB7EC; &#xC624;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;:)</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em>&#xA0;&#x1F60A;</p>]]></content:encoded></item><item><title><![CDATA[비동기 작업 캐시 하기]]></title><description><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0"><strong>&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</strong></h2><hr><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; Noah&#xC785;&#xB2C8;&#xB2E4;.</p><p><a href="https://sopt.org/?ref=noah-ios.dev">SOPT</a>&#xB77C;&#xB294; &#xB3D9;&#xC544;&#xB9AC;&#xC5D0;&#xC11C; &#xB300;&#xD559;&#xC0DD;&#xB4E4;&#xC774; &#xBAA8;&#xC5EC; &#xB9CC;&#xB4E4;&#xAC8C; &#xB41C; &#xC571;&#xC774; &#xACF5;&#xAC1C;&#xB41C;&#xC9C0; &#xC5BC;&#xB9C8;&#xB418;&#xC9C0;  &#xC54A;&#xC558;&#xC74C;&#xC5D0;&#xB3C4; &#xBD88;&#xAD6C;&#xD558;</p>]]></description><link>https://noah-ios.dev/cache-task/</link><guid isPermaLink="false">6457c3b122fba699ec4bb9b9</guid><category><![CDATA[iOS]]></category><category><![CDATA[Swift]]></category><category><![CDATA[Test]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Sun, 27 Aug 2023 15:14:41 GMT</pubDate><media:content url="https://noah-ios.dev/content/images/2023/05/AF1QipOz98NVUBXOfJj493qtiXEOO5ohqgAT2RQQYHak-w1798-h450.png" medium="image"/><content:encoded><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0"><strong>&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</strong></h2><hr><img src="https://noah-ios.dev/content/images/2023/05/AF1QipOz98NVUBXOfJj493qtiXEOO5ohqgAT2RQQYHak-w1798-h450.png" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;"><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; Noah&#xC785;&#xB2C8;&#xB2E4;.</p><p><a href="https://sopt.org/?ref=noah-ios.dev">SOPT</a>&#xB77C;&#xB294; &#xB3D9;&#xC544;&#xB9AC;&#xC5D0;&#xC11C; &#xB300;&#xD559;&#xC0DD;&#xB4E4;&#xC774; &#xBAA8;&#xC5EC; &#xB9CC;&#xB4E4;&#xAC8C; &#xB41C; &#xC571;&#xC774; &#xACF5;&#xAC1C;&#xB41C;&#xC9C0; &#xC5BC;&#xB9C8;&#xB418;&#xC9C0;  &#xC54A;&#xC558;&#xC74C;&#xC5D0;&#xB3C4; &#xBD88;&#xAD6C;&#xD558;&#xACE0; &#xAC10;&#xC0AC;&#xD558;&#xAC8C;&#xB3C4; &#xB9CE;&#xC740; &#xD68C;&#xC6D0; &#xC218;&#xB97C; &#xC720;&#xCE58;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC11C;&#xBE44;&#xC2A4; &#xC18C;&#xAC1C; &#xD398;&#xC774;&#xC9C0; : <a href="https://havit.app/?ref=noah-ios.dev">https://havit.app/</a></blockquote><p>&#xB610; &#xADF8;&#xB9CC;&#xD07C; &#xB3C8;&#xC73C;&#xB85C; &#xC0B4; &#xC218; &#xC5C6;&#xB294; &#xC18C;&#xC911;&#xD55C; &#xD53C;&#xB4DC;&#xBC31;&#xACFC;, &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC0AC;&#xC6A9;&#xACBD;&#xD5D8;&#xC744; &#xB4E4;&#xC5B4;&#xBCFC; &#xC218; &#xC788;&#xC5C8;&#xB294;&#xB370;&#xC694;,</p><p>&#xC624;&#xB298;&#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC0AC;&#xC6A9; &#xACBD;&#xD5D8;&#xC744; &#xB192;&#xC774;&#xAE30; &#xC704;&#xD574; &#xD588;&#xB358; &#xACBD;&#xD5D8; &#xD55C; &#xAC00;&#xC9C0;&#xB97C; &#xACF5;&#xC720;&#xD558;&#xACE0;&#xC790; &#xD569;&#xB2C8;&#xB2E4;.</p><blockquote>&#xB0B4;&#xAC00; &#xB9CC;&#xB4E0; &#xC571;&#xC744; &#xB204;&#xAD70;&#xAC00;&#xAC00; &#xC0AC;&#xC6A9;&#xD574; &#xBCF8;&#xB2E4;&#xB294; &#xAC74; &#xC815;&#xB9D0; &#xD2B9;&#xBCC4;&#xD55C; &#xACBD;&#xD5D8;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4; &#x263A;&#xFE0F;</blockquote><p>HAVIT &#xC571;&#xC740; &#xC778;&#xD130;&#xB137;&#xC5D0;&#xC11C; &#xCC3E;&#xC740; &#xC720;&#xC6A9;&#xD55C; &#xC6F9;&#xD398;&#xC774;&#xC9C0;, &#xBE14;&#xB85C;&#xADF8;, &#xAE30;&#xC0AC;, &#xC774;&#xBBF8;&#xC9C0;, &#xB3D9;&#xC601;&#xC0C1; &#xB4F1;&#xC744; &#xC800;&#xC7A5;&#xD558;&#xACE0;, &#xD544;&#xC694;&#xD560; &#xB54C; &#xC5B8;&#xC81C;&#xB4E0;&#xC9C0; &#xC27D;&#xAC8C; &#xCC3E;&#xC544;&#xBCFC; &#xC218; &#xC788;&#xB294; &#xCF58;&#xD150;&#xCE20; &#xC544;&#xCE74;&#xC774;&#xBE59; &#xC11C;&#xBE44;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;. </p><h2 id="%EC%96%B4%EB%8A%90%EB%82%A0-%EB%B0%9B%EA%B2%8C-%EB%90%9C-%ED%94%BC%EB%93%9C%EB%B0%B1">&#xC5B4;&#xB290;&#xB0A0; &#xBC1B;&#xAC8C; &#xB41C; &#xD53C;&#xB4DC;&#xBC31;</h2><hr><p>&#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xC6D0;&#xD558;&#xB294; &#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xBA74;&#xC11C; &#xD574;&#xB2F9; &#xCF58;&#xD150;&#xCE20;&#xC640; &#xAD00;&#xB828;&#xB41C; &#xCE74;&#xD14C;&#xACE0;&#xB9AC;&#xB97C; &#xC124;&#xC815;&#xD558;&#xC5EC; &#xC790;&#xC2E0;&#xB9CC;&#xC758; &#xAC1C;&#xC778;&#xC801;&#xC778; &#xCF58;&#xD150;&#xCE20; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB97C; &#xAD6C;&#xCD95;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBA3C;&#xC800; &#xC571;&#xC744; &#xCC98;&#xC74C; &#xBCF4;&#xC2DC;&#xB294; &#xBD84;&#xB4E4;&#xC744; &#xC704;&#xD574; &quot;&#xACF5;&#xC720;&#xD558;&#xAE30; &#xD504;&#xB85C;&#xC138;&#xC2A4;&quot;&#xC758; &#xC0AC;&#xC774;&#xD074;&#xC744; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<img src="https://user-images.githubusercontent.com/63908856/236692729-ba1fad03-71bb-4118-854c-b0e4e1748d89.gif" width="320px" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;">
<!--kg-card-end: html-->
<p></p><blockquote>&#xACF5;&#xC720;&#xD558;&#xAE30; -&gt; Share Extension &#xC9C4;&#xC785; -&gt; &#xCE74;&#xD14C;&#xACE0;&#xB9AC; &#xC120;&#xD0DD; -&gt; &#xCF58;&#xD150;&#xCE20; &#xC800;&#xC7A5; (&#xCF58;&#xD150;&#xCE20; &#xBBF8;&#xB9AC;&#xBCF4;&#xAE30; &#xC81C;&#xACF5;) -&gt; &#xC644;&#xB8CC; &#xBC84;&#xD2BC; &#xD130;&#xCE58; -&gt; &#xC800;&#xC7A5;</blockquote><p>&#xC0AC;&#xC6A9;&#xC790;&#xB294; &#xC704;&#xC758; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xAC70;&#xCCD0; &#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC571;&#xC744; &#xCD9C;&#xC2DC;&#xD55C; &#xC9C0; &#xC5BC;&#xB9C8;&#xB418;&#xC9C0; &#xC54A;&#xC544; &#xC0AC;&#xC6A9;&#xC790;&#xB85C;&#xBD80;&#xD130; &#xD53C;&#xB4DC;&#xBC31;&#xC744; &#xBC1B;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p><strong><em>&quot;&#xCF58;&#xD150;&#xCE20;&#xAC00; &#xAC00;&#xB054; &#xC911;&#xBCF5;&#xC73C;&#xB85C; &#xC800;&#xC7A5;&#xB3FC;&#xC694;!&quot;</em></strong></p><h2 id="%EB%AC%B8%EC%A0%9C-%EC%9B%90%EC%9D%B8-%EC%B0%BE%EA%B8%B0">&#xBB38;&#xC81C; &#xC6D0;&#xC778; &#xCC3E;&#xAE30;</h2><hr><p>&#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xBA3C;&#xC800; &#xBB38;&#xC81C;&#xAC00; &#xC5B4;&#xB514;&#xC11C; &#xBC1C;&#xC0DD;&#xD558;&#xB294;&#xC9C0; &#xCC3E;&#xAE30; &#xC704;&#xD55C; &#xBC29;&#xBC95;&#xC744; &#xACE0;&#xBBFC;&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/assets/63908856/8219b1cd-7e7d-417c-8c01-bfcbce3c428f" class="kg-image" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;" loading="lazy"></figure><p>&#xCF58;&#xD150;&#xCE20;&#xAC00; &#xC911;&#xBCF5;&#xB418;&#xB294; &#xD604;&#xC0C1;&#xC740; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD; &#xACFC;&#xC815; &#xC911; &#xB3D9;&#xC2DC;&#xC131; &#xBB38;&#xC81C;&#xC640; &#xAD00;&#xB828;&#xC774; &#xC788;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD558;&#xC5EC;, instruments&#xC5D0;&#xC11C; Swift Concurrency profiling template&#xC744; &#xC774;&#xC6A9;&#xD574; &#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB3D9;&#xC791;&#xC744; &#xB2E4;&#xC591;&#xD558;&#xAC8C; &#xC2DC;&#xB3C4;&#xD574;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB3D9;&#xC791;&#xC744; &#xC5EC;&#xB7EC; &#xC870;&#xAC74;&#xC73C;&#xB85C; &#xC2DC;&#xB3C4;&#xD574;&#xBCF4;&#xB358; &#xC911; &#xCF58;&#xD150;&#xCE20; &#xC800;&#xC7A5; &#xBC84;&#xD2BC;&#xC744; &#xC5EC;&#xB7EC; &#xBC88; &#xD130;&#xCE58; &#xC2DC; &#xC544;&#xB798;&#xC758; &#xB808;&#xCF54;&#xB4DC;&#xB97C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/assets/63908856/3f42cc43-a452-4873-b8c7-1ff498f319b0" class="kg-image" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;" loading="lazy"></figure><p>&#xC0DD;&#xC131;&#xB41C; Task&#xB4E4;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xBCF4;&#xB2C8;, &#xC911;&#xBCF5;&#xB41C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xD638;&#xCD9C;&#xB85C; &#xC778;&#xD55C; Continuation &#xC0C1;&#xD0DC;&#xC758; task&#xB4E4;&#xC774; &#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xAE30; &#xC774;&#xC804;&#xC5D0; &#xC5F0;&#xC18D;&#xD574;&#xC11C; &#xC0DD;&#xACA8;&#xB098;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p> &#xC0AC;&#xC2E4;,<br><br>&quot;&#xC911;&#xBCF5; &#xC694;&#xCCAD; &#xBC29;&#xC9C0;? Combine &#xD639;&#xC740; RxSwift &#xC758; throttle, debounce&#xACFC; &#xAC19;&#xC740; operator&#xB85C; &#xC785;&#xB825; event&#xB97C; &#xC81C;&#xC5B4;&#xD558;&#xBA74; &#xB418;&#xB294; &#xAC83; &#xC544;&#xB2CC;&#xAC00;?&quot; &#xB77C;&#xB294; &#xC0DD;&#xAC01;&#xC744; &#xAC00;&#xC9C0;&#xACE0;, <br><br>&#xC571;&#xC744; &#xCD9C;&#xC2DC;&#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0; throttle operator&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC9E7;&#xC740; &#xC2DC;&#xAC04; &#xB0B4;&#xC5D0; &#xC5EC;&#xB7EC; &#xBC88; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xC911;&#xBCF5; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574; &#xBC29;&#xC9C0;&#xB97C; &#xD574;&#xB193;&#xC558;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xAC00; &#xC0DD;&#xAE30;&#xB9AC;&#xB77C;&#xACE0; &#xC608;&#xC0C1;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>Combine &#xD639;&#xC740; RxSwift&#xC758; throttle, debounce&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAC8C; &#xB420; &#xACBD;&#xC6B0; &#xC544;&#xB798;&#xC758; &#xBB38;&#xC11C;&#xC758; &#xB0B4;&#xC6A9;&#xC5D0;&#xC11C; &#xC54C; &#xC218; &#xC788;&#xB4EF; time interval&#xC5D0; &#xC758;&#xC874;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><blockquote>&quot;Publishes either the most-recent or first element published by the upstream publisher in the specified time interval.&quot; <br>- Apple Documentation -</blockquote><blockquote>&quot;Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.&quot;<br>- ReactiveX / RxSwift - </blockquote><p>&#xD558;&#xC9C0;&#xB9CC; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xACFC; &#xAC19;&#xC740; <strong>&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;</strong>&#xC740; &#xC2DC;&#xAC04;(time interval)&#xC5D0; &#xC758;&#xC874;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; throttle&#xACFC; &#xAC19;&#xC774; &#xD2B9;&#xC815; time interval, duration&#xC5D0; &#xC758;&#xC874;&#xD558;&#xC5EC; &#xC785;&#xB825; event&#xB97C; &#xC81C;&#xC5B4;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC740; &#xC81C;&#xC678;&#xD574;&#xC57C;&#xACA0;&#xB2E4;&#xACE0; &#xD310;&#xB2E8;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xC2DC;&#xAC04;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xC9C0; &#xC54A;&#xACE0;, <strong>&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;</strong>&#xC5D0; &#xB300;&#xD55C; &#xC911;&#xBCF5; &#xC694;&#xCCAD;&#xC744; &#xBC29;&#xC9C0;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC0DD;&#xAC01;&#xD574; &#xBCF4;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC">&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC5D0; &#xAD00;&#xD558;&#xC5EC;</h2><hr><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xBA3C;&#xC800; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC740; &#xBB58;&#xAE4C;&#xC694;?</p><p>&#x201C;<strong>&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;</strong>&#x201D;&#xC740; <strong>&#xB098;&#xC911;&#xC5D0; &#xC54C; &#xC218; &#xC5C6;&#xB294; &#xC2DC;&#xAC04;&#xC5D0; &#xC644;&#xB8CC;&#xB420; &#xC218; &#xC788;&#xB294; &#xC791;&#xC5C5;</strong>&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; </p><ol><li>&#xD574;&#xB2F9; &#xBE44;&#xB3D9;&#xAE30; &#xCF54;&#xB4DC;&#xB294; &#xC2E4;&#xD589;&#xACFC; &#xB3D9;&#xC2DC;&#xC5D0; &#xBC14;&#xB85C; &#xC644;&#xB8CC;&#xB418;&#xB294; &#xAC83;&#xB3C4; &#xC544;&#xB2C8;&#xACE0;,</li><li>&#xD638;&#xCD9C; &#xC2A4;&#xB808;&#xB4DC;&#xC758; &#xCF54;&#xB4DC; &#xC2E4;&#xD589;&#xC744; &#xB9C9;&#xC9C0;&#xB3C4; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4; (non-block)</li></ol><p>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC791;&#xC5C5;&#xC740; &#xBE44;&#xB3D9;&#xAE30;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xB300;&#xD45C;&#xC801;&#xC778; &#xC791;&#xC5C5;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC65C; &#xB300;&#xBD80;&#xBD84; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC791;&#xC5C5;&#xC744; &#xBE44;&#xB3D9;&#xAE30;&#xB85C; &#xCC98;&#xB9AC;&#xD574;&#xC57C; &#xD560;&#xAE4C;&#xC694;?</p><p>&#xBA3C;&#xC800; &#xBA54;&#xBAA8;&#xB9AC; &#xACC4;&#xCE35;&#xAD6C;&#xC870;&#xB97C; &#xC0B4;&#xD3B4;&#xBD05;&#xC2DC;&#xB2E4;.</p><p>&#xBA54;&#xBAA8;&#xB9AC;&#xC758; &#xACC4;&#xCE35;&#xAD6C;&#xC870;&#xC758; &#xC704;&#xC5D0; &#xC788;&#xC73C;&#xBA74; &#xC788;&#xC744;&#xC218;&#xB85D; &#xBA85;&#xB839;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xB294; CPU&#xC640; &#xAC00;&#xAE4C;&#xC6B0;&#xBA70;, &#xADF8;&#xB9CC;&#xD07C; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xC18D;&#xB3C4; &#xC5ED;&#xC2DC; &#xBE60;&#xB985;&#xB2C8;&#xB2E4;. &#xBC18;&#xB300;&#xB85C; &#xACC4;&#xCE35;&#xAD6C;&#xC870;&#xC758; &#xBC11;&#xC73C;&#xB85C; &#xAC00;&#xBA74; &#xAC08;&#xC218;&#xB85D; &#xBA85;&#xB839;&#xC744; &#xCC98;&#xB9AC;&#xD558;&#xB294; CPU&#xC640; &#xBA40;&#xC5B4;&#xC9C0;&#xBA70;, &#xADF8;&#xB9CC;&#xD07C; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xC18D;&#xB3C4; &#xC5ED;&#xC2DC; &#xB290;&#xB824;&#xC9D1;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://user-images.githubusercontent.com/63908856/238175245-52d11273-4675-4278-9835-f991ccbff613.png" class="kg-image" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98; : https://diveintosystems.org/book/C11-MemHierarchy/mem_hierarchy.html</span></figcaption></figure><p>&#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xB97C; &#xD1B5;&#xD574; &#xC5B4;&#xB5A0;&#xD55C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xAC70;&#xB098; &#xBCF4;&#xB0B4;&#xB294; &#xAC83;&#xC740; &#xD604;&#xC7AC; &#xCEF4;&#xD4E8;&#xD130;(&#xB85C;&#xCEEC; &#xB514;&#xBC14;&#xC774;&#xC2A4;)&#xC5D0; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC544;&#xB2CC;, &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD1B5;&#xC2E0;&#xC744; &#xD1B5;&#xD574; &#xB2E4;&#xB978; &#xCEF4;&#xD4E8;&#xD130;&#xC5D0; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xB294; &#xAC83;&#xC774;&#xBBC0;&#xB85C; &#xADF8;&#xB9CC;&#xD07C; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xC18D;&#xB3C4; &#xC5ED;&#xC2DC; &#xB514;&#xBC14;&#xC774;&#xC2A4; &#xB0B4;&#xC5D0; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xAC83;&#xBCF4;&#xB2E4;&#xB294; &#xB290;&#xB9B4; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB9CC;&#xC57D; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD1B5;&#xC2E0;&#xC744; &#xD1B5;&#xD574; &#xAC00;&#xC838;&#xC628; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC774;&#xC6A9;&#xD574;&#xC11C; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; <strong>&#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C;</strong> &#xAD6C;&#xC131;&#xD55C;&#xB2E4;&#xBA74; Remote Storage&#xC5D0; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC62C; &#xB54C;&#xAE4C;&#xC9C0; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC778;&#xD130;&#xB809;&#xC158;&#xC5D0; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774; &#xBC18;&#xC751;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xAC8C; &#xB420; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;. &#xADF8;&#xB9AC;&#xACE0; &#xC774;&#xB294; &#xC88B;&#xC9C0; &#xBABB;&#xD55C; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC73C;&#xB85C; &#xC774;&#xC5B4;&#xC9C8; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><blockquote>&quot;100 ms is the threshold for delays in direct user interaction. If a delay in user interaction becomes longer than 100 ms, it starts to become noticeable and causes a hang. A shorter delay is rarely noticeable.&quot;<br>- Apple Developer Documentation</blockquote><p>Apple&#xC758; <a href="https://developer.apple.com/documentation/xcode/improving-app-responsiveness?ref=noah-ios.dev#Overview">&#xBB38;&#xC11C;</a>&#xC5D0; &#xB530;&#xB974;&#xBA74; 100ms&#xBCF4;&#xB2E4; &#xC9C0;&#xC5F0;&#xC2DC;&#xAC04;&#xC774; &#xAE38;&#xC5B4;&#xC9C0;&#xBA74; &#xB208;&#xC5D0; &#xB744;&#xAE30; &#xC2DC;&#xC791;&#xD558;&#xBA70; &#xBC84;&#xBC85;&#xC784;&#xC774; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC88B;&#xC740; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC120; &#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC791;&#xC131;&#xD558;&#xB294; &#xD568;&#xC218;&#xC758; &#xACBD;&#xC6B0; &#xCD5C;&#xB300;<strong> 100ms &#xC774;&#xB0B4;&#xC5D0; &#xC2E4;&#xD589;</strong>&#xB418;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;&#xB294; <strong>&#xC911;&#xC694;&#xD55C; &#xD78C;&#xD2B8;</strong>&#xB97C; &#xC704; &#xBB38;&#xC11C;&#xB97C; &#xD1B5;&#xD574; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD; &#xC791;&#xC5C5;&#xC740; 100ms &#xC774;&#xB0B4;&#xC5D0; &#xC2E4;&#xD589;&#xB420; &#xAC83;&#xC774;&#xB77C;&#xB294; &#xBCF4;&#xC7A5;&#xC774; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; (&#xC0AC;&#xC6A9;&#xC790; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xD658;&#xACBD;, &#xC6D0;&#xACA9; &#xC11C;&#xBC84; &#xD658;&#xACBD;&#xACFC; &#xAC19;&#xC740; &#xC5EC;&#xB7EC; &#xBD88;&#xD655;&#xC2E4;&#xD55C; &#xD658;&#xACBD;&#xC801; &#xC694;&#xC778; &#xD3EC;&#xD568;) &#xBE44;&#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xC5EC; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC751;&#xB2F5;&#xC774; &#xC62C; &#xB54C;&#xAE4C;&#xC9C0; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2CC;, &#xB2E4;&#xB978; &#xC791;&#xC5C5;&#xC744; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD574;&#xC8FC;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC55E;&#xC11C; &#xB9D0;&#xD588;&#xB4EF; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xACFC; &#xAC19;&#xC740; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC740; &#xC2DC;&#xAC04;(time interval)&#xC5D0; &#xC758;&#xC874;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;.</p><p><strong>&#xC54C; &#xC218; &#xC5C6;&#xB294; &#xC2DC;&#xAC04;&#xC5D0; &#xC644;&#xB8CC;&#xB420; &#xC218; &#xC788;&#xB294; &#xC791;&#xC5C5;</strong>&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB97C; &#xBE44;&#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD558;&#xC5EC;</p>
<!--kg-card-begin: html-->
<p align="center">
<img src="https://user-images.githubusercontent.com/63908856/238197039-eabc9897-f78c-4c72-a413-62ef41130573.png" width="300px" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;">
<center>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: Apple Developer Documentation</center>
</p>
<!--kg-card-end: html-->
<p>&#xBA54;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; block &#xD558;&#xC9C0; &#xC54A;&#xACE0;, &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xC640; &#xC778;&#xD130;&#xB809;&#xC158; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xD574;&#xC8FC;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xC704;&#xC758; &#xACF5;&#xC720;&#xD558;&#xAE30; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC0AC;&#xC774;&#xD074;&#xC5D0;&#xC11C; &#xBCF4;&#xC558;&#xB358; &quot;&#xCF58;&#xD150;&#xCE20; &#xC800;&#xC7A5; &quot;&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD; &#xC791;&#xC5C5; &#xC5ED;&#xC2DC; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4">&#xBB38;&#xC81C; &#xD574;&#xACB0; &#xC544;&#xC774;&#xB514;&#xC5B4;</h2><hr><p>&#xB2E4;&#xC2DC; &#xB3CC;&#xC544;&#xC640;&#xC11C; &#xD604;&#xC7AC; &#xC6B0;&#xB9AC;&#xB294; <em><strong>&quot;&#xCF58;&#xD150;&#xCE20;&#xAC00; &#xAC00;&#xB054; &#xC911;&#xBCF5;&#xC73C;&#xB85C; &#xC800;&#xC7A5;&#xB3FC;&#xC694;!&quot;</strong>&#xB77C;&#xB294; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xB824;&#xACE0; &#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</em></p><p>&#xC774; &#xBB38;&#xC81C;&#xB294; &#xC2DC;&#xAC04;&#xC5D0; &#xC758;&#xC874;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC791;&#xC5C5;&#xC778; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; throttle&#xACFC; &#xAC19;&#xC774; &#xD2B9;&#xC815; time interval, duration&#xC5D0; &#xC758;&#xC874;&#xD558;&#xC5EC; &#xC785;&#xB825; event&#xB97C; &#xC81C;&#xC5B4;&#xD558;&#xB294; operator&#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBC1C;&#xC0DD;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;?</p><p>&#xCC98;&#xC74C;&#xC5D0; &#xC0DD;&#xAC01;&#xD588;&#xB358; &#xBC29;&#xC2DD;&#xC740; flag &#xBCC0;&#xC218;&#xB97C; &#xB450;&#xACE0; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB420; &#xB54C;&#xAE4C;&#xC9C0; &#xC0C8;&#xB85C;&#xC6B4; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xC694;&#xCCAD;&#xC744; &#xB9C9;&#xB294; &#xAC83;&#xC774;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xC870;&#xAE08; &#xB354; &#xC0DD;&#xAC01;&#xD574; &#xBCF4;&#xBA74; &#xBCC0;&#xC218;&#xB294; <a href="https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_%EC%95%88%EC%A0%84?ref=noah-ios.dev"><strong>&#xC2A4;&#xB808;&#xB4DC; &#xC138;&#xC774;&#xD504;</strong></a>&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</p><img src="https://user-images.githubusercontent.com/63908856/263647257-af946e66-3c04-4e9b-90fd-83ba54157e98.png" width="250px" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;"><p>&#xB9CC;&#xC57D; A &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xC694;&#xCCAD;&#xD55C; &#xB4A4;&#xC5D0; B &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;&#xBA74; flag &#xBCC0;&#xC218;&#xB77C;&#xB294; &#xACF5;&#xC720; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; <a href="https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C?ref=noah-ios.dev">race condition</a>&#xC774; &#xBC1C;&#xC0DD;&#xD574; &#xC911;&#xBCF5;&#xB41C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC774; &#xC694;&#xCCAD;&#xB420; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBB3C;&#xB860; flag &#xBCC0;&#xC218;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xCF54;&#xB4DC; &#xC5ED;&#xC2DC;  mutual exclusion&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xAE30; &#xC704;&#xD574; NSLock, Serial Queue&#xB4F1; &#xC5EC;&#xB7EC; &#xB3D9;&#xAE30;&#xD654; &#xBC29;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xBCF4;&#xC644;&#xD560; &#xC218; &#xC788;&#xC9C0;&#xB9CC; flag &#xBCC0;&#xC218;&#xB77C;&#xB294; &#xAD00;&#xB9AC; &#xD3EC;&#xC778;&#xD2B8;&#xAC00; &#xB298;&#xC5B4;&#xB098; &#xBCF5;&#xC7A1;&#xB3C4;&#xAC00; &#xC62C;&#xB77C;&#xAC08; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB7EC;&#xD55C; &#xBCF5;&#xC7A1;&#xB3C4;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; <a href="https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C?ref=noah-ios.dev"><strong>&#xCE90;&#xC2DC;</strong></a>&#xB97C; &#xACE0;&#xB824;&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xCE90;&#xC2DC;&#xB294; &#xB3D9;&#xC77C;&#xD55C; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574; &#xC774;&#xC804;&#xC5D0; &#xC694;&#xCCAD;&#xD55C; &#xACB0;&#xACFC;&#xB97C; &#xC7AC;&#xC0AC;&#xC6A9;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC911;&#xBCF5; &#xC694;&#xCCAD;&#xC744; &#xBC29;&#xC9C0;&#xD558;&#xB294; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD544;&#xC694;&#xD55C; &#xD2B9;&#xC131;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; &#xBD80;&#xAC00;&#xC801;&#xC73C;&#xB85C; &#xB300;&#xBD80;&#xBD84;&#xC758; &#xCE90;&#xC2F1; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xB0B4;&#xBD80;&#xC801;&#xC73C;&#xB85C; &#xB3D9;&#xAE30;&#xD654; &#xBB38;&#xC81C;&#xB97C; &#xCC98;&#xB9AC;&#xD558;&#xB294; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC774; &#xAD6C;&#xD604;&#xB418;&#xC5B4; &#xC788;&#xC5B4; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC9C1;&#xC811; &#xB3D9;&#xAE30;&#xD654; &#xB85C;&#xC9C1;&#xC744; &#xC2E0;&#xACBD; &#xC4F8; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xAC8C; &#xB418;&#xC5B4; &#xC55E;&#xC11C; &#xC804;&#xC220;&#xD55C; flag &#xBCC0;&#xC218;&#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xC744; &#xB54C; &#xC2A4;&#xB808;&#xB4DC; &#xB3D9;&#xAE30;&#xD654;&#xB85C; &#xC778;&#xD55C; &#xBCF5;&#xC7A1;&#xB3C4;&#xAC00; &#xC62C;&#xB77C;&#xAC00;&#xB294; &#xAC83;&#xC744; &#xD53C;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/apple/swift-corelibs-foundation/blob/main/Sources/Foundation/NSCache.swift?ref=noah-ios.dev#L77"><div class="kg-bookmark-content"><div class="kg-bookmark-title">swift-corelibs-foundation/Sources/Foundation/NSCache.swift at main &#xB7; apple/swift-corelibs-foundation</div><div class="kg-bookmark-description">The Foundation Project, providing core utilities, internationalization, and OS independence - apple/swift-corelibs-foundation</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">apple</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/1a75ba3463214ff65a575259ae9628416bf3feb4841592f0efcc0205bd4301e8/apple/swift-corelibs-foundation" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;"></div></a></figure><blockquote>&#xD639;&#xC2DC; &#xBAB0;&#xB77C; Swift Foundation framework&#xC758; NSCache &#xAD6C;&#xD604; &#xBD80;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF8; &#xACB0;&#xACFC; NSLock&#xC744; &#xC774;&#xC6A9;&#xD55C; &#xB3D9;&#xAE30;&#xD654; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC774; &#xAD6C;&#xD604;&#xB418;&#xC5B4; &#xC788;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xB530;&#xB77C;&#xC11C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xC911;&#xBCF5;&#xC73C;&#xB85C; &#xC694;&#xCCAD;&#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xAC8C; &#xD558;&#xAE30; &#xC704;&#xD574; &#xCE90;&#xC2DC;&#xC758; &#xD2B9;&#xC131;&#xC744; &#xC774;&#xC6A9;&#xD558;&#xC5EC; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC758; &#xB2E8;&#xC704;&#xC778; <a href="https://developer.apple.com/documentation/swift/task?ref=noah-ios.dev"><strong>Swift Concurrency&#xC758; Task</strong></a><strong> </strong>&#xB97C; &#xCE90;&#xC2DC; &#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xACB0;&#xC815;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC81C; &#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD55C; &#xC791;&#xC5C5;&#xC744; &#xCE90;&#xC2DC; &#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD574; &#xBD05;&#xC2DC;&#xB2E4;.</p><h2 id="%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85-%EC%BA%90%EC%8B%9C-%ED%95%98%EA%B8%B0">&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;</h2><hr><p>&#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ul><li>&#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xC9C4;&#xD589; &#xC911;&#xC77C; &#xACBD;&#xC6B0; &#xCE90;&#xC2DC; &#xB41C; &#xC791;&#xC5C5;&#xC744; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</li><li>&#xCF58;&#xD150;&#xCE20;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xC5C8;&#xC744; &#xACBD;&#xC6B0; &#xC644;&#xB8CC;&#xB41C; &#xACB0;&#xACFC;&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</li></ul><p>&#xC704;&#xC758; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xB450; &#xAC00;&#xC9C0;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xAC00;&#xC9C4;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>&#xC791;&#xC5C5;&#xC774; &#xC9C4;&#xD589; &#xC911;&#xC778; &#xC0C1;&#xD0DC;</li><li>&#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB41C; &#xC0C1;&#xD0DC;</li></ol><p>Swift&#xC758; enum&#xC740; &#xC704;&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xD45C;&#xD604;&#xD558;&#xAE30;&#xC5D0; &#xC790;&#xC5F0;&#xC2A4;&#xB7EC;&#xC6B4; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC791;&#xC5C5;&#xC740; &#xC5B4;&#xB5BB;&#xAC8C; &#xD45C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;?</p><p>Swift Concurrency&#xC758; Task&#xB294; &#xBE44;&#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xB294; &#xC791;&#xC5C5;&#xC758; &#xB2E8;&#xC704;&#xB97C; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Task&#xC640; enum&#xC744; &#xC774;&#xC6A9;&#xD574; &#xC704; &#xB0B4;&#xC6A9;&#xC744; &#xCF54;&#xB4DC;&#xB85C; &#xBC14;&#xAFD4;&#xBD05;&#xC2DC;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/noah0316/6227a278af59dad3637e96e0ecb43ddc.js"></script>
<!--kg-card-end: html-->
<p>&#xC791;&#xC5C5;&#xC774; &#xC694;&#xCCAD;(request)&#xB418;&#xC5C8;&#xC9C0;&#xB9CC;, &#xC544;&#xC9C1; &#xC644;&#xB8CC;&#xB418;&#xC9C0; &#xC54A;&#xC740; Task&#xC758; &#xACBD;&#xC6B0; &#xC911;&#xBCF5; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD; &#xBC29;&#xC9C0;&#xB97C; &#xC704;&#xD574; inProgress &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xBA70;, &#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB41C; &#xACBD;&#xC6B0; ready &#xCF00;&#xC774;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD560; &#xC608;&#xC815;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC81C; &#xC704; enum&#xC744; &#xCE90;&#xC2DC; &#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xCE90;&#xC2DC; &#xD56D;&#xBAA9;&#xC774; <a href="https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%84%B1?ref=noah-ios.dev">&#xC601;&#xC18D;&#xC131;</a>&#xC744; &#xAC16;&#xC9C0; &#xC54A;&#xAE30; &#xC6D0;&#xD558;&#xBBC0;&#xB85C; &#xB514;&#xC2A4;&#xD06C; &#xCE90;&#xC2DC;&#xAC00; &#xC544;&#xB2CC; &#xBA54;&#xBAA8;&#xB9AC; &#xCE90;&#xC2DC;&#xB85C; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD574; <a href="https://developer.apple.com/documentation/foundation/nscache/?ref=noah-ios.dev">NSCache</a> &#xB97C; &#xC774;&#xC6A9;&#xD574; &#xAD6C;&#xD604;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/noah0316/2b03c5a78adac682ebc767971938f9cd.js"></script>
<!--kg-card-end: html-->
<p>&#xC704; &#xC120;&#xC5B8; &#xBD80;&#xB97C; &#xBCF4;&#xBA74; &#xC54C; &#xC218; &#xC788;&#xB4EF; NSCache&#xB294; reference type&#xB9CC;&#xC744; &#xC800;&#xC7A5;&#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; enum&#xC744; &#xCE90;&#xC2DC; &#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; enum&#xC744; &#xBCF4;&#xC720;&#xD558;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xC774; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xCE90;&#xC2DC;&#xC5D0; &#xC0BD;&#xC785;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/noah0316/6ccbc5392786b25c6adc9bf7c6686a16.js"></script>
<!--kg-card-end: html-->
<blockquote>final &#xD0A4;&#xC6CC;&#xB4DC;&#xC640; &#xBAA8;&#xB4E0; &#xD504;&#xB85C;&#xD37C;&#xD2F0;&#xB97C; let&#xC73C;&#xB85C; &#xC120;&#xC5B8;&#xD558;&#xC5EC;, &#xC2A4;&#xB808;&#xB4DC; &#xAC04;&#xC5D0; &#xC0C1;&#xD0DC;&#xC758; &#xBCC0;&#xACBD; &#xC5C6;&#xC774; &#xD574;&#xB2F9; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC548;&#xC804;&#xD558;&#xAC8C; &#xC804;&#xB2EC;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>Task&#xB97C; &#xCE90;&#xC2DC;&#xD558;&#xB294;&#xB370; &#xD544;&#xC694;&#xD55C; &#xD0C0;&#xC785;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4; &#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>Swift&#xC758; &#xC11C;&#xBE0C;&#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xBCF5;&#xC7A1;&#xB3C4;&#xB97C; &#xC228;&#xAE30;&#xACE0;, &#xCE90;&#xC2DC;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xAC04;&#xACB0;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/noah0316/52781edd0fb89b8871bd32048fc93cef.js"></script>
<!--kg-card-end: html-->
<p>&#xC138;&#xD130;(setter)&#xC5D0;&#xC11C; &#xB9CC;&#xC57D; &#xAC12;&#xC774; nil&#xC774; &#xB4E4;&#xC5B4;&#xC628;&#xB2E4;&#xBA74;, &#xD574;&#xB2F9; key&#xC5D0; &#xB300;&#xD55C; &#xCE90;&#xC2DC;&#xB97C; &#xC81C;&#xAC70;&#xD574; &#xB515;&#xC154;&#xB108;&#xB9AC;&#xC640; &#xBE44;&#xC2B7;&#xD55C; &#xB3D9;&#xC791;&#xC744; &#xD558;&#xB3C4;&#xB85D; &#xD569;&#xB2C8;&#xB2E4;. </p><p>NSCache&#xB294; &#xC2A4;&#xB808;&#xB4DC; &#xC138;&#xC774;&#xD504; &#xD569;&#xB2C8;&#xB2E4;. </p><p>&#xC774;&#xB9D0;&#xC778;&#xC989;&#xC2A8;, &#xC5EC;&#xB7EC; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC561;&#xC138;&#xC2A4;&#xD574;&#xB3C4; race condition&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;. </p><p>&#xADF8;&#xB7EC;&#xB098; &#xC5EC;&#xB7EC; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC811;&#xADFC;&#xD560; &#xB54C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xC694;&#xCCAD;&#xC744; &#xD55C; &#xBC88;&#xB9CC; &#xC2E4;&#xD589;&#xD558;&#xB3C4;&#xB85D; &#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; NSCache&#xC758; &#xC2A4;&#xB808;&#xB4DC; &#xC138;&#xC774;&#xD504;&#xB294; &#xC774;&#xB97C; &#xBCF4;&#xC7A5;&#xD558;&#xAE30;&#xC5D0; &#xCDA9;&#xBD84;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB4DC; &#xCF54;&#xB4DC;&#xC758; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xBB38;&#xC81C;&#xB294; &#xC608;&#xCE21;&#xD560; &#xC218; &#xC5C6;&#xB294; &#xCF54;&#xB4DC;&#xC758; &#xC2E4;&#xD589;&#xC21C;&#xC11C;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xCCAB; &#xBC88;&#xC9F8; &#xC694;&#xCCAD;&#xC5D0; &#xB300;&#xD574; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xB300;&#xAE30;&#xD558;&#xBA74; &#xC774;&#xC804; &#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xAE30; &#xC804;&#xC5D0; &#xC0C8; &#xC694;&#xCCAD;&#xC774;  &#xC2E4;&#xD589;&#xB429;&#xB2C8;&#xB2E4;. </p><p>&#xC6B0;&#xB9AC;&#xAC00; &#xD558;&#xB824;&#xACE0; &#xD558;&#xB294; &#xBC14;&#xB294; &#xB2E4;&#xB978; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xC2DC;&#xC791;&#xD558;&#xC9C0; &#xC54A;&#xACE0;, &#xC774;&#xBBF8; &#xC9C4;&#xD589; &#xC911;&#xC778; &#xC694;&#xCCAD; &#xC791;&#xC5C5;&#xC744; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>actor type&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC774; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>actor type&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xB3D9;&#xC2DC; &#xC811;&#xADFC;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C;&#xBD80;&#xD130; &#xCE90;&#xC2DC;&#xB97C; &#xBCF4;&#xD638;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xB2E8;&#xC21C;&#xD788; actor type&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83; &#xC5ED;&#xC2DC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>actor&#xB294; &#xAC00;&#xBCC0;&#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD55C; &#xB3C5;&#xC810;&#xC801;&#xC778; &#xC561;&#xC138;&#xC2A4;&#xB97C; &#xBCF4;&#xC7A5;&#xD558;&#xB294;&#xB370; &#xC65C; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC5C6;&#xC744;&#xAE4C;&#xC694;?</blockquote><p>&#xBC14;&#xB85C; <strong>actor reenterancy</strong>&#xC640; &#xAD00;&#xB828;&#xB41C; &#xD2B9;&#xC131; &#xB54C;&#xBB38;&#xC778;&#xB370;&#xC694;, actor&#xB294; actor&#xC758; Mailbox&#xC5D0;&#xC11C; &#xD55C;&#xBC88;&#xC5D0; &#xD558;&#xB098;&#xC758; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xCC98;&#xB9AC;&#xD569;&#xB2C8;&#xB2E4;. &#xD558;&#xC9C0;&#xB9CC;, actor&#xB294; &#xD574;&#xB2F9; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xC804;&#xBD80; <strong>&#xC644;&#xB8CC; </strong>&#xD558;&#xB294; &#xAC83;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>await &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74; &#xC2E4;&#xD589;&#xC774; &#xC7A0;&#xC7AC;&#xC801;&#xC73C;&#xB85C; suspend&#xB418;&#xACE0;, actor&#xB294; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xAE30; &#xC804;&#xC5D0; &#xC0C8;&#xB85C;&#xC6B4; &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C; &#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC774;&#xB7EC;&#xD55C; actor reentrerancy&#xB77C;&#xB294; &#xD2B9;&#xC131;&#xC774; &#xD604;&#xC7AC; &#xC791;&#xC5C5;&#xC5D0;&#xC11C;&#xB294; &#xC5B4;&#xB5A4; &#xBB38;&#xC81C;&#xB97C; &#xBD88;&#xB7EC;&#xC77C;&#xC73C;&#xD0AC; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;?</blockquote><p>actor&#xB0B4;&#xBD80;&#xC5D0;&#xC11C; &#xD2B9;&#xC815; URL&#xC5D0; &#xB300;&#xD55C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xC694;&#xCCAD;&#xC744; &#xD55C; &#xD6C4; await&#xB85C; &#xC778;&#xD55C; &#xC7A0;&#xC7AC;&#xC801;&#xC778; suspend&#xC0C1;&#xD0DC;&#xC5D0;&#xC11C;(&#xC791;&#xC5C5;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC0C1;&#xD0DC;) &#xB3D9;&#xC77C;&#xD55C; URL&#xC5D0; &#xB300;&#xD574; &#xBE44;&#xB3D9;&#xAE30;&#xC791;&#xC5C5;&#xC744; actor&#xC5D0; &#xD558;&#xAC8C;&#xB418;&#xBA74; &#xCE90;&#xC2DC;&#xC5D0;&#xB294; &#xC544;&#xC9C1; &#xD574;&#xB2F9; &#xAC12;&#xC774; &#xAE30;&#xB85D;&#xB418;&#xC5B4; &#xC788;&#xC9C0; &#xC54A;&#xC73C;&#xBBC0;&#xB85C; &#xC911;&#xBCF5;&#xC73C;&#xB85C; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xACB0;&#xACFC;&#xB97C; &#xB0B3;&#xAC8C; &#xB420; &#xAC83; &#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xCE90;&#xC2DC;&#xC5D0; &#xAC12;&#xC774; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD558;&#xACE0;, &#xC694;&#xCCAD; &#xC791;&#xC5C5; &#xC2E4;&#xD589;&#xC744; &#xC2DC;&#xC791;&#xD560; &#xB54C; &#xCE90;&#xC2DC;&#xB41C; &#xAC12;&#xC744; &#xCC3E;&#xC544; &#xCD94;&#xAC00; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D;&#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/noah0316/f12e7dc648052b8239ebc8a59130c574.js"></script>
<!--kg-card-end: html-->
<h2 id="%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1-%EB%B0%8F-%EA%B2%B0%EA%B3%BC-%EA%B2%80%EC%A6%9D">&#xD14C;&#xC2A4;&#xD2B8; &#xCF54;&#xB4DC; &#xC791;&#xC131; &#xBC0F; &#xACB0;&#xACFC; &#xAC80;&#xC99D;</h2><hr><p>&#xC774;&#xC81C; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xB300;&#xB85C; &#xC81C;&#xB300;&#xB85C; &#xC791;&#xB3D9;&#xD558;&#xB294;&#xC9C0; &#xD14C;&#xC2A4;&#xD2B8; &#xCF54;&#xB4DC;&#xB97C; &#xD1B5;&#xD574; &#xAC80;&#xC99D;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC6B0;&#xB9AC;&#xC758; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC740; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xB450; &#xAC1C;&#xB97C; &#xC694;&#xCCAD;&#xD588;&#xC744; &#xB54C; &#xC791;&#xC5C5;&#xC774; &#xD55C; &#xBC88;&#xB9CC; &#xC774;&#xB8E8;&#xC5B4;&#xC838;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC774; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC744; &#xD1A0;&#xB300;&#xB85C; &#xD14C;&#xC2A4;&#xD2B8; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p>
<!--kg-card-begin: html-->
<script src="https://gist.github.com/noah0316/44dd3817e817a94db42e4b3e70a3fe75.js"></script>
<!--kg-card-end: html-->
<figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/263537133-ddfed684-168c-49f2-8b16-2036e11e1989.png" class="kg-image" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/263537139-79e8a027-29fc-4230-b030-eda19f812089.png" class="kg-image" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;" loading="lazy"></figure><p>&#xD14C;&#xC2A4;&#xD2B8;&#xC5D0; &#xD1B5;&#xACFC;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;!</p><p>&#xB2E4;&#xC74C;&#xC740; instruments&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xBC14;&#xC640; &#xAC19;&#xC774; &#xB2E4;&#xC2DC; &#xD55C;&#xBC88; &#xBB38;&#xC81C; &#xC0C1;&#xD669;&#xC744; &#xC7AC;&#xC5F0;&#xD574; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD588;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/assets/63908856/ca6d795d-fad1-411f-8a0d-5ef78630e740" class="kg-image" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;" loading="lazy"></figure><p>instruments&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xAC80;&#xC99D;&#xD55C; &#xACB0;&#xACFC; &#xC5ED;&#xC2DC; &#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5;&#xC744; &#xC911;&#xBCF5;&#xD574;&#xC11C; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xACE0;&#xC788;&#xC9C0; &#xC54A;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB85C;&#xC368; &#xAC80;&#xC99D;&#xAE4C;&#xC9C0; &#xB9C8;&#xCCE4;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xBA70; &#xACE0;&#xBBFC;&#xD588;&#xB358; &#xB0B4;&#xC6A9;&#xB4E4;&#xC774; &#xC5EC;&#xB7EC;&#xBD84;&#xB4E4;&#xC5D0;&#xAC8C; &#xB3C4;&#xC6C0;&#xC774; &#xB418;&#xB294; &#xAE00;&#xC774; &#xB418;&#xC5C8;&#xC73C;&#xBA74; &#xC88B;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xAE34; &#xAE00; &#xC77D;&#xC5B4;&#xC8FC;&#xC154;&#xC11C; &#xAC10;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;.</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em> &#x1F60A;</p><h2 id="%EC%B0%B8%EA%B3%A0"><strong>&#xCC38;&#xACE0;</strong></h2><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/apple/swift-evolution/blob/main/proposals/0306-actors.md?ref=noah-ios.dev#actor-reentrancy"><div class="kg-bookmark-content"><div class="kg-bookmark-title">swift-evolution/proposals/0306-actors.md at main &#xB7; apple/swift-evolution</div><div class="kg-bookmark-description">This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">apple</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/7afd45ae807b0f2aa6c2deb04d288e51305608e276a6d1eec88877553f31740b/apple/swift-evolution" alt="&#xBE44;&#xB3D9;&#xAE30; &#xC791;&#xC5C5; &#xCE90;&#xC2DC; &#xD558;&#xAE30;"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[겹침의 아름다움]]></title><description><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://gist.github.com/user-attachments/assets/87e5e774-3dd4-4486-8114-7675dc8cb37f" class="kg-image" alt loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xC601;&#xD654; &lt;&#xD37C;&#xD399;&#xD2B8; &#xB370;&#xC774;&#xC988;(2024) &#x4E2D;&gt;</span></figcaption></figure><p>&#x201C;&#xADF8;&#xB9BC;&#xC790;&#xAC00; &#xACB9;&#xCE58;&#xBA74; &#xB354; &#xC5B4;&#xB450;&#xC6CC;&#xC9C8;&#xAE4C;&#xC694;?&#x201D; &#xC2DC;&#xD55C;&#xBD80; &#xD310;&#xC815;&#xC744; &#xBC1B;&#xC740; &#xD55C; &#xC0AC;&#xB0B4;&#xAC00; &#xC8FC;&#xC778;&#xACF5; &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xC5D0;&#xAC8C; &#xB358;</p>]]></description><link>https://noah-ios.dev/perfect-days/</link><guid isPermaLink="false">66c1ecdec9efaff98fe3ce2a</guid><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Sun, 18 Aug 2024 12:58:03 GMT</pubDate><media:content url="https://noah-ios.dev/content/images/2024/08/IMG_5383.JPG" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://gist.github.com/user-attachments/assets/87e5e774-3dd4-4486-8114-7675dc8cb37f" class="kg-image" alt="&#xACB9;&#xCE68;&#xC758; &#xC544;&#xB984;&#xB2E4;&#xC6C0;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xC601;&#xD654; &lt;&#xD37C;&#xD399;&#xD2B8; &#xB370;&#xC774;&#xC988;(2024) &#x4E2D;&gt;</span></figcaption></figure><img src="https://noah-ios.dev/content/images/2024/08/IMG_5383.JPG" alt="&#xACB9;&#xCE68;&#xC758; &#xC544;&#xB984;&#xB2E4;&#xC6C0;"><p>&#x201C;&#xADF8;&#xB9BC;&#xC790;&#xAC00; &#xACB9;&#xCE58;&#xBA74; &#xB354; &#xC5B4;&#xB450;&#xC6CC;&#xC9C8;&#xAE4C;&#xC694;?&#x201D; &#xC2DC;&#xD55C;&#xBD80; &#xD310;&#xC815;&#xC744; &#xBC1B;&#xC740; &#xD55C; &#xC0AC;&#xB0B4;&#xAC00; &#xC8FC;&#xC778;&#xACF5; &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xC5D0;&#xAC8C; &#xB358;&#xC9C4; &#xC9C8;&#xBB38;&#xC774;&#xB2E4;. &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xB294; &#xB300;&#xB2F5;&#xD55C;&#xB2E4;. &#xC544;&#xBB34;&#xAC83;&#xB3C4; &#xBCC0;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xBA74; &#xB9D0;&#xC774; &#xC548; &#xB41C;&#xB2E4;&#xACE0;. &#xB9E4;&#xC77C; &#xC9D1; &#xC55E;&#xC5D0;&#xC11C; &#xD55C; &#xD560;&#xBA38;&#xB2C8;&#xC758; &#xBE44; &#xC4F0;&#xB294; &#xC18C;&#xB9AC;&#xC5D0; &#xC7A0;&#xC5D0;&#xC11C; &#xAE68;&#xACE0;, &#xC591;&#xCE58;&#xB97C; &#xD558;&#xACE0;, &#xD654;&#xBD84;&#xC5D0; &#xBB3C;&#xC744; &#xC8FC;&#xACE0;, &#xD30C;&#xB780;&#xC0C9; &#xC791;&#xC5C5;&#xBCF5;&#xC744; &#xC785;&#xACE0;, &#xB611;&#xAC19;&#xC740; &#xC790;&#xD310;&#xAE30; &#xCE94; &#xCEE4;&#xD53C;&#xB97C; &#xBA39;&#xC73C;&#xBA70; &#xCD9C;&#xADFC;&#xD558;&#xB294; &#xC8FC;&#xC778;&#xACF5; &#xD788;&#xB85C;&#xC57C;&#xB9C8;. &#xB9E4;&#xC77C; &#xCC59;&#xACA8;&#xAC00;&#xC57C; &#xD560; &#xC18C;&#xC9C0;&#xD488;&#xB4E4;&#xC744; &#xC21C;&#xC11C;&#xB300;&#xB85C; &#xB193;&#xC544;&#xB458; &#xB9CC;&#xD07C; &#xC9C8;&#xC11C;&#xC640; &#xC548;&#xC815;&#xC744; &#xCD94;&#xAD6C;&#xD558;&#xB294; &#xC8FC;&#xC778;&#xACF5;&#xB9C8;&#xC800; &#xBCC0;&#xD654;&#xB294; &#xB2F9;&#xC5F0;&#xD55C; &#xAC70;&#xB77C; &#xB9D0;&#xD55C;&#xB2E4;.<br><br>&#xBE54; &#xBCA4;&#xB354;&#xC2A4;&#xC758; &#xC601;&#xD654; &lt;&#xD37C;&#xD399;&#xD2B8; &#xB370;&#xC774;&#xC988;&gt;(2024)&#xB294; &#xC2DC;&#xC885;&#xC77C;&#xAD00; &#xADF8;&#xB7F0; &#xACB9;&#xCE68;&#xC744; &#xCC2C;&#xB780;&#xD558;&#xB2E4;&#xACE0; &#xB9D0;&#xD55C;&#xB2E4;. &#xBE5B;&#xC758; &#xAC01;&#xB3C4;, &#xB098;&#xBB47;&#xC78E; &#xBAA8;&#xC591;, &#xADF8;&#xB9AC;&#xACE0; &#xBC14;&#xB78C;&#xC758; &#xC138;&#xAE30;. &#xC138; &#xBCC0;&#xC218;&#xAC00; &#xB9CC;&#xB4E0; &#xADF8;&#xB9BC;&#xC790;&#xB294; &#xADF8; &#xC21C;&#xAC04;&#xC5D0;&#xB9CC; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xAC83;&#xCC98;&#xB7FC;. &#xC8FC;&#xC778;&#xACF5; &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xC758; &#xBC18;&#xBCF5;&#xB418;&#xB294; &#xC0B6; &#xC18D;&#xC5D0;&#xC11C;&#xB3C4; &#xC6B0;&#xC5F0;&#xD55C; &#x2018;&#xACB9;&#xCE68;&apos;&#xC774; &#xBCC0;&#xC8FC;&#xB97C; &#xB9CC;&#xB4E0;&#xB2E4;. &#xD654;&#xC7A5;&#xC2E4; &#xCCAD;&#xC18C;&#xBD80;&#xC778; &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xB294; &#xB9E4;&#xC77C; &#xB2E4;&#xB978; &#xC774;&#xB4E4;&#xC744; &#xB9C8;&#xC8FC;&#xD558;&#xBA70; &#xC624;&#xB298;&#xC774; &#xB610; &#xC5B4;&#xC81C;&#xC640; &#xB2E4;&#xB978; &#xD558;&#xB8E8;&#xC784;&#xC744; &#xB290;&#xB080;&#xB2E4;. &#xC5C4;&#xB9C8;&#xB97C; &#xC783;&#xC5B4;&#xBC84;&#xB9B0; &#xC544;&#xC774;. &#xD53C;&#xBD80;&#xC0C9;&#xC774; &#xB2E4;&#xB978; &#xC678;&#xAD6D;&#xC778;. &#xBC24;&#xC0D8; &#xD68C;&#xC2DD;&#xC73C;&#xB85C; &#xC544;&#xC9C1; &#xC220;&#xC774; &#xB35C; &#xAE6C; &#xC9C1;&#xC7A5;&#xC778;. &#xADF8;&#xB294; &#xADF8;&#xB54C; &#xB9D0;&#xC5C6;&#xC774; &#xC605;&#xC740; &#xBBF8;&#xC18C;&#xB97C; &#xB764;&#xB2E4;. &#xB204;&#xAD70;&#xAC00; &#xD654;&#xC7A5;&#xC2E4;&#xC5D0; &#xB0A8;&#xAE30;&#xACE0; &#xAC04; &#xBE59;&#xACE0; &#xAC8C;&#xC784; &#xC885;&#xC774;&#xC5D0; X&#xB97C; &#xADF8;&#xB9AC;&#xBA70; &#xAC8C;&#xC784;&#xC744; &#xC774;&#xC5B4; &#xB098;&#xAC00;&#xB294; &#xADF8;&#xC758; &#xD45C;&#xC815;&#xC5D4; &#xD558;&#xB8E8;&#xC5D0; &#xB300;&#xD55C; &#xAE30;&#xB300;&#xAC10;&#xACFC; &#xC124;&#xB818; &#xB9C8;&#xC800; &#xBB3B;&#xC5B4;&#xB09C;&#xB2E4;. &#xADF8;&#xB7F0; &#xBCC0;&#xC8FC;&#xAC00; &#xB2E8;&#xC9C0; &#xAE30;&#xC068;&#xB9CC;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xB294; &#xAC74; &#xC544;&#xB2C8;&#xB2E4;. &#xCCAD;&#xC18C;&#xBD80; &#xD6C4;&#xBC30; &#xB2E4;&#xCE74;&#xC2DC;&#xAC00; &#xAC11;&#xC790;&#xAE30; &#xC77C;&#xC744; &#xAD00;&#xB450;&#xC790; &#xB298;&#xC5B4;&#xB09C; &#xC77C;&#xC5D0; &#xADF8;&#xB294; &#xC9DC;&#xC99D;&#xC744; &#xB0B4;&#xAE30;&#xB3C4; &#xD558;&#xACE0;, &#xC5F0;&#xB77D;&#xC744; &#xB04A;&#xACE0; &#xC0B4;&#xB358; &#xB3D9;&#xC0DD;&#xACFC;&#xC758; &#xB9CC;&#xB0A8;&#xC5D0; &#xC624;&#xC5F4;&#xD558;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;. &#xB9C8;&#xC9C0;&#xB9C9;&#xC5D0; &#xCC28;&#xB97C; &#xBAB0;&#xBA70; &#xC6C3;&#xB294;&#xC9C0; &#xC6B0;&#xB294;&#xC9C0;&#xB3C4; &#xBAA8;&#xB974;&#xB294; &#xADF8;&#xC758; &#xD45C;&#xC815;&#xC5D0;&#xC11C; &#xAE30;&#xC068; &#xADF8;&#xB9AC;&#xACE0; &#xC2AC;&#xD514; &#xB9CC;&#xAC10;&#xC774; &#xAD50;&#xCC28;&#xD55C;&#xB2E4;. &#xACBD;&#xACC4;&#xB97C; &#xB118;&#xB098;&#xB4DC;&#xB294; &#xACB9;&#xCE68;&#xC774; &#xCC2C;&#xB780;&#xD55C; &#xC774;&#xC720;&#xB294; &#xADF8;&#xB0E5; &#xADF8; &#xC21C;&#xAC04;&#xC5D0;&#xB9CC; &#xC874;&#xC7AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC77C; &#xAC83;&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://gist.github.com/user-attachments/assets/f8a2dc11-aa46-4d70-84d7-0146af42b19c" class="kg-image" alt="&#xACB9;&#xCE68;&#xC758; &#xC544;&#xB984;&#xB2E4;&#xC6C0;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xC601;&#xD654; &lt;&#xD37C;&#xD399;&#xD2B8; &#xB370;&#xC774;&#xC988;(2024) &#x4E2D;&gt;</span></figcaption></figure><p>&#xAD00;&#xACC4;&#xB3C4; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB2E4;. &#xC6B0;&#xB9AC;&#xB294; &#xAC01;&#xC790; &#xC138;&#xACC4;&#xC5D0; &#xC0B4;&#xC544;&#xAC04;&#xB2E4;. &#xADF8;&#xB7EC;&#xBA74;&#xC11C; &#xC6B0;&#xC5F0;&#xD788; &#xD3EC;&#xAC1C;&#xC5B4;&#xC9C0;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;. &#xB098;&#xC758; &#xC138;&#xACC4;&#xB97C; &#xC54C;&#xC544;&#xBD10; &#xC900; &#xB204;&#xAD70;&#xAC00;&#xC5D0; &#xAC15;&#xD55C; &#xCE5C;&#xBC00;&#xAC10;&#xC744; &#xB290;&#xB07C;&#xAE30;&#xB3C4; &#xD55C;&#xB2E4;. 50&#xB300; &#xB0A8;&#xC131;&#xC778; &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xC640; 20&#xB300; &#xC5EC;&#xC131;&#xC778; &#xB2E4;&#xCE74;&#xC2DC; &#xC5EC;&#xC790; &#xCE5C;&#xAD6C;. &#xC804;&#xD600; &#xACB9;&#xCE60; &#xAC8C; &#xC5C6;&#xB358; &#xB450; &#xC778;&#xBB3C;&#xC774; &#x2018;&#xCE74;&#xC138;&#xD2B8; &#xD14C;&#xC774;&#xD504;&apos;&#xC758; &#xAC10;&#xC131;&#xACFC; &#xCDE8;&#xD5A5;&#xC5D0; &#xACF5;&#xAC10;&#xD560; &#xB54C;, &#xD788;&#xB85C;&#xC57C;&#xB9C8;&#xC640; 10&#xB300; &#xC870;&#xCE74; &#xB2C8;&#xCF54;&#xAC00; &#xAC01;&#xAC01; &#xD544;&#xB984; &#xCE74;&#xBA54;&#xB77C;&#xC640; &#xC544;&#xC774;&#xD3F0;&#xC73C;&#xB85C; &#xC77C;&#xB801;&#xC774;&#xB294; &#xADF8;&#xB9BC;&#xC790;&#xB97C; &#xD568;&#xAED8; &#xD3EC;&#xCC29;&#xD560; &#xB54C;. &#xC2DC;&#xB300;&#xC640; &#xC131;&#xBCC4;&#xC744; &#xB6F0;&#xC5B4;&#xB118;&#xC5B4; &#xD3EC;&#xAC1C;&#xC9C0;&#xB294; &#xADF8; &#xC21C;&#xAC04;&#xC744; &#xAE30;&#xC801;&#xC774;&#xB77C; &#xB9D0;&#xD558;&#xB294; &#xAC74; &#xACFC;&#xD55C; &#xC598;&#xAE38;&#xAE4C;. &#xC5D4;&#xB529; &#xD06C;&#xB808;&#xB527;&#xC774; &#xC62C;&#xB77C;&#xAC00;&#xBA74; &#xB9C8;&#xC9C0;&#xB9C9;&#xC73C;&#xB85C; &#xD55C; &#xBB38;&#xAD6C;&#xAC00; &#xB098;&#xD0C0;&#xB09C;&#xB2E4;. &apos;&#xCF54;&#xBAA8;&#xB808;&#xBE44;: &#xD754;&#xB4E4;&#xB9AC;&#xB294; &#xB098;&#xBB47;&#xC78E; &#xC0AC;&#xC774;&#xB85C; &#xC77C;&#xB801;&#xC774;&#xB294; &#xD587;&#xC0B4;&#xC744; &#xB73B;&#xD558;&#xB294; &#xC77C;&#xBCF8;&#xC5B4;&#xB85C; &#xCF54;&#xBAA8;&#xB808;&#xBE44;&#xB294; &#xADF8; &#xC21C;&#xAC04;&#xC5D0;&#xB9CC; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;&apos;<br><br>&#xCDE8;&#xD5A5;&#xC758; &#xD30C;&#xD3B8;&#xD654;. &#xCD08;&#xAC1C;&#xC778;&#xD654; &#xC2DC;&#xB300; &#xACB9;&#xCE68;&#xC758; &#xC601;&#xC5ED;&#xC740; &#xC810;&#xC810; &#xC904;&#xC5B4;&#xB4DC;&#xB294; &#xAC83;&#xB9CC; &#xAC19;&#xB2E4;. &#xB2E8;&#xC801;&#xC73C;&#xB85C; O,A,B,AB 4&#xBD84;&#xC758; 1&#xB85C; &#xC5F0;&#xACB0;&#xB418;&#xB358; &#xC6B0;&#xB9AC;&#xB294; &#xC774;&#xC81C;&#xB294; MBTI, 16&#xBD84;&#xC758; 1 &#xB354; &#xC801;&#xC740; &#xD655;&#xB960;&#xB85C; &#xACB9;&#xCE58;&#xAC8C; &#xB410;&#xB2E4;. &#xAC01;&#xC790; &#xACE0;&#xC720;&#xD55C; &#xB2E4;&#xC591;&#xC131;&#xC744; &#xC874;&#xC911;&#xD558;&#xBA74;&#xC11C;&#xB3C4; &#xC6B0;&#xB9AC;&#xAC00; &#xC5F0;&#xACB0;&#xB418;&#xB294; &#xC21C;&#xAC04;&#xC740; &#xADF8;&#xB798;&#xC11C; &#xB354; &#xC18C;&#xC911;&#xD558;&#xB2E4;. &#xD3EC;&#xAE30;&#xC640; &#xBC30;&#xB824;&#xB77C;&#xB294; &#xC704;&#xACC4;&#xC801; &#xCE35;&#xC704;&#xAC00; &#xC544;&#xB2CC; &#xC218;&#xD3C9;&#xC801;&#xC73C;&#xB85C; &#xACB9;&#xCE58;&#xB294; &#xC6B0;&#xB9AC;&#xC758; &#xC21C;&#xAC04;. &#xC2DC;&#xC120;&#xC758; &#xAC01;&#xB3C4;, &#xC6B0;&#xB9AC;&#xC758; &#xBAA8;&#xC591;, &#xACF5;&#xAC10;&#xC758; &#xC138;&#xAE30;&#xAC00; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xB294; &#xC21C;&#xAC04;&#xC758; &#xCC2C;&#xB780;&#xD568;.</p>]]></content:encoded></item><item><title><![CDATA[확신이 없다면 Checked Continuation을!]]></title><description><![CDATA[<p>URL&#xC758; &#xBBF8;&#xB9AC;&#xBCF4;&#xAE30; &#xC774;&#xBBF8;&#xC9C0;(&#xB300;&#xD45C; &#xC774;&#xBBF8;&#xC9C0;)&#xB97C; Apple&#xC758; <a href="https://developer.apple.com/documentation/linkpresentation?ref=noah-ios.dev">Link Presentation</a> &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xBD88;&#xB7EC;&#xC624;&#xB3C4;&#xB85D; &#xAC1C;&#xBC1C;&#xD558;&#xBA70; &#xD2B9;&#xC815; &#xB9C1;&#xD06C;&#xC758; &#xACBD;&#xC6B0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; continuation</p>]]></description><link>https://noah-ios.dev/checked-continuation/</link><guid isPermaLink="false">65fbd801c9efaff98fe3cddf</guid><category><![CDATA[Swift]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Thu, 21 Mar 2024 06:58:30 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1509475826633-fed577a2c71b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkZWJ1Z2luZ3xlbnwwfHx8fDE3MTEwMDQzNDV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1509475826633-fed577a2c71b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkZWJ1Z2luZ3xlbnwwfHx8fDE3MTEwMDQzNDV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xD655;&#xC2E0;&#xC774; &#xC5C6;&#xB2E4;&#xBA74; Checked Continuation&#xC744;!"><p>URL&#xC758; &#xBBF8;&#xB9AC;&#xBCF4;&#xAE30; &#xC774;&#xBBF8;&#xC9C0;(&#xB300;&#xD45C; &#xC774;&#xBBF8;&#xC9C0;)&#xB97C; Apple&#xC758; <a href="https://developer.apple.com/documentation/linkpresentation?ref=noah-ios.dev">Link Presentation</a> &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xBD88;&#xB7EC;&#xC624;&#xB3C4;&#xB85D; &#xAC1C;&#xBC1C;&#xD558;&#xBA70; &#xD2B9;&#xC815; &#xB9C1;&#xD06C;&#xC758; &#xACBD;&#xC6B0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; continuation misuse&#xB85C; &#xC778;&#xD55C; leak&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD558;&#xC5EC; &#xC8FC;&#xC758;&#xD560; &#xC810;&#xC5D0; &#xB300;&#xD574; &#xAE30;&#xB85D; &#xC0BC;&#xC544; &#xB0A8;&#xACA8;&#xBCF8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/assets/63908856/635b88ee-e995-437d-a178-85c8b15afcac" class="kg-image" alt="&#xD655;&#xC2E0;&#xC774; &#xC5C6;&#xB2E4;&#xBA74; Checked Continuation&#xC744;!" loading="lazy"></figure><p>&#xBB34;&#xC5C7;&#xC774; &#xBB38;&#xC81C;&#xC600;&#xB294;&#xC9C0;, &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xD655;&#xC778;&#xD574; &#xBCF4;&#xC790;</p><h2 id="before">Before</h2><pre><code class="language-swift">func requestPreviewImage() async throws -&gt; UIImage {
  let primaryImageProvider = self.linkMetadata?.imageProvider ?? self.linkMetadata?.iconProvider
  return try await withCheckedThrowingContinuation { continuation in
    primaryImageProvider?.loadObject(ofClass: UIImage.self) { (previewImage, error) in
      guard let previewImage = previewImage as? UIImage,
      error == nil
      else {
        continuation.resume(throwing: LinkMetadataServiceError.contentsCouldNotBeLoaded)
        return
      }
		
      continuation.resume(returning: previewImage)
    }
  }
}
</code></pre><p>&#xAE30;&#xC874; completion Handler &#xAE30;&#xBC18;&#xC758; &#xCF54;&#xB4DC;&#xB97C; Swift Concurrency&#xB85C; bridge &#xD574;&#xC8FC;&#xAE30; &#xC704;&#xD574; CheckedContinuation&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC8FC;&#xC5C8;&#xB2E4;.</p><p>CheckedContinuation&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC8FC;&#xC5C8;&#xAE30;&#xC5D0; &#xB514;&#xBC84;&#xAE45; &#xCF58;&#xC194;&#xC5D0;&#xC11C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><pre><code>SWIFT TASK CONTINUATION MISUSE: requestPreviewImage() leaked its continuation!</code></pre><h3 id="%EC%96%B4%EB%94%94%EA%B0%80-%EB%AC%B8%EC%A0%9C%EC%98%80%EC%9D%84%EA%B9%8C">&#xC5B4;&#xB514;&#xAC00; &#xBB38;&#xC81C;&#xC600;&#xC744;&#xAE4C;?</h3><p><code>imageProvider</code>, <code>iconProvider</code>&#xC5D0; &#xBAA8;&#xB450; nil&#xC774; &#xD560;&#xB2F9;&#xB418;&#xC5B4; <code>primaryImageProvider</code> &#xC5D0; nil&#xC774; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB41C;&#xB2E4;&#xBA74;?</p><pre><code class="language-swift">func requestPreviewImage() async throws -&gt; UIImage {
  let primaryImageProvider = self.linkMetadata?.imageProvider ?? self.linkMetadata?.iconProvider
  return try await withCheckedThrowingContinuation { continuation in
    primaryImageProvider?.loadObject(ofClass: UIImage.self) { (previewImage, error) in
      guard let previewImage = previewImage as? UIImage,
      error == nil
      else {
        continuation.resume(throwing: LinkMetadataServiceError.contentsCouldNotBeLoaded)
        return
      }
		
      continuation.resume(returning: previewImage)
    }

    // nil&#xC77C; &#xACBD;&#xC6B0; &#xC624;&#xAC8C;&#xB418;&#xB294; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;
  }
}
</code></pre><p><a href="https://docs.swift.org/swift-book/documentation/the-swift-programming-language/optionalchaining/?ref=noah-ios.dev#Calling-Methods-Through-Optional-Chaining">Optional Chaining</a>&#xC744; &#xC774;&#xC6A9;&#xD574; &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD588;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; nil&#xB85C; &#xD3C9;&#xAC00;&#xB418;&#xC5B4; loadObject&#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xACE0; &#xB2E4;&#xC74C; &#xCEE8;&#xD14D;&#xC2A4;&#xD2B8;&#xB85C; &#xB118;&#xC5B4;&#xAC00;&#xAC8C; &#xB41C;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; continuation&#xC758; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xAC8C; &#xB418;&#xC5B4; continuation misuse&#xB85C; &#xC778;&#xD55C; leak&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB41C;&#xB2E4;.</p><p>&#xBB38;&#xC81C;&#xB97C; &#xC54C;&#xAC8C; &#xB418;&#xC5C8;&#xC73C;&#xB2C8;, &#xCF54;&#xB4DC;&#xB97C; &#xC218;&#xC815;&#xD574; &#xBCF4;&#xC790;</p><h2 id="after">After</h2><pre><code class="language-swift">
func requestPreviewImage() async throws -&gt; UIImage {
  guard let linkMetadata = self.linkMetadata,
        let primaryImageProvider = linkMetadata.imageProvider ?? linkMetadata.iconProvider,
        primaryImageProvider.canLoadObject(ofClass: UIImage.self)
  else { throw LinkMetadataServiceError.contentsCouldNotBeLoaded }
		
  return try await withCheckedThrowingContinuation { continuation in
    primaryImageProvider.loadObject(ofClass: UIImage.self) { (previewImage, error) in
      guard let previewImage = previewImage as? UIImage,
      error == nil
      else {
        continuation.resume(throwing: LinkMetadataServiceError.contentsCouldNotBeLoaded)
        return
      }
  
      continuation.resume(returning: previewImage)
    }
  }
}
</code></pre><p>guard &#xAD6C;&#xBB38;&#xC5D0;&#xC11C; Optional Binding&#xC744; &#xD574;&#xC8FC;&#xACE0;, NSItemProvider&#xC758; <a href="https://developer.apple.com/documentation/foundation/nsitemprovider/2888333-canloadobject?ref=noah-ios.dev">canLoadObject(ofClass:)</a><br>&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xAC1D;&#xCCB4;&#xB97C; &#xB85C;&#xB4DC;&#xD560; &#xC218; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD55C; &#xB4A4;&#xC5D0; &#xC870;&#xAC74;&#xBB38;&#xC744; &#xD1B5;&#xACFC;&#xD558;&#xC9C0; &#xBABB;&#xD55C;&#xB2E4;&#xBA74; &#xC5D0;&#xB7EC;&#xB97C; throw&#xD558;&#xBA70; early exit&#xD558;&#xB3C4;&#xB85D; &#xD574;&#xC8FC;&#xC5B4; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://gist.github.com/assets/63908856/a594c058-0a33-4e81-a86d-dc2e40b15f10" class="kg-image" alt="&#xD655;&#xC2E0;&#xC774; &#xC5C6;&#xB2E4;&#xBA74; Checked Continuation&#xC744;!" loading="lazy"></figure><h1 id="conclusion">Conclusion</h1><p>continuation&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xB54C;&#xB294; &#xCF54;&#xB4DC; &#xC2E4;&#xD589; &#xACBD;&#xB85C;&#xC5D0;&#xC11C; resume&#xC740; &#xCF54;&#xB4DC; &#xC2E4;&#xD589; &#xACBD;&#xB85C;&#xC5D0;&#xC11C; &#xB531; &#xD55C; &#xBC88; &#xD638;&#xCD9C;&#xB418;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC5D0; &#xC720;&#xC758;&#xD574;&#xC11C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xB2E4; &#xBCF4;&#xB2C8; &#xB450; &#xBC88; &#xC774;&#xC0C1; &#xD638;&#xCD9C;&#xD558;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xBD80;&#xBD84;&#xC740; &#xC2E0;&#xACBD;&#xC744; &#xC37C;&#xC5C8;&#xB294;&#xB370;,</p><p>&#xC774;&#xBC88; &#xACBD;&#xC6B0;&#xCC98;&#xB7FC; &#xD55C; &#xBC88;&#xB3C4; &#xD638;&#xCD9C;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xC2E0;&#xACBD;&#xC744; &#xC4F0;&#xC9C0; &#xBABB;&#xD588;&#xB358; &#xAC83; &#xAC19;&#xB2E4;.</p><p>&#xADF8;&#xB798;&#xB3C4; &#xB2E4;&#xD589;&#xC778; &#xBD80;&#xBD84;&#xC740; <a href="https://developer.apple.com/documentation/swift/withcheckedthrowingcontinuation(function:_:)?ref=noah-ios.dev">withCheckedThrowingContinuation(function:_:)</a>&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xAE30;&#xC5D0; &#xBE60;&#xB974;&#xAC8C; &#xBB38;&#xC81C;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB2E4;.</p><p>checkedContinuation&#xC740; &#xB7F0;&#xD0C0;&#xC784;&#xC5D0; misuse&#xC5D0; &#xB300;&#xD55C; &#xAC80;&#xC0AC;&#xB97C; &#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; unsafeContinuation&#xBCF4;&#xB2E4; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xC788;&#xAE34; &#xD558;&#xC9C0;&#xB9CC;, &#xC774;&#xCC98;&#xB7FC; &#xAC1C;&#xBC1C;&#xC744; &#xD558;&#xB294; &#xACFC;&#xC815; &#xC911;&#xC5D0; &#xBE60;&#xB974;&#xAC8C; &#xBB38;&#xC81C;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB3C4;&#xC640;&#xC8FC;&#xC5B4; misuse&#xC5D0; &#xB300;&#xD55C; &#xD655;&#xC2E0;&#xC774; &#xC5C6;&#xB294; &#xACBD;&#xC6B0;&#xC5D0; &#xC88B;&#xC740; &#xAC83; &#xAC19;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[Swift Concurrency 이전의 동시성 프로그래밍]]></title><description><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;! &#xC624;&#xB298;&#xC740; Swift Concurrency&#xAC00; &#xB4F1;&#xC7A5;&#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0;&#xB294; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC5B4;&#xB5A0;&#xD55C; &#xB3C4;&#xAD6C;&#xB4E4;&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xB294;&#xC9C0;</p>]]></description><link>https://noah-ios.dev/swift-concurrency/</link><guid isPermaLink="false">65f039718ca412ea7a800a48</guid><category><![CDATA[Swift]]></category><category><![CDATA[Computer-Science]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Tue, 12 Mar 2024 11:58:20 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1598533463912-68adac0b8231?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fHBhcmFsbGVsfGVufDB8fHx8MTcxMDI0MTU4Mnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><img src="https://images.unsplash.com/photo-1598533463912-68adac0b8231?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fHBhcmFsbGVsfGVufDB8fHx8MTcxMDI0MTU4Mnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Swift Concurrency &#xC774;&#xC804;&#xC758; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;"><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;! &#xC624;&#xB298;&#xC740; Swift Concurrency&#xAC00; &#xB4F1;&#xC7A5;&#xD558;&#xAE30; &#xC774;&#xC804;&#xC5D0;&#xB294; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC5B4;&#xB5A0;&#xD55C; &#xB3C4;&#xAD6C;&#xB4E4;&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xB294;&#xC9C0;, &#xC5B4;&#xB5A0;&#xD55C; &#xB9E5;&#xB77D;&#xC73C;&#xB85C; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xB3C4;&#xC640;&#xC8FC;&#xB294; &#xB3C4;&#xAD6C;&#xB4E4;&#xC774; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xB354; &#xB098;&#xC544;&#xAC00; Swift Concurrency&#xB294; &#xC5B4;&#xB5A0;&#xD55C; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="thread">Thread</h2><p>&#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xD560; &#xB54C; &apos;&#xC2A4;&#xB808;&#xB4DC;&apos;&#xB77C;&#xB294; &#xB2E8;&#xC5B4;&#xAC00; &#xB9CE;&#xC774; &#xC5B8;&#xAE09;&#xB418;&#xB294;&#xB370;&#xC694;, &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB9CE;&#xC774; &#xC4F0;&#xBA74; &#xC4F8;&#xC218;&#xB85D; &#xB354; &#xB9CE;&#xC740; &#xC791;&#xC5C5;&#xC744; &#xB3D9;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xC73C;&#xB2C8;, &#xC2A4;&#xB808;&#xB4DC;&#xB294; &#xB9CE;&#xC744;&#xC218;&#xB85D; &#xC88B;&#xC740; &#xAC78;&#xAE4C;&#xC694;?</p><blockquote>&quot;&#xB3D9;&#xC2DC;&quot;&#xB77C;&#xB294; &#xB2E8;&#xC5B4;&#xC5D0; &#xB300;&#xD55C; &#xB9E5;&#xB77D;&#xC740; <a href="https://noah-ios.dev/concurrency-vs-parallel/" rel="noreferrer">&#xC774;&#xC804; &#xD3EC;&#xC2A4;&#xD2B8;</a>&#xC640; &#xAC19;&#xC774;&#xD569;&#xB2C8;&#xB2E4;!</blockquote><p>&#xC544;&#xB798;&#xC758; &#xD45C;&#xB97C; &#xBCFC;&#xAE4C;&#xC694;?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://gist.github.com/assets/63908856/5af6331e-895d-42b2-87a3-b31a6bfe3bca" class="kg-image" alt="Swift Concurrency &#xC774;&#xC804;&#xC758; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xCD9C;&#xCC98; : </span><a href="https://www.baeldung.com/cs/servers-threads-number?ref=noah-ios.dev"><span style="white-space: pre-wrap;">https://www.baeldung.com/cs/servers-threads-number</span></a></figcaption></figure><p>&#xC2A4;&#xB808;&#xB4DC;&#xC758; &#xC218;&#xAC00; &#xB9CE;&#xC544;&#xC9D0;&#xC5D0; &#xB530;&#xB77C; &#xD37C;&#xD3EC;&#xBA3C;&#xC2A4;(&#xC2DC;&#xAC04; &#xB2F9; &#xC791;&#xC5C5;&#xD6A8;&#xC728;)&#xAC00; &#xC62C;&#xB77C;&#xAC00;&#xC9C0;&#xB9CC;, &#xC5B4;&#xB290; &#xC21C;&#xAC04;&#xBD80;&#xD130;&#xB294; &#xB354; &#xC774;&#xC0C1; &#xD37C;&#xD3EC;&#xBA3C;&#xC2A4;&#xAC00; &#xD5A5;&#xC0C1;&#xB418;&#xC9C0; &#xC54A;&#xB294; &#xAD6C;&#xAC04;&#xC774; &#xB098;&#xD0C0;&#xB098;&#xB294;&#xB370;&#xC694;,</p><p>&#xC774;&#xB294; CPU&#xC758; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xB9CE;&#xC544;&#xC9C8;&#xC218;&#xB85D; &#xC2A4;&#xB808;&#xB4DC; &#xC2A4;&#xC704;&#xCE6D; &#xB4F1;&#xC758; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB418;&#xC5B4; &#xCF54;&#xC5B4;&#xB2F9; &#xC77C;&#xC815; &#xC218;&#xC758; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xB118;&#xC5B4;&#xAC00;&#xAC8C; &#xB420; &#xACBD;&#xC6B0; &#xC131;&#xB2A5;&#xC5D0; &#xC88B;&#xC9C0; &#xC54A;&#xC740; &#xC601;&#xD5A5;&#xC744; &#xBBF8;&#xCE58;&#xAC8C; &#xB418;&#xAE30; &#xB54C;&#xBB38;&#xC785;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC774;&#xB97C; thread-explosion&#xC774;&#xB77C;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</blockquote><p>&#xB530;&#xB77C;&#xC11C; &#xB300;&#xBD80;&#xBD84;&#xC758; CPU &#xC81C;&#xC870;&#xC0AC;&#xB294; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xC544;&#xB2CC;, &#xCF54;&#xC5B4; &#xC218;&#xB97C; &#xC99D;&#xAC00;&#xC2DC;&#xCF1C; &#xBCD1;&#xB82C;&#xCC98;&#xB9AC;&#xB85C; &#xC778;&#xD55C; &#xC131;&#xB2A5; &#xD5A5;&#xC0C1;&#xC744; &#xAF80;&#xD558;&#xB294; &#xC2DD;&#xC73C;&#xB85C; CPU&#xB97C; &#xBC1C;&#xC804;&#xC2DC;&#xCF1C; &#xB098;&#xAC00;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB298;&#xC5B4;&#xB09C; &#xCF54;&#xC5B4;&#xB9CC;&#xD07C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xCEF4;&#xD4E8;&#xD130;&#xAC00; &#xBE68;&#xB77C;&#xC84C;&#xB2E4;&#xB294;&#xAC78; &#xB290;&#xB07C;&#xAC8C; &#xD558;&#xB824;&#xBA74; &#xC2A4;&#xB808;&#xB4DC;&#xB294; CPU &#xCF54;&#xC5B4; &#xC218;&#xC5D0; &#xB9DE;&#xCD94;&#xC5B4; &#xC801;&#xB2F9;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xACE0;, &#xB9CC;&#xB4E4;&#xC5B4;&#xB193;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xB3CC;&#xC544;&#xAC00;&#xB294; &#xCF54;&#xB4DC;&#xB4E4;&#xC744; &#xBE60;&#xB974;&#xAC8C; &#xB2E4;&#xB978; &#xCF54;&#xB4DC;&#xB85C; &#xAD50;&#xCCB4;&#xD574; &#xC918;&#xC57C; &#xD6A8;&#xC728;&#xC801;&#xC73C;&#xB85C; &#xB3CC;&#xC544;&#xAC00;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xB290;&#xB07C;&#xAC8C; &#xB420; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xD504;&#xB85C;&#xC138;&#xC2A4; &#xB0B4;&#xC758; user-level &#xC2A4;&#xB808;&#xB4DC; &#xC5ED;&#xC2DC; &#xB3D9;&#xC77C;&#xD55C; &#xB17C;&#xB9AC;&#xB97C; &#xB530;&#xB985;&#xB2C8;&#xB2E4;.</p><blockquote>&#xBC29;&#xAE08; &#xC5B8;&#xAE09;&#xD55C; &#xC2A4;&#xB808;&#xB4DC;&#xB294; CPU &#xCF54;&#xC5B4;&#xC5D0;&#xC11C; &#xB3D9;&#xC791;&#xD558;&#xB294; CPU &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;.<br>&#xBC11;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF4;&#xACA0;&#xC9C0;&#xB9CC; &#xC6B0;&#xB9AC;&#xAC00; &#xC774;&#xBC88; &#xAE00;&#xC5D0;&#xC11C; &#xB2E4;&#xB8E8;&#xAC8C; &#xB420; &#xC2A4;&#xB808;&#xB4DC;&#xB294; user-level &#xC2A4;&#xB808;&#xB4DC;, &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xB0B4;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xB418;&#xB294; &#xC138;&#xBD80; &#xC791;&#xC5C5;&#xC758; &#xB2E8;&#xC704;&#xC785;&#xB2C8;&#xB2E4;.<br>&#xB530;&#xB77C;&#xC11C; &#xC544;&#xB798;&#xC758; &#xAE00;&#xC5D0;&#xC11C; &#xB4F1;&#xC7A5;&#xD558;&#xB294; &#xC2A4;&#xB808;&#xB4DC;&#xB294; &#xD2B9;&#xBCC4;&#xD55C; &#xC5B8;&#xAE09;&#xC774; &#xC5C6;&#xB294; &#xC774;&#xC0C1; user-level &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4; :)</blockquote><p>&#xB530;&#xB77C;&#xC11C; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D; &#xBC29;&#xC2DD;&#xB3C4; &#xC5ED;&#xC2DC; &#xACFC;&#xB3C4;&#xD558;&#xAC8C; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB9CE;&#xC774; &#xB9CC;&#xB4E4;&#xC5B4; &#xC2A4;&#xB808;&#xB4DC; &#xC2A4;&#xC704;&#xCE58;&#xC640; &#xAC19;&#xC740; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xB97C; &#xBE44;&#xC6A9;&#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xB294; &#xAC83;&#xBCF4;&#xB2E4; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xB9CC;&#xB4E4;&#xC5B4; &#xB193;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0; &#xC2E4;&#xD589;&#xD560; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xB0B4;&#xB294; &#xC2DD;&#xC73C;&#xB85C; &#xBC1C;&#xC804;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC560;&#xD50C; &#xAC1C;&#xBC1C; &#xC0DD;&#xD0DC;&#xACC4;&#xC5D0;&#xC11C;&#xB3C4; &#xC5ED;&#xC2DC; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xC0AC;&#xC6A9;&#xD558;&#xB294; API&#xAC00; &#xC788;&#xC9C0;&#xB9CC;, &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D; &#xBC29;&#xC2DD;&#xC774; &#xBCC0;&#xD654;&#xD568;&#xC5D0; &#xB530;&#xB77C; &#xC774;&#xC81C;&#xB294; &#xC798; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC2A4;&#xB808;&#xB4DC;, &#xD55C;&#xBC88; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCFC;&#xAE4C;&#xC694;?</p><h2 id="nsthread">NSThread</h2><p>URL&#xB85C;&#xBD80;&#xD130; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC628; &#xD6C4;, &#xCF58;&#xC194;&#xC5D0; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD55C; &#xB2E4;&#xC74C;, &#xC2A4;&#xB808;&#xB4DC;&#xB97C;&#xC0DD;&#xC131;&#xD55C; &#xD6C4;&#xC5D0; &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB97C; &#xC0DD;&#xC131;&#xD55C; user-level &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xAC04;&#xB2E8;&#xD55C; &#xC608;&#xC81C;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBD05;&#xC2DC;&#xB2E4;.</p><p>&#xBA3C;&#xC800; URL&#xB85C;&#xBD80;&#xD130; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC628; &#xD6C4;, &#xCF58;&#xC194;&#xC5D0; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD574; &#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-swift">func fetchAndPrintHTML(from url: URL) {
  let responseData = try! Data(contentsOf: url)
  print(String(data: responseData, encoding: .utf8)!)
}</code></pre><p>&#xC704; &#xD568;&#xC218;&#xC758; &#xCCAB; &#xBC88;&#xC9F8; &#xC904;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xD30C;&#xB77C;&#xBBF8;&#xD130;&#xB85C; &#xBC1B;&#xC740; url&#xC744; &#xC774;&#xC6A9;&#xD574; <a href="https://developer.apple.com/documentation/foundation/nsdata/1413892-init?ref=noah-ios.dev">Data</a> &#xC0DD;&#xC131;&#xC790;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC774; &#xC644;&#xB8CC;&#xB420; &#xB54C;&#xAE4C;&#xC9C0; &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xCC28;&#xB2E8;&#xB420; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB2E4;&#xC74C;&#xC73C;&#xB85C; &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB97C; &#xC2E4;&#xD589;&#xD560; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private var networkRequestThread: Thread? = nil

  func startRequest() {
    self.networkRequestThread = Thread(
      target: self,
      selector: #selector(self.fetchAndPrintHTML(from:)),
      object: URL(string: &quot;https://www.naver.com&quot;)!
    )
    self.networkRequestThread?.start()
  }
}

</code></pre><p><code>startRequest</code> &#xD568;&#xC218;&#xC5D0;&#xC11C;&#xB294; NSThread(&#xC77C;&#xBA85; Cocoa thread)&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xC8FC;&#xACE0; &#xC788;&#xB294;&#xB370;&#xC694;, NSThread&#xB294; &#xC774;&#xBBF8; &#xC2E4;&#xD589; &#xC911;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC0C8; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xB370; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB294; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</p><p>NSThread&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC740; &#xD06C;&#xAC8C; &#xB450; &#xAC00;&#xC9C0;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>&#xC0C8; NSThread &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xACE0; start &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xACFC;</li><li><code>detachNewThreadSelector:toTarget:withObject:</code> &#xD074;&#xB798;&#xC2A4; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xC0C8; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ol><blockquote>&#xACF5;&#xC2DD; &#xBB38;&#xC11C; &#xCC38;&#xC870;: <a href="https://developer.apple.com/documentation/foundation/thread?ref=noah-ios.dev">https://developer.apple.com/documentation/foundation/thread</a></blockquote><p>&#xC774; &#xBC29;&#xBC95; &#xC911; &#xCCAB; &#xBC88;&#xC9F8; &#xBC29;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD574; NSThread &#xAC1D;&#xCCB4;&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xC8FC;&#xC5C8;&#xB294;&#xB370;&#xC694;,</p><pre><code class="language-swift">self.networkRequestThread = Thread(
  target: self,
  selector: #selector(self.fetchAndPrintHTML(from:)),
  object: URL(string: &quot;https://www.naver.com&quot;)!
)
</code></pre><p>&#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xD560; &#xBA54;&#xC11C;&#xB4DC;&#xAC00; &#xC18D;&#xD55C; &#xAC1D;&#xCCB4;&#xC640;, &#xC2E4;&#xD589;&#xD560; &#xBA54;&#xC11C;&#xB4DC;, &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD560; &#xB54C; &#xD544;&#xC694;&#xD55C; &#xAC1D;&#xCCB4;&#xB97C; &#xC9C0;&#xC815;&#xD574; &#xC8FC;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB2E4;&#xC74C;</p><pre><code class="language-swift">self.networkRequestThread?.start()
</code></pre><p>&#xC2A4;&#xB808;&#xB4DC;&#xC758; start &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC2DC;&#xC791;&#xD574; &#xC8FC;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD55C; &#xD6C4;, &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB97C; NSThread &#xC0DD;&#xC131;&#xC790;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC0DD;&#xC131;&#xD55C; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB418;&#xC5C8;&#xB294;&#xB370;&#xC694;, &#xC774;&#xC81C; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xB2E4;&#xC2DC; &#xAD6C;&#xC131;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private var networkRequestThread: Thread? = nil
	
  func startRequest() {
    self.networkRequestThread = Thread(
      target: self,
      selector: #selector(self.fetchAndPrintHTML(from:)),
      object: URL(string: &quot;https://www.naver.com&quot;)!
    )
    self.networkRequestThread?.start()
  }

  @objc private func fetchAndPrintHTML(from url: URL) {
    let responseData = try! Data(contentsOf: url)
    print(String(data: responseData, encoding: .utf8)!)
  }
	
  deinit {
    self.networkRequestThread?.cancel()
    self.networkRequestThread = nil
  }
}
</code></pre><blockquote><code>#selector</code> &#xC5D0; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xD568;&#xC218;&#xB294; Objective-C&#xC5D0;&#xC11C; &#xD638;&#xCD9C;&#xB420; &#xC218; &#xC788;&#xB3C4;&#xB85D; @objc &#xD0A4;&#xC6CC;&#xB4DC;&#xAC00; &#xBD99;&#xC5B4;&#xC788;&#xC5B4;&#xC57C; &#xD558;&#xBBC0;&#xB85C; &#xC704;&#xC5D0;&#xC11C; &#xC791;&#xC131;&#xD55C; &#xD568;&#xC218;&#xC5D0; @objc &#xD0A4;&#xC6CC;&#xB4DC;&#xB97C; &#xBD99;&#xC5EC;&#xC8FC;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD574; &#xBCFC;&#xAE4C;&#xC694;?</p><pre><code class="language-swift">let networkRequestManager = NetworkRequestManager()
networkRequestManager.startRequest()
print(&quot;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&quot;)

RunLoop.main.run()
</code></pre><p>&#xB9CC;&#xC57D; startRequest&#xD568;&#xC218;&#xAC00; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xD588;&#xB2E4;&#xBA74;, startRequest&#xD568;&#xC218; &#xB0B4;&#xBD80;&#xC758; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC774; &#xC644;&#xB8CC;&#xB41C; &#xD6C4;&#xC5D0; &quot;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&quot;&#xB77C;&#xB294; &#xBB38;&#xC790;&#xC5F4;&#xC774; &#xCD9C;&#xB825;&#xB418;&#xC5C8;&#xC744; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7EC;&#xB098;, &#xC6B0;&#xB9AC;&#xB294; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD55C; &#xD6C4;&#xC5D0; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD55C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xD574;&#xB2F9; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD558;&#xB3C4;&#xB85D; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD588;&#xC73C;&#xBA70;, &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xBCF4;&#xB2E4; &#xCF58;&#xC194;&#xC5D0; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC740; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xBE60;&#xB974;&#xAC8C; &#xC2E4;&#xD589;&#xB418;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xCF58;&#xC194;&#xC5D0;&#xC11C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xACB0;&#xACFC;&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-text">&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;
   &lt;!doctype html&gt; &lt;html lang=&quot;ko&quot; class=&quot;fzoom&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;meta name=&quot;Referrer&quot; content=&quot;origin&quot;&gt; &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=1190&quot;&gt; &lt;title&gt;NAVER&lt;/title&gt; &lt;meta name=&quot;apple-mobile-web-app-title&quot; content=&quot;NAVER&quot;/&gt; &lt;meta name=&quot;robots&quot; content=&quot;index,nofollow&quot;/&gt; &lt;meta name=&quot;description&quot; content=&quot;&#xB124;&#xC774;&#xBC84; &#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC720;&#xC6A9;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xB9CC;&#xB098; &#xBCF4;&#xC138;&#xC694;&quot;/&gt; &lt;meta property=&quot;og:title&quot; content=&quot;&#xB124;&#xC774;&#xBC84;&quot;&gt; &lt;meta property=&quot;og:url&quot; content=&quot;https://www.naver.com/&quot;&gt; &lt;meta property=&quot;og:image&quot; content=&quot;https://s.pstatic.net/static/www/mobile/edit/2016/0705/mobile_212852414260.png&quot;&gt; &lt;meta property=&quot;og:description&quot; content=&quot;&#xB124;&#xC774;&#xBC84; &#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC720;&#xC6A9;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xB9CC;&#xB098; &#xBCF4;&#xC138;&#xC694;&quot;/&gt; &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;&gt; 
/ ... /</code></pre><p>Swift&#xC5D0;&#xC11C; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC704;&#xC640; &#xAC19;&#xC740; &#xBC29;&#xBC95;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xAC70;&#xB098; &#xC870;&#xAE08; &#xB354; &#xBCF5;&#xC7A1;&#xD558;&#xACE0;, &#xC138;&#xBD80;&#xC801;&#xC778; &#xC791;&#xC5C5;&#xC774; &#xD544;&#xC694;&#xD558;&#xB2E4;&#xBA74; NSThread&#xB97C; &#xC0C1;&#xC18D;&#xD55C; &#xD6C4;&#xC5D0; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBC29;&#xAE08; &#xC6B0;&#xB9AC;&#xAC00; &#xC0B4;&#xD3B4;&#xBCF8; &#xBC29;&#xC2DD;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xC5B4;&#xB5A4; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xC788;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD55C; &#xD6C4;&#xC5D0; &#xD2B9;&#xC815; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xD574;&#xB2F9; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xACB0;&#xC815;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC55E;&#xC11C;</p><blockquote>&quot;&#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D; &#xBC29;&#xC2DD;&#xB3C4; &#xACFC;&#xB3C4;&#xD558;&#xAC8C; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB9CE;&#xC774; &#xB9CC;&#xB4E4;&#xC5B4; &#xC2A4;&#xB808;&#xB4DC; &#xC2A4;&#xC704;&#xCE58;&#xC640; &#xAC19;&#xC740; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xB97C; &#xBE44;&#xC6A9;&#xC744; &#xBC1C;&#xC0DD;&#xC2DC;&#xD0A4;&#xB294; &#xAC83;&#xBCF4;&#xB2E4; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xB9CC;&#xB4E4;&#xC5B4; &#xB193;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0; &#xC2E4;&#xD589;&#xD560; &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xB0B4;&#xB294; &#xC2DD;&#xC73C;&#xB85C; &#xBC1C;&#xC804;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.&quot;</blockquote><p>&#xB77C;&#xB294; &#xB9D0;&#xC744; &#xD588;&#xC5C8;&#xB294;&#xB370;&#xC694;, &#xC6B0;&#xB9AC;&#xAC00; &#xBC29;&#xAE08; &#xC0B4;&#xD3B4;&#xBCF8; &#xBC29;&#xC2DD;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xB294; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xACFC;&#xB3C4;&#xD558;&#xAC8C; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xB9CE;&#xC774; &#xC0DD;&#xC131;&#xB420; &#xC218; &#xC788;&#xB294; &#xBB38;&#xC81C;&#xC640; &#xC5EC;&#xB7EC; &#xD734;&#xBA3C; &#xC5D0;&#xB7EC;&#xC758; &#xBC1C;&#xC0DD;&#xC704;&#xD5D8;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; &#xC774;&#xB97C; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xC791;&#xC131;&#xD588;&#xB294;&#xC9C0; &#xAC80;&#xC99D;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xB514;&#xBC84;&#xAE45;, &#xD14C;&#xC2A4;&#xD305; &#xBE44;&#xC6A9;&#xC744; &#xC9C0;&#xBD88;&#xD574;&#xC57C;&#xD560; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xB4A4;&#xC5D0; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB420; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xB3C4;&#xC640;&#xC8FC;&#xB294; &#xB3C4;&#xAD6C;&#xB4E4;&#xC740; CPU &#xCF54;&#xC5B4; &#xAC1C;&#xC218;&#xC5D0; &#xB9DE;&#xAC8C; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xB9CC;&#xB4E4;&#xC5B4;&#xB193;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC744; &#xB3C4;&#xC785;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xACB0;&#xAD6D; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xC758; &#xB2E8;&#xC704;&#xB294; &#xD074;&#xB85C;&#xC838;&#xAC00; &#xB418;&#xACE0;, &#xD574;&#xB2F9; &#xD074;&#xB85C;&#xC838;&#xB97C; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xD050;&#xC5D0; &#xC81C;&#xCD9C;&#xD558;&#xACE0;, &#xD050;&#xC5D0; &#xC788;&#xB294; &#xD074;&#xB85C;&#xC800;&#xB97C;&#xAC00;&#xC6A9;&#xD55C; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xBD84;&#xBC30;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC774; <a href="https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40008091-CH102-SW1">Grand Central Dispatch(GCD)</a>&#xC785;&#xB2C8;&#xB2E4;.</p><h2 id="grand-central-dispatch">Grand Central Dispatch</h2><p>GCD&#xB97C; &#xC774;&#xC6A9;&#xD574;, &#xC55E;&#xC11C; &#xBCF4;&#xC558;&#xB358; &#xC608;&#xC81C;&#xC778; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xAD6C;&#xC131;&#xD55C; &#xB2E4;&#xC74C;, &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xB97C; &#xB2E4;&#xB978; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; &#xC608;&#xC81C;&#xB97C; &#xCD5C;&#xB300;&#xD55C; &#xBE44;&#xC2B7;&#xD558;&#xAC8C; &#xB2E4;&#xC2DC; &#xB9CC;&#xB4E4;&#xC5B4;&#xBD05;&#xC2DC;&#xB2E4;.</p><p>&#xBA3C;&#xC800; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xAD00;&#xB9AC;&#xD560; &#xD050;&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD569;&#xC2DC;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private let networkRequestQueue = DispatchQueue(
    label: &quot;com.example.networkRequestQueue&quot;
  )
}
</code></pre><p><code>DispatchQueue(label:)</code> &#xC0DD;&#xC131;&#xC790;&#xB97C; &#xC774;&#xC6A9;&#xD574; private concurrent queue&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xC8FC;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C; &#xD074;&#xB85C;&#xC800; &#xB2E8;&#xC704;&#xC758; &#xC791;&#xC5C5;&#xC744; &#xCEA1;&#xC290;&#xD654;&#xD558;&#xB294; DispatchWorkItem&#xC744; &#xC120;&#xC5B8;&#xD574; &#xC8FC;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private let networkRequestQueue = DispatchQueue(
    label: &quot;com.example.networkRequestQueue&quot;
  )
  private var fetchHTMLWorkItem: DispatchWorkItem? = nil
}
</code></pre><p>&#xC55E;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xC608;&#xC81C;&#xC640; &#xAC19;&#xC774; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xD55C; &#xD6C4;&#xC5D0; &#xC751;&#xB2F5;&#xC744; &#xCF58;&#xC194;&#xC5D0; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xCD94;&#xAC00;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private let networkRequestQueue = DispatchQueue(
    label: &quot;com.example.networkRequestQueue&quot;
  )
  private var fetchHTMLWorkItem: DispatchWorkItem?

  private func fetchAndPrintHTML(from url: URL) {
    let responseData = try! Data(contentsOf: url)
    print(String(data: responseData, encoding: .utf8)!)
  }
}
</code></pre><p>&#xC774;&#xC81C; &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xAE30; &#xC704;&#xD574; &#xD050;&#xC5D0; &#xC791;&#xC5C5;&#xC744; &#xC81C;&#xCD9C;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xCD94;&#xAC00;&#xD574; &#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private let networkRequestQueue = DispatchQueue(
    label: &quot;com.example.networkRequestQueue&quot;
  )
  private var fetchHTMLWorkItem: DispatchWorkItem?

  private func fetchAndPrintHTML(from url: URL) {
    let responseData = try! Data(contentsOf: url)
    print(String(data: responseData, encoding: .utf8)!)
  }
	
  func startRequest() {
    self.fetchHTMLWorkItem = DispatchWorkItem {
      self.fetchAndPrintHTML(from: URL(string: &quot;https://www.naver.com&quot;)!)
    }
    
    if let workItem = self.fetchHTMLWorkItem {
      self.networkRequestQueue.async(execute: workItem)
    }
  }

  deinit {
    self.fetchHTMLWorkItem?.cancel()
  }
}
</code></pre><p>&#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC; &#xC608;&#xC81C;&#xB97C; &#xC2E4;&#xD589;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">let networkRequestManager = NetworkRequestManager()
networkRequestManager.startRequest()

print(&quot;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&quot;)

RunLoop.main.run()
</code></pre><p>&#xACB0;&#xACFC;&#xB97C; &#xD655;&#xC778;&#xD574; &#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-text">&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;
   &lt;!doctype html&gt; &lt;html lang=&quot;ko&quot; class=&quot;fzoom&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;meta name=&quot;Referrer&quot; content=&quot;origin&quot;&gt; &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=1190&quot;&gt; &lt;title&gt;NAVER&lt;/title&gt; &lt;meta name=&quot;apple-mobile-web-app-title&quot; content=&quot;NAVER&quot;/&gt; &lt;meta name=&quot;robots&quot; content=&quot;index,nofollow&quot;/&gt; &lt;meta name=&quot;description&quot; content=&quot;&#xB124;&#xC774;&#xBC84; &#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC720;&#xC6A9;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xB9CC;&#xB098; &#xBCF4;&#xC138;&#xC694;&quot;/&gt; &lt;meta property=&quot;og:title&quot; content=&quot;&#xB124;&#xC774;&#xBC84;&quot;&gt; &lt;meta property=&quot;og:url&quot; content=&quot;https://www.naver.com/&quot;&gt; &lt;meta property=&quot;og:image&quot; content=&quot;https://s.pstatic.net/static/www/mobile/edit/2016/0705/mobile_212852414260.png&quot;&gt; &lt;meta property=&quot;og:description&quot; content=&quot;&#xB124;&#xC774;&#xBC84; &#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC720;&#xC6A9;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xB9CC;&#xB098; &#xBCF4;&#xC138;&#xC694;&quot;/&gt; &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;&gt; 
/ ... /</code></pre><p>&#xACB0;&#xACFC;&#xB294; &#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xC608;&#xC81C;&#xC640; &#xB3D9;&#xC77C;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xACFC; &#xBE44;&#xAD50;&#xD574;, GCD&#xB294; &#xC2DC;&#xC2A4;&#xD15C;&#xC774; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xAD00;&#xB9AC;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC2A4;&#xB808;&#xB4DC; &#xAD00;&#xB9AC;&#xC5D0; &#xB300;&#xD55C; &#xC2E0;&#xACBD;&#xC744; &#xC4F0;&#xC9C0; &#xC54A;&#xC744; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC9C0;&#xAE08;&#xC740; &#xAC04;&#xB2E8;&#xD55C; &#xC608;&#xC81C;&#xB97C; &#xC2E4;&#xD589;&#xD574; &#xBCF4;&#xC558;&#xC9C0;&#xB9CC;, &#xC608;&#xC81C;&#xAC00; &#xB354; &#xB9CE;&#xC774; &#xBCF5;&#xC7A1;&#xD574;&#xC9C0;&#xBA74; &#xCC28;&#xC774;&#xB294; &#xB354; &#xBD84;&#xBA85;&#xD574;&#xC9C8; &#xAC83;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><p>&#xBC29;&#xAE08; &#xC0B4;&#xD3B4;&#xBCF8; GCD &#xC5ED;&#xC2DC; &#xD55C;&#xACC4;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294;&#xB370;&#xC694;, GCD&#xB3C4; concurrent dispatch queue&#xC5D0; &#xC758;&#xD574; &#xC608;&#xC57D;&#xB41C; &#xC791;&#xC5C5;&#xC774; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xCC28;&#xB2E8;&#xD560; &#xACBD;&#xC6B0;, &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xB300;&#xAE30; &#xC911;&#xC778; &#xB2E4;&#xB978; &#xBCD1;&#xB82C;&#xC791;&#xC5C5;&#xC744; &#xC2E4;&#xD589;&#xD560; &#xCD94;&#xAC00; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC704;&#xC5D0;&#xC11C; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC; &#xC608;&#xC81C;&#xC5D0;&#xC11C;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; custom concurrent queue&#xB97C; &#xC0DD;&#xC131;&#xD574; &#xC8FC;&#xC5C8;&#xB294;&#xB370;&#xC694;,</p><pre><code class="language-swift">private let networkRequestQueue = DispatchQueue(
  label: &quot;com.example.networkRequestQueue&quot;
)
</code></pre><p>custom concurrent queue&#xB97C; &#xACFC;&#xB3C4;&#xD558;&#xAC8C; &#xC0DD;&#xC131;&#xD558;&#xAC8C; &#xB420; &#xACBD;&#xC6B0;, &#xAC01;&#xAC01;&#xC758; dispatch queue&#xB294; &#xC2A4;&#xB808;&#xB4DC; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xAC8C; &#xB418;&#xC5B4; &#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xADF8;&#xB798;&#xD504;&#xC640; &#xAC19;&#xC774; </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://gist.github.com/assets/63908856/5af6331e-895d-42b2-87a3-b31a6bfe3bca" class="kg-image" alt="Swift Concurrency &#xC774;&#xC804;&#xC758; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xCD9C;&#xCC98; : </span><a href="https://www.baeldung.com/cs/servers-threads-number?ref=noah-ios.dev"><span style="white-space: pre-wrap;">https://www.baeldung.com/cs/servers-threads-number</span></a></figcaption></figure><p>&#xB9CE;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xAC04; &#xBB38;&#xB9E5; &#xC804;&#xD658;&#xC73C;&#xB85C; &#xC778;&#xD55C; &#xC131;&#xB2A5;&#xC800;&#xD558;&#xB85C; &#xC774;&#xC5B4;&#xC9C8; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB354; &#xB9CE;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xBA74; &#xBB38;&#xB9E5; &#xC804;&#xD658;&#xC774; &#xB354; &#xC790;&#xC8FC; &#xBC1C;&#xC0DD;&#xD558;&#xACE0;, &#xC774;&#xB85C; &#xC778;&#xD574; &#xC2DC;&#xC2A4;&#xD15C;&#xC758; &#xBD80;&#xB2F4;&#xC774; &#xB354; &#xCEE4;&#xC9C0;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xAC83;&#xC774; &#xBC14;&#xB85C; &#x201C;thread-explosion&#x201D;&#xC785;&#xB2C8;&#xB2E4;.</p><blockquote>thread-explosion: &#xC2DC;&#xC2A4;&#xD15C; &#xB0B4;&#xC758; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xB9CE;&#xC544;&#xC838; &#xC2A4;&#xB808;&#xB4DC; &#xC2A4;&#xC704;&#xCE6D; &#xB4F1;&#xC758; &#xC624;&#xBC84;&#xD5E4;&#xB4DC;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB418;&#xB294; &#xD604;&#xC0C1;</blockquote><p>&#xB530;&#xB77C;&#xC11C; <a href="https://developer.apple.com/documentation/dispatch/dispatchqueue?ref=noah-ios.dev#3136752">Apple&#xC758; &#xBB38;&#xC11C;</a>&#xC5D0;&#xC11C;&#xB294; custom queue&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB300;&#xC2E0; global concurrent dispatch queue&#xC5D0; &#xC791;&#xC5C5;&#xC744; &#xC81C;&#xCD9C;&#xD574; &#xC2A4;&#xB808;&#xB4DC; &#xC218;&#xB97C; &#xCD5C;&#xC18C;&#xD654;&#xD558;&#xB294; &#xAC83;&#xC744; &#xAC00;&#xC774;&#xB4DC;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; DispatchQueue&#xB294; First In First Out &#xD2B9;&#xC131;&#xC744; &#xAC00;&#xC9C4; Queue&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <a href="https://en.wikipedia.org/wiki/Priority_inversion?ref=noah-ios.dev">&#xC6B0;&#xC120;&#xC21C;&#xC704; &#xC5ED;&#xC804; &#xD604;&#xC0C1;</a>&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, &#xD074;&#xB85C;&#xC800;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xBA85;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC791;&#xC5C5;&#xC744; &#xC81C;&#xCD9C;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC774;&#xAE30;&#xC5D0; &#xC791;&#xC5C5;&#xC744; &#xAE30;&#xB2E4;&#xB9AC;&#xB294; &#xC21C;&#xC11C;&#xAC00; &#xBCF5;&#xC7A1;&#xD574;&#xC9C0;&#xAC8C; &#xB418;&#xBA74; &#xD074;&#xB85C;&#xC800;&#xB4E4;&#xC774; &#xC911;&#xCCA9;&#xB418;&#xB294; &#xC0C1;&#xD669;&#xC774; &#xC0DD;&#xAE30;&#xAC8C; &#xB418;&#xC5B4; &#xAC1C;&#xBC1C;&#xC790;&#xB85C; &#xD558;&#xC5EC;&#xAE08; &#xCF54;&#xB4DC;&#xC758; &#xD750;&#xB984;&#xC744; &#xB530;&#xB77C;&#xAC00;&#xAE30; &#xC5B4;&#xB835;&#xAC8C; &#xB9CC;&#xB4DC;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB7EC;&#xD55C; &#xBB38;&#xC81C;&#xB4E4;&#xC744; &#xD574;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; Swift Concurrency&#xAC00; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB418;&#xB294;&#xB370;&#xC694;,</p><p>&#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xC608;&#xC81C;, Swift Concurrency&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xB2E4;&#xC2DC; &#xC791;&#xC131;&#xD574; &#xBCFC;&#xAE4C;&#xC694;?</p><h2 id="swift-concurrency">Swift Concurrency</h2><p>&#xBA3C;&#xC800; &#xC2E4;&#xD589;&#xB418;&#xAE30; &#xC6D0;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC758; &#xB2E8;&#xC704;&#xB97C; Task&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC9C0;&#xC815;&#xD574;&#xC8FC;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private var networkRequestTask: Task&lt;Void, Never&gt;? = nil
}
</code></pre><p>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xB3D9;&#xAE30;&#xC801;&#xC73C;&#xB85C; &#xD55C; &#xD6C4;&#xC5D0; &#xC751;&#xB2F5;&#xC744; &#xCF58;&#xC194;&#xC5D0; &#xCD9C;&#xB825;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xCD94;&#xAC00;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  private var networkRequestTask: Task&lt;Void, Never&gt;? = nil
	
  private func fetchAndPrintHTML(from url: URL) {
    let responseData = try! Data(contentsOf: url)
    print(String(data: responseData, encoding: .utf8)!)
  }
}
</code></pre><p>&#xC774;&#xC81C; &#xD574;&#xB2F9; &#xD568;&#xC218;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xAE30; &#xC704;&#xD574; task&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xD568;&#xC218;&#xB97C; &#xCD94;&#xAC00;&#xD574; &#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">final class NetworkRequestManager {
  var networkRequestTask: Task&lt;Void, Never&gt;? = nil
	
  func startRequest() {
    self.networkRequestTask = Task {
      self.fetchAndPrintHTML(from: URL(string: &quot;https://www.naver.com&quot;)!)
    }
  }
	
  private func fetchAndPrintHTML(from url: URL) {
    let responseData = try! Data(contentsOf: url)
    guard Task.isCancelled == false
    else { return }

    print(String(data: responseData, encoding: .utf8)!)
  }
	
  deinit {
    self.networkRequestTask?.cancel()
    self.networkRequestTask = nil
  }
}
</code></pre><p>&#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xC694;&#xCCAD;&#xC744; &#xD55C; &#xC774;&#xD6C4;&#xC5D0; Task&#xAC00; &#xCDE8;&#xC18C;&#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC5EC;&#xBD80;&#xB97C; &#xD655;&#xC778;&#xD558;&#xACE0; &#xCDE8;&#xC18C;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xC558;&#xB2E4;&#xBA74; &#xCF58;&#xC194;&#xC5D0; &#xC751;&#xB2F5;&#xC744; &#xCD9C;&#xB825;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Swift Concurrency&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC; &#xC608;&#xC81C;&#xB97C; &#xC2E4;&#xD589;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">let networkRequestManager = NetworkRequestManager()
networkRequestManager.startRequest()

print(&quot;&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;&quot;)

RunLoop.main.run()
</code></pre><p>&#xACB0;&#xACFC;&#xB97C; &#xD655;&#xC778;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;.</p><pre><code class="language-text">&#xC548;&#xB155;&#xD558;&#xC138;&#xC694;
   &lt;!doctype html&gt; &lt;html lang=&quot;ko&quot; class=&quot;fzoom&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;meta name=&quot;Referrer&quot; content=&quot;origin&quot;&gt; &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=1190&quot;&gt; &lt;title&gt;NAVER&lt;/title&gt; &lt;meta name=&quot;apple-mobile-web-app-title&quot; content=&quot;NAVER&quot;/&gt; &lt;meta name=&quot;robots&quot; content=&quot;index,nofollow&quot;/&gt; &lt;meta name=&quot;description&quot; content=&quot;&#xB124;&#xC774;&#xBC84; &#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC720;&#xC6A9;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xB9CC;&#xB098; &#xBCF4;&#xC138;&#xC694;&quot;/&gt; &lt;meta property=&quot;og:title&quot; content=&quot;&#xB124;&#xC774;&#xBC84;&quot;&gt; &lt;meta property=&quot;og:url&quot; content=&quot;https://www.naver.com/&quot;&gt; &lt;meta property=&quot;og:image&quot; content=&quot;https://s.pstatic.net/static/www/mobile/edit/2016/0705/mobile_212852414260.png&quot;&gt; &lt;meta property=&quot;og:description&quot; content=&quot;&#xB124;&#xC774;&#xBC84; &#xBA54;&#xC778;&#xC5D0;&#xC11C; &#xB2E4;&#xC591;&#xD55C; &#xC815;&#xBCF4;&#xC640; &#xC720;&#xC6A9;&#xD55C; &#xCEE8;&#xD150;&#xCE20;&#xB97C; &#xB9CC;&#xB098; &#xBCF4;&#xC138;&#xC694;&quot;/&gt; &lt;meta name=&quot;twitter:card&quot; content=&quot;summary&quot;&gt; 
/ ... /</code></pre><p>&#xC5ED;&#xC2DC; &#xACB0;&#xACFC;&#xB294; &#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xC608;&#xC81C;&#xC640; &#xB3D9;&#xC77C;&#xD569;&#xB2C8;&#xB2E4;.</p><p>GCD&#xC640; &#xBE44;&#xAD50;&#xD574; &#xC5B4;&#xB5A4;&#xAC00;&#xC694;?</p><p>&#xCF54;&#xB4DC; &#xC678;&#xC801;&#xC73C;&#xB85C;&#xB294; &#xB3D9;&#xAE30;&#xC801;&#xC778; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xB294; &#xAC83;&#xACFC; &#xBE44;&#xC2B7;&#xD558;&#xAC8C; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C;, &#xCEF4;&#xD30C;&#xC77C; &#xB2E8;&#xACC4;&#xC5D0;&#xC11C; &#xB370;&#xC774;&#xD130; &#xB808;&#xC774;&#xC2A4;&#xC640; &#xAD00;&#xB828;&#xB41C; &#xC5D0;&#xB7EC;&#xB97C; &#xBC1C;&#xC0DD;&#xC2DC;&#xCF1C; &#xCF54;&#xB4DC; &#xC791;&#xC131; &#xC2E4;&#xC218;&#xB85C; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB294; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC640; &#xD568;&#xAED8;, &#xC774;&#xC804; GCD&#xAC00; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB358; &#xBB38;&#xC81C;&#xC778; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xACFC;&#xB3C4;&#xD558;&#xAC8C; &#xC0DD;&#xC131;&#xB418;&#xC5B4; &#xBC1C;&#xC0DD;&#xD558;&#xB294; thread-explosion &#xBB38;&#xC81C;&#xB97C; suspend point(await)&#xC5D0;&#xC11C; &#xC2A4;&#xB808;&#xB4DC; &#xAC04; &#xBB38;&#xB9E5; &#xC804;&#xD658;&#xC774; &#xC544;&#xB2CC;, &#xC791;&#xC5C5;&#xC758; &#xC7AC;&#xAC1C; &#xC5EC;&#xBD80;&#xB97C; &#xCD94;&#xC801;&#xD558;&#xB294; &#xAC00;&#xBCBC;&#xC6B4; &#xAC1D;&#xCCB4;&#xC778; continuation &#xAC04; &#xC804;&#xD658;&#xC744; &#xD558;&#xB3C4;&#xB85D; &#xD558;&#xC5EC;, &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xCC28;&#xB2E8;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xD568;&#xC218; &#xD638;&#xCD9C; &#xC815;&#xB3C4;&#xC758; &#xBE44;&#xC6A9;&#xB9CC; &#xC9C0;&#xBD88;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.<br><br>&#xB354;&#xBD88;&#xC5B4;, &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xC2A4;&#xB808;&#xB4DC; &#xC218;&#xB97C; CPU &#xCF54;&#xC5B4; &#xC218;&#xB9CC;&#xD07C; &#xC0DD;&#xC131;&#xD558;&#xB3C4;&#xB85D; &#xC81C;&#xD55C;&#xD558;&#xC5EC; thread-explosion &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote><a href="https://developer.apple.com/videos/play/wwdc2021/10254/?time=528&amp;ref=noah-ios.dev">WWDC-21 Swift concurrency: Behinde the scenes &#xCC38;&#xC870;</a></blockquote><p>&#xB610;&#xD55C; GCD&#xC640; &#xB2EC;&#xB9AC; &#xC791;&#xC5C5;&#xC774; &#xC2E4;&#xD589;&#xB418;&#xB294; &#xC21C;&#xC11C;&#xAC00; FIFO&#xAC00; &#xC544;&#xB2C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBA3C;&#xC800; &#xCD94;&#xAC00;&#xB41C; &#xC791;&#xC5C5;&#xC774; &#xC2E4;&#xD589;&#xB418;&#xACE0; &#xC788;&#xC744; &#xB54C; &#xC2E4;&#xD589;&#xB418;&#xACE0; &#xC788;&#xB294; &#xC791;&#xC5C5;&#xBCF4;&#xB2E4; &#xC6B0;&#xC120;&#xC21C;&#xC704;&#xAC00; &#xB354; &#xB192;&#xC740; &#xC791;&#xC5C5;&#xC774; &#xCD94;&#xAC00;&#xB418;&#xBA74; &#xD574;&#xB2F9; &#xC791;&#xC5C5;&#xC744; &#xBA3C;&#xC800; &#xC2E4;&#xD589;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC6B0;&#xC120;&#xC21C;&#xC704; &#xC5ED;&#xC804; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%A7%88%EC%B9%98%EB%A9%B0">&#xB9C8;&#xCE58;&#xBA70;</h2><p>&#xC774;&#xBC88; &#xAE00;&#xC5D0;&#xC11C;&#xB294; Swift Concurrency &#xC774;&#xC804;&#xC5D0;&#xB294; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC5B4;&#xB5A0;&#xD55C; &#xB3C4;&#xAD6C;&#xB4E4;&#xC744; &#xC0AC;&#xC6A9;&#xD588;&#xB294;&#xC9C0;, &#xC5B4;&#xB5A0;&#xD55C; &#xB9E5;&#xB77D;&#xC73C;&#xB85C; &#xB3D9;&#xC2DC;&#xC131; &#xD504;&#xB85C;&#xADF8;&#xB798;&#xBC0D;&#xC744; &#xB3C4;&#xC640;&#xC8FC;&#xB294; &#xB3C4;&#xAD6C;&#xB4E4;&#xC774; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; Swift Concurrency&#xAC00; &#xB4F1;&#xC7A5;&#xD55C; &#xBC30;&#xACBD;&#xC744; &#xC774;&#xD574;&#xD558;&#xB294; &#xB370; &#xC5EC;&#xB7EC;&#xBD84;&#xAED8; &#xB3C4;&#xC6C0;&#xC774; &#xB418;&#xC5C8;&#xC73C;&#xBA74; &#xC88B;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>Swift Concurrency &#xC5ED;&#xC2DC; Swift&#xC640; &#xD568;&#xAED8; &#xBC1C;&#xC804;&#xD558;&#xB294; &#xAE30;&#xC220;&#xC774;&#xAE30;&#xC5D0; &#xC55E;&#xC73C;&#xB85C; &#xCD94;&#xAC00;&#xB420; &#xAE30;&#xB2A5;&#xB4E4;&#xC774; &#xB354; &#xAE30;&#xB300;&#xAC00; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xAE34; &#xAE00; &#xC77D;&#xC5B4;&#xC8FC;&#xC154;&#xC11C; &#xAC10;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;.</p>]]></content:encoded></item><item><title><![CDATA[동시성과 병렬성의 차이]]></title><description><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><p>&#xC774;&#xBC88; &#xC8FC;&#xC81C;&#xC5D0;&#xC11C;&#xB294; Swift Concurrency&#xC5D0; &#xB300;&#xD574; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xAE30;&#xC5D0; &#xC55E;&#xC11C; &#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC5D0; &#xB300;&#xD55C; &#xAC1C;&#xB150;&#xC744; &#xC7A1;&#xC544;&#xBCF4;&#xB824;&#xACE0; &#xD574;&#xC694;</p><p>&#xCF54;&#xB4DC;&#xB97C; &#xB2E4;</p>]]></description><link>https://noah-ios.dev/concurrency-vs-parallel/</link><guid isPermaLink="false">65f037268ca412ea7a800a36</guid><category><![CDATA[Computer-Science]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Tue, 12 Mar 2024 11:12:44 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1547042591-aae98619aab5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRocmVhZHxlbnwwfHx8fDE3MTAyMTY2NDB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><img src="https://images.unsplash.com/photo-1547042591-aae98619aab5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRocmVhZHxlbnwwfHx8fDE3MTAyMTY2NDB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="&#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC758; &#xCC28;&#xC774;"><p>&#xC774;&#xBC88; &#xC8FC;&#xC81C;&#xC5D0;&#xC11C;&#xB294; Swift Concurrency&#xC5D0; &#xB300;&#xD574; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xAE30;&#xC5D0; &#xC55E;&#xC11C; &#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC5D0; &#xB300;&#xD55C; &#xAC1C;&#xB150;&#xC744; &#xC7A1;&#xC544;&#xBCF4;&#xB824;&#xACE0; &#xD574;&#xC694;</p><p>&#xCF54;&#xB4DC;&#xB97C; &#xB2E4;&#xB978; &#xCF54;&#xB4DC;&#xC640; &#xB3D9;&#xC2DC;&#xC5D0; &#xC2E4;&#xD589;&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC740; &#xBB34;&#xC5C7;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xB294; &#xAC78;&#xAE4C;&#xC694;?<br>Computer Science&#xC5D0;&#xC11C; &#x2018;&#xB3D9;&#xC2DC;&#x2019;&#xB77C;&#xB294; &#xB2E8;&#xC5B4;&#xC758; &#xC758;&#xBBF8;&#xB294; 2&#xAC1C; &#xC774;&#xC0C1;&#xC758; &#xC0AC;&#xAC74;&#xC774; &#xC815;&#xD655;&#xD788; &#xAC19;&#xC740; &#xC2DC;&#xAC04;&#xC5D0; &#xC9C4;&#xD589;&#xB418;&#xB294; &#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xB294; &#x201C;same-time&#x201D;&#xC744; &#xC758;&#xBBF8;&#xD558;&#xB294;&#xAC78;&#xAE4C;&#xC694;?<br><br>&#xADF8;&#xB7FC; &#xC2DC;&#xC791;&#xD574;&#xBCF4;&#xC2DC;&#xC8E0;!</p><p>&#xC6B0;&#xB9AC;&#xAC00; &#xC791;&#xC131;&#xD558;&#xB294; &#xB300;&#xBD80;&#xBD84;&#xC758; &#xCF54;&#xB4DC;&#xB294; &#xB3D9;&#xC2DC;&#xC131;&#xC774; &#xC5C6;&#xB294;, &#xB2E8;&#xC77C; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xB418;&#xB294; &#xCF54;&#xB4DC;<br>&#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xB3D9;&#xAE30;&#xC801;&#xC778; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xD55C;&#xBC88;&#xC5D0; &#xD55C;&#xC904;, &#xD55C;&#xC904; &#xC529;, &#xD55C; &#xD568;&#xC218;&#xC529; &#xC2E4;&#xD589;&#xB3FC;&#xC694;</p><pre><code class="language-swift">func getFullName() {
 let givenName = getGivenName()
 let familyName = getFamilyName()
 print(&#x201C;\\(givenName) \\(familyName)&#x201D;)
}

func getGivenName() -&gt; String {
 print(&quot;What&apos;s your given name?&quot;)
 return readLine() ?? &quot; - &quot;
}

func getFamilyName() -&gt; String {
 print(&quot;What&apos;s your family name?&quot;)
 return readLine() ?? &quot; - &quot;
}

getFullName()</code></pre><ul><li>&#xC704; &#xCF54;&#xB4DC;&#xB294; readLine() &#xD568;&#xC218;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC785;&#xB825;&#xC744; &#xBC1B;&#xC744; &#xB54C;&#xAE4C;&#xC9C0; &#xB300;&#xAE30;&#xD558;&#xACE0; &#xC788;&#xC744; &#xAC70;&#xC608;&#xC694;</li><li>&#xBB3C;&#xB860; &#xC0AC;&#xC6A9;&#xC790;&#xC758; &#xC785;&#xB825;&#xC744; &#xBC1B;&#xC744; &#xB54C;&#xAE4C;&#xC9C0; &#xB300;&#xAE30;&#xD560; &#xB3D9;&#xC548; &#xC544;&#xBB34;&#xB7F0; &#xC791;&#xC5C5;&#xB3C4; &#xD558;&#xC9C0; &#xBABB;&#xD569;&#xB2C8;&#xB2E4;.</li></ul><p>&#xC704; &#xCC98;&#xB7FC; &#xC624;&#xB798;&#xAC78;&#xB9AC;&#xB294; &#xC791;&#xC5C5; &#xD639;&#xC740; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774; CPU &#xD639;&#xC740; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC810;&#xC720;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC6D0;&#xD65C;&#xD558;&#xAC8C; &#xC2E4;&#xD589;&#xB418;&#xB3C4;&#xB85D; &#xD558;&#xB824;&#xBA74; &#xB3D9;&#xC2DC;&#xC131;&#xC744; &#xD65C;&#xC6A9;&#xD574;&#xC57C;&#xD574;&#xC694;</p><p>CPU&#xB294; &#xC5EC;&#xB7EC; &#xC791;&#xC5C5;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xB7EC;&#xC791;&#xC5C5;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xC218;&#xD589;&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC740; &#xBB34;&#xC5C7;&#xC744; &#xB9D0;&#xD558;&#xB294;&#xAC78;&#xAE4C;&#xC694;?</p><p>&#xC5EC;&#xB7EC;&#xC791;&#xC5C5;&#xC744; &#xB3D9;&#xC2DC;&#xC5D0; &#xC218;&#xD589;&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC740;&#xA0;<strong>&#xD558;&#xB098;&#xC758; &#xC791;&#xC5C5;</strong>&#xC744; &#xB3D9;&#xC2DC;(same-time)&#xC5D0; &#xC218;&#xD589;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2CC;,&#xA0;<strong>&#xC5EC;&#xB7EC; &#xC791;&#xC5C5;</strong>&#xC744; &#xBC88;&#xAC08;&#xC544; &#xC2E4;&#xD589;&#xD558;&#xBA70; &#xB3D9;&#xC2DC;(same-time)&#xC5D0; &#xC218;&#xD589;&#xB418;&#xB294; &#xAC83; &#xCC98;&#xB7FC; &#xBCF4;&#xC774;&#xB294; &#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD574;&#xC694;</p><p>&#xD55C; &#xAC1C;&#xC758; Core&#xB97C; &#xAC00;&#xC9C4; CPU&#xC5D0;&#xC11C;&#xB3C4; &#xD55C; &#xAC1C; &#xC774;&#xC0C1;&#xC758; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xB3D9;&#xC2DC;&#xC5D0;(&#xBC88;&#xAC08;&#xC544; &#xAC00;&#xBA70;) &#xC2E4;&#xD589;&#xD558;&#xBA70; &#xBA40;&#xD2F0; &#xC2A4;&#xB808;&#xB529; &#xD658;&#xACBD;&#xC744; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><blockquote>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC5EC;&#xB7EC; &#xCF54;&#xC5B4;&#xB97C; &#xAC00;&#xC9C4; CPU&#xC5D0;&#xC11C;&#xB294; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;?</blockquote><p>&#xC5EC;&#xB7EC; CPU Core&#xB97C; &#xAC00;&#xC9C4; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; &#xBCD1;&#xB82C;&#xB85C; &#xC5EC;&#xB7EC; &#xC2A4;&#xB808;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;,</p><h2 id="%EB%8F%99%EC%8B%9C%EC%84%B1%EA%B3%BC-%EB%B3%91%EB%A0%AC%EC%84%B1%EC%9D%98-%EC%B0%A8%EC%9D%B4">&#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC758; &#xCC28;&#xC774;</h2><p>&#xC774;&#xCBE4;&#xC5D0;&#xC11C; &#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC758; &#xCC28;&#xC774;&#xC5D0; &#xB300;&#xD574; &#xC815;&#xB9AC;&#xD558;&#xBA74; &#xC88B;&#xC744; &#xAC83; &#xAC19;&#xC544;&#xC694;</p><p>&#xB3D9;&#xC2DC;&#xC131;&#xC740; &#xC704;&#xC5D0;&#xC11C; &#xB9D0;&#xD588;&#xB358; &#xAC83;&#xCC98;&#xB7FC; &#xC5EC;&#xB7EC; &#xC791;&#xC5C5;&#xC744; &#xBC88;&#xAC08;&#xC544;&#xAC00;&#xBA70; &#xC218;&#xD589;&#xD558;&#xB294; &#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD574;&#xC694;</p><p>&#xBCD1;&#xB82C;&#xC131;&#xC740; &#xC5EC;&#xB7EC; &#xC791;&#xC5C5;&#xC744; same-time&#xC5D0; &#xC218;&#xD589;&#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xC758;&#xBBF8;&#xD574;&#xC694;</p><h2 id="thread-safety">Thread Safety</h2>
<!--kg-card-begin: html-->
<img width="859" alt="&#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC758; &#xCC28;&#xC774;" src="https://gist.github.com/assets/63908856/efa354d7-c1ba-49d3-ac6f-f53aa5f34157">
<!--kg-card-end: html-->
<p>&#xC5EC;&#xB7EC;&#xD30C;&#xC77C;&#xC5D0;&#xC11C; &#xD55C;&#xC904; &#xD55C;&#xC904; &#xC529; &#xD30C;&#xC77C;&#xC744; &#xC77D;&#xC5B4;&#xC11C; &#xD2B9;&#xC815; &#xD0A4;&#xC6CC;&#xB4DC;&#xB97C; &#xCC3E;&#xC544; &#xC77C;&#xCE58;&#xD55C; &#xD0A4;&#xC6CC;&#xB4DC;&#xB97C; &#xACB0;&#xACFC; &#xD30C;&#xC77C;&#xC5D0; &#xAE30;&#xB85D;&#xD558;&#xB294; &#xC0C1;&#xD669;&#xC744; &#xAC00;&#xC815;&#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC0C9;&#xC774; &#xB2E4;&#xB978; &#xAC01;&#xAC01;&#xC758; &#xBC15;&#xC2A4;&#xB294; &#xB2E4;&#xB978; &#xC2A4;&#xB808;&#xB4DC;&#xC5D0;&#xC11C; &#xC2E4;&#xD589;&#xB418;&#xACE0; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC704; &#xC791;&#xC5C5;&#xC740; &#xC5B4;&#xB5A0;&#xD55C; &#xC7A0;&#xC7AC;&#xC801;&#xC778; &#xBB38;&#xC81C;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC744;&#xAE4C;&#xC694;?</p><p>&#xC5EC;&#xB7EC; &#xC2A4;&#xB808;&#xB4DC;&#xAC00; &#xC815;&#xD655;&#xD558;&#xAC8C; same-time&#xC5D0; &#xC77C;&#xCE58;&#xD55C; &#xD2B9;&#xC815; &#xD0A4;&#xC6CC;&#xB4DC;&#xB97C; &#xAE30;&#xB85D;&#xD558;&#xB824;&#xACE0; &#xD560; &#xB54C; &#xB370;&#xC774;&#xD130; &#xB808;&#xC774;&#xC2A4;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xAE30;&#xB85D;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC774; &#xC6D0;&#xC790;&#xC801;&#xC73C;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4;&#xB2E4;&#xB294; &#xC804;&#xC81C;&#xD558;&#xC5D0;&#xC11C;&#xB294; &#xB3D9;&#xC2DC;&#xC801;&#xC73C;&#xB85C; &#xC77C;&#xCE58;&#xD55C; &#xD56D;&#xBAA9;&#xC744; &#xAE30;&#xB85D;&#xD558;&#xB824;&#xACE0; &#xD558;&#xBA74; &#xAD1C;&#xCC2E;&#xC9C0;&#xB9CC;, &#xBCD1;&#xB82C;&#xB85C; &#xC77C;&#xCE58;&#xD55C; &#xD56D;&#xBAA9;&#xC744; &#xAE30;&#xB85D;&#xD560; &#xACBD;&#xC6B0; &#xB370;&#xC774;&#xD130;&#xC758; &#xC77C;&#xAD00;&#xC131;&#xC774; &#xAE68;&#xC9C0;&#xAC8C; &#xB418;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><p>&#xC704;&#xC640; &#xAC19;&#xC740; &#xC0C1;&#xD669; &#xC774;&#xC678;&#xC5D0;&#xB3C4; &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB294; &#xC801;&#xC5B4;&#xB3C4; &#xD558;&#xB098;&#xAC00; &#xC4F0;&#xAE30; &#xC5F0;&#xC0B0;&#xC744; &#xC218;&#xD589;&#xD560; &#xB54C; &#xB370;&#xC774;&#xD130; &#xB808;&#xC774;&#xC2A4;&#xC758; &#xC704;&#xD5D8;&#xC774; &#xB530;&#xB974;&#xB294;&#xB370;&#xC694;,</p><p>&#xC608;&#xCE21; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xACB0;&#xACFC;&#xB97C; &#xBC29;&#xC9C0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xBA40;&#xD2F0;&#xC2A4;&#xB808;&#xB4DC; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xC791;&#xC5C5;&#xD560; &#xB54C;&#xB294; &#xB370;&#xC774;&#xD130; &#xB808;&#xC774;&#xC2A4;&#xB97C; &#xD53C;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC801;&#xC808;&#xD55C; &#xB3D9;&#xAE30;&#xD654; &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD574;&#xC694;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; &#xBBA4;&#xD14D;&#xC2A4;(Mutex)&#xB098; &#xC138;&#xB9C8;&#xD3EC;&#xC5B4;(Semaphore) &#xAC19;&#xC740; &#xB3C4;&#xAD6C;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xACF5;&#xC720; &#xC790;&#xC6D0;&#xC5D0; &#xB300;&#xD55C; &#xC811;&#xADFC;&#xC744; &#xC870;&#xC808;&#xD558;&#xACE0;, &#xC6D0;&#xC790;&#xC131;&#xC744; &#xBCF4;&#xC7A5;&#xD560; &#xC218; &#xC788;&#xB294; &#xC5F0;&#xC0B0;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.</p><h2 id="%EB%A7%88%EC%B9%98%EB%A9%B0">&#xB9C8;&#xCE58;&#xBA70;</h2><p>&#xC774;&#xBC88; &#xC2DC;&#xAC04;&#xC5D0;&#xB294; &#xB3D9;&#xC2DC;&#xC131;&#xACFC; &#xBCD1;&#xB82C;&#xC131;&#xC758; &#xCC28;&#xC774;&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xC558;&#xB294;&#xB370;&#xC694;, Swift Concurrency&#xC5D0;&#xC11C;&#xB294; &#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xBB38;&#xC81C;&#xB4E4;&#xC744; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xACB0;&#xD588;&#xB294;&#xC9C0; &#xB2E4;&#xC74C; &#xAE00;&#xB4E4;&#xC744; &#xD1B5;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4; :)</p>]]></content:encoded></item><item><title><![CDATA[Bundle에 관하여]]></title><description><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; Noah&#xC785;&#xB2C8;&#xB2E4;.<br>Bundle Class&#xB294; Bundle directory&#xB97C; &#xCD94;&#xC0C1;&#xD654;&#xD574; &#xB0B4;&#xBD80; &#xAD6C;&#xC870;&#xB97C; &#xBAB0;&#xB77C;&#xB3C4; &#xD3B8;&#xD558;&#xAC8C; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD574;&#xC8FC;&#xB294;&#xB370;&#xC694;, <br>&#xC624;&#xB298;&#xC740; &#xC774;</p>]]></description><link>https://noah-ios.dev/ios-bundle/</link><guid isPermaLink="false">65475911d86d1daffad19b8b</guid><category><![CDATA[iOS]]></category><category><![CDATA[Swift]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Tue, 14 Nov 2023 07:54:01 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1601598704991-eef6114775e0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHxiZWVyJTIwcGFjfGVufDB8fHx8MTY5OTE3NDcxNXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h2><img src="https://images.unsplash.com/photo-1601598704991-eef6114775e0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDE5fHxiZWVyJTIwcGFjfGVufDB8fHx8MTY5OTE3NDcxNXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;"><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; Noah&#xC785;&#xB2C8;&#xB2E4;.<br>Bundle Class&#xB294; Bundle directory&#xB97C; &#xCD94;&#xC0C1;&#xD654;&#xD574; &#xB0B4;&#xBD80; &#xAD6C;&#xC870;&#xB97C; &#xBAB0;&#xB77C;&#xB3C4; &#xD3B8;&#xD558;&#xAC8C; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD574;&#xC8FC;&#xB294;&#xB370;&#xC694;, <br>&#xC624;&#xB298;&#xC740; &#xC774; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC758; &#xAD6C;&#xC870;&#xC640; &#xAC1C;&#xB150;, Bundle class&#xC758; &#xC0AC;&#xC6A9;&#xBC95;&#xC5D0; &#xB300;&#xD574; &#xC608;&#xC81C;&#xC640; &#xBB38;&#xC11C;&#xB97C; &#xBCF4;&#xBA70; &#xD568;&#xAED8; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h1 id="bundle">Bundle</h1><p>Apple Developer Documentation&#xC5D0;&#xC11C;&#xB294; Bundle Class&#xB97C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC18C;&#xAC1C;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC694;</p><blockquote>A representation of the code and resources stored in a bundle directory on disk.</blockquote><ul><li><a href="https://developer.apple.com/documentation/foundation/bundle?ref=noah-ios.dev">Apple Developer Documentation</a></li></ul><p>Bundle Class&#xB294; &#xB514;&#xC2A4;&#xD06C;&#xC758; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xC800;&#xC7A5;&#xB41C; &#xCF54;&#xB4DC; &#xBC0F; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;&#xACE0; &#xD558;&#xB294;&#xB370;&#xC694;, <br>&#xBA3C;&#xC800; Bundle Class&#xC758; &#xC124;&#xBA85;&#xC5D0; &#xB098;&#xC624;&#xB294; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xAC00; &#xC5B4;&#xB5A4; &#xC758;&#xBBF8;&#xC778;&#xC9C0; &#xC870;&#xAE08; &#xB354; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBD05;&#xC2DC;&#xB2E4; &#x1F3CA;&#x200D;&#x2642;&#xFE0F;</p><h2 id="bundle-directory">Bundle Directory</h2><p>Bundle&#xC740; &#xD55C;&#xAD6D;&#xB9D0;&#xB85C; &apos;&#xBB36;&#xC74C;&apos;&#xC778;&#xB370;&#xC694;, &#xC288;&#xD37C;&#xB9C8;&#xCF13;&#xC5D0;&#xC11C; &#xD30C;&#xB294; &#xB9E5;&#xC8FC; &#xBC88;&#xB4E4;, &#xACFC;&#xC790; &#xBC88;&#xB4E4;&#xC744; &#xB5A0;&#xC62C;&#xB9AC;&#xBA70; &#xC544;&#xB798;&#xC758; &#xC124;&#xBA85;&#xC744; &#xC77D;&#xC5B4;&#xBCF4;&#xC2DC;&#xBA74; &#xC88B;&#xC744; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://user-images.githubusercontent.com/63908856/282396464-47d3f3c6-470e-490a-a5ec-0ba4578fdd2d.jpg" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xB9E5;&#xC8FC;, &#xACFC;&#xC790; &#xBC88;&#xB4E4;</span></figcaption></figure><p>Apple&#xC5D0;&#xC11C; &#xC815;&#xC758;&#xD558;&#xB294; Bundle&#xC740; <strong>&#xC2E4;&#xD589; &#xCF54;&#xB4DC;</strong>&#xC640; &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <strong>&#xB9AC;&#xC18C;&#xC2A4;(&#xC774;&#xBBF8;&#xC9C0;, &#xC74C;&#xC545;, &#xC2A4;&#xD1A0;&#xB9AC;&#xBCF4;&#xB4DC; &#xB4F1;&#xB4F1;)</strong> &#xB97C; &#xD3EC;&#xD568;&#xD558;&#xB294; &#xACC4;&#xCE35; &#xAD6C;&#xC870;&#xB97C; &#xAC00;&#xC9C4; &#xD45C;&#xC900;&#xD654;&#xB41C; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xB9D0;&#xD558;&#xB294;&#xB370;&#xC694;,</p><p>Bundle&#xC744; &#xC0AC;&#xC6A9;&#xD574; application, app extension, framework, plug-in&#xC744; &#xB098;&#xD0C0;&#xB0B4;&#xBA70;, Bundle&#xC774; &#xB2E4;&#xB978; Bundle&#xC744; &#xD3EC;&#xD568;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC608;&#xB97C;&#xB4E4;&#xBA74; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4; &#xC774; app extension &#xBC88;&#xB4E4;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xB294; &#xAC83;&#xCC98;&#xB7FC; &#xB9D0;&#xC774;&#xC8E0;</blockquote><p>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC758; &#xAD6C;&#xC870;&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCFC;&#xAE4C;&#xC694;?</p><h2 id="application">Application</h2><h3 id="macos-application-bundle">macOS Application Bundle</h3><p>&#xC55E;&#xC11C; &#xB9D0;&#xD55C; &#xAC83; &#xCC98;&#xB7FC; Bundle&#xC740; <strong>&#xD45C;&#xC900;&#xD654;&#xB41C;</strong> &#xB514;&#xB809;&#xD130;&#xB9AC; &#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Bundle&#xC5D0;&#xB294; &#xCF58;&#xD150;&#xCE20;&#xB97C; &#xBCF4;&#xAD00;&#xD560; &#xC218; &#xC788;&#xB294; &#xC704;&#xCE58;&#xAC00; &#xC815;&#xD574;&#xC838; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xAC00;&#xB839; app extension&#xC740; plug-in&#xC6A9;&#xC73C;&#xB85C; &#xC608;&#xC57D;&#xB41C; &#xC704;&#xCE58;&#xC5D0;, &#xC2A4;&#xD1A0;&#xB9AC;&#xBCF4;&#xB4DC;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xC6A9;&#xC73C;&#xB85C; &#xC608;&#xC57D;&#xB41C; &#xC704;&#xCE58;&#xC5D0; &#xBC30;&#xCE58;&#xD574;&#xC57C;&#xD574;&#xC694;</p><blockquote>&#xBC88;&#xB4E4;&#xC758; &#xAD6C;&#xC870;&#xB294; &#xBC88;&#xB4E4;&#xC758; &#xD0C0;&#xC785;&#xACFC; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0; &#xB530;&#xB77C; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;.</blockquote><p>&#xD55C;&#xBC88; &#xD655;&#xC778;&#xD574;&#xBCFC;&#xAE4C;&#xC694;?</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422353-ea26f3b6-5d42-47fc-bab3-5fd4866d71dd.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xC74C;&#xC545; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xC6B0;&#xD074;&#xB9AD;&#xD55C; &#xD6C4;&#xC5D0; Show Package Contents&#xB97C; &#xD074;&#xB9AD;&#xD574; &#xBD05;&#xC2DC;&#xB2E4;.</p><p>Bundle&#xC744; &#xD655;&#xC778;&#xD574; &#xBCF4;&#xB824;&#xACE0; &#xD558;&#xB294;&#xB370; &#xC65C; Package&#xB97C;  &#xC5F4;&#xC5B4;&#xBD10;&#xC57C;&#xD560;&#xAE4C;&#xC694;?<br>Package&#xC758; &#xC815;&#xC758;&#xB97C; &#xBA3C;&#xC800; &#xC77D;&#xC5B4;&#xBD05;&#xC2DC;&#xB2E4;.</p><blockquote>A <em>package</em> is any directory that the Finder presents to the user as if it were a single file.<br>- <a href="https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html?ref=noah-ios.dev#//apple_ref/doc/uid/10000123i-CH100-SW2">Apple Developer Bundle Programming Guide</a></blockquote><p>&#xD328;&#xD0A4;&#xC9C0;&#xB294; Finder&#xAC00; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xB2E8;&#xC77C; &#xD30C;&#xC77C;&#xB85C; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;. <br>&#xD328;&#xD0A4;&#xC9C0;&#xB294; macOS&#xC5D0;&#xC11C; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xCD94;&#xC0C1;&#xD654;&#xD558;&#xB294; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xBC29;&#xBC95; &#xC911; &#xD558;&#xB098;&#xC778;&#xB370;&#xC694;, Package&#xB294; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC774;&#xC9C0;&#xB9CC; Finder&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB97C; &#xB2E8;&#xC77C; &#xD30C;&#xC77C;&#xB85C; &#xC778;&#xC2DD;&#xD569;&#xB2C8;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xD30C;&#xC778;&#xB354;&#xC5D0;&#xC11C; &#xB354;&#xBE14;&#xD074;&#xB9AD;&#xD558;&#xBA74; &#xD574;&#xB2F9; &#xB514;&#xB809;&#xD130;&#xB9AC; &#xB0B4;&#xBD80;&#xB85C; &#xC774;&#xB3D9;&#xD558;&#xC9C0;&#xB9CC;, &#xD328;&#xD0A4;&#xC9C0;&#xB97C; &#xB354;&#xBE14;&#xD074;&#xB9AD;&#xD558;&#xBA74; &#xD574;&#xB2F9; &#xD30C;&#xC77C;&#xC774; &#xC2E4;&#xD589;&#xB429;&#xB2C8;&#xB2E4;.</p><blockquote>&#xB530;&#xB77C;&#xC11C; &#xC6B0;&#xB9AC;&#xAC00; mac&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294; application&#xB3C4; &#xBAA8;&#xB450; &#xD328;&#xD0A4;&#xC9C0;&#xC785;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC704;&#xC5D0;&#xC11C; &#xC6B0;&#xD074;&#xB9AD;&#xC73C;&#xB85C; &#xD655;&#xC778;&#xD558;&#xB824;&#xACE0; &#xD588;&#xB358; application&#xB3C4; &#xC5EC;&#xB7EC; &#xD328;&#xD0A4;&#xC9C0; &#xC885;&#xB958; &#xC911; &#xD558;&#xB098;&#xC778;&#xB370;&#xC694;, Finder&#xAC00; &#xD328;&#xD0A4;&#xC9C0;&#xB85C; &#xC778;&#xC2DD;&#xD558;&#xB294; &#xAC83;&#xC740; <code>.app</code>, <code>.bundle</code>, <code>.framework</code>, <code>.plugin</code> &#xB4F1;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC6B0;&#xB9AC;&#xAC00; &#xC54C;&#xC544;&#xBCF4;&#xB824;&#xACE0; &#xD558;&#xB294; &#xBC88;&#xB4E4;&#xACFC; &#xD328;&#xD0A4;&#xC9C0;&#xB294; &#xC5B4;&#xB5A4; &#xAD00;&#xACC4;&#xC77C;&#xAE4C;&#xC694;?</p><p><strong>&#xB9CE;&#xC740; &#xD0C0;&#xC785;&#xC758; &#xBC88;&#xB4E4;&#xC774; &#xD328;&#xD0A4;&#xC9C0;&#xC774;&#xAE30;&#xB3C4; &#xD55C;&#xB370;&#xC694;,</strong></p><p>&#xD328;&#xD0A4;&#xC9C0;&#xAC00; &#xC0AC;&#xC6A9;&#xC790;&#xC5D0;&#xAC8C; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xB2E8;&#xC77C; &#xD30C;&#xC77C;&#xB85C; &#xBCF4;&#xC5EC;&#xC90C;&#xC73C;&#xB85C;&#xC368; &#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xAC1C;&#xC120;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC874;&#xC7AC;&#xD558;&#xB294; &#xBC18;&#xBA74; <br>&#xBC88;&#xB4E4;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xCF54;&#xB4DC;&#xB97C; &#xD328;&#xD0A4;&#xC9D5;&#xD558;&#xACE0; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xC5D0; &#xC561;&#xC138;&#xC2A4;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3D5;&#xB294;&#xB370; &#xB354; &#xC911;&#xC810;&#xC744; &#xB461;&#xB2C8;&#xB2E4;.</p><p>&#xBC88;&#xB4E4;&#xC740; &#xD45C;&#xC900;&#xD654;&#xB41C; &#xAD6C;&#xC870;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294; &#xBC18;&#xBA74;, &#xD328;&#xD0A4;&#xC9C0;&#xB294; &#xB0B4;&#xBD80;&#xC5D0; &#xC5B4;&#xB5A4; &#xD3F4;&#xB354; &#xAD6C;&#xC870;&#xB3C4; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBAA8;&#xB4E0; &#xD328;&#xD0A4;&#xC9C0;&#xAC00; &#xBC88;&#xB4E4;&#xC778; &#xAC83;&#xC740; &#xC544;&#xB2D9;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xC6B0;&#xB9AC;&#xAC00; &#xBCF4;&#xB824;&#xACE0; &#xD558;&#xB294; application&#xC740; finder&#xC5D0;&#xC11C; &#xB2E8;&#xC77C; &#xD30C;&#xC77C;&#xB85C; &#xBCF4;&#xC5EC;&#xC9C0;&#xB294; &#xD328;&#xD0A4;&#xC9C0;&#xC774;&#xBA74;&#xC11C;, &#xC2E4;&#xD589; &#xCF54;&#xB4DC;&#xC640; &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;(&#xC774;&#xBBF8;&#xC9C0;, &#xC74C;&#xC545;, &#xC2A4;&#xD1A0;&#xB9AC;&#xBCF4;&#xB4DC; &#xB4F1;&#xB4F1;)&#xC744; &#xD3EC;&#xD568;&#xD558;&#xB294; &#xBC88;&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xC2DC; &#xB3CC;&#xC544;&#xC640;&#xC11C; show package contents&#xB97C; &#xD074;&#xB9AD;&#xD574; &#xD328;&#xD0A4;&#xC9C0;&#xC774;&#xBA74;&#xC11C;, &#xC2E4;&#xD589; &#xCF54;&#xB4DC;&#xC640; &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xB294; &#xBC88;&#xB4E4;&#xC778;, application &#xBC88;&#xB4E4;&#xC744; &#xD655;&#xC778;&#xD574; &#xBD05;&#xC2DC;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422366-1b1db840-4a87-4972-a96c-ce8d5f9b6b3c.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>macOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC5D0; &#xC811;&#xADFC;&#xD574; &#xBCF4;&#xB2C8; &#xAC00;&#xC7A5; &#xBA3C;&#xC800; Contents&#xB77C;&#xB294; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xAC00; &#xC788;&#xB124;&#xC694;, &#xB0B4;&#xBD80;&#xB85C; &#xD55C; &#xBC88; &#xB354;&#xB4E4;&#xC5B4;&#xAC00; &#xBCFC;&#xAE4C;&#xC694;?</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422371-dc113237-8c43-49d6-b690-2427e9104545.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>Contents &#xB514;&#xB809;&#xD130;&#xB9AC; &#xB0B4;&#xBD80;&#xB97C; &#xBCF4;&#xB2C8;,&#xC5EC;&#xB7EC; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC640; &#xD30C;&#xC77C;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;,<br>&#xADF8; &#xC911; Resources &#xB514;&#xB809;&#xD130;&#xB9AC; &#xB0B4;&#xBD80;&#xB97C; &#xB4E4;&#xC5EC;&#xB2E4;&#xBCF4;&#xB3C4;&#xB85D; &#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422379-c9ea2875-c914-4983-befd-a162074db39d.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>Resources &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00; &#xBCF4;&#xB2C8; &#xC571;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC544;&#xC774;&#xCF58;, &#xB85C;&#xCEEC;&#xB77C;&#xC774;&#xC81C;&#xC774;&#xC158;&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xD30C;&#xC77C;, <code>WelcomeWindowController.nib</code> &#xC774;&#xB77C;&#xB294; &#xC2A4;&#xD1A0;&#xB9AC;&#xBCF4;&#xB4DC; &#xD30C;&#xC77C;(&#xB9AC;&#xC18C;&#xC2A4; &#xAD00;&#xB828; &#xD30C;&#xC77C;)&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB124;&#xC694;!</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422383-ace8307e-3fa3-498f-97b2-225584c98409.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xC55E;&#xC11C; &#xBC88;&#xB4E4;&#xC740; &#xACC4;&#xCE35; &#xAD6C;&#xC870;&#xB97C; &#xAC00;&#xC9C4; &#xD45C;&#xC900;&#xD654;&#xB41C; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xAC00;&#xB9AC;&#xD0A8;&#xB2E4;&#xACE0; &#xD588;&#xB294;&#xB370;&#xC694;, <br>&#xCE74;&#xCE74;&#xC624;&#xD1A1;&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xB3C4; Music &#xC571;&#xCC98;&#xB7FC; Resources &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC744;&#xAE4C;&#xC694;? <br>&#xD55C;&#xBC88; &#xC0B4;&#xD3B4;&#xBD05;&#xC2DC;&#xB2E4;!</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422385-9605b7fa-f1cf-4167-8a89-7ded5c185fe3.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; <code>Contents/Resources</code> &#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xBCF4;&#xBA74; &#xC2A4;&#xD1A0;&#xB9AC;&#xBCF4;&#xB4DC; &#xD30C;&#xC77C;&#xACFC;, &#xC571; &#xC544;&#xC774;&#xCF58;&#xACFC; &#xC571; &#xB0B4;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xC5EC;&#xB7EC; &#xC774;&#xBBF8;&#xC9C0; &#xD30C;&#xC77C;&#xACFC; &#xC74C;&#xC545;&#xD30C;&#xC77C;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422389-57f47bd7-6170-46ca-b92a-c74401c276fe.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xBC88;&#xB4E4;&#xC758; &#xAD6C;&#xC870;&#xB294; &#xC55E;&#xC11C; &#xB9D0;&#xD55C; &#xBC14;&#xC640; &#xAC19;&#xC774; &#xBC88;&#xB4E4;&#xC758; &#xD0C0;&#xC785;&#xACFC; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0; &#xB530;&#xB77C; &#xB2E4;&#xB974;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; iOS&#xB098; watchOS, tvOS&#xC5D0;&#xC11C;&#xB294; &#xB2E4;&#xB978; &#xAD6C;&#xC870;&#xC77C; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><blockquote>iOS&#xC5D0;&#xC11C;&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC740; &#xBC11;&#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>macOS&#xC5D0;&#xC11C;&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC740; &#xC5B4;&#xB5A4; &#xD45C;&#xC900;&#xD654;&#xB41C; &#xACC4;&#xCE35; &#xAD6C;&#xC870;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC744;&#xAE4C;&#xC694;?<br>macOS&#xC5D0;&#xC11C;&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC740; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xD30C;&#xC77C;&#xB4E4;&#xC744; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC694;</p>
<!--kg-card-begin: html-->
<table class="graybox" border="0" cellspacing="0" cellpadding="5" style="border-top: 1px solid rgb(155, 179, 205); border-left: 1px solid rgb(155, 179, 205); margin-bottom: 4em; color: rgb(0, 0, 0); font-family: " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: font-variant-caps: font-weight: 400; letter-spacing: orphans: 2; text-align: start; text-transform: none; widows: word-spacing: 0px; -webkit-text-stroke-width: white-space: background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: text-decoration-color: initial;"><tbody><tr><th scope="col" class="TableHeading_TableRow_TableCell" style="text-align: left; font-weight: 400; background: rgb(147, 165, 187); padding: 0.3em 0.667em; font-size: 13.39px; color: rgb(255, 255, 255); border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0.33em; font: 700 13.39px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">File</p></th><th scope="col" class="TableHeading_TableRow_TableCell" style="text-align: left; font-weight: 400; background: rgb(147, 165, 187); padding: 0.3em 0.667em; font-size: 13.39px; color: rgb(255, 255, 255); border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0.33em; font: 700 13.39px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">Description</p></th></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">Info.plist</code><span>&#xA0;</span>file</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">(Required) The<span>&#xA0;</span><em class="newTerm" style="font-family: " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif; font-size: 13px; font-style: italic;">information property list</em><span>&#xA0;</span>file is a<span>&#xA0;</span><span class="pediaLink" data-header="Property list" data-contents="A property list is a representation of a hierarchy of objects that can be stored in the file system and reconstituted later. "><a data-renderer-version="1" target="_self" onclick="s_objectID=" https: developer.apple.com library archive documentation general conceptual devpedia-cocoacore p_1";return this.s_oc?this.s_oc(e):true" data-href="../../../../General/Conceptual/DevPedia-CocoaCore/PropertyList.html#//apple_ref/doc/uid/TP40008195-CH44" style="color: rgb(51, 102, 204); text-decoration: none; font-style: normal; border-bottom: 1px dashed rgb(51, 102, 204); white-space: nowrap; cursor: pointer; transition-property: color, background-color, border-bottom, -webkit-border-top-left-radius, -webkit-border-top-right-radius, padding, margin; transition-duration: 0.25s;">structured file</a></span><span>&#xA0;</span>that contains configuration information for the application. The system relies on the presence of this file to identify relevant information about your application and any related files.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">Executable</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">(Required) Every application must have an executable file. This file contains the application&#x2019;s main entry point and any code that was statically linked to the application target.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">Resource files</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">Resources are data files that live outside your application&#x2019;s executable file. Resources typically consist of things like images, icons, sounds,<span>&#xA0;</span><span class="pediaLink" data-header="Nib file" data-contents="A nib file is a special type of resource file that you use to store the user interfaces of iOS and Mac apps. "><a data-renderer-version="1" target="_self" onclick="s_objectID=" https: developer.apple.com library archive documentation general conceptual devpedia-cocoacore n_1";return this.s_oc?this.s_oc(e):true" data-href="../../../../General/Conceptual/DevPedia-CocoaCore/NibFile.html#//apple_ref/doc/uid/TP40008195-CH34" style="color: rgb(51, 102, 204); text-decoration: none; font-style: normal; border-bottom: 1px dashed rgb(51, 102, 204); white-space: nowrap; cursor: pointer; transition-property: color, background-color, border-bottom, -webkit-border-top-left-radius, -webkit-border-top-right-radius, padding, margin; transition-duration: 0.25s;">nib files</a></span>, strings files, configuration files, and data files (among others). Most resource files can be localized for a particular language or region or shared by all localizations.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">The placement of resource files in the bundle directory structure depends on whether you are developing an iOS or Mac app.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">Other support files</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px " lucida grande", "lucida sans unicode", helvetica, arial, verdana, sans-serif;">Mac apps can embed additional high-level resources such as private<span>&#xA0;</span><span class="pediaLink" data-header="Framework" data-contents="A framework is a bundle (a structured directory) that contains a dynamic shared library along with associated resources, such as nib files, image files, and header files. "><a data-renderer-version="1" target="_self" onclick="s_objectID=" https: developer.apple.com library archive documentation general conceptual devpedia-cocoacore f_1";return this.s_oc?this.s_oc(e):true" data-href="../../../../General/Conceptual/DevPedia-CocoaCore/Framework.html#//apple_ref/doc/uid/TP40008195-CH56" style="color: rgb(51, 102, 204); text-decoration: none; font-style: normal; border-bottom: 1px dashed rgb(51, 102, 204); white-space: nowrap; cursor: pointer; transition-property: color, background-color, border-bottom, -webkit-border-top-left-radius, -webkit-border-top-right-radius, padding, margin; transition-duration: 0.25s;">frameworks</a></span>, plug-ins, document templates, and other custom data resources that are integral to the application. Although you can include custom data resources in your iOS application bundles, you cannot include custom frameworks or plug-ins.</p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p><code>Info.plist</code>&#xB97C; &#xD1B5;&#xD574; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC0F; &#xAD00;&#xB828; &#xD30C;&#xC77C;&#xC5D0; &#xB300;&#xD55C; &#xAD00;&#xB828; &#xC815;&#xBCF4;&#xB97C; &#xC2DD;&#xBCC4;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC740; <code>Info.plist</code>&#xB97C; &#xAF2D; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xBAA8;&#xB4E0; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC740; &#xC2E4;&#xD589;&#xD30C;&#xC77C;(executable file)&#xC744; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xB294;&#xB370;&#xC694;, &#xC774; &#xD30C;&#xC77C;&#xC5D0;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; main entry point&#xC640; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xD0C0;&#xAC9F;&#xC5D0; &#xC815;&#xC801;&#xC73C;&#xB85C; &#xB9C1;&#xD06C;&#xB41C; &#xCF54;&#xB4DC;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4; &#xC788;&#xC5B4;&#xC694;</p><p>Resources&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xC2E4;&#xD589;&#xD30C;&#xC77C; &#xC678;&#xBD80;&#xC5D0; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130; &#xD30C;&#xC77C; &#xC785;&#xB2C8;&#xB2E4;. <br>&#xC704;&#xC5D0;&#xC11C; &#xBCF8; &#xAC83;&#xCC98;&#xB7FC; &#xC774;&#xBBF8;&#xC9C0;, &#xC544;&#xC774;&#xCF58;, &#xC74C;&#xC545;&#xD30C;&#xC77C;, &#xC2A4;&#xD1A0;&#xB9AC;&#xBCF4;&#xB4DC; &#xD30C;&#xC77C;, &#xB85C;&#xCEEC;&#xB77C;&#xC774;&#xC81C;&#xC774;&#xC158;&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xD30C;&#xC77C;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4; &#xC788;&#xC5B4;&#xC694;</p><blockquote>&#xB300;&#xBD80;&#xBD84;&#xC758; Resources &#xD30C;&#xC77C;&#xC740; &#xD2B9;&#xC815; &#xC5B8;&#xC5B4;, &#xC9C0;&#xC5ED;&#xC5D0; &#xB9DE;&#xAC8C; &#xB85C;&#xCEEC;&#xB77C;&#xC774;&#xC81C;&#xC774;&#xC158; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC774;&#xC81C; iOS&#xC5D0;&#xC11C;&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC758; &#xAD6C;&#xC870;&#xB97C; &#xC0B4;&#xD3B4;&#xBCFC;&#xAE4C;&#xC694;?</p><h3 id="ios-application-bundle">iOS Application Bundle</h3><p>iOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC758; &#xAD6C;&#xC870;&#xB294; &#xBAA8;&#xBC14;&#xC77C; &#xB514;&#xBC14;&#xC774;&#xC2A4; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC5D0; &#xB9DE;&#xAC8C; &#xB514;&#xC2A4;&#xD06C; &#xACF5;&#xAC04;&#xC744; &#xC808;&#xC57D;&#xD558;&#xACE0; &#xD30C;&#xC77C;&#xC5D0; &#xB300;&#xD55C; &#xC561;&#xC138;&#xC2A4;&#xB97C; &#xB2E8;&#xC21C;&#xD654;&#xD558;&#xAE30; &#xC704;&#xD574; &#xCD5C;&#xC0C1;&#xC704; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xC2E4;&#xD589;&#xD30C;&#xC77C;&#xACFC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBAA8;&#xB4E0; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC5B4; macOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xACFC; &#xBE44;&#xAD50;&#xD588;&#xC744; &#xB54C; &#xBE44;&#xAD50;&#xC801; &#xD3C9;&#xD3C9;&#xD55C; &#xAD6C;&#xC870;&#xB85C; &#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xC694;</p><p>&#xB300;&#xBD80;&#xBD84;&#xC758; Xcode &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xD15C;&#xD50C;&#xB9BF;&#xC73C;&#xB85C; &#xB9CC;&#xB4E0; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB294; &#xC2E4;&#xD589; &#xD30C;&#xC77C;&#xC744; &#xBE4C;&#xB4DC;&#xD560; &#xB54C; &#xBE4C;&#xB4DC;&#xD558;&#xB824;&#xACE0; &#xD558;&#xB294; target&#xC5D0; &#xB300;&#xD55C; &#xBC88;&#xB4E4;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294;&#xB370;&#xC694;,<br>iOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xBE4C;&#xB4DC;&#xD560; &#xB54C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC744; &#xD655;&#xC778;&#xD574; &#xBCF4;&#xBA70; iOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC758; &#xAD6C;&#xC870;&#xB97C; &#xC0B4;&#xD3B4;&#xBD05;&#xC2DC;&#xB2E4;.</p><p>iOS App &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C;  Product&#xB97C; &#xD074;&#xB9AD;&#xD55C; &#xD6C4;&#xC5D0;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422395-55d030ee-4d96-4eb0-8e1f-d71ffa058b77.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure>
<!--kg-card-begin: html-->
<img src="https://user-images.githubusercontent.com/63908856/282422396-6c0bd693-f05e-4d0d-8cb9-688c99fd70ed.png" width="300px" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;">
<!--kg-card-end: html-->
<p>Show Build Folder in Finder&#xB97C; &#xD074;&#xB9AD;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422400-5b741288-2072-405a-be34-1a21ea6d79c9.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>Build/Products/Dev-iphonesimulator &#xC5D0; &#xC811;&#xADFC;&#xD558;&#xAC8C; &#xB418;&#xBA74; <br>&#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;,</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422405-20db00b4-b64f-41c4-96ee-53b9a5e44dd4.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4; &#xB0B4;&#xBD80;&#xB85C; &#xAC00;&#xBCFC;&#xAE4C;&#xC694;?</p>
<!--kg-card-begin: html-->
<img src="https://user-images.githubusercontent.com/63908856/282422441-ed8d0c66-627c-4c88-a0fa-9fbcd40ce857.png" width="500px" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;">
<!--kg-card-end: html-->
<p>&#xC55E;&#xC11C; &#xB9D0;&#xD55C; &#xAC83;&#xCC98;&#xB7FC; macOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xACFC; &#xB2EC;&#xB9AC; iOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC740; &#xCD5C;&#xC0C1;&#xC704; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xC2E4;&#xD589;&#xD30C;&#xC77C;&#xACFC; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xBAA8;&#xB4E0; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4; &#xC788;&#xB124;&#xC694;</p><p>iOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xB3C4; &#xC5ED;&#xC2DC; Info.plist&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC57C; &#xD558;&#xB294;&#xB370;&#xC694;, Info.plist&#xC5D0;&#xB294; &#xBC88;&#xB4E4;&#xC758; ID, &#xBC84;&#xC804; &#xBC88;&#xD638;, display name&#xB4F1; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xB4E4;&#xC5B4;&#xC788;&#xC5B4;&#xC694;</p><p>&#xC55E;&#xC11C; &#xB300;&#xBD80;&#xBD84;&#xC758; Xcode &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xD15C;&#xD50C;&#xB9BF;&#xC73C;&#xB85C; &#xB9CC;&#xB4E0; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB294; &#xC2E4;&#xD589; &#xD30C;&#xC77C;&#xC744; &#xBE4C;&#xB4DC;&#xD560; &#xB54C; &#xBC88;&#xB4E4;&#xC744; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;&#xACE0; &#xD588;&#xB294;&#xB370;&#xC694;, &#xC6B0;&#xB9AC;&#xAC00; Xcode&#xC5D0;&#xC11C; iOS App &#xD15C;&#xD50C;&#xB9BF;&#xC744; &#xC774;&#xC6A9;&#xD574; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC2DC;&#xC791;&#xD560; &#xB54C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC740; &#xCC3D;&#xC774; &#xB728;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422413-25fa3dda-76cf-4d69-b1b2-6deb79df23b8.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xC774;&#xACF3;&#xC5D0;&#xC11C; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xC785;&#xB825;&#xD558;&#xB294; &#xC815;&#xBCF4;&#xC5D0; &#xB530;&#xB77C; Bundle Identifier&#xAC00; &#xC815;&#xD574;&#xC9C0;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><h3 id="plug-ins">Plug-ins</h3><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422444-34f146ed-5fe2-4af2-a5d3-c6f50ef00e8f.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p><code>Settings.bundle</code>&#xC740; &#xC124;&#xC815; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0; &#xCD94;&#xAC00;&#xD558;&#xB824;&#xB294; &#xC815;&#xBCF4;&#xAC00; &#xB2F4;&#xAE34; &#xD2B9;&#xC218;&#xD55C; &#xD0C0;&#xC785;&#xC758; <strong>&#xD50C;&#xB7EC;&#xADF8;&#xC778; &#xBC88;&#xB4E4;</strong>&#xC774;&#xC5D0;&#xC694;<br>&#xC81C;&#xAC00; &#xCC38;&#xC5EC;&#xD588;&#xB358; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC778; <a href="https://havit.app/?ref=noah-ios.dev">Havit</a>&#xC5D0;&#xC11C;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD55C; &#xC624;&#xD508;&#xC18C;&#xC2A4; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC; &#xC815;&#xBCF4;&#xB97C; <code>Settings.bundle</code>&#xC744; &#xC774;&#xC6A9;&#xD574; &#xC124;&#xC815; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD574;&#xC8FC;&#xC5C8;&#xC5B4;&#xC694;</p>
<!--kg-card-begin: html-->
<img src="https://user-images.githubusercontent.com/63908856/282688845-7611fa72-8660-41a2-9baf-6665a9e7d788.gif" width="300px" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;">
<!--kg-card-end: html-->
<p>&#xC5EC;&#xAE30;&#xAE4C;&#xC9C0; &#xC790;&#xC8FC; &#xC4F0;&#xB294; iOS, macOS&#xC758; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC758; &#xAD6C;&#xC870;&#xB97C; &#xC7A0;&#xC2DC; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC55E;&#xC11C; &#xBC88;&#xB4E4;&#xC740; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xCF54;&#xB4DC;&#xB97C; &#xD328;&#xD0A4;&#xC9D5;&#xD558;&#xACE0; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC5D0;&#xC11C; &#xD574;&#xB2F9; &#xCF54;&#xB4DC;&#xC5D0; &#xC561;&#xC138;&#xC2A4;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xB3D5;&#xB294;&#xB370; &#xB354; &#xC911;&#xC810;&#xC744; &#xB454;&#xB2E4;&#xACE0; &#xD588;&#xB294;&#xB370;&#xC694;,</p><p>&#xC5B4;&#xB5BB;&#xAC8C; &#xADF8;&#xB9AC;&#xACE0; &#xC5B4;&#xB5A4; &#xB3C4;&#xC6C0;&#xC744; &#xC904;&#xAE4C;&#xC694;?</p><h2 id="bundle-class">Bundle class</h2><p>&#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xCD94;&#xC0C1;&#xD654;&#xD55C; &#xD074;&#xB798;&#xC2A4;&#xC778; Bundle class&#xB97C; &#xC0B4;&#xD3B4;&#xBD05;&#xC2DC;&#xB2E4;.<br>&#xCD94;&#xC0C1;&#xD654;&#xB97C; &#xD1B5;&#xD574; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB294; &#xC774;&#xC810;&#xC740; &#xBB34;&#xC5C7;&#xC77C;&#xAE4C;&#xC694;?</p><p>&#xCD94;&#xC0C1;&#xD654;&#xB97C; &#xD1B5;&#xD574; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB294; &#xC774;&#xC810; &#xC911; &#xD558;&#xB098;&#xB294; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xCABD;&#xC5D0;&#xC11C; &#xAD6C;&#xD604; &#xB514;&#xD14C;&#xC77C;&#xC744; &#xBAB0;&#xB77C;&#xB3C4; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xD1B5;&#xD574; &#xD544;&#xC694;&#xD55C; &#xACB0;&#xACFC;&#xB97C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB294; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD574;&#xC694;</p><p>&#xADF8;&#xB7FC;, &#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xCD94;&#xC0C1;&#xD654;&#xD558;&#xBA74; &#xC5B4;&#xB5A8;&#xAE4C;&#xC694;?<br>&#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD558;&#xB294; &#xAC1C;&#xBC1C;&#xC790; &#xC785;&#xC7A5;&#xC5D0;&#xC11C;&#xB294; &#xD30C;&#xC77C;&#xAD6C;&#xC870;&#xC5D0; &#xB300;&#xD55C; &#xC138;&#xBD80; &#xB514;&#xD14C;&#xC77C;&#xC744; &#xBAB0;&#xB77C;&#xB3C4; Bundle&#xC758; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xC27D;&#xAC8C; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xCD94;&#xC0C1;&#xD654;&#xD55C; class&#xAC00; &#xBC14;&#xB85C;  <a href="https://developer.apple.com/documentation/foundation/bundle?ref=noah-ios.dev">Bundle class</a>&#xC785;&#xB2C8;&#xB2E4;.</p><p>Bundle class&#xC758; &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA70; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD560;&#xC9C0; &#xC54C;&#xC544;&#xBD05;&#xC2DC;&#xB2E4;.</p><p>&#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xD328;&#xD134;&#xC740; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBA3C;&#xC800; &#xC758;&#xB3C4;&#xD55C; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0; &#xB300;&#xD55C; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E0; &#xD6C4;, &#xD574;&#xB2F9; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xC758; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xD544;&#xC694;&#xD55C; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xCC3E;&#xAC70;&#xB098; &#xB85C;&#xB4DC;&#xD569;&#xB2C8;&#xB2E4;.</p><blockquote>&#xC790;&#xC8FC; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC77C;&#xBD80; &#xB9AC;&#xC18C;&#xC2A4; &#xD0C0;&#xC785;&#xC740; &#xBC88;&#xB4E4; &#xC5C6;&#xC774;&#xB3C4; &#xB85C;&#xB4DC;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;, <br>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; &#xC544;&#xB798; &#xCC98;&#xB7FC; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xB85C;&#xB4DC;&#xD560; &#xB54C; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xC5D0;&#xC14B; &#xCE74;&#xD0C8;&#xB85C;&#xADF8;&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xACE0;, UIImage&#xC758; <a href="https://developer.apple.com/documentation/uikit/uiimage/1624146-init?ref=noah-ios.dev">init(named:)</a> &#xC744; &#xC774;&#xC6A9;&#xD574; &#xC774;&#xBBF8;&#xC9C0; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xAC83;&#xC774; &#xADF8; &#xC608;&#xC2DC;&#xC785;&#xB2C8;&#xB2E4;.</blockquote><p>&#xBA3C;&#xC800; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xCC3E;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xBA3C;&#xC800; &#xCC3E;&#xC73C;&#xB824;&#xACE0; &#xD558;&#xB294; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xBC88;&#xB4E4;&#xC744; &#xC9C0;&#xC815;&#xD574;&#xC57C; &#xD558;&#xB294;&#xB370;&#xC694;, <br>&#xAC00;&#xC7A5; &#xC790;&#xC8FC; &#xC4F0;&#xAC8C; &#xB418;&#xB294; &#xBC88;&#xB4E4;&#xC740; &#xD604;&#xC7AC; &#xC2E4;&#xD589; &#xC911;&#xC778; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC758; &#xCF54;&#xB4DC;&#xC640; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xBA54;&#xC778; &#xBC88;&#xB4E4;&#xC785;&#xB2C8;&#xB2E4;. <br>&#xC774; &#xBA54;&#xC778; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xD1B5;&#xD574; &#xC571;&#xACFC; &#xD568;&#xAED8; &#xC81C;&#xACF5;&#xB41C; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xC561;&#xC138;&#xC2A4;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC544;&#xB798;&#xC758; &#xCF54;&#xB4DC;&#xCC98;&#xB7FC; &#xB9D0;&#xC774;&#xC8E0;</p><pre><code class="language-swift">let mainBundle = Bundle.main
</code></pre><p>&#xC774; &#xBA54;&#xC778; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xD1B5;&#xD574; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xD604;&#xC7AC; &#xC2E4;&#xD589; &#xC911;&#xC778; &#xCF54;&#xB4DC;&#xC640; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xB97C; &#xD655;&#xC778;&#xD574; &#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">let mainBundleDirectoryFilePath = Bundle.main.bundleURL
</code></pre><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422429-53051548-61bd-4d23-b565-eceeb35297e6.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xBA54;&#xC778; &#xBC88;&#xB4E4; &#xC774;&#xC678;&#xC5D0; &#xB2E4;&#xB978; &#xBC88;&#xB4E4;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC57C;&#xD560;&#xAE4C;&#xC694;?</p><p>Apple&#xC758; <a href="https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html?ref=noah-ios.dev">Bundle Class&#xBB38;&#xC11C;</a>&#xC758; &#xC124;&#xBA85;&#xC5D0; &#xB530;&#xB974;&#xBA74; &#xC571;&#xC774; &#xD50C;&#xB7EC;&#xADF8;&#xC778;, &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C; &#xB610;&#xB294; &#xAE30;&#xD0C0; &#xBC88;&#xB4E4; &#xCF58;&#xD150;&#xCE20;&#xC640; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xD1B5;&#xD574; &#xC571;&#xC774; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294; &#xBC88;&#xB4E4;&#xC5D0; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xACE0; &#xB418;&#xC5B4;&#xC788;&#xB294;&#xB370;&#xC694;,</p><blockquote>&#xC178; &#xC2A4;&#xD06C;&#xB9BD;&#xD2B8;, &#xC815;&#xC801; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;, &#xBC0F; &#xBCC4;&#xB3C4;&#xC758; &#xB3D9;&#xC801; &#xB77C;&#xC774;&#xBE0C;&#xB7EC;&#xB9AC;&#xB294; &#xBC88;&#xB4E4; &#xAD6C;&#xC870;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC608;&#xC2DC;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xBCF4;&#xBA70;, &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9; &#xC911;&#xC778; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C; &#xBC88;&#xB4E4;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422450-40b5a56e-cfcf-48b6-8523-448f73abc7c0.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xBA3C;&#xC800; &#xC0AC;&#xC6A9;&#xD560; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xD558;&#xB098; &#xC0DD;&#xC131;&#xD55C; &#xD6C4;&#xC5D0;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422456-31f197e5-778a-4b0e-ab79-2ddd4b3712f8.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC758; Product Name&#xC740; Example&#xB85C; &#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>Bundle Identifier&#xC5D0; <code>noah.Example</code>&#xC774;&#xB77C;&#xACE0; &#xC4F0;&#xC5EC; &#xC788;&#xB294; &#xAC8C; &#xBCF4;&#xC774;&#xC2DC;&#xB098;&#xC694;?</blockquote><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422457-4907c9cc-19cf-4ad0-92c1-86f9ea489e18.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xC774;&#xACF3;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xD558;&#xB098; &#xC0DD;&#xC131;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>&#xBAA8;&#xB4C8; &#xC678;&#xBD80;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xAC83;&#xC774;&#xBBC0;&#xB85C; <code>public</code> &#xC811;&#xADFC;&#xC81C;&#xC5B4;&#xC790;&#xB97C; &#xB2EC;&#xC544;&#xC8FC;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422483-12f777f3-33b8-4f13-a717-e93c250b3410.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p><code>Something</code>&#xC774;&#xB77C;&#xB294; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0; &#xBE4C;&#xB4DC;&#xB97C; &#xD55C; &#xD6C4;&#xC5D0;</p><p>iOS App &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC5D0;&#xC11C; &#xBC29;&#xAE08; &#xB9CC;&#xB4E0; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422466-c42ca43d-aded-481f-9bfe-54c252267c41.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422471-81d3ee9c-171d-46c2-ac03-146e09d42a98.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p>&#xC774;&#xACF3;&#xC5D0;&#xC11C; &#xBC14;&#xB85C; &#xC55E;&#xC5D0; &#xB9CC;&#xB4E0; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xCD94;&#xAC00;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#xC0AC;&#xC6A9;&#xD560; &#xBAA8;&#xB4C8;&#xC744; import &#xD55C; &#xD6C4;&#xC5D0;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422479-39698b5c-2f00-4985-b718-376da064d0b1.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p><code>mainBundleIdentifier</code>&#xB97C; &#xD655;&#xC778;&#xD574; &#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422490-7db11bd6-a00b-4b10-a38d-8cf70558280e.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p><code>mainBundleIdentifier</code>&#xB294; <code>noah.iOSExample</code>&#xC774;&#xB124;&#xC694;<br>iOS App &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xC0DD;&#xC131;&#xD560; &#xB54C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C4; Bundle Identifier&#xC640; &#xB3D9;&#xC77C;&#xD55C; &#xAC83;&#xC73C;&#xB85C; &#xBBF8;&#xB8E8;&#xC5B4; &#xBCF4;&#xC544; <code>mainBundleIdentifier</code>&#xAC00; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xBD88;&#xB7EC;&#xC640;&#xC9C4; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><p>&#xB2E4;&#xC74C; &#xBE0C;&#xB808;&#xC774;&#xD06C; &#xD3EC;&#xC778;&#xD2B8;&#xB85C; &#xB118;&#xC5B4;&#xAC00; &#xBD05;&#xC2DC;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422493-7cbc99f7-e660-4174-a1c9-81e1aa0e5fa3.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p><code>frameworkBundleIdentifier</code>&#xC758; &#xAC12;&#xC740; <code>noah.Example</code>&#xC785;&#xB2C8;&#xB2E4;.<br>&#xC5ED;&#xC2DC; &#xC704;&#xC5D0;&#xC11C; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xB9CC;&#xB4E4; &#xB54C; &#xC0DD;&#xC131;&#xD55C; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC758; Bundle Identifier&#xC640; &#xB3D9;&#xC77C;&#xD55C; &#xAC83;&#xC73C;&#xB85C; &#xBBF8;&#xB8E8;&#xC5B4;&#xBCF4;&#xC544;<br>&#xC6B0;&#xB9AC;&#xAC00; &#xC0DD;&#xC131;&#xD55C; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC758; &#xBC88;&#xB4E4;&#xC758; identifier&#xB97C; &#xC62C;&#xBC14;&#xB974;&#xAC8C; &#xBD88;&#xB7EC;&#xC640;&#xC9C4; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><p>&#xC774;&#xCC98;&#xB7FC; &#xBA54;&#xC778; &#xBC88;&#xB4E4;&#xC5D0;&#xC11C; &#xB85C;&#xB4DC;&#xD558;&#xB294; &#xB9AC;&#xC18C;&#xC2A4; &#xB300;&#xC2E0; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC758; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xC5D0; &#xB300;&#xD55C; &#xCC38;&#xC870;&#xB97C; &#xD1B5;&#xD574; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC5D0; &#xC788;&#xB294; &#xBC88;&#xB4E4; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xC811;&#xADFC;&#xD574; &#xD574;&#xB2F9; &#xD30C;&#xC77C;&#xC744; &#xBD88;&#xB7EC;&#xC62C; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;, <br>&#xC774;&#xB97C;&#xD14C;&#xBA74; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC5D0; &#xC788;&#xB294; &#xC774;&#xBBF8;&#xC9C0; &#xD639;&#xC740; Color Asset&#xC744; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xC704;&#xD574; UIImage&#xC5D0;&#xB294; <a href="https://developer.apple.com/documentation/uikit/uiimage/3294226-init?ref=noah-ios.dev">UIImage(named:in:with:)</a>&#xC640; &#xAC19;&#xC740; &#xC0DD;&#xC131;&#xC790;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xACE0; &#xC788;&#xC73C;&#xBA70; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xB123;&#xB294; &#xD30C;&#xB77C;&#xBBF8;&#xD130; &#xC790;&#xB9AC;&#xC5D0; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xAC00;&#xC838;&#xC624;&#xB824;&#xACE0; &#xD558;&#xB294; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xBA74; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C; UIColor&#xC5D0;&#xB3C4; &#xC5ED;&#xC2DC; <a href="https://developer.apple.com/documentation/uikit/uicolor/2877381-init?ref=noah-ios.dev">UIColor(named:in:compatibleWith:)</a>&#xC0DD;&#xC131;&#xC790;&#xB97C; &#xD1B5;&#xD574; Color Asset&#xC744; &#xAC00;&#xC838;&#xC624;&#xB824;&#xACE0; &#xD558;&#xB294;  &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xBA74; &#xD574;&#xB2F9; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC5D0;&#xC11C; Color Asset&#xC744; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><blockquote>&#xC774;&#xB97C; &#xC798; &#xD65C;&#xC6A9;&#xD558;&#xBA74; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xAC00; &#xB3C5;&#xB9BD;&#xC801;&#xC778; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xAC16;&#xB3C4;&#xB85D; &#xD560; &#xC218; &#xC788;&#xACA0;&#xB124;&#xC694; :)</blockquote><blockquote>image&#xC640; colorAsset&#xACFC; &#xAC19;&#xC774; &#xBC88;&#xB4E4;&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; framework&#xC758; linking option&#xC5D0;&#xC11C; mach-o type&#xC744; dynamic library&#xB85C; &#xC124;&#xC815;&#xD574; &#xC8FC;&#xC5B4;&#xC57C; &#xD558;&#xB294;&#xB370;&#xC694;, &#xC774; &#xC774;&#xC720;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xB2E4;&#xC74C; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xB610;&#xD55C; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xC5D0; &#xB300;&#xD55C; &#xCC38;&#xC870;&#xB97C; &#xC5BB;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC55E;&#xC11C; &#xC5B8;&#xAE09;&#xD55C; Bundle&#xACFC; &#xC5F0;&#xAD00;&#xB41C; &#xD074;&#xB798;&#xC2A4; &#xC774;&#xB984;&#xC744; &#xC801;&#xB294; &#xAC83; &#xB9D0;&#xACE0;&#xB3C4; &#xC544;&#xB798;&#xC758; &#xC0DD;&#xC131;&#xC790;&#xB97C; &#xC774;&#xC6A9;&#xD574; <br>Bundle&#xC758; identifier&#xB97C; &#xD1B5;&#xD574;, file URL&#xC744; &#xD1B5;&#xD574;, directory&#xC758; path&#xB97C; &#xC5B8;&#xAE09;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD1B5;&#xD574; &#xBC88;&#xB4E4; &#xAC1D;&#xCCB4;&#xC5D0; &#xB300;&#xD55C; &#xCC38;&#xC870;&#xB97C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><p><a href="https://developer.apple.com/documentation/foundation/bundle/1411929-init?ref=noah-ios.dev"><code>init?(identifier: String)</code></a></p><p>Returns the <code>NSBundle</code> instance that has the specified bundle identifier.</p><p><a href="https://developer.apple.com/documentation/foundation/bundle/1409352-init?ref=noah-ios.dev"><code>init?(url: URL)</code></a></p><p>Returns an <code>NSBundle</code> object initialized to correspond to the specified file URL.</p><p><a href="https://developer.apple.com/documentation/foundation/bundle/1412741-init?ref=noah-ios.dev"><code>init?(path: String)</code></a></p><p>Returns an <code>NSBundle</code> object initialized to correspond to the specified directory.</p><h2 id="%EB%B2%88%EB%93%A4%EC%97%90-%EB%A6%AC%EC%86%8C%EC%8A%A4%EA%B0%80-%EB%93%A4%EC%96%B4%EA%B0%80%EB%8A%94-%EC%8B%9C%EC%A0%90%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC">&#xBC88;&#xB4E4;&#xC5D0; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xB4E4;&#xC5B4;&#xAC00;&#xB294; &#xC2DC;&#xC810;&#xC5D0; &#xAD00;&#xD558;&#xC5EC;</h2><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC704;&#xC5D0;&#xC11C; &#xBCF8; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC5D0; &#xB9AC;&#xC18C;&#xC2A4;&#xB294; &#xC5B4;&#xB290; &#xC2DC;&#xC810;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB420;&#xAE4C;&#xC694;?<br>Xcode&#xC5D0;&#xC11C; iOS App &#xD504;&#xB85C;&#xC81D;&#xD2B8; &#xD15C;&#xD50C;&#xB9BF;&#xC744; &#xC774;&#xC6A9;&#xD558;&#xBA74; &#xCEF4;&#xD30C;&#xC77C;&#xD560; &#xC18C;&#xC2A4; &#xD30C;&#xC77C;, &#xBC88;&#xB4E4;&#xC5D0; &#xB9AC;&#xC18C;&#xC2A4;&#xB97C; &#xBCF5;&#xC0AC;&#xD558;&#xB294; &#xACFC;&#xC815; &#xB4F1; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC774; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xAE30; &#xC704;&#xD574; &#xD544;&#xC694;&#xD55C; &#xADDC;&#xCE59;&#xC774; &#xBBF8;&#xB9AC; &#xC815;&#xC758;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;,</p><p>&#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xC758; App Target&#xC758; Build Phase&#xB97C; &#xBCF4;&#xBA74;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/282422501-1ef6fd3d-5d7f-4ed0-828a-649d272220c2.png" class="kg-image" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy"></figure><p><code>Copy Bundle Resources</code> &#xB77C;&#xB294; Phase&#xB97C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694; <br>&#xBC14;&#xB85C; &#xC774; &#xC2DC;&#xC810;&#xC5D0; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><p>&#xBE4C;&#xB4DC; &#xACB0;&#xACFC;&#xB85C; &#xB098;&#xC624;&#xAC8C; &#xB41C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC744; &#xD655;&#xC778;&#xD574; &#xBCFC;&#xAE4C;&#xC694;?</p>
<!--kg-card-begin: html-->
<img src="https://user-images.githubusercontent.com/63908856/282422509-9655c1f0-97ee-4c21-9de3-ebec5a8964db.png" width="300px" alt="Bundle&#xC5D0; &#xAD00;&#xD558;&#xC5EC;">
<!--kg-card-end: html-->
<p><code>Assets.xcassets</code>&#xC740; Assets.car&#xB85C; <code>Something.storyboard</code> &#xD30C;&#xC77C;&#xC740; <code>Somthing.storyboardc</code>&#xB85C; &#xCEF4;&#xD30C;&#xC77C; &#xB418;&#xC5B4; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC5D0; &#xB4E4;&#xC5B4;&#xAC00; &#xC788;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC5B4;&#xC694;</p><blockquote>xib&#xD30C;&#xC77C;&#xC740; nib&#xD30C;&#xC77C;&#xB85C; &#xCEF4;&#xD30C;&#xC77C;&#xB429;&#xB2C8;&#xB2E4;.</blockquote><h2 id="%EB%A7%88%EC%B9%98%EB%A9%B0">&#xB9C8;&#xCE58;&#xBA70;</h2><p>Bundle Class&#xAC00; &#xC544;&#xBB34;&#xB9AC; &#xCD94;&#xC0C1;&#xD654;&#xAC00; &#xC798; &#xB418;&#xC5B4;&#xC788;&#xC5B4;&#xB3C4; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC758; &#xAD6C;&#xC870;&#xC640; &#xADF8; &#xC548;&#xC5D0; &#xC788;&#xB294; &#xCF54;&#xB4DC; &#xBC0F; &#xB9AC;&#xC18C;&#xC2A4;&#xC5D0; &#xC561;&#xC138;&#xC2A4;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC774;&#xD574;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC911;&#xC694;&#xD558;&#xB2E4;&#xACE0; &#xC0DD;&#xAC01;&#xD574;&#xC694;</p><p>&#xB530;&#xB77C;&#xC11C; &#xC624;&#xB298;&#xC740; &#xBC88;&#xB4E4; &#xB514;&#xB809;&#xD130;&#xB9AC;&#xC640;, &#xBC88;&#xB4E4; &#xD074;&#xB798;&#xC2A4;&#xC5D0; &#xB300;&#xD55C; &#xAC1C;&#xB150;&#xACFC; &#xC790;&#xC8FC; &#xC4F0;&#xC774;&#xB294;, &#xD639;&#xC740; &#xC4F0;&#xAC8C;&#xB420; macOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;, iOS &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158; &#xBC88;&#xB4E4;&#xC758; &#xAD6C;&#xC870;&#xC5D0; &#xB300;&#xD574; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xACE0; Bundle class&#xC758; &#xC0AC;&#xC6A9;&#xBC95;&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xBC88; &#xAE00;&#xC774; &#xBC88;&#xB4E4;&#xC5D0; &#xB300;&#xD55C; &#xC774;&#xD574;&#xB97C; &#xB192;&#xC774;&#xB294; &#xACC4;&#xAE30;&#xAC00; &#xB418;&#xC5C8;&#xC73C;&#xBA74; &#xC88B;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. <br>&#xAE34; &#xAE00; &#xC77D;&#xC5B4;&#xC8FC;&#xC154;&#xC11C; &#xAC10;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;.</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em> &#x1F60A;</p><h2 id="%EC%B0%B8%EA%B3%A0">&#xCC38;&#xACE0;</h2><ul><li><a href="https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html?ref=noah-ios.dev#//apple_ref/doc/uid/10000123i-CH100-SW2">Apple Developer Bundle Programming Guide</a></li><li><a href="https://hcn1519.github.io/articles/2018-12/bundle?ref=noah-ios.dev">https://hcn1519.github.io/articles/2018-12/bundle</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Thank you Jonathan Rasmusson!!]]></title><description><![CDATA[<p>WWDC 2016 UnderStanding Swift Performance&#xC744; &#xBCF4;&#xACE0; &#xB3D9;&#xB8CC;&#xB4E4;&#xACFC; &#xC2A4;&#xD130;&#xB514;&#xB97C; &#xD55C; &#xB4A4;&#xC5D0; &#xC798;&#xBABB; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC788;&#xB358; &#xBD80;&#xBD84;(&#xBD80;&#xB044;&#xB7FD;&#xC9C0;&#xB9CC; Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C;</p>]]></description><link>https://noah-ios.dev/thank-you-jonathan-rasmusson/</link><guid isPermaLink="false">64e8cc7822fba699ec4bbc8a</guid><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Thu, 29 Jun 2023 15:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0dWR5fGVufDB8fHx8MTY5MjkzNTQ3M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0dWR5fGVufDB8fHx8MTY5MjkzNTQ3M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Thank you Jonathan Rasmusson!!"><p>WWDC 2016 UnderStanding Swift Performance&#xC744; &#xBCF4;&#xACE0; &#xB3D9;&#xB8CC;&#xB4E4;&#xACFC; &#xC2A4;&#xD130;&#xB514;&#xB97C; &#xD55C; &#xB4A4;&#xC5D0; &#xC798;&#xBABB; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC788;&#xB358; &#xBD80;&#xBD84;(&#xBD80;&#xB044;&#xB7FD;&#xC9C0;&#xB9CC; Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC54C;&#xACE0; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.)&#xC744; &#xBC14;&#xB85C; &#xC7A1;&#xAE30; &#xC704;&#xD574; &#xBA54;&#xBAA8;&#xB9AC; &#xB9F5;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA70; Value Type&#xC774; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB418;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2D8;&#xC744; &#xC800;&#xBC88; &#xD3EC;&#xC2A4;&#xD2B8;&#xB97C; &#xD1B5;&#xD574; &#xC870;&#xC0AC;&#xD574;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="%EC%A7%80%EB%82%9C%EB%B2%88-%ED%8F%AC%EC%8A%A4%ED%8A%B8-value-type%EC%9D%80-%EB%AC%B4%EC%A1%B0%EA%B1%B4-stack%EC%97%90%EB%A7%8C-%ED%95%A0%EB%8B%B9%EB%90%A0%EA%B9%8C">&#xC9C0;&#xB09C;&#xBC88; &#xD3EC;&#xC2A4;&#xD2B8; : <a href="https://noah0316.github.io/Swift/2022-06-29-value-type%EC%9D%80-%EB%AC%B4%EC%A1%B0%EA%B1%B4-stack%EC%97%90%EB%A7%8C-%ED%95%A0%EB%8B%B9%EB%90%A0%EA%B9%8C/?ref=noah-ios.dev">Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?</a></h3><p>&#xC870;&#xC0AC;&#xD558;&#xBA70; &#xC54C;&#xAC8C; &#xB41C; &#xB0B4;&#xC6A9;&#xC744; &#xD3C9;&#xC18C; &#xC874;&#xACBD;&#xD558;&#xB294; &#xAC1C;&#xBC1C;&#xC790;&#xC774;&#xC790; &#xC804; &#xC2A4;&#xD3EC;&#xD2F0;&#xD30C;&#xC774;&#xC758; &#xAC1C;&#xBC1C;&#xC790;&#xC774;&#xC2E0; Jonathan Rasmusson&#xB2D8;&#xC758; &#xAD50;&#xC721;&#xC6A9; &#xB808;&#xD3EC;&#xC9C0;&#xD1A0;&#xB9AC;&#xC5D0; &#xAC19;&#xC774; &#xACF5;&#xBD80;&#xD558;&#xB294; <strong>&#xB354; &#xB9CE;&#xC740; &#xD559;&#xC0DD;&#xB4E4;</strong>&#xC5D0;&#xAC8C; &#xC774; &#xB0B4;&#xC6A9;&#xC744; <strong>&#xACF5;&#xC720;</strong>&#xD558;&#xACE0; &#xC2F6;&#xC5B4; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xACF5;&#xC720;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/254bea654fd156016506c3d46202fbf1/6aca1/1.jpg" class="kg-image" alt="Thank you Jonathan Rasmusson!!" loading="lazy" title="1"></figure><p><strong>&#xC815;&#xB9D0; &#xAC10;&#xC0AC;&#xD558;&#xAC8C;&#xB3C4;</strong> &#xC774;&#xC288;&#xB97C; &#xB0A8;&#xAE34; &#xC9C0; &#xC5BC;&#xB9C8; &#xB418;&#xC9C0; &#xC54A;&#xC544; &#xB2F5;&#xBCC0;&#xC744; &#xB0A8;&#xACA8;&#xC8FC;&#xC168;&#xACE0;,</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/bb383699ce15ece37868fd2660faef78/a6d36/2.png" class="kg-image" alt="Thank you Jonathan Rasmusson!!" loading="lazy" title="2"></figure><p>&#xB2F5;&#xBCC0;&#xC744; &#xBCF4;&#xBA70; &#xC55E;&#xC73C;&#xB85C; &#xAC1C;&#xBC1C;&#xC790;&#xB85C;&#xC11C; &#xC9C0;&#xB140;&#xC57C; &#xD560; &#xC790;&#xC138;&#xC5D0; &#xB300;&#xD574; &#xB9CE;&#xC740; &#xC0DD;&#xAC01;&#xC744; &#xD588;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC88B;&#xC740; &#xAE30;&#xC5C5;&#xC5D0;&#xC11C;, &#xB610; &#xD604;&#xC5C5;&#xC5D0;&#xC11C; &#xC624;&#xB798;&#xB3C4;&#xB85D; &#xACBD;&#xD5D8;&#xC744; &#xC313;&#xC544;&#xC624;&#xC2E0; &#xBD84;&#xC774;, &#xD559;&#xC0DD;&#xC778; &#xC81C; &#xC758;&#xACAC;&#xB3C4; &#xBC1B;&#xC544;&#xB4E4;&#xC5EC; &#xC8FC;&#xC2DC;&#xB294; &#xAC83;&#xC744; &#xBCF4;&#xBA70;,</p><p>&#xBC1C;&#xC804;&#xC744; &#xC704;&#xD574; &#xC11C;&#xB85C; &#xB193;&#xCE5C; &#xAC83;&#xC744; &#xC598;&#xAE30;&#xD574;&#xC8FC;&#xACE0; &#xACF5;&#xC720;&#xD574;&#xC8FC;&#xB294; &#xAC1C;&#xBC1C;&#xC790;&#xB4E4;&#xC758; &#xBB38;&#xD654;&#xAC00; &#xB108;&#xBB34; &#xBA4B;&#xC788;&#xC5C8;&#xACE0; &#xB108;&#xBB34; &#xC790;&#xB791;&#xC2A4;&#xB7EC;&#xC6E0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC800; &#xC5ED;&#xC2DC; &#xD56D;&#xC0C1; &#xC5F4;&#xB9B0; &#xB9C8;&#xC74C;&#xC73C;&#xB85C; &#xB354; &#xC88B;&#xC740; &#xBC29;&#xD5A5;&#xC73C;&#xB85C; &#xB098;&#xC544;&#xAC00;&#xAE30; &#xC704;&#xD574; &#xB3D9;&#xB8CC;&#xB4E4;&#xACFC; &#xD568;&#xAED8; &#xB04A;&#xC784;&#xC5C6;&#xC774; &#xACE0;&#xBBFC;&#xD558;&#xB294; &#xBA4B;&#xC9C4; &#xAC1C;&#xBC1C;&#xC790;&#xAC00; &#xB418;&#xACE0; &#xC2F6;&#xB124;&#xC694;!</p><p>&#xACF5;&#xC720;&#xC640; &#xC131;&#xC7A5;&#xC744; &#xD1B5;&#xD574; &#xD558;&#xB8E8;&#xD558;&#xB8E8; &#xBC1C;&#xC804;&#xD574; &#xB098;&#xAC00;&#xB294; &#xB0B4;&#xC77C;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4; &#xB098;&#xAC00;&#xB294; &#xBAA8;&#xB4E0; &#xBD84;&#xB4E4; &#xD654;&#xC774;&#xD305;&#xC785;&#xB2C8;&#xB2E4; :)</p><p>&#xAC10;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC544;&#xB798;&#xB294; &#xD574;&#xB2F9; &#xC774;&#xC288;&#xB9C1;&#xD06C;&#xC785;&#xB2C8;&#xB2E4;:)</p><p><a href="https://github.com/jrasmusson/ios-professional-course/issues/2?ref=noah-ios.dev">https://github.com/jrasmusson/ios-professional-course/issues/2</a></p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em> &#x1F60A;</p>]]></content:encoded></item><item><title><![CDATA[Git의 commit id는 어떻게 생성될까?]]></title><description><![CDATA[<p>&#xC5EC;&#xB7EC;&#xBD84; &#xC548;&#xB155;&#xD558;&#xC138;&#xC694;! Noah&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%98%B9%EC%8B%9C-git%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4%EC%84%9C-commit-id%EB%A5%BC-%EB%B3%B4%EC%8B%A0-%EC%A0%81%EC%9D%B4-%EC%9E%88%EB%82%98%EC%9A%94">&#xD639;&#xC2DC; Git&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;&#xC11C; commit id&#xB97C; &#xBCF4;&#xC2E0; &#xC801;&#xC774; &#xC788;&#xB098;&#xC694;?</h3><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/1acfad70ab28348d5a7b763b1c7a4c88/a6d36/1.png" class="kg-image" alt="1" loading="lazy" title="1"></figure><p>&#xC6B0;&#xB9AC;&#xB294; commit id&#xB85C; &#xD2B9;&#xC815; &#xBC84;&#xC804;&#xC744; &#xAC00;&#xB9AC;&#xCF1C; commit&#xC744; &#xB418;&#xB3CC;&#xB9AC;</p>]]></description><link>https://noah-ios.dev/how-to-generate-commit-id/</link><guid isPermaLink="false">64e8d02d22fba699ec4bbcb9</guid><category><![CDATA[Computer-Science]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Thu, 30 Mar 2023 15:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1556075798-4825dfaaf498?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGdpdHxlbnwwfHx8fDE2OTI5NzkyODN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1556075798-4825dfaaf498?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGdpdHxlbnwwfHx8fDE2OTI5NzkyODN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Git&#xC758; commit id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0DD;&#xC131;&#xB420;&#xAE4C;?"><p>&#xC5EC;&#xB7EC;&#xBD84; &#xC548;&#xB155;&#xD558;&#xC138;&#xC694;! Noah&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%ED%98%B9%EC%8B%9C-git%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4%EC%84%9C-commit-id%EB%A5%BC-%EB%B3%B4%EC%8B%A0-%EC%A0%81%EC%9D%B4-%EC%9E%88%EB%82%98%EC%9A%94">&#xD639;&#xC2DC; Git&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74;&#xC11C; commit id&#xB97C; &#xBCF4;&#xC2E0; &#xC801;&#xC774; &#xC788;&#xB098;&#xC694;?</h3><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/1acfad70ab28348d5a7b763b1c7a4c88/a6d36/1.png" class="kg-image" alt="Git&#xC758; commit id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0DD;&#xC131;&#xB420;&#xAE4C;?" loading="lazy" title="1"></figure><p>&#xC6B0;&#xB9AC;&#xB294; commit id&#xB85C; &#xD2B9;&#xC815; &#xBC84;&#xC804;&#xC744; &#xAC00;&#xB9AC;&#xCF1C; commit&#xC744; &#xB418;&#xB3CC;&#xB9AC;&#xAE30;&#xB3C4; &#xD558;&#xACE0;,</p><p>&#xD2B9;&#xC815; commit&#xC758; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC744; &#xB418;&#xB3CC;&#xB9AC;&#xAE30;&#xB3C4; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC774; commit id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xD574;&#xC11C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xB294; &#xAC78;&#xAE4C;&#xC694;?</p><h3 id="q-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EA%B3%A0%EC%9C%A0%ED%95%9C-id%EB%A5%BC-%EB%B6%80%EC%97%AC%ED%95%B4%EC%A3%BC%EB%82%98%EC%9A%94%F0%9F%A7%90"><strong>Q.</strong> <strong>&#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xACE0;&#xC720;&#xD55C; id&#xB97C; &#xBD80;&#xC5EC;&#xD574;&#xC8FC;&#xB098;&#xC694;..?&#x1F9D0;</strong></h3><p><strong>A.</strong> Git&#xC740; &#xB85C;&#xCEEC;&#xC5D0;&#xC11C; &#xAD00;&#xB9AC;&#xB418;&#xB294; &#xBC84;&#xC804; &#xAD00;&#xB9AC;&#xC2DC;&#xC2A4;&#xD15C;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xBCC4;&#xB3C4;&#xC758; &#xC778;&#xD130;&#xB137;&#xC774; &#xC5F0;&#xACB0;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xD658;&#xACBD;&#xC5D0;&#xC11C;&#xB3C4; commit&#xC774; &#xB418;&#xACE0;,</p><p>commit id&#xAC00; &#xBD80;&#xC5EC;&#xB418;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;!</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/ccdbd78d1ad34a61918c4a07cc7573ea/2.gif" class="kg-image" alt="Git&#xC758; commit id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0DD;&#xC131;&#xB420;&#xAE4C;?" loading="lazy"></figure><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; commit id&#xB97C; &#xBD80;&#xC5EC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC774; &#xC11C;&#xBC84;&#xAC00; &#xBD80;&#xC5EC;&#xD574;&#xC8FC;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2CC;,</p><p>&#xBCC4;&#xB3C4;&#xC758; &#xADDC;&#xCE59;&#xC744; &#xD1B5;&#xD574; &#xBD80;&#xC5EC;&#xB418;&#xB294; &#xAC83;&#xC784;&#xC744; &#xC720;&#xCD94;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="q-%EA%B7%B8%EB%9F%B0%EB%8D%B0%EC%9A%94%E2%80%A6id%EB%8A%94-%EA%B3%A0%EC%9C%A0%ED%95%9C-%EA%B2%8C-%EC%83%9D%EB%AA%85-%EC%95%84%EB%8B%8C%EA%B0%80%EC%9A%94">Q. &#xADF8;&#xB7F0;&#xB370;&#xC694;&#x2026;id&#xB294; &#xACE0;&#xC720;&#xD55C; &#xAC8C; &#xC0DD;&#xBA85; &#xC544;&#xB2CC;&#xAC00;&#xC694;?</h3><p><strong>&#xC11C;&#xBC84;&#xC5D0;&#xC11C; id&#xB97C; &#xBD80;&#xC5EC;&#xD574;&#xC8FC;&#xB294; &#xAC8C; &#xC544;&#xB2C8;&#xBA74; &#xC5B4;&#xB5BB;&#xAC8C; &#xACE0;&#xC720;&#xD55C; &#xAC78; &#xBCF4;&#xC7A5;&#xD558;&#xC8E0;??&#x1F9D0;</strong></p><p><strong>A.</strong> &#xC774;&#xB97C; &#xC54C;&#xC544;&#xBCF4;&#xAE30; &#xC804;&#xC5D0; &#xBA3C;&#xC800; hash function&#xC5D0; &#xB300;&#xD574; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</p><blockquote>hash function&#xC744; &#xCCA8; &#xB4E4;&#xC5B4;&#xBCF4;&#xC168;&#xB2E4;&#xBA74;?!<br>hash function&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xC138;&#xD55C; &#xC124;&#xBA85;&#xC740; &#xC544;&#xB798;&#xC758; &#xB9C1;&#xD06C;&#xB97C; &#xCC38;&#xACE0;&#xD574;&#xC8FC;&#xC138;&#xC694;!<br><a href="https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98?ref=noah-ios.dev">&#xC704;&#xD0A4;&#xD53C;&#xB514;&#xC544; &#xD574;&#xC2DC;&#xD568;&#xC218;</a><br><a href="https://noah0316.github.io/Algorithms/2021-06-24-%ED%95%B4%EC%8B%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98(hash-algorithm)/?ref=noah-ios.dev">hash algorithm</a></blockquote><p>Git&#xC740; hash&#xB97C; &#xC774;&#xC6A9;&#xD574; commit&#xC758; id&#xB97C; &#xC0DD;&#xC131;&#xD569;&#xB2C8;&#xB2E4;.</p><p><strong>&#xADF8;&#xB7EC;&#xBA74; commit id&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294;&#xB370; &#xD544;&#xC694;&#xD55C; &#xD574;&#xC2DC; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC740; &#xC5B4;&#xB5A0;&#xD55C; &#xAC83;&#xC744; &#xCC44;&#xD0DD;&#xD558;&#xACE0; &#xC788;&#xC744;&#xAE4C;&#xC694;?</strong></p><p>Git&#xC740; commit id&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xB294;&#xB370; &#xD544;&#xC694;&#xD55C; &#xD574;&#xC2DC; &#xC54C;&#xACE0;&#xB9AC;&#xC998;&#xC73C;&#xB85C; SHA-1&#xC744; &#xCC44;&#xD0DD;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>commit id&#xAC00; 40&#xC790;&#xB9AC;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83;&#xC744; &#xBCF4;&#xACE0; SHA-1&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB2E4;&#xACE0; &#xC720;&#xCD94;&#xD574;&#xBCFC; &#xC218;&#xB3C4; &#xC788;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>commit id&#xAC00; &#xB9CC;&#xB4E4;&#xC5B4;&#xC9C0;&#xB294; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74; &#xC544;&#xB798; &#xADF8;&#xB9BC;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/625509c33e517e6dbf63107f3b9e30d6/a6d36/3.png" class="kg-image" alt="Git&#xC758; commit id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0DD;&#xC131;&#xB420;&#xAE4C;?" loading="lazy" title="3"></figure><p>SHA-1&#xC758; &#xC785;&#xB825;&#xC73C;&#xB85C; &#xB4E4;&#xC5B4;&#xAC00;&#xB294; &#xB9CE;&#xC740; &#xC815;&#xBCF4;&#xB4E4; &#xC911;&#xC5D0; &#xD55C; &#xAE00;&#xC790;&#xB9CC; &#xBC14;&#xB00C;&#xB354;&#xB77C;&#xB3C4; commit id&#xB294; &#xBC14;&#xB00C;&#xAC8C; &#xB429;&#xB2C8;&#xB2E4;.</p><h3 id="q-%EA%B7%B8%EB%9F%BC-hash-function%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4-%EA%B3%A0%EC%9C%A0%ED%95%9C-id%EB%9D%BC%EB%8A%94-%EA%B2%8C-%EB%B3%B4%EC%9E%A5%EC%9D%B4-%EB%90%98%EB%82%98%EC%9A%94">Q. &#xADF8;&#xB7FC; hash function&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xACE0;&#xC720;&#xD55C; id&#xB77C;&#xB294; &#xAC8C; &#xBCF4;&#xC7A5;&#xC774; &#xB418;&#xB098;&#xC694;?</h3><p><strong>hash function&#xC740; collision&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xB098;&#xC694;??&#x1F9D0;</strong></p><p><strong>&#xB9DE;&#xC2B5;&#xB2C8;&#xB2E4;. &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</strong></p><p>hash function&#xAC00; &#xBB34;&#xD55C;&#xD55C; &#xAC00;&#xC9D3;&#xC218;&#xC758; &#xC785;&#xB825;&#xAC12;&#xC744; &#xBC1B;&#xC544; &#xC720;&#xD55C;&#xD55C; &#xAC00;&#xC9D3;&#xC218;&#xC758; &#xCD9C;&#xB825; &#xAC12;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xACBD;&#xC6B0;,</p><p>&#xBE44;&#xB458;&#xAE30;&#xC9D1; &#xC6D0;&#xB9AC;(pigeonhole principle)&#xC5D0; &#xC758;&#xD574; &#xD574;&#xC2DC; &#xCDA9;&#xB3CC;&#xC740; &#xD56D;&#xC0C1; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;.</p><blockquote>&#xBE44;&#xB458;&#xAE30;&#xC9D1; &#xC6D0;&#xB9AC; :<br><a href="https://ko.wikipedia.org/wiki/%EB%B9%84%EB%91%98%EA%B8%B0%EC%A7%91_%EC%9B%90%EB%A6%AC?ref=noah-ios.dev">https://ko.wikipedia.org/wiki/&#xBE44;&#xB458;&#xAE30;&#xC9D1;_&#xC6D0;&#xB9AC;</a></blockquote><p>SHA-1&#xC758; &#xCD9C;&#xB825; &#xAC12;&#xC740; 40&#xC790;&#xB9AC; &#xC218;&#xC758; 16&#xC9C4;&#xC218; &#xBB38;&#xC790;&#xC5F4;&#xC785;&#xB2C8;&#xB2E4;.</p><p>SHA-1&#xB85C; &#xC0DD;&#xC131; &#xAC00;&#xB2A5;&#xD55C; commit id&#xC758; &#xAC1C;&#xC218;&#xB294;</p><p>&#xD55C; &#xC790;&#xB9AC; &#xC218;&#xB2F9; 4&#xBE44;&#xD2B8;&#xC529; &#xACF1;&#xD558;&#xBA74; 4*40 = 160&#xBE44;&#xD2B8; 10&#xBE44;&#xD2B8;&#xB294; &#xB300;&#xB7B5; 1000(&#xC815;&#xD655;&#xD788;&#xB294; 1024)</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; SHA-1&#xB85C; &#xC0DD;&#xC131; &#xAC00;&#xB2A5;&#xD55C; commit id&#xC758; &#xAC1C;&#xC218;&#xB294;</p><p>1 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 0000</p><p>10&#xC758; 48&#xC2B9;&#xAC1C;&#xC785;&#xB2C8;&#xB2E4;.</p><p>10&#xC758; 48&#xC2B9;&#xC774;&#xB77C;&#xB294; &#xC22B;&#xC790;&#xB97C; &#xC870;&#xAE08; &#xB354; &#xB2E4;&#xAC00;&#xC624;&#xB3C4;&#xB85D; &#xC608;&#xC2DC;&#xB97C; &#xB4E4;&#xC5B4;&#xBCF4;&#xBA74;, &#xB2EC;(Moon)&#xC740; 10&#xC758; 47&#xC2B9;&#xAC1C;&#xC758; &#xC6D0;&#xC790;&#xB85C; &#xAD6C;&#xC131;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xAC19;&#xC740; commit id&#xB97C; &#xBC1C;&#xACAC;&#xD560; &#xD655;&#xB960;&#xC740; &#xC6B0;&#xC8FC;&#xC5D0; &#xC5EC;&#xB7EC; &#xAC1C;&#xC758; &#xB2EC;(Moon)&#xC774; &#xC788;&#xB2E4;&#xACE0; &#xAC00;&#xC815;&#xD588;&#xC744; &#xB54C; &#xC774; &#xB2EC; &#xC911;&#xC5D0;&#xC11C; &#xC6D0;&#xC790; &#xD558;&#xB098;&#xB97C; &#xBB34;&#xC791;&#xC704;&#xB85C; &#xACE0;&#xB978; &#xB2E4;&#xC74C;, &#xB2E4;&#xB978; &#xB2EC;&#xC5D0;&#xC11C; &#xC6D0;&#xC790;&#xD558;&#xB098;&#xB97C; &#xBB34;&#xC791;&#xC704;&#xB85C; &#xACE8;&#xB790;&#xC744; &#xB54C; &#xAC19;&#xC740; &#xC6D0;&#xC790;&#xB97C; &#xC120;&#xD0DD;&#xD560; &#xAC00;&#xB2A5;&#xC131;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="q-%EA%B7%B8%EB%9E%98%EB%8F%84-%EB%88%84%EA%B5%B0%EA%B0%80%EA%B0%80-%EC%95%85%EC%9D%98%EC%A0%81%EC%9C%BC%EB%A1%9C-commit-id%EB%A5%BC-%EC%A4%91%EB%B3%B5%EC%8B%9C%ED%82%A4%EA%B8%B0-%EC%9C%84%ED%95%B4-%EA%B3%84%EC%86%8D%ED%95%B4%EC%84%9C-%EC%8B%9C%EB%8F%84%ED%95%9C%EB%8B%A4%EB%A9%B4%EC%9A%94%F0%9F%A7%90">Q. &#xADF8;&#xB798;&#xB3C4; &#xB204;&#xAD70;&#xAC00;&#xAC00; &#xC545;&#xC758;&#xC801;&#xC73C;&#xB85C; commit id&#xB97C; &#xC911;&#xBCF5;&#xC2DC;&#xD0A4;&#xAE30; &#xC704;&#xD574; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xC2DC;&#xB3C4;&#xD55C;&#xB2E4;&#xBA74;&#xC694;?&#x1F9D0;</h3><p><strong>A. &#x201C;&#xC774;&#xB807;&#xAC8C; &#xAE4C;&#xC9C0; &#xD574;&#xC57C; &#xD558;&#xB098;&#x2026;&#x201D;</strong></p><p>git&#xC758; commit id&#xB97C; &#xC911;&#xBCF5;&#xB418;&#xAC8C; &#xD558;&#xAE30; &#xC704;&#xD574; &#xCEF4;&#xD4E8;&#xD305; &#xC5F0;&#xC0B0;&#xC5D0; &#xB4DC;&#xB294; &#xBE44;&#xC6A9;, &#xC2DC;&#xAC04;&#xACFC;</p><p>git commit id&#xB97C; &#xC911;&#xBCF5;&#xB418;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC11C; &#xC5BB;&#xC744; &#xC218; &#xC788;&#xB294; &#xC774;&#xC775;&#xC744; &#xBE44;&#xAD50;&#xD588;&#xC744; &#xB54C; &#xAC00;&#xC131;&#xBE44;&#xAC00; 0&#xC5D0; &#xC218;&#xB834;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;</p><p>&#xCDA9;&#xBD84;&#xD55C; &#xC7AC;&#xC6D0;&#xC744; &#xAC00;&#xC9C4; &#xB204;&#xAD70;&#xAC00;&#xAC00; &#xC2DC;&#xB3C4;&#xB97C; &#xD558;&#xC9C0; &#xC54A;&#xB294; &#xC774;&#xC0C1; &#xC2DC;&#xB3C4;&#xD558;&#xAE30; &#xC5B4;&#xB835;&#xB2E4;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</p><blockquote>&#xAD6C;&#xAE00;&#xC5D0;&#xC11C;&#xB294; SHA1&#xC758; &#xCDA9;&#xB3CC; &#xC30D;&#xC744; &#xB9CC;&#xB4E4;&#xC5B4;&#xB0B4;&#xAE30; &#xC704;&#xD574; 9&#xACBD; &#xBC88;&#xC758; &#xC5F0;&#xC0B0;&#xC744; &#xC2DC;&#xB3C4;&#xD588;&#xB2E4;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</blockquote><p>&#xD558;&#xC9C0;&#xB9CC; SHA-1&#xC758; &#xCDA9;&#xB3CC; &#xACF5;&#xACA9;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xB9CE;&#xC740; &#xBB38;&#xC81C;&#xAC00; &#xB4DC;&#xB7EC;&#xB0AC;&#xACE0;,</p><p>&#xC774;&#xBBF8; &#xBCF4;&#xC548; &#xBD84;&#xC57C;&#xC5D0;&#xC11C;&#xB294; SHA-1&#xC740; &#xAC70;&#xC758; &#xD1F4;&#xCD9C;&#xB41C; &#xC0C1;&#xD0DC;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB54C;&#xBB38;&#xC5D0; GitHub&#xC5D0;&#xC11C;&#xB294; Git contents&#xC758; &#xCDA9;&#xB3CC;&#xC744; &#xAC10;&#xC9C0;&#xD558;&#xACE0; &#xC774;&#xC5D0; &#xB300;&#xD55C; &#xB300;&#xC751;&#xCC45;&#xC744; &#xB0B4;&#xB193;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><a href="https://github.blog/2017-03-20-sha-1-collision-detection-on-github-com/?ref=noah-ios.dev">SHA-1 collision detection on GitHub.com</a></p><h2 id="%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4"><strong>&#xADF8;&#xB807;&#xB2E4;&#xBA74;</strong></h2><p>&#xC774;&#xB807;&#xAC8C; &#xC911;&#xC559; &#xC9D1;&#xC911;&#xD615; &#xC11C;&#xBC84; &#xC5C6;&#xC774; &#xACE0;&#xC720;&#xD55C; ID&#xB97C; &#xBD80;&#xC5EC;&#xBC1B;&#xC744; &#xC218; &#xC788;&#xB294; hash&#xB294; &#xB610; &#xC5B4;&#xB514;&#xC5D0; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xC744;&#xAE4C;&#xC694;?</p><p><strong>&#xBC14;&#xB85C; &#xBE14;&#xB85D;&#xCCB4;&#xC778;&#xC785;&#xB2C8;&#xB2E4;.</strong></p><p>&#xBE44;&#xD2B8;&#xCF54;&#xC778;&#xACFC; &#xAC19;&#xC774; &#xBE14;&#xB85D;&#xCCB4;&#xC778; &#xAE30;&#xC220;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC554;&#xD638;&#xD654;&#xD3D0;&#xC758; &#xAC70;&#xB798; &#xACFC;&#xC815;&#xC740; &#xC911;&#xC559;&#xC9D1;&#xC911;&#xD615; &#xBC29;&#xC2DD;&#xC774; &#xC544;&#xB2CC;, &#xD0C8;&#xC911;&#xC559;&#xD654; &#xB41C; &#xC804;&#xC790;&#xC7A5;&#xBD80;&#xC5D0; &#xC4F0;&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="%EA%B7%B8%EB%A0%87%EB%8B%A4%EB%A9%B4-%EA%B0%81-%EB%B8%94%EB%A1%9D%EC%97%90-%ED%8F%AC%ED%95%A8%EB%90%9C-%EA%B1%B0%EB%9E%98%EB%82%B4%EC%97%AD%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-id%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B6%80%EC%97%AC%EB%B0%9B%EC%9D%84%EA%B9%8C%EC%9A%94">&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xAC01; &#xBE14;&#xB85D;&#xC5D0; &#xD3EC;&#xD568;&#xB41C; &#xAC70;&#xB798;&#xB0B4;&#xC5ED;(&#xD2B8;&#xB79C;&#xC7AD;&#xC158;)&#xC758; id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xBD80;&#xC5EC;&#xBC1B;&#xC744;&#xAE4C;&#xC694;?</h3><blockquote>&#xBE14;&#xB85D;&#xC5D0; &#xD3EC;&#xD568;&#xB41C; &#xD2B8;&#xB79C;&#xC7AD;&#xC158;&#xC758; id&#xB294; &#xC911;&#xBCF5; &#xC5C6;&#xC774; &#xACE0;&#xC720;&#xD574;&#xC57C; &#xD569;&#xB2C8;&#xB2E4;.</blockquote><p>id&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xACE0;&#xC720;&#xD55C; &#xD2B8;&#xB79C;&#xC7AD;&#xC158;&#xC758; id&#xB97C; &#xBD80;&#xC5EC;&#xD560;&#xAE4C;&#xC694;?</p><p>&#xB9CC;&#xC57D; id&#xB97C; &#xC11C;&#xBC84;&#xC5D0;&#xC11C; &#xBD80;&#xC5EC;&#xD55C;&#xB2E4;&#xBA74; &#xBE14;&#xB85D;&#xCCB4;&#xC778;&#xC758; &#xCCA0;&#xD559;&#xC778; &#xD0C8;&#xC911;&#xC559;&#xD654;&#xC640; &#xC5B4;&#xAE0B;&#xB098;&#xB294; &#xD589;&#xC704;&#xC77C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xBE14;&#xB85D;&#xCCB4;&#xC778;&#xC758; &#xD2B8;&#xB79C;&#xC7AD;&#xC158;&#xC758; id&#xB97C; &#xBD80;&#xC5EC;&#xD558;&#xB294; &#xBC29;&#xC2DD; &#xC5ED;&#xC2DC; hash&#xB97C; &#xC774;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/48c9ae87a7b1d47f9d94de873b493729/4.gif" class="kg-image" alt="Git&#xC758; commit id&#xB294; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0DD;&#xC131;&#xB420;&#xAE4C;?" loading="lazy"></figure><p>&#xBE44;&#xD2B8;&#xCF54;&#xC778;&#xC5D0;&#xC11C;&#xB294; transaction&#xC758; id&#xB97C; &#xBD80;&#xC5EC;&#xD558;&#xB294; hash algorithm&#xC73C;&#xB85C; SHA-256&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC54C;&#xB824;&#xC838; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC790;, &#xC5EC;&#xAE30;&#xAE4C;&#xC9C0; Git&#xC758; commit id&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0DD;&#xC131;&#xB418;&#xB294;&#xC9C0; &#xC54C;&#xC544;&#xBCF4;&#xBA70;, &#xC774;&#xC640; &#xD568;&#xAED8; hash function&#xC774; &#xB610; &#xC5B4;&#xB290; &#xACF3;&#xC5D0; &#xC0AC;&#xC6A9;&#xB418;&#xC5C8;&#xB294;&#xC9C0; &#xC54C;&#xC544;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em> &#x1F60A;</p><blockquote>&#xCC38;&#xACE0;</blockquote><ul><li><a href="https://github.blog/2017-03-20-sha-1-collision-detection-on-github-com/?ref=noah-ios.dev">GitHub Blog</a></li><li><a href="https://stackoverflow.com/questions/1867191/probability-of-sha1-collisions?ref=noah-ios.dev">Stack Overflow</a></li></ul>]]></content:encoded></item><item><title><![CDATA[TCP와 UDP에 관하여]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/d694a99d1d4bfb698f26425f09533c24/494f9/1.png" class="kg-image" alt="1" loading="lazy" title="1"></figure><p>OSI7 Layer Model</p><h3 id="%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-noah%EC%9E%85%EB%8B%88%EB%8B%A4">&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; :) Noah&#xC785;&#xB2C8;&#xB2E4;.</h3><p>&#xC624;&#xB298;&#xC740; TCP&#xC640; UDP&#xC758; &#xD1B5;&#xC2E0;&#xBC29;&#xC2DD;&#xC5D0; &#xAD00;&#xD55C; &#xC598;&#xAE30;&#xB97C; &#xB098;&#xB220;&#xBCFC;&#xAE4C; &#xD569;&#xB2C8;&#xB2E4;. &#xC778;&#xAC04;&#xC0AC;&#xD68C;&#xC5D0; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0; &#xADDC;&#xCE59;&#xC774;&#xB098; &#xADDC;</p>]]></description><link>https://noah-ios.dev/tcp-udp/</link><guid isPermaLink="false">64e9a07922fba699ec4bbdf9</guid><category><![CDATA[Computer-Science]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Wed, 22 Mar 2023 15:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1591808216268-ce0b82787efe?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDUyfHxuZXR3b3JrfGVufDB8fHx8MTY5MzAzMjU4OXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/d694a99d1d4bfb698f26425f09533c24/494f9/1.png" class="kg-image" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy" title="1"></figure><img src="https://images.unsplash.com/photo-1591808216268-ce0b82787efe?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDUyfHxuZXR3b3JrfGVufDB8fHx8MTY5MzAzMjU4OXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;"><p>OSI7 Layer Model</p><h3 id="%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-noah%EC%9E%85%EB%8B%88%EB%8B%A4">&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; :) Noah&#xC785;&#xB2C8;&#xB2E4;.</h3><p>&#xC624;&#xB298;&#xC740; TCP&#xC640; UDP&#xC758; &#xD1B5;&#xC2E0;&#xBC29;&#xC2DD;&#xC5D0; &#xAD00;&#xD55C; &#xC598;&#xAE30;&#xB97C; &#xB098;&#xB220;&#xBCFC;&#xAE4C; &#xD569;&#xB2C8;&#xB2E4;. &#xC778;&#xAC04;&#xC0AC;&#xD68C;&#xC5D0; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0; &#xADDC;&#xCE59;&#xC774;&#xB098; &#xADDC;&#xC57D;&#xC774; &#xC788;&#xB4EF;, &#xCEF4;&#xD4E8;&#xD130; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xBD84;&#xC57C;&#xC5D0;&#xB3C4; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0; &#xADDC;&#xC57D;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#xC774;&#xB7EC;&#xD55C; &#xADDC;&#xC57D;&#xC744; &#xC815;&#xD558;&#xB294; &#xAE30;&#xAD00; &#xC911; &#xAD6D;&#xC81C;&#xD45C;&#xC900;&#xD654;&#xAE30;&#xAD6C;(ISO)&#xC5D0;&#xC11C; &#xD1B5;&#xC2E0;&#xC774; &#xC77C;&#xC5B4;&#xB098;&#xB294; &#xACFC;&#xC815;&#xC744; &#xB2E8;&#xACC4;&#xBCC4;&#xB85C; &#xC27D;&#xAC8C; &#xD30C;&#xC545;&#xD558;&#xACE0;,</p><p>&#xB2E4;&#xB978; &#xC2DC;&#xC2A4;&#xD15C; &#xAC04;&#xC758; &#xC6D0;&#xD65C;&#xD55C; &#xD1B5;&#xC2E0;&#xC744; &#xC704;&#xD574; &#xC81C;&#xC548;&#xD55C; &#xD1B5;&#xC2E0;&#xADDC;&#xC57D;&#xC778; OSI 7 Layer Model&#xC740; &#xC704;&#xC758; &#xADF8;&#xB9BC;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.<br><br><br></p><h4 id="tcp-udp%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-%EC%A0%84%EC%97%90">TCP, UDP&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xAE30; &#xC804;&#xC5D0;</h4><p>4&#xACC4;&#xCE35;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xC804;&#xC1A1;&#xACC4;&#xCE35;&#xC744; &#xB354; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC804;&#xC1A1;&#xACC4;&#xCE35;&#xC5D0;&#xC11C;&#xB294; source to destination, end-to-end&#xAC04; &#xC5F0;&#xACB0;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xBA70;,<br>&#xC624;&#xB958; &#xC81C;&#xC5B4;, &#xD750;&#xB984; &#xC81C;&#xC5B4;, &#xB370;&#xC774;&#xD130; &#xC21C;&#xC11C;&#xD654; &#xB4F1;&#xC758; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xAE30;&#xC11C; &#xB9D0;&#xD558;&#xB294; end-to-end&#xB780; &#xB2E8;&#xC21C;&#xD788; &#xCEF4;&#xD4E8;&#xD130;&#xC5D0;&#xC11C; &#xCEF4;&#xD4E8;&#xD130;&#xB85C; &#xB9CC;&#xC758; &#xC804;&#xB2EC;&#xC774; &#xC544;&#xB2CC;,<br>&#xC1A1;&#xC2E0; &#xCEF4;&#xD4E8;&#xD130;&#xC758; &#xC751;&#xC6A9;&#xD504;&#xB85C;&#xADF8;&#xB7A8;(&#xD504;&#xB85C;&#xC138;&#xC2A4;)&#xC5D0;&#xC11C; &#xCD5C;&#xC885; &#xC218;&#xC2E0; &#xCEF4;&#xD4E8;&#xD130;&#xC758; &#xC751;&#xC6A9;&#xD504;&#xB85C;&#xADF8;&#xB7A8;(&#xD504;&#xB85C;&#xC138;&#xC2A4;)&#xC73C;&#xB85C;&#xC758;<br>&#xC804;&#xB2EC;&#xC744; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC804;&#xC1A1;&#xACC4;&#xCE35;&#xC5D0;&#xC11C;&#xC758; &#xC8FC;&#xC18C; &#xD45C;&#xD604;&#xC740; &#xD3EC;&#xD2B8; &#xBC88;&#xD638;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370;,<br>&#xD3EC;&#xD2B8; &#xBC88;&#xD638;&#xB294; &#xD1B5;&#xC2E0; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xAD6C;&#xBCC4;&#xD558;&#xB294; &#xBC88;&#xD638;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C;, &#xC804;&#xC1A1;&#xACC4;&#xCE35;&#xC5D0;&#xC11C;&#xC758; &#xD504;&#xB85C;&#xD1A0;&#xCF5C; &#xB370;&#xC774;&#xD130; &#xB2E8;&#xC704;(PDU)&#xB294; &#xC138;&#xADF8;&#xBA3C;&#xD2B8;&#xB77C;&#xACE0; &#xD558;&#xBA70;,<br>&#xC804;&#xC1A1;&#xACC4;&#xCE35;&#xC5D0;&#xC11C;&#xB294; &#xC2E0;&#xB8B0;&#xC131; &#xAD00;&#xB828; &#xC81C;&#xC5B4;&#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xACE0;, &#xC548;&#xD560;&#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC81C; TCP, UDP&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBD05;&#xC2DC;&#xB2E4;&#x1F60E;</p><h3 id="tcp%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC">TCP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;</h3><hr><p>TCP(Transmission Control Protocol)&#xB97C; &#xD55C;&#xB9C8;&#xB514;&#xB85C; &#xC815;&#xC758;&#xD558;&#xC790;&#xBA74;<br>&#xC2E0;&#xB8B0;&#xC131;&#xC788;&#xB294; &#xB370;&#xC774;&#xD130; &#xD1B5;&#xC2E0;&#xC744; &#xAC00;&#xB2A5;&#xD558;&#xAC8C; &#xD574;&#xC8FC;&#xB294; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC785;&#xB2C8;&#xB2E4;.</p><p>TCP&#xC758; &#xAC00;&#xC7A5; &#xC911;&#xC694;&#xD55C; &#xD2B9;&#xC9D5; &#xC911; &#xD558;&#xB098;&#xB294; Connection&#xC744; &#xC218;&#xB9BD;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;.</p><p>(Connection Establish) &#xC774;&#xC5D0; &#xAD00;&#xD574;&#xC11C;&#xB294; 3-way-handshake&#xB77C;&#xB294; &#xACFC;&#xC815;&#xC774; &#xC874;&#xC7AC;&#xD558;&#xB294;&#xB370;,<br>&#xC774;&#xC5D0; &#xAD00;&#xD574;&#xC11C;&#xB294; &#xC7A0;&#xC2DC; &#xD6C4;&#xC5D0; &#xC0B4;&#xD3B4;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xB978; &#xD2B9;&#xC9D5;&#xC73C;&#xB85C; TCP&#xB294; &#xB370;&#xC774;&#xD130;&#xC758; &#xC21C;&#xCC28; &#xC804;&#xC1A1;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xBA70;,<br>&#xD750;&#xB984; &#xC81C;&#xC5B4;, &#xD63C;&#xC7A1; &#xC81C;&#xC5B4;, &#xC624;&#xB958; &#xAC10;&#xC9C0;&#xAC00; &#xAC00;&#xB2A5;&#xD558;&#xB2E4;&#xB294; &#xD2B9;&#xC9D5;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br><br></p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/e565c5bbbaa21a6be1f08836598e0d76/a6d36/2.png" class="kg-image" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy" title="2"></figure><p>TCP &#xD5E4;&#xB354;</p><p>&#xC804;&#xC1A1;&#xACC4;&#xCE35;&#xC5D0;&#xC11C;&#xB294; &#xD3EC;&#xD2B8; &#xBC88;&#xD638;&#xB85C; &#xD1B5;&#xC2E0;&#xC744; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; TCP header&#xC5D0;&#xB294; Source port&#xC640; destination port&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xACE0;,<br>&#xC21C;&#xCC28; &#xC804;&#xC1A1;&#xC758; &#xC2E0;&#xB8B0;&#xC131;&#xC744; &#xBCF4;&#xC7A5;&#xD558;&#xAE30; &#xC704;&#xD574; Sequence number, Acknowledge number&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xACE0;,<br>flag field&#xB294; tcp&#xC758; &#xC5F0;&#xACB0;&#xC744; &#xC81C;&#xC5B4;&#xD558;&#xACE0;, &#xB370;&#xC774;&#xD130; &#xAD00;&#xB9AC;&#xB97C; &#xD558;&#xAE30; &#xC704;&#xD574; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;.</p><p>flag field&#xC911; &#xD06C;&#xAC8C; 3&#xAC00;&#xC9C0;&#xB9CC; &#xBA3C;&#xC800; &#xC54C;&#xC544;&#xBCF4;&#xBA74; SYN&#xC740; &#xC5F0;&#xACB0;&#xC744; &#xC694;&#xCCAD;&#xD560; &#xB54C; &#xC4F0;&#xC774;&#xB294; flag,<br>FIN&#xC740; &#xC5F0;&#xACB0;&#xC744; &#xC885;&#xB8CC;&#xD560; &#xB54C; &#xC4F0;&#xB294; flag, ACK&#xB294; &#xC751;&#xB2F5;&#xC744; &#xC798; &#xBC1B;&#xC558;&#xC74C;&#xC744; &#xC54C;&#xB824;&#xC8FC;&#xAE30; &#xC704;&#xD55C; flag&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; 3-way-handshake&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA70; &#xB354; &#xC790;&#xC138;&#xD788; &#xC54C;&#xC544;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h4 id="3-way-handshake">3-way-handshake</h4><hr><p><br></p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/0e9303a27508c66c655cfcaf01d3cff5/a6d36/3.png" class="kg-image" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy" title="3"></figure><p>3-way handshake</p><p><br></p><p>3-way-handshake&#xB780; Connection&#xC744; &#xC218;&#xB9BD;&#xD558;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;.</p><p>Client&#xC5D0;&#xC11C; Server&#xC5D0; &#xC5F0;&#xACB0;&#xC744; &#xC2E0;&#xCCAD;&#xC744; &#xD560; &#xB54C; SYN&#xC744; 1&#xB85C; &#xC124;&#xC815;&#xD574; &#xC1A1;&#xC2E0;&#xC744; &#xD55C; &#xB4A4;&#xC5D0;<br>Server&#xC5D0;&#xC11C; &#xBC1B;&#xC73C;&#xBA74; &#xC694;&#xCCAD;&#xC744; &#xC798; &#xBC1B;&#xC558;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xB85C; ACK&#xB97C; 1&#xB85C; &#xC124;&#xC815;&#xD574; &#xC1A1;&#xC2E0;&#xD569;&#xB2C8;&#xB2E4;.</p><p>Connection&#xC740; &#xC591;&#xBC29;&#xD5A5;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC11C;&#xBC84; &#xC5ED;&#xC2DC; &#xC5F0;&#xACB0;&#xC744; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xB85C; ACK&#xC640; &#xD568;&#xAED8;<br>SYN&#xC744; 1&#xB85C; &#xC124;&#xC815;&#xD574; &#xC1A1;&#xC2E0;&#xD569;&#xB2C8;&#xB2E4;.<br>Client&#xB3C4; &#xC694;&#xCCAD;&#xC744; &#xC798; &#xBC1B;&#xC558;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xB85C; ACK&#xB97C; 1&#xB85C; &#xC124;&#xC815;&#xD574; &#xB2E4;&#xC2DC; &#xC1A1;&#xC2E0;&#xD558;&#xBA74; Connection&#xC774; &#xC218;&#xB9BD;&#xB429;&#xB2C8;&#xB2E4;.</p><p>Connection&#xC774; &#xC218;&#xB9BD;&#xB41C; &#xC774;&#xD6C4;&#xC5D0; &#xB370;&#xC774;&#xD130; &#xC1A1;&#xC218;&#xC2E0;&#xC744; &#xD06C;&#xAC8C; 3&#xB2E8;&#xACC4;&#xB85C; &#xBCF4;&#xBA74;</p><ol><li>Client&#xAC00; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC1A1;&#xC2E0;&#xD55C;&#xB2E4;.</li><li>Server&#xC5D0;&#xC11C; &#xC798; &#xC218;&#xC2E0; &#xD588;&#xB2E4;&#xBA74; ACK&#xB97C; &#xC1A1;&#xC2E0;&#xD55C;&#xB2E4;.</li><li>Client&#xAC00; &#xB300;&#xAE30;&#xD558;&#xB2E4;&#xAC00; ACK&#xB97C; &#xC218;&#xC2E0;&#xD558;&#xC9C0; &#xBABB;&#xD558;&#xBA74; &#xC7AC;&#xC804;&#xC1A1;&#xC744; &#xD55C;&#xB2E4;.</li></ol><p>&#xC774;&#xB7EC;&#xD55C; &#xC77C;&#xB828;&#xC758; &#xACFC;&#xC815;&#xC744; &#xD1B5;&#xD574; TCP&#xB294; TCP&#xC758; &#xC7A5;&#xC810;&#xC778; &#xC2E0;&#xB8B0;&#xC131; &#xC788;&#xB294; &#xD1B5;&#xC2E0;&#xC744; &#xAD6C;&#xD604;&#xD569;&#xB2C8;&#xB2E4;.</p><h4 id="4-way-handshake">4-way-handshake</h4><hr><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/af040ce1d23c409cc5ae04c0fdc7a203/44c61/4.png" class="kg-image" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy" title="4"></figure><p>4-way handshake</p><p>Connection&#xC774; &#xC218;&#xB9BD;(establish) &#xB418;&#xC5C8;&#xB2E4;&#xBA74; Connection&#xC744; &#xB2EB;&#xB294; &#xACFC;&#xC815;&#xB3C4; &#xD544;&#xC694;&#xD569;&#xB2C8;&#xB2E4;.</p><ol><li>Client&#xC5D0;&#xC11C; &#xB354; &#xC774;&#xC0C1; &#xBCF4;&#xB0BC; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC5C6;&#xC73C;&#xBA74; FIN&#xC744; 1&#xB85C; &#xC124;&#xC815;&#xD558;&#xC5EC; Server&#xC5D0;&#xAC8C; &#xC1A1;&#xC2E0;&#xD55C;&#xB2E4;.</li><li>Server&#xC5D0;&#xC11C;&#xB294; &#xC798; &#xC218;&#xC2E0; &#xBC1B;&#xC558;&#xB2E4;&#xB294; &#xC758;&#xBBF8;&#xB85C; ACK&#xB97C; 1&#xB85C; &#xC124;&#xC815;&#xD558;&#xC5EC; &#xD074;&#xB77C;&#xC774;&#xC5B8;&#xD2B8;&#xC5D0;&#xAC8C; &#xC1A1;&#xC2E0;&#xD55C;&#xB2E4;.</li><li>Connection&#xC744; &#xC218;&#xB9BD;&#xD560;&#xB54C;&#xC640;&#xB294; &#xB2E4;&#xB974;&#xAC8C; Server&#xCABD;&#xC5D0;&#xC11C; &#xC544;&#xC9C1; &#xBCF4;&#xB0BC; &#xB370;&#xC774;&#xD130;&#xAC00; &#xB0A8;&#xC544;&#xC788;&#xC744; &#xC218;&#xB3C4; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;<br>&#xC7A0;&#xC2DC; &#xB300;&#xAE30;&#xD6C4; Server&#xCABD;&#xC5D0;&#xC11C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xBAA8;&#xB450; &#xC804;&#xB2EC;&#xD588;&#xB2E4;&#xBA74; FIN&#xC744; 1&#xB85C; &#xC124;&#xC815;&#xD574; Client &#xCABD;&#xC73C;&#xB85C; &#xC1A1;&#xC2E0;&#xD55C;&#xB2E4;.</li><li>Client&#xC5D0;&#xC11C; &#xC798; &#xC218;&#xC2E0;&#xC744; &#xBC1B;&#xC558;&#xC73C;&#xBA74; ACK&#xB97C; 1&#xB85C; &#xC124;&#xC815;&#xD574; Server&#xC5D0;&#xAC8C; &#xC1A1;&#xC2E0;&#xD558;&#xBA74; &#xC0C1;&#xD0DC;&#xAC00; Closed &#xB41C;&#xB2E4;.</li></ol><p>&#xC774;&#xB7EC;&#xD55C; &#xB2E8;&#xACC4;&#xB97C; &#xD1B5;&#xD574; TCP&#xC758; Connection&#xC744; Close&#xD569;&#xB2C8;&#xB2E4;.</p><p>TCP&#xC758; &#xB2E8;&#xC810;&#xC73C;&#xB85C;&#xB294; &#xB9E4;&#xBC88; Connection&#xC744; 3-way-handshake&#xB85C; &#xC5F0;&#xACB0;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC2DC;&#xAC04; &#xC190;&#xC2E4;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xACE0;,<br>&#xC870;&#xAE08;&#xB9CC; &#xC138;&#xADF8;&#xBA3C;&#xD2B8;&#xB97C; &#xC190;&#xC2E4;&#xD574;&#xB3C4; &#xC7AC;&#xC804;&#xC1A1;&#xC744; &#xD55C;&#xB2E4;&#xB294; &#xC810;&#xC785;&#xB2C8;&#xB2E4;.</p><p>e-mail&#xACFC; &#xAC19;&#xC774; &#xC190;&#xC2E4;&#xC774; &#xC5C6;&#xC5B4;&#xC57C; &#xD558;&#xB294; &#xB370;&#xC774;&#xD130;&#xC758; &#xACBD;&#xC6B0; &#xC774;&#xB7EC;&#xD55C; &#xACFC;&#xC815;&#xC774; &#xC7A5;&#xC810;&#xC774; &#xB420; &#xC218; &#xC788;&#xC9C0;&#xB9CC;<br>&#xC2E4;&#xC2DC;&#xAC04; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D;&#xACFC; &#xAC19;&#xC774; &#xC190;&#xC2E4;&#xC774; &#xC5B4;&#xB290;&#xC815;&#xB3C4; &#xBC1C;&#xC0DD;&#xD574;&#xB3C4; &#xB418;&#xB294; &#xB370;&#xC774;&#xD130;&#xC758; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xBE44;&#xD6A8;&#xC728;&#xC801;&#xC778; &#xD1B5;&#xC2E0; &#xBC29;&#xBC95;&#xC774; &#xB420; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xC810;&#xC744; &#xC8FC;&#xC758;&#xD574;&#xC57C;&#xD569;&#xB2C8;&#xB2E4;.</p><h3 id="udp%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC">UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;</h3><hr><p>UDP(User Datagram Protocol)&#xB97C; &#xD55C;&#xB9C8;&#xB514;&#xB85C; &#xC815;&#xC758;&#xD558;&#xBA74; TCP&#xBCF4;&#xB2E4; &#xC2E0;&#xB8B0;&#xC131;&#xC774; &#xB5A8;&#xC5B4;&#xC9C0;&#xC9C0;&#xB9CC; &#xC804;&#xC1A1; &#xC18D;&#xB3C4;&#xAC00;<br>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xBE60;&#xB978; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC774;&#xB77C; &#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>Connection&#xC744; TCP&#xCC98;&#xB7FC; &#xC218;&#xB9BD;&#xD558;&#xC9C0; &#xC54A;&#xACE0;,<br>&#xBE44;&#xC5F0;&#xACB0; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xD1B5;&#xC2E0;&#xC744; &#xD558;&#xBA70; TCP&#xC758; &#xC8FC;&#xC694;&#xAE30;&#xB2A5;&#xC778; &#xC21C;&#xCC28; &#xC804;&#xC1A1;, &#xD750;&#xB984; &#xC81C;&#xC5B4;, &#xD63C;&#xC7A1; &#xC81C;&#xC5B4; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD558;&#xC9C0; &#xC54A;&#xC73C;&#xBA70;, Checksum&#xC744; &#xD1B5;&#xD574; &#xCD5C;&#xC18C;&#xD55C;&#xC758; &#xC5D0;&#xB7EC;&#xAC80;&#xCD9C;&#xC744; &#xC9C4;&#xD589;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC8FC;&#xB85C; &#xB370;&#xC774;&#xD130;&#xC758; &#xC2E0;&#xB8B0;&#xC131;&#xC774; &#xC911;&#xC694;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xB54C; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;.(ex. &#xC2E4;&#xC2DC;&#xAC04; &#xC2A4;&#xD2B8;&#xB9AC;&#xBC0D;)</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/50c42442aa4999e2ebfbe009777b06b4/a6d36/5.png" class="kg-image" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy" title="5"></figure><p>UDP &#xD5E4;&#xB354;</p><p>UDP&#xD5E4;&#xB354;&#xC758; &#xACBD;&#xC6B0; TCP&#xD5E4;&#xB354; &#xBCF4;&#xB2E4; &#xBE44;&#xAD50;&#xC801; &#xB2E8;&#xC21C;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xD3EC;&#xD2B8; &#xBC88;&#xD638;&#xB85C; &#xD1B5;&#xC2E0;&#xC744; &#xD558;&#xAE30;&#xC704;&#xD55C; Source port&#xC640; destination port&#xAC00; &#xC874;&#xC7AC;&#xD558;&#xACE0;,<br>&#xC5D0;&#xB7EC; &#xAC80;&#xCD9C;&#xC744; &#xC704;&#xD55C; Checksum&#xC774; &#xC874;&#xC7AC;&#xD569;&#xB2C8;&#xB2E4;.<br><br></p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/786c4b9b29c54162f31985bf5d15fd3f/3ebb1/6.png" class="kg-image" alt="TCP&#xC640; UDP&#xC5D0; &#xAD00;&#xD558;&#xC5EC;" loading="lazy" title="6"></figure><p>UDP &#xD1B5;&#xC2E0;&#xACFC;&#xC815;</p><p>UDP&#xC758; &#xB370;&#xC774;&#xD130; &#xC804;&#xC1A1; &#xBC29;&#xC2DD;&#xC740; Connection&#xC774; &#xC5C6;&#xC73C;&#xB2C8; &#xD655;&#xC778;&#xC744; &#xD558;&#xC9C0; &#xC54A;&#xACE0;,<br>&#xBB34;&#xC870;&#xAC74; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC694;&#xCCAD; &#xD558;&#xBA74; &#xBCF4;&#xB0B4;&#xB294; &#xBC29;&#xC2DD;&#xC785;&#xB2C8;&#xB2E4;.</p><p>Server&#xB294; UDP &#xAD00;&#xB828;&#xD574; &#xC18C;&#xCF13;&#xC744; &#xC5F4;&#xC5B4;&#xB450;&#xACE0; &#xC788;&#xC5B4; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC694;&#xCCAD; &#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xBB34;&#xC870;&#xAC74; &#xBC1B;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#xB610;&#xD55C; Checksum&#xC744; &#xC774;&#xC6A9;&#xD574; &#xCD5C;&#xC18C;&#xD55C;&#xC758; &#xC624;&#xB958;&#xB9CC;&#xC744; &#xAC80;&#xC99D;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD328;&#xD0B7;&#xC758; &#xC190;&#xC2E4;&#xC774; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xB9CE;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xAE30;&#xC5D0; TCP&#xC640; &#xBE44;&#xAD50;&#xD558;&#xC5EC; &#xC2E0;&#xB8B0;&#xC131; &#xC788;&#xB294; &#xB370;&#xC774;&#xD130;&#xC758; &#xC804;&#xC1A1;&#xC744; &#xBCF4;&#xC7A5;&#xD560; &#xC218; &#xC5C6;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB610;&#xD55C;, &#xC55E;&#xC11C; &#xC5B8;&#xAE09;&#xB41C; Client&#xC640; Server&#xB294; &#xBAA8;&#xB450; end-system&#xC774;&#xBA70; &#xB3D9;&#xC2DC;&#xC5D0; host&#xC785;&#xB2C8;&#xB2E4;.</p><h3 id="tcp%EC%99%80-udp-%EB%B9%84%EA%B5%90">TCP&#xC640; UDP &#xBE44;&#xAD50;</h3><hr><p>TCP&#xC640; UDP&#xC758; &#xD2B9;&#xC9D5;&#xC744; &#xD45C;&#xB85C; &#xBE44;&#xAD50;&#xD558;&#xC5EC; &#xD55C;&#xB208;&#xC5D0; &#xC27D;&#xAC8C; &#xC54C;&#xC544;&#xBCF4;&#xB824; &#xD569;&#xB2C8;&#xB2E4;.</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0px 0px 0.8125rem; padding: 0px; font-size: 1rem; line-height: 1.625rem; border-collapse: collapse; width: 741px;"><thead style="box-sizing: inherit; text-align: left;"><tr style="box-sizing: inherit;"><th style="box-sizing: inherit; font-weight: 600; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding-left: 0px; padding-right: 0px !important; padding-top: 0px !important; padding-bottom: 0px !important;">&#xAD6C;&#xBD84;</th><th style="box-sizing: inherit; font-weight: 600; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0px !important;">TCP</th><th style="box-sizing: inherit; font-weight: 600; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding-left: 0px !important; padding-right: 0px; padding-top: 0px !important; padding-bottom: 0px !important;">UDP</th></tr></thead><tbody style="box-sizing: inherit;"><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xC5F0;&#xACB0; &#xC218;&#xB9BD;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xC5F0;&#xACB0; &#xC9C0;&#xD5A5;&#xD615;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xBE44; &#xC5F0;&#xACB0;&#xD615;</td></tr><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xC2E0;&#xB8B0;&#xC131;, &#xC2B9;&#xC778;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xBAA8;&#xB4E0; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC2E0;&#xB8B0;&#xC131;, &#xC2B9;&#xC778; &#xC81C;&#xACF5;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xBAA8;&#xB4E0; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC2E0;&#xB8B0;&#xC131;, &#xC2B9;&#xC778; &#xC81C;&#xACF5;</td></tr><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xC7AC;&#xC804;&#xC1A1;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xBAA8;&#xB4E0; &#xB370;&#xC774;&#xD130;&#xB97C; &#xAD00;&#xB9AC;&#xD574; &#xC790;&#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC7AC;&#xC804;&#xC1A1;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xD0D0;&#xC9C0; &#xD6C4; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; &#xC218;&#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC7AC;&#xC804;&#xC1A1;</td></tr><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xD750;&#xB984; &#xC81C;&#xC5B4;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xC81C;&#xACF5;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xBBF8;&#xC81C;&#xACF5;</td></tr><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xC190;&#xC2E4;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xC5C6;&#xC74C;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xC190;&#xC2E4; &#xBC1C;&#xC0DD; &#xAC00;&#xB2A5;&#xC131; &#xC788;&#xC74C;</td></tr><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xC18D;&#xB3C4;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xB290;&#xB9AC;&#xB2E4;.</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xBE60;&#xB974;&#xB2E4;.</td></tr><tr style="box-sizing: inherit;"><td style="box-sizing: inherit; text-align: right !important; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px) 0px; font-weight: bolder !important;">&#xC6A9;&#xB3C4;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 1.08333rem calc(0.8125rem - 1px);">&#xC2E0;&#xB8B0;&#xD560; &#xC218; &#xC788;&#xB294; &#xBC29;&#xBC95;&#xC73C;&#xB85C; &#xC804;&#xC1A1;&#xD574;&#xC57C; &#xD558;&#xB294; &#xACF3;&#xC5D0; &#xC801;&#xD569;</td><td style="box-sizing: inherit; text-align: left; border-bottom: 1px solid rgba(0, 0, 0, 0.12); font-feature-settings: &quot;tnum&quot;; padding: 0.8125rem 0px calc(0.8125rem - 1px) 1.08333rem;">&#xB370;&#xC774;&#xD130;&#xC758; &#xC644;&#xC804;&#xC131;&#xBCF4;&#xB2E4; &#xC804;&#xB2EC; &#xC18D;&#xB3C4;&#xAC00; &#xC911;&#xC694;&#xD55C; &#xACF3;&#xC5D0; &#xC801;&#xD569;</td></tr></tbody></table><!--kg-card-end: html--><p><br></p><p>&#xD45C;&#xB97C; &#xD1B5;&#xD574; &#xC804;&#xC1A1;&#xACC4;&#xCE35; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xC120;&#xD0DD;&#xD560; &#xB54C; TCP, UDP&#xC758; &#xD2B9;&#xC131;&#xC744; &#xD30C;&#xC545;&#xD558;&#xACE0;,<br>&#xC0C1;&#xD669;&#xC5D0; &#xB530;&#xB77C; &#xC801;&#xC808;&#xD55C; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xB3C4;&#xCD9C;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC678;&#xC5D0;&#xB3C4; &#xCC28;&#xC138;&#xB300; &#xC804;&#xC1A1;&#xACC4;&#xCE35; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xB85C;&#xB294; SCTP, RSVP &#xAD6C;&#xAE00;&#xC5D0;&#xC11C; &#xAC1C;&#xBC1C;&#xD55C; QUIC, &#xB4F1;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD639;&#xC2DC; &#xC81C;&#xAC00; &#xC798;&#xBABB; &#xC54C;&#xACE0; &#xC788;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xC788;&#xAC70;&#xB098;, &#xC624;&#xD0C0; &#xD639;&#xC740; &#xAD81;&#xAE08;&#xD55C; &#xC810; &#xC788;&#xC73C;&#xC2DC;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xC54C;&#xB824;&#xC8FC;&#xC2DC;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!!&#x1F60E;<br></p><blockquote>&#xB3C4;&#xC6C0;&#xC744; &#xC8FC;&#xC2E0; &#xBD84;</blockquote><ul><li>&#xBA85;&#xC9C0;&#xB300; &#xCEF4;&#xD4E8;&#xD130;&#xACF5;&#xD559;&#xACFC; &#xBC15;&#xD604;&#xBBFC; &#xAD50;&#xC218;&#xB2D8;</li></ul><blockquote>&#xCC38;&#xACE0;</blockquote><ul><li><a href="https://www.youtube.com/watch?v=ikDVGYp5dhg&amp;ref=noah-ios.dev">&#xC6B0;&#xC544;&#xD55C; Tech &#x1F468;&#x200D;&#x1F3EB; &#xB974;&#xC708;&#xC758; TCP UDP</a></li></ul><blockquote>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;</blockquote><ul><li><a href="https://netchobo.tistory.com/44?ref=noah-ios.dev">OSI 7 Layer Model</a></li><li><a href="https://hand-over.tistory.com/15?ref=noah-ios.dev">TCP &#xD5E4;&#xB354;</a></li><li><a href="https://www.luxoft-training.com/news/building-java-client-server-applications-with-tcp?ref=noah-ios.dev">3-way handshake</a></li><li><a href="https://steffen-lee.tistory.com/31?ref=noah-ios.dev">4-way-handshake</a></li><li><a href="https://rednooby.tistory.com/17?ref=noah-ios.dev">UDP &#xD5E4;&#xB354;</a></li><li><a href="https://coconuts.tistory.com/33?ref=noah-ios.dev">UDP &#xD1B5;&#xC2E0;&#xACFC;&#xC815;</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Apple의 과거 Process memory 관리 모델을 알아보자]]></title><description><![CDATA[<p>&#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xAC00; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xBCC4;&#xB85C; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC744; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD559;&#xC2B5;&#xC758; &#xC77C;&#xD658;&#xC73C;&#xB85C; Apple&#xC758; &#xACFC;&#xAC70; <a href="https://ko.wikipedia.org/wiki/%EB%A7%A5_OS?ref=noah-ios.dev">Macintosh Operating System</a>&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xAD00;&#xB9AC; &#xBAA8;&#xB378;</p>]]></description><link>https://noah-ios.dev/classic-macos-memory-management/</link><guid isPermaLink="false">64e8caed22fba699ec4bbc4f</guid><category><![CDATA[Apple]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Thu, 12 Jan 2023 15:43:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1532799118157-9fef52fdbc5e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fG1hY2ludG9zaHxlbnwwfHx8fDE2OTI5Nzc5MDZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1532799118157-9fef52fdbc5e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fG1hY2ludG9zaHxlbnwwfHx8fDE2OTI5Nzc5MDZ8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;"><p>&#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xAC00; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xBCC4;&#xB85C; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC744; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xD559;&#xC2B5;&#xC758; &#xC77C;&#xD658;&#xC73C;&#xB85C; Apple&#xC758; &#xACFC;&#xAC70; <a href="https://ko.wikipedia.org/wiki/%EB%A7%A5_OS?ref=noah-ios.dev">Macintosh Operating System</a>&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xD604;&#xB300; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xBA54;&#xBAA8;&#xB9AC; &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xACFC; &#xBE44;&#xAD50;&#xD574;&#xAC00;&#xBA70;, stack, heap, text, &#xAE00;&#xB85C;&#xBC8C; &#xBCC0;&#xC218; GVAR, BSS&#xC758; &#xC5ED;&#xD560;&#xC5D0; &#xB300;&#xD574; &#xC815;&#xB9AC;&#xD574;&#xBCF4;&#xC790;.</p><h1 id="inside-macintosh-memory">Inside Macintosh: Memory</h1><p><br><strong>Classic Mac OS memory management</strong></p><p>&#xBA3C;&#xC800; &#xC624;&#xB298; &#xC0B4;&#xD3B4;&#xBCF4;&#xB824;&#xACE0; &#xD558;&#xB294; Apple&#xC758; Macintosh System 7.0&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/06bb8ad9059d00d6714c9a738097805c/6aca1/2.jpg" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><blockquote>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98; : <a href="https://github.com/EG-tech/digipres-posters?ref=noah-ios.dev">https://github.com/EG-tech/digipres-posters</a></blockquote><p>Apple&#xC740; 1980&#xB144;&#xB300;&#xC5D0; &#xC790;&#xCCB4; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC778; Macintosh System&#xC744; &#xB9CC;&#xB4E4;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; UNIX &#xACC4;&#xC5F4;&#xACFC;&#xB294; &#xB2E4;&#xB978; &#xBD80;&#xBD84;&#xC774; &#xC788;&#xB2E4;. &#xC774; &#xB54C;&#xBB38;&#xC5D0; &#xBC11;&#xC5D0;&#xC11C; &#xBCFC; Process memory model&#xC740; &#xD604;&#xC7AC; &#xC6B0;&#xB9AC;&#xAC00; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xACE0; &#xC788;&#xB294; Unix&#xACC4;&#xC5F4;&#xC758; process memory model&#xACFC; &#xB2E4;&#xB974;&#xB2E4;.</p><figure class="kg-card kg-embed-card"><iframe width="200" height="150" src="https://www.youtube.com/embed/_W4CntluoBQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="2002 05 06 WWDC 2002 Death Of Mac OS 9"></iframe></figure><p>&#xD604;&#xC7AC; &#xC6B0;&#xB9AC;&#xAC00; &#xC0AC;&#xC6A9;&#xD558;&#xACE0; &#xC788;&#xB294; Mac OS&#xB294; 2000&#xB144;&#xB300; &#xCD08;&#xBC18; Classic Mac OS&#xC640;&#xB294; &#xB2E4;&#xB978; UNIX&#xC5D0; &#xBFCC;&#xB9AC;&#xB97C; &#xB450;&#xACE0;&#xC788;&#xB294; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC774;&#xBA70;, Classic Mac OS&#xB294; OS X&#xAC00; &#xCD9C;&#xC2DC; &#xB41C; &#xC774;&#xD6C4; WWDC 2002&#xC5D0;&#xC11C; MacOS 9&#xC758; &#xBAA8;&#xC758; &#xC7A5;&#xB840;&#xC2DD;&#xC744; &#xD1B5;&#xD574; &#xC0AC;&#xB77C;&#xC9C0;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;..</p><p>Apple developer &#xC0AC;&#xC774;&#xD2B8;&#xC5D0; archive&#xB41C; &#xB3C4;&#xC11C;&#xB97C; &#xD1B5;&#xD574; Macitonsh system&#xC758; Process memory model&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xB3C4;&#xB85D; &#xD574;&#xBCF4;&#xC790;<br>&#xB9C1;&#xD06C;: <a href="https://developer.apple.com/library/archive/documentation/mac/pdf/Memory/Intro_to_Mem_Mgmt.pdf?ref=noah-ios.dev">Inside Macintosh: Memory</a></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://m.media-amazon.com/images/I/91spbOVoHHL.jpg" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;: amazon</span></figcaption></figure><h2 id="about-memory"><strong>About Memory</strong></h2><p>Macintosh Operating System&#xC774; &#xC2DC;&#xC791;&#xB418;&#xBA74; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; RAM&#xC744; &#xB450;&#xAC1C;&#xC758; &#xC139;&#xC158;&#xC73C;&#xB85C; &#xB098;&#xB208;&#xB2E4;. &#xB450;&#xAC1C;&#xC758; &#xC139;&#xC158; &#xC911; &#xD558;&#xB098;&#xB294; system partition&#xC778;&#xB370;, system partition&#xC740; &#xD56D;&#xC0C1; &#xC8FC;&#xC18C; &#xC9C0;&#xC815;&#xC774; &#xAC00;&#xB2A5;&#xD55C; &#xAC00;&#xC7A5; &#xB0AE;&#xC740; &#xBA54;&#xBAA8;&#xB9AC; &#xC8FC;&#xC18C;(0&#xBC88;&#xC9C0;)&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xD55C;&#xB2E4;. system partition&#xC5D0;&#xB294; system heap, global variable&#xB4E4;&#xC758; &#xC9D1;&#xD569;&#xC744; &#xD3EC;&#xD568;&#xD55C;&#xB2E4;.</p><blockquote>linux&#xC640; &#xAC19;&#xC740; &#xD604;&#xB300; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC5D0;&#xC11C;&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; virtual memory&#xB97C; kernel space&#xC640; user space&#xB85C; &#xB098;&#xB204;&#xB294;&#xB370; Macintosh System&#xC5D0;&#xC11C;&#xB294; &#xC774;&#xB97C; system partition&#xACFC; application partition&#xC73C;&#xB85C; &#xB098;&#xB204;&#xB294; &#xAC83; &#xAC19;&#xB124;&#xC694;!</blockquote><p>&#xB098;&#xBA38;&#xC9C0; &#xC139;&#xC158;&#xC778; system partition &#xC678;&#xBD80;&#xC758; &#xBAA8;&#xB4E0; &#xBA54;&#xBAA8;&#xB9AC;&#xB294; application&#xC774;&#xB098; &#xAE30;&#xD0C0; software components&#xC5D0; &#xD560;&#xB2F9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://noah0316.github.io/static/02adb96b69161c8b8cf748904d39f5dd/6af66/Macintosh_System_7.5.3_screenshot.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"><figcaption><span style="white-space: pre-wrap;">&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98; : </span><a href="https://apple.fandom.com/wiki/System_7?ref=noah-ios.dev"><span style="white-space: pre-wrap;">Apple Wiki</span></a></figcaption></figure><p>Macintosh System 7(1991&#xB144; &#xCD9C;&#xC2DC;) &#xC774;&#xC0C1;&#xBD80;&#xD130; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xD55C;&#xBC88;&#xC5D0; &#xC5EC;&#xB7EC; application&#xC744; &#xC5F4; &#xC218; &#xC788;&#xAC8C;&#xB418;&#xC5C8;&#xB294;&#xB370;, &#xACFC;&#xAC70; Apple&#xC5D0;&#xC11C; application &#xBCC4;&#xB85C; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xAD00;&#xB9AC;&#xD588;&#xC5C8;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;.</p><blockquote>Apple&#xC740; Macintosh System 7&#xBD80;&#xD130; &#xAC00;&#xC0C1;&#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xC73C;&#xBA70;, &#xC774;&#xB54C;&#xBD80;&#xD130; &#xD611;&#xB825;&#xD615; &#xBA40;&#xD2F0;&#xD0DC;&#xC2A4;&#xD0B9;&#xC744; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xB2E4;.<br>&#xCC38;&#xC870;: <a href="https://en.wikipedia.org/wiki/System_7?ref=noah-ios.dev">https://en.wikipedia.org/wiki/System_7</a></blockquote><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212100358-527a461d-4169-4ae0-b62e-fc3091045b07.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>&#xC804;&#xC220;&#xD55C; &#xBC14;&#xC640; &#xAC19;&#xC774; system partition &#xBA54;&#xBAA8;&#xB9AC;&#xC5D0;&#xC11C; &#xAC00;&#xC7A5; &#xB0AE;&#xC740; &#xC704;&#xCE58;&#xB97C; &#xCC28;&#xC9C0;&#xD55C;&#xB2E4;.<br>application partition&#xC740; &#xBA3C;&#xC800; &#xBA54;&#xBAA8;&#xB9AC;&#xC758; &#xC0C1;&#xB2E8; &#xBD80;&#xBD84;&#xBD80;&#xD130; &#xB85C;&#xB4DC; &#xB41C;&#xB2E4;.</p><p>&#xC704; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C;&#xB294; &#xC138;&#xAC1C;&#xC758; application&#xC774; &#xC788;&#xB294;&#xB370;, application&#xB9C8;&#xB2E4; &#xACE0;&#xC720;&#xD55C; partition&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;. Application1&#xB85C; &#xD45C;&#xC2DC;&#xB41C; application&#xC774; active application&#xC774;&#xB2E4;.</p><blockquote>&#xD604;&#xC7AC; &#xD65C;&#xC131;&#xD654;&#xB41C; &#xC560;&#xD50C;&#xB9AC;&#xCF00;&#xC774;&#xC158;&#xC744; &#xAC00;&#xB9AC;&#xD0A4;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC0DD;&#xAC01;&#xB418;&#xB124;&#xC694;</blockquote><p>&#xC624;&#xB978;&#xCABD;&#xC5D0; &#xC788;&#xB294; &#xB77C;&#xBCA8;&#xB4E4;&#xC740; system global variables&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; system global variable&#xC774;&#xB2E4;.</p><h3 id="the-system-heap">The System Heap</h3><hr><p>system partition&#xC758; main part&#xB294; system heap&#xC774;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; system heap&#xC740; system resource, system code segement &#xBC0F; system data structure&#xC640; &#xAC19;&#xC740; &#xB2E4;&#xC591;&#xD55C; &#xD56D;&#xBAA9;&#xC744; &#xB85C;&#xB4DC;&#xD558;&#xB294; &#xC6B4;&#xC601;&#xCCB4;&#xC81C; &#xBC0F; &#xAE30;&#xD0C0; system software&#xC5D0;&#xC11C; &#xB3C5;&#xC810;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC608;&#xC57D;&#xB418;&#xC5B4; &#xC788;&#xB2E4;. &#xC608;&#xB97C;&#xB4E4;&#xC5B4; system buffer, queue &#xB4F1;&#xC774; system heap&#xC5D0; &#xD560;&#xB2F9;&#xB41C;&#xB2E4;.</p><h3 id="the-system-global-variables">The System Global Variables</h3><hr><p>Memory&#xC758; &#xAC00;&#xC7A5; &#xB0AE;&#xC740; &#xBD80;&#xBD84;&#xC740; system global variables(or low-memory system global variables)&#xB77C;&#xACE0; &#xD558;&#xB294; global variable&#xC758; collection&#xC774; &#xCC28;&#xC9C0;&#xD55C;&#xB2E4;.</p><p>&#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xB294; &#xC774;&#xB7EC;&#xD55C; global variable&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC6B4;&#xC601; &#xD658;&#xACBD;&#xC5D0; &#xB300;&#xD55C; &#xC5EC;&#xB7EC; &#xC885;&#xB958;&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC720;&#xC9C0;&#xD55C;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4; operating-system queue&#xC758; head&#xC5D0; &#xB300;&#xD55C; pointer, menu bar&#xC758; &#xB192;&#xC774; &#xB4F1;&#xC774; &#xC788;&#xB2E4;.</p><p>low memory&#xC5D0; &#xC704;&#xCE58;&#xD55C; &#xB300;&#xBD80;&#xBD84;&#xC758; global variable&#xC740; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;, &#xB610;&#xB294; &#xAE30;&#xD0C0; system software&#xC5D0;&#xB9CC; &#xC720;&#xC6A9;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><p>low memory&#xC5D0; &#xC704;&#xCE58;&#xD55C; &#xB2E4;&#xB978; global variable &#xD604;&#xC7AC; application&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. &#xC608;&#xB97C; &#xB4E4;&#xC5B4;</p><ul><li><code>ApplZone</code>global variable&#xC5D0;&#xB294; &#xD604;&#xC7AC; &#xD65C;&#xC131;&#xD654; &#xB41C; application partition&#xC758; &#xC758; &#xCCAB;&#xBC88;&#xC9F8; &#xBC14;&#xC774;&#xD2B8;&#xC758; &#xC8FC;&#xC18C;&#xAC00; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</li><li><code>ApplLimit</code> global variable&#xC5D0;&#xB294; &#xD604;&#xC7AC; &#xD65C;&#xC131;&#xD654; &#xB41C; application&#xC758; &#xD799;&#xC774; &#xD655;&#xC7A5;&#xD560; &#xC218; &#xC788;&#xB294; &#xB9C8;&#xC9C0;&#xB9C9; &#xBC14;&#xC774;&#xD2B8;&#xC758; &#xC8FC;&#xC18C;&#xAC00; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</li><li><code>CurrentA5</code> global variable&#xC5D0;&#xB294; &#xD604;&#xC7AC; &#xD65C;&#xC131;&#xD654; &#xB41C; application&#xC758; global variable&#xACFC; parameter&#xC0AC;&#xC774;&#xC758; &#xACBD;&#xACC4; &#xC8FC;&#xC18C;&#xAC00; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</li></ul><p>&#xC774;&#xB7EC;&#xD55C; global variable&#xC5D0;&#xB294; &#xD65C;&#xC131;&#xD654;&#xB41C; application&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xB294; context switching&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xB54C;&#xB9C8;&#xB2E4; &#xC774;&#xB7EC;&#xD55C; global variable&#xC758; &#xAC12;&#xC744; &#xBCC0;&#xACBD;&#xD55C;&#xB2E4;.</p><blockquote>&#xC81C;&#xAC00; &#xACF5;&#xBD80;&#xD588;&#xC5C8;&#xB358; &#xB2E4;&#xB978; &#xD604;&#xB300; Operating System&#xC5D0;&#xC11C;&#xB294; <code>ApplZone</code>, <code>ApplLimit</code>, <code>CurrentA5</code>&#xC640; &#xAC19;&#xC740; &#xBA54;&#xBAA8;&#xB9AC; &#xC8FC;&#xC18C;&#xACF5;&#xAC04;&#xACFC; &#xAC19;&#xC740; &#xC815;&#xBCF4;&#xB4E4;&#xC740; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xBCC4;&#xB85C; <a href="https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EC%A0%9C%EC%96%B4_%EB%B8%94%EB%A1%9D?ref=noah-ios.dev">Process Control Block</a>&#xC774;&#xB77C;&#xB294; &#xC790;&#xB8CC;&#xAD6C;&#xC870;&#xC5D0; &#xB2F4;&#xC544; kernel&#xC5D0; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB2E4;&#xAC00; CPU&#xC758; &#xB808;&#xC9C0;&#xC2A4;&#xD130;&#xC5D0;(&#xBA54;&#xBAA8;&#xB9AC; &#xC815;&#xBCF4;&#xC640; &#xAC19;&#xC740; &#xACBD;&#xC6B0; &#xD604;&#xC7AC; page table&#xC744; &#xAC00;&#xB9AC;&#xD0A4;&#xB294; &#xB808;&#xC9C0;&#xC2A4;&#xD130; &#xB4F1;)&#xD574;&#xB2F9; &#xC815;&#xBCF4;&#xB4E4;&#xC744; &#xBCF5;&#xC0AC;&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC778;&#xB370;, &#xC704;&#xC758; global variable&#xB4E4;&#xC774; &#xC774;&#xC640; &#xBE44;&#xC2B7;&#xD55C; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC785;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; low memory&#xC5D0; &#xC704;&#xCE58;&#xD55C; global variable&#xB4E4;&#xC740; read/write&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC774; &#xC88B;&#xB2E4;. &#xB300;&#xBD80;&#xBD84;&#xC758; global variable&#xB4E4;&#xC740; &#xBB38;&#xC11C;&#xD654;&#xB418;&#xC5B4;&#xC788;&#xC9C0; &#xC54A;&#xACE0;, &#xBCC0;&#xACBD;&#xD560; &#xACBD;&#xC6B0; &#xC608;&#xCE21;&#xD558;&#xAE30; &#xC5B4;&#xB835;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294; &#xAC83;&#xC774; &#xC88B;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; low memory&#xC5D0; &#xC704;&#xCE58;&#xD55C; global variable&#xC744; application&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD560; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xC788;&#xB294; &#xACBD;&#xC6B0; &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; global variable&#xC758; &#xD604;&#xC7AC; &#xAC12;&#xC744; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC788;&#xB2E4;.</p><blockquote>&#xC774; &#xC5ED;&#xC2DC; &#xB2E4;&#xB978; &#xD604;&#xB300; Operating System&#xC5D0;&#xC11C;&#xB294; kernel&#xC758; &#xBCF4;&#xD638;&#xBB38;&#xC81C;&#xB85C; User mode&#xC5D0;&#xC11C;&#xB294; kernel space&#xC5D0; &#xC811;&#xADFC;&#xD574;&#xC57C;&#xD558;&#xB294; &#xACBD;&#xC6B0; system call&#xC744; &#xC774;&#xC6A9;&#xD574; &#xC811;&#xADFC;&#xD574;&#xC57C; &#xD558;&#xB294;&#xB370; Macintosh System&#xC5D0;&#xC11C;&#xB294; application&#xC5D0;&#xC11C; system call&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0;&#xB3C4; system partition&#xC758; global variable&#xC5D0; &#xC811;&#xADFC;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xB098; &#xBD05;&#xB2C8;&#xB2E4;.</blockquote><h3 id="organization-of-memory-in-an-application-partition">Organization of Memory in an Application Partition</h3><hr><p>application&#xC774; &#xC2DC;&#xC791;&#xB418;&#xBA74; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xB294; application partition&#xC774;&#xB77C;&#xB294; memory partition&#xC744; &#xD560;&#xB2F9;&#xD569;&#xB2C8;&#xB2E4;. &#xD574;&#xB2F9; partition&#xC5D0;&#xB294; application code&#xC758; &#xD544;&#xC218; segment&#xC640; application&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xAE30;&#xD0C0; &#xB370;&#xC774;&#xD130;&#xAC00; &#xD3EC;&#xD568;&#xB41C;&#xB2E4;.</p><p>&#xC544;&#xB798;&#xC758; &#xADF8;&#xB9BC;&#xC740; applcation partition&#xC758; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xAD6C;&#xC131;&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212100960-cfba758c-9e8d-4f24-8f78-e388c6b44604.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>application partition&#xC740; &#xC138;&#xAC00;&#xC9C0;&#xC758; major part&#xB85C; &#xB098;&#xB25C;&#xB2E4;.</p><ul><li>application stack</li><li>applicaiton heap</li><li>application global variable and A5 world</li></ul><p>heap&#xC740; application&#xC758; low memory&#xB05D;(<code>ApplZone</code>)&#xC5D0; &#xC704;&#xCE58;&#xD558;&#xBA70; &#xD56D;&#xC0C1; &#xB192;&#xC740; &#xBA54;&#xBAA8;&#xB9AC; &#xCABD;&#xC73C;&#xB85C; &#xD655;&#xC7A5;&#xB41C;&#xB2E4;.<br>A5 World&#xB294; application partition&#xC758; high memory&#xB05D;&#xC5D0; &#xC704;&#xCE58;&#xD558;&#xBA70; &#xD06C;&#xAE30;&#xAC00; &#xACE0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><p>stack&#xC740; A5 World&#xC758; low memory&#xBD80;&#xD130; &#xC2DC;&#xC791;&#xD558;&#xBA70; heap&#xC758; &#xC0C1;&#xB2E8;&#xC744; &#xD5A5;&#xD574; &#xC544;&#xB798;&#xCABD;&#xC73C;&#xB85C; &#xD655;&#xC7A5;&#xD55C;&#xB2E4;.</p><h3 id="%EC%9E%A0%EA%B9%90-a5-world-%EA%B7%B8%EA%B2%8C-%EB%AD%98%EA%B9%8C">&#xC7A0;&#xAE50; A5 world? &#xADF8;&#xAC8C; &#xBB58;&#xAE4C;?</h3><hr><p>Apple&#xC740; Macintosh&#xC5D0; classic 68K &#xB7F0;&#xD0C0;&#xC784; &#xC544;&#xD0A4;&#xD14D;&#xCCD0;&#xB97C; &#xC0AC;&#xC6A9;&#xD588;&#xB294;&#xB370;&#xC694;, &#xBAA8;&#xB4E0; classic 68k application&#xC5D0;&#xB294; A5 world &#xBA54;&#xBAA8;&#xB9AC; &#xC601;&#xC5ED;&#xC774; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xC989; &#xBA54;&#xBAA8;&#xB9AC; &#xC601;&#xC5ED;&#xC744; &#xB9D0;&#xD558;&#xB294; &#xAC83;&#xC774;&#xC9C0;&#xC694;.</p><p>A5 world&#xC5D0;&#xB294; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740; &#xD56D;&#xBAA9;&#xB4E4;&#xC744; &#xC800;&#xC7A5;&#xD569;&#xB2C8;&#xB2E4;.</p><ul><li><strong>application&#xC758; global variable</strong></li><li>application&#xC758; paramter</li><li>application&#xC774; code segment&#xAC04;&#xC5D0; &#xD638;&#xCD9C;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xD558;&#xB294; jump table</li><li>Macintosh&#xC758; &#xADF8;&#xB798;&#xD53D; &#xBAA8;&#xB378;&#xC778; <a href="https://en.wikipedia.org/wiki/QuickDraw?ref=noah-ios.dev">Quickdraw</a>&#xC758; drawing environment&#xC758; &#xC815;&#xBCF4;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB294; global variable</li></ul><p>&#xACB0;&#xAD6D; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xACE0; &#xC788;&#xB294; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xBAA8;&#xB378;&#xC5D0;&#xC11C; &#xB370;&#xC774;&#xD130; &#xC601;&#xC5ED;&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xAC83; &#xAC19;&#xB124;&#xC694;!</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212101630-853f0800-1c4f-4b67-8325-8f5593aad3e6.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>&#xC704; &#xADF8;&#xB9BC;&#xC5D0;&#xC11C; &#xBCFC; &#xC218; &#xC788;&#xB4EF;, &#xC67C;&#xCABD;&#xC5D0; &#xBCF4;&#xC774;&#xB294; &#xAC83;&#xC774; Maciontosh System&#xC758; &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xBCC4; &#xBA54;&#xBAA8;&#xB9AC; &#xAD6C;&#xC870;, &#xC624;&#xB978;&#xCABD;&#xC774; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC6B0;&#xB9AC;&#xAC00; &#xC54C;&#xACE0; &#xC788;&#xB294; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xAD6C;&#xC870;&#xC785;&#xB2C8;&#xB2E4;. Data, Code(Text)&#xC601;&#xC5ED;&#xC774; Heap&#xC758; &#xBC11;&#xBD80;&#xBD84;&#xC5D0; &#xC704;&#xCE58;&#xD55C; &#xBC18;&#xBA74; &#xACFC;&#xAC70; Macintosh System&#xC5D0;&#xC11C;&#xB294; Stack&#xC758; &#xC717;&#xBD80;&#xBD84;&#xC758; A5 world&#xB77C;&#xB294; &#xC77C;&#xBC18;&#xC73C;&#xB85C; &#xC6B0;&#xB9AC;&#xAC00; &#xC54C;&#xACE0;&#xC788;&#xB294; data &#xC601;&#xC5ED;&#xC5D0; &#xD1B5;&#xC0C1;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xACE0;&#xC788;&#xB294; process model&#xC758; data(GVAR, BSS)&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xB4A4;&#xC5D0;&#xC11C; &#xC870;&#xAE08; &#xB354; &#xC0B4;&#xD3B4;&#xBD05;&#xC2DC;&#xB2E4;!</p><blockquote>&#xD1B5;&#xC0C1;&#xC801;&#xC778; process memory model&#xC5D0;&#xC11C; &#xB370;&#xC774;&#xD130; &#xC139;&#xC158;&#xC740; <code>GVAR</code>, <code>BSS</code>&#xB85C; &#xB098;&#xB258;&#xB294;&#xB370; <code>GVAR</code>&#xC5D0;&#xB294; &#xCD08;&#xAE30;&#xD654;&#xB41C; &#xC804;&#xC5ED;&#xBCC0;&#xC218;, <code>BSS</code>&#xC601;&#xC5ED;&#xC5D0;&#xB294; &#xCD08;&#xAE30;&#xD654;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC804;&#xC5ED;&#xBCC0;&#xC218;&#xAC00; &#xC800;&#xC7A5;&#xB429;&#xB2C8;&#xB2E4;.</blockquote><blockquote>&#xC65C; &#xB098;&#xB220;&#xB193;&#xC558;&#xC744;&#xAE4C;? <code>BSS</code>&#xC601;&#xC5ED;&#xC5D0;&#xB294; &#xCD08;&#xAE30;&#xD654;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC804;&#xC5ED;&#xBCC0;&#xC218;&#xB4E4;&#xC774; &#xC800;&#xC7A5;&#xB418;&#xC5B4; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC774; &#xC2E4;&#xD589;&#xB420; &#xB54C; &#xC601;&#xC5ED;&#xC744; &#xCC28;&#xC9C0;&#xD574; <code>BSS</code>&#xC601;&#xC5ED; &#xBCC0;&#xC218;&#xB4E4;&#xC774; &#xB9CE;&#xC544;&#xC838;&#xB3C4; &#xD504;&#xB85C;&#xADF8;&#xB7A8;&#xC758; &#xC2E4;&#xD589; &#xCF54;&#xB4DC; &#xC0AC;&#xC774;&#xC988;&#xB97C; &#xB298;&#xB9AC;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;&#xB294; &#xD2B9;&#xC9D5;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.<br>&#xCC38;&#xACE0; : <a href="https://ko.wikipedia.org/wiki/.bss?ref=noah-ios.dev">https://ko.wikipedia.org/wiki/.bss</a></blockquote><h3 id="%EC%9E%90-%EB%8B%A4%EC%8B%9C-%EB%8F%8C%EC%95%84%EC%99%80%EC%84%9C">&#xC790;! &#xB2E4;&#xC2DC; &#xB3CC;&#xC544;&#xC640;&#xC11C;</h3><hr><p>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; stack&#xACFC; heap &#xC0AC;&#xC774;&#xC5D0;&#xB294; &#xC0AC;&#xC6A9;&#xB418;&#xC9C0; &#xC54A;&#xB294; &#xBA54;&#xBAA8;&#xB9AC; &#xC601;&#xC5ED;(unused memory)&#xC774; &#xC788;&#xB2E4;. &#xC774; &#xC601;&#xC5ED;&#xC740; application heap&#xC5D0; &#xD560;&#xB2F9;&#xB41C; &#xACF5;&#xAC04;&#xC744; &#xCE68;&#xBC94;&#xD558;&#xC9C0; &#xC54A;&#xACE0;, stack&#xC774; &#xCEE4;&#xC9C8; &#xC218; &#xC788;&#xB294; &#xACF5;&#xAC04;&#xC744; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; &#xACBD;&#xC6B0;&#xC5D0; &#xB530;&#xB77C; application heap &#xC6A9;&#xB3C4;&#xB85C; &#xC608;&#xC57D;&#xB41C; &#xACF5;&#xAC04;&#xC744; stack&#xC774; &#xCE68;&#xBC94;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370;, &#xC774; &#xACBD;&#xC6B0; heap&#xC758; &#xB370;&#xC774;&#xD130;&#xAC00; &#xC190;&#xC0C1;&#xB420; &#xAC00;&#xB2A5;&#xC131;&#xC774; &#xB9E4;&#xC6B0; &#xB192;&#xB2E4;.</p><h3 id="the-application-stack">The Application stack</h3><hr><p>stack&#xC740; application partition&#xC758; memory&#xC601;&#xC5ED;&#xC73C;&#xB85C; &#xD55C;&#xCABD; &#xB05D;&#xC740; &#xB298;&#xC5B4;&#xB098;&#xAC70;&#xB098; &#xC904;&#xACE0;, &#xB2E4;&#xB978; &#xCABD; &#xB05D;&#xC740; &#xACE0;&#xC815;&#xB41C; &#xC0C1;&#xD0DC;&#xB85C; &#xC720;&#xC9C0;&#xB429;&#xB2C8;&#xB2E4;. &#xC774;&#xB294; stack &#xC601;&#xC5ED;&#xC774; &#xD56D;&#xC0C1; <strong>LIFO</strong>(&#xD6C4;&#xC785;&#xC120;&#xCD9C;)&#xC21C;&#xC11C;&#xB85C; &#xD560;&#xB2F9; &#xBC0F; &#xD574;&#xC81C;&#xB428;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;. &#xB9C8;&#xC9C0;&#xB9C9;&#xC73C;&#xB85C; &#xD560;&#xB2F9;&#xB41C; &#xD56D;&#xBAA9;&#xC774; &#xD56D;&#xC0C1; &#xAC00;&#xC7A5; &#xBA3C;&#xC800; &#xD574;&#xC81C;&#xB41C;&#xB2E4;. &#xB610;&#xD55C; stack&#xC758; &#xD560;&#xB2F9;&#xB41C; &#xC601;&#xC5ED;&#xC774; &#xD56D;&#xC0C1; &#xC5F0;&#xC18D;&#xC801;&#xC774;&#xB77C;&#xB294; &#xC758;&#xBBF8;&#xC774;&#xAE30;&#xB3C4; &#xD558;&#xBA70;, stack&#xC758; &#xB9E8; &#xC704;&#xC5D0;&#xC11C;&#xB9CC; &#xD574;&#xC81C;&#xB418;&#xACE0; &#xC911;&#xAC04;&#xC5D0;&#xC11C;&#xB294; &#xD574;&#xC81C;&#xB418;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB294; stack&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xC9C0; &#xC54A;&#xB294; &#x201C;holes(&#xAD6C;&#xBA4D;)&#x201C;&#xB294; &#xC5C6;&#xC74C;&#xC744; &#xC758;&#xBBF8;&#xD55C;&#xB2E4;.</p><p>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; stack&#xC740; high memory&#xC5D0;&#xC11C; low memory&#xB85C; &#xC313;&#xC778;&#xB2E4;. &#xB298;&#xC5B4;&#xB098;&#xAC70;&#xB098; &#xC904;&#xC5B4;&#xB4DC;&#xB294; stack&#xC758; &#xB05D;&#xC740; &#xC2E4;&#xC81C;&#xB85C;&#xB294; &#xC2A4;&#xD0DD;&#xC774; &#xCC28;&#xC9C0;&#xD558;&#xB294; &#xBA54;&#xBAA8;&#xB9AC;&#xC758; &#xD558;&#xB2E8;&#xC5D0; &#xC788;&#xC9C0;&#xB9CC; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; stack&#xC758; &#xC0C1;&#xB2E8;&#xC774;&#xB77C;&#xACE0; &#xD55C;&#xB2E4;.</p><p><strong>LIFO</strong>&#xD2B9;&#xC131;&#xC73C;&#xB85C; &#xC778;&#xD574; stack&#xC740; &#xD568;&#xC218; &#xB610;&#xB294; &#xD504;&#xB85C;&#xC2DC;&#xC800; &#xC2E4;&#xD589;&#xACFC; &#xAD00;&#xB828;&#xB41C; &#xBA54;&#xBAA8;&#xB9AC; &#xD560;&#xB2F9;&#xC5D0; &#xD2B9;&#xD788; &#xC720;&#xC6A9;&#xD558;&#xB2E4;. application&#xC774; &#xD2B9;&#xC815; &#xB8E8;&#xD2F4;&#xC744; &#xD638;&#xCD9C;&#xD558;&#xBA74; stack frame&#xC5D0; &#xB300;&#xD55C; &#xACF5;&#xAC04;&#xC774; stack&#xC5D0; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xD560;&#xB2F9;&#xB41C;&#xB2E4;. stack frame&#xC5D0;&#xB294; &#xB8E8;&#xD2F4;&#xC758; parameter, local variable &#xBC0F; &#xBC18;&#xD658;&#xC8FC;&#xC18C;&#xAC00; &#xD3EC;&#xD568;&#xB41C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212101810-46d87e6f-2769-4836-916a-70a644390ce0.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>&#xC704; &#xADF8;&#xB9BC;&#xC740; &#xD568;&#xC218; &#xD638;&#xCD9C; &#xC911;&#xC5D0; stack&#xC774; &#xC5B4;&#xB5BB;&#xAC8C; &#xD655;&#xC7A5;&#xB418;&#xACE0; &#xCD95;&#xC18C;&#xB418;&#xB294;&#xC9C0; &#xBCF4;&#xC5EC;&#xC900;&#xB2E4;. &#xB9E8; &#xC67C;&#xCABD; &#xADF8;&#xB9BC;&#xC740; &#xD568;&#xC218;&#xAC00; &#xD638;&#xCD9C;&#xB418;&#xAE30; &#xC9C1;&#xC804;&#xC758; stack&#xC744; &#xBCF4;&#xC5EC;&#xC900;&#xB2E4;. &#xC911;&#xAC04; &#xADF8;&#xB9BC;&#xACFC; &#xB9E8; &#xC624;&#xB978;&#xCABD; &#xADF8;&#xB9BC;&#xC740; &#xD655;&#xC7A5;&#xB41C; stack frame&#xACFC; &#xD568;&#xC218;&#xC758; &#xACB0;&#xACFC;&#xAC00; &#xC5B4;&#xB514;&#xC5D0; &#xC788;&#xAC8C; &#xB418;&#xB294;&#xC9C0; &#xBCF4;&#xC5EC;&#xC900;&#xB2E4;. &#xD568;&#xC218;&#xC758; &#xC2E4;&#xD589;&#xC774; &#xC644;&#xB8CC;&#xB418;&#xACE0; &#xB098;&#xBA74; local variable&#xB4E4;&#xACFC; &#xD568;&#xC218; parameter&#xB4E4;&#xC740; stack&#xC5D0;&#xC11C; pop&#xB418;&#xBA70;,&#xD568;&#xC218;&#xC758; &#xACB0;&#xACFC;&#xB294; &#xC774;&#xC804; stack&#xC758; &#xCD5C;&#xC0C1;&#xB2E8;&#xC5D0; &#xC788;&#xB2E4;.</p><p>Pascal&#xACFC; &#xAC19;&#xC740; &#xACE0;&#xAE09; &#xAC1C;&#xBC1C; &#xC5B8;&#xC5B4;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xACBD;&#xC6B0; stack&#xC758; &#xB3D9;&#xC801; &#xBA54;&#xBAA8;&#xB9AC; &#xD560;&#xB2F9;&#xC740; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xCC98;&#xB9AC;&#xB418;&#xBA70;, &#xCEF4;&#xD30C;&#xC77C;&#xB7EC;&#xB294; &#xAC01; &#xD568;&#xC218; &#xB610;&#xB294; &#xD504;&#xB85C;&#xC2DC;&#xC800; &#xD638;&#xCD9C;&#xC5D0; &#xB300;&#xD55C; stack frame&#xC744; &#xB9CC;&#xB4E4;&#xACE0; &#xC0AD;&#xC81C;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;.</p><h3 id="the-appliaction-heap">The Appliaction heap</h3><hr><p>application heap&#xC740; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xD560;&#xB2F9;&#xB418;&#xACE0;, &#xC694;&#xCCAD;&#xC2DC; &#xD574;&#xC81C;&#xB418;&#xB294; application partition&#xC758; memory&#xC601;&#xC5ED;&#xC774;&#xB2E4;. heap&#xC740; application&#xC758; low memory&#xB05D;&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xD558;&#xC5EC; memory &#xC704;&#xCABD;&#xC73C;&#xB85C; &#xD655;&#xC7A5;&#xB41C;&#xB2E4;. heap&#xC5D0;&#xB294; stack&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xAC70;&#xC758; &#xBAA8;&#xB4E0; &#xD56D;&#xBAA9;&#xC774; &#xD3EC;&#xD568;&#xB41C;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; application heap&#xC5D0;&#xB294; &#xD604;&#xC7AC; memory&#xC5D0; &#xB85C;&#xB4DC;&#xB41C; application&#xC758; code segment&#xC640; resource&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. heap&#xC5D0;&#xB294; window records, dialog records, document data&#xC640; &#xAC19;&#xC774; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xD560;&#xB2F9;&#xB41C; &#xB2E4;&#xB978; &#xD56D;&#xBAA9;&#xB3C4; &#xD3EC;&#xD568;&#xB41C;&#xB2E4;.</p><blockquote>&#xC5EC;&#xAE30;&#xC11C; &#xB9D0;&#xD558;&#xB294; code segment&#xB780; application&#xC758; &#xC2E4;&#xD589; &#xCF54;&#xB4DC;&#xB97C; &#xC758;&#xBBF8;&#xD569;&#xB2C8;&#xB2E4;.<br>&#xCC38;&#xC870; : <a href="https://developer.apple.com/library/archive/documentation/mac/pdf/Processes/Segment_Manager.pdf?ref=noah-ios.dev">Apple Document Segment Manager</a></blockquote><blockquote>&#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC54C;&#xACE0;&#xC788;&#xB294; process memory model&#xC5D0;&#xC11C;&#xB294; heap, text&#xC139;&#xC158;&#xC744; &#xBD84;&#xB9AC;&#xD574; &#xB193;&#xC558;&#xB294;&#xB370;, &#xACFC;&#xAC70; Apple&#xC758; Macitosh System&#xC740; &#xC774;&#xB97C; heap&#xC5D0; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB2E4;&#xACE0; &#xC124;&#xBA85;&#xD558;&#xACE0; &#xC788;&#xB294;&#xAC8C; &#xD765;&#xBBF8;&#xB86D;&#xB124;&#xC694;</blockquote><p>Memory Manager&#xB97C; &#xC9C1;&#xC811;&#xC801;(&#xC608;&#xB97C;&#xB4E4;&#xBA74;, <code>NewHandle</code>&#xD568;&#xC218; &#xC0AC;&#xC6A9;) &#xD639;&#xC740; &#xAC04;&#xC811;&#xC801;(&#xC608;&#xB97C; &#xB4E4;&#xC5B4;, Memory Manager&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB294; <code>NewWindow</code>&#xC640; &#xAC19;&#xC740; &#xB8E8;&#xD2F4;&#xC744; &#xC0AC;&#xC6A9;)&#xC73C;&#xB85C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; application&#xC758; heap&#xB0B4;&#xC5D0; &#xACF5;&#xAC04;&#xC744; &#xD560;&#xB2F9;&#xD55C;&#xB2E4;.</p><p>Heap&#xC758; &#xACF5;&#xAC04;&#xC740; &#xD2B9;&#xC815; object&#xC5D0; &#xD544;&#xC694;&#xD55C; &#xBAA8;&#xB4E0; &#xD06C;&#xAE30;&#xC758; &#xBE14;&#xB85D;&#xC73C;&#xB85C; &#xD560;&#xB2F9;&#xB41C;&#xB2E4;.</p><p>Memory Manager&#xB294; heap&#xC758; &#xBE14;&#xB85D;&#xC744; &#xCD94;&#xC801;&#xD558;&#xB294;&#xB370; &#xD544;&#xC694;&#xD55C; &#xBAA8;&#xB4E0; &#xAC83;&#xC744; &#xC218;&#xD589;&#xD55C;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC791;&#xC5C5;&#xC740; &#xC784;&#xC758;&#xC758; &#xC21C;&#xC11C;&#xB85C; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xAE30; &#xB584;&#xBB38;&#xC5D0; heap&#xC740; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; stack&#xCC98;&#xB7FC; &#xC9C8;&#xC11C; &#xC815;&#xC5F0;&#xD55C; &#xBC29;&#xC2DD;&#xC73C;&#xB85C; &#xD655;&#xC7A5; &#xBC0F; &#xCD95;&#xC18C;&#xB418;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xB300;&#xC2E0; application&#xC774; &#xC2E4;&#xD589;&#xB41C; &#xD6C4; &#xD55C;&#xB3D9;&#xD55C; &#xC544;&#xB798;&#xC758; &#xADF8;&#xB9BC;&#xCC98;&#xB7FC; heap&#xC774; &#xD560;&#xB2F9;&#xB41C; &#xBE14;&#xB85D;&#xACFC; free block(&#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xBE14;&#xB85D;)&#xC73C;&#xB85C; &#xB2E8;&#xD3B8;&#xD654;(fragmentation)&#xB418;&#xB294; &#xACBD;&#xD5A5;&#xC774; &#xC788;&#xB2E4;. &#xC774;&#xB97C; Heap fragmentation&#xC774;&#xB77C;&#xACE0; &#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212102159-af9a1832-9683-4cd1-b9f6-ccff24e49b81.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>Heap fragmentation&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD55C; &#xC5EC;&#xC720;&#xACF5;&#xAC04;&#xC774; &#xCDA9;&#xBD84;&#xD558;&#xB354;&#xB77C;&#xB3C4; &#xACF5;&#xAC04;&#xC774; &#xC694;&#xCCAD;&#xB41C; &#xD06C;&#xAE30;&#xBCF4;&#xB2E4; &#xC791;&#xC740; &#xBE14;&#xB85D;&#xC73C;&#xB85C; &#xB098;&#xB258;&#xC5B4;&#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Memory manager&#xAC00; &#xD2B9;&#xC815; &#xD06C;&#xAE30;&#xC758; block&#xC744; &#xD560;&#xB2F9;&#xD558;&#xB77C;&#xB294; application&#xC758; &#xC694;&#xCCAD;&#xC744; &#xC218;&#xD589;&#xD558;&#xC9C0; &#xBABB;&#xD560; &#xC218; &#xC788;&#xB2E4;. &#xC774;&#xB7EC;&#xD55C; &#xC77C;&#xC774; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; Memory manager&#xB294; &#xD560;&#xB2F9;&#xB41C; &#xBE14;&#xB85D;&#xC744; &#xC774;&#xB3D9;&#xD558;&#xC5EC; &#xD544;&#xC694;&#xD55C; &#xACF5;&#xAC04;&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB824;&#xACE0; &#xC2DC;&#xB3C4;&#xD55C;&#xB2E4;. &#xC774; &#xC791;&#xC5C5;(operation)&#xC744; Heap compaction&#xC774;&#xB77C;&#xACE0; &#xD55C;&#xB2E4;.</p><p>&#xC544;&#xB798;&#xC758; &#xADF8;&#xB9BC;&#xC740; Heap compation &#xC791;&#xC5C5;&#xC744; &#xC218;&#xD589;&#xD55C; heap&#xC744; &#xB098;&#xD0C0;&#xB0B8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212102619-988c676e-2625-4bab-ab20-0ecfd20db5a4.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>&#x2018;&#xD560;&#xB2F9;&#xB41C; &#xBA54;&#xBAA8;&#xB9AC; &#xBE14;&#xB85D;&#xC774; Heap compaction&#xC911;&#xC5D0; &#xC790;&#xC720;&#xB86D;&#xAC8C; &#xC774;&#xB3D9;&#xD560; &#xC218; &#xC788;&#xB294; &#xD55C; Heap compaction&#xC740; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xBB38;&#xC81C;&#xAC00; &#xB418;&#xC9C0; &#xC54A;&#xC9C0;&#xB9CC; &#xC790;&#xC720;&#xB86D;&#xAC8C; &#xC774;&#xB3D9;&#xD560; &#xC218; &#xC5C6;&#xB294; &#xB450; &#xAC00;&#xC9C0; &#xC0C1;&#xD669;&#xC774; &#xC788;&#xB2E4;. &#xC989;, &#xC7AC;&#xBC30;&#xCE58; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xBE14;&#xB85D;(nonrelocatable)&#xC778; &#xACBD;&#xC6B0;&#xC640; &#xC7A0;&#xAE34;(locked) &#xBE14;&#xB85D;&#xC778; &#xACBD;&#xC6B0;&#xC774;&#xB2E4;. Heap fragmentation&#xC744; &#xCD5C;&#xC18C;&#xD654;&#xD558;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC7AC;&#xBC30;&#xCE58; &#xBD88;&#xAC00;&#xB2A5;&#xD55C; &#xBE14;&#xB85D;&#xC744; &#xB4DC;&#xBB3C;&#xAC8C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C; &#xD558;&#xBA70;, &#xC808;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0;&#xC5D0;&#xB9CC; &#xBE14;&#xB85D;&#xC744; lock&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><blockquote>&#xC774; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD574;&#xC11C;&#xB294; &#xBC94;&#xC704;&#xAC00; &#xB118;&#xC5B4;&#xAC00;&#xBBC0;&#xB85C; &#xB2E4;&#xB8E8;&#xC9C0; &#xC54A;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;. &#xB354; &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC774; &#xAD81;&#xAE08;&#xD558;&#xC2E0; &#xBD84;&#xB4E4;&#xC740; <a href="https://developer.apple.com/library/archive/documentation/mac/pdf/Memory/Intro_to_Mem_Mgmt.pdf?ref=noah-ios.dev">&#xBB38;&#xC11C;</a>&#xB97C; &#xCC38;&#xACE0;&#xD574;&#xC8FC;&#xC138;&#xC694;!</blockquote><h3 id="the-application-global-variables-and-a5-world">The Application Global Variables and A5 World</h3><hr><p>application&#xC758; global variable&#xC740; application partition&#xC758; &#xC0C1;&#xB2E8;&#xC5D0; &#xC704;&#xCE58;&#xD55C; A5 World&#xC5D0; &#xC800;&#xC7A5;&#xB41C;&#xB2E4;.</p><p>A5 World&#xC758; &#xAD6C;&#xC870;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212102832-38fd4990-ce12-44bf-870e-666e614ff1e2.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>global variable&#xACFC;, jump table&#xD06C;&#xAE30;&#xB294; application&#xB9C8;&#xB2E4; &#xB2E4;&#xB97C; &#xC218; &#xC788;&#xC9C0;&#xB9CC; &#xC774;&#xB7EC;&#xD55C; &#xAC01; &#xD56D;&#xBAA9;&#xC758; &#xD06C;&#xAE30;&#xB294; &#xACE0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><p>application&#xC758; global variable&#xC740; &#xC804;&#xC220;&#xD588;&#xB358; quickdraw global variable &#xC704; &#xB610;&#xB294; &#xC544;&#xB798;&#xC5D0; &#xB098;&#xD0C0;&#xB0A0; &#xC218; &#xC788;&#xB2E4;. &#xC774; &#xB450; &#xD56D;&#xBAA9;&#xC758; &#xC0C1;&#xB300;&#xC801; &#xC704;&#xCE58;&#xB294; linker&#xC5D0; &#xC758;&#xD574; &#xACB0;&#xC815;&#xB41C;&#xB2E4;.</p><p>system global variable&#xC778; <code>CurrentA5</code>&#xB294; &#xD604;&#xC7AC; application global variable&#xACFC; application parameter&#xC640;&#xC758; &#xACBD;&#xACC4;&#xB97C; &#xAC00;&#xB9AC;&#xD0A8;&#xB2E4;.</p><p>application&#xC758; jump table&#xC5D0;&#xB294; application&#xC758; &#xAC01; &#xB8E8;&#xD2F4;&#xC5D0; &#xB300;&#xD55C; entry&#xAC00; &#xD3EC;&#xD568;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. &#xB2E4;&#xB978; segment&#xC758; code&#xC5D0; &#xC758;&#xD574; &#xD638;&#xCD9C;&#xB418;&#xBA70;, Segment Manager&#xB294; jump table&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; code segment&#xC5D0; &#xC758;&#xD574; &#xD638;&#xCD9C;&#xB418;&#xB294; &#xC678;&#xBD80; &#xCC38;&#xC870; &#xB8E8;&#xD2F4;&#xC758; &#xC8FC;&#xC18C;&#xB97C; &#xACB0;&#xC815;&#xD55C;&#xB2E4;.</p><blockquote><a href="https://ko.wikipedia.org/wiki/%EB%B6%84%EA%B8%B0_%ED%85%8C%EC%9D%B4%EB%B8%94?ref=noah-ios.dev">jump table&#xC5D0; &#xB300;&#xD55C; &#xC124;&#xBA85;</a></blockquote><p>application parameter&#xB294; 32&#xBC14;&#xC774;&#xD2B8; &#xBA54;&#xBAA8;&#xB9AC;&#xC774;&#xBA70; &#xC774;&#xB294; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC608;&#xC57D;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><h3 id="temporary-memory">Temporary Memory</h3><hr><p>Macintosh &#xBA40;&#xD2F0;&#xD0DC;&#xC2A4;&#xD0B9; &#xD658;&#xACBD;&#xC5D0;&#xC11C; &#xAC01; application&#xC740; &#xD2B9;&#xC815; memory partiton&#xC73C;&#xB85C; &#xC81C;&#xD55C;&#xB41C;&#xB2E4;. (&#xD06C;&#xAE30;&#xB294; &#x2018;SIZE&#x2019;&#xB77C;&#xB294; application&#xC758; resource&#xC5D0; &#xC758;&#xD574; &#xACB0;&#xC815;&#xB41C;&#xB2E4;.) application heap&#xC758; &#xD06C;&#xAE30;&#xC5D0; &#xC81C;&#xD55C;&#xC744; &#xB450;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; application partition&#xD06C;&#xAE30;&#xC5D0; &#xC81C;&#xD55C;&#xC774; &#xC788;&#xC5B4; application&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; buffer &#xBC0F; &#xAE30;&#xD0C0; &#xB9AC;&#xC18C;&#xC2A4;&#xAC00; &#xBD80;&#xC871;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212102998-c6414cd6-1599-4526-b0a5-2f413d00c969.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><p>&#xC704; &#xADF8;&#xB9BC;&#xCC98;&#xB7FC; application&#xC758; heap&#xC5D0;&#xC11C; &#xD604;&#xC7AC; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xAC83; &#xBCF4;&#xB2E4; &#xB354; &#xB9CE;&#xC740; memory&#xAC00; &#xD544;&#xC694;&#xD55C; &#xACBD;&#xC6B0; &#xB2E4;&#xB978; application&#xC5D0; &#xC544;&#xC9C1; &#xD560;&#xB2F9;&#xB418;&#xC9C0; &#xC54A;&#xC740; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD55C; memory&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC5D0; &#xC694;&#xCCAD;&#xD560; &#xC218; &#xC788;&#xB2E4;. temporary memory&#xB85C; &#xC54C;&#xB824;&#xC9C4; &#xC774; memory&#xB294; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; RAM&#xC5D0;&#xC11C; &#xD560;&#xB2F9;&#xB41C;&#xB2E4;. &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xD574;&#xB2F9; memory&#xB294; application&#xC601;&#xC5ED;&#xC758; memory&#xC640; &#xC778;&#xC811;&#xD558;&#xC9C0; &#xC54A;&#xB2E4;.</p><p>temporary memory&#xB97C; &#xAC00;&#xB054;&#xC529;&#xB9CC; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xC88B;&#xC740; &#xC774;&#xC720; &#xC911; &#xD558;&#xB098;&#xB294; &#xC694;&#xCCAD;&#xD55C; temporary memory&#xB97C; &#xD56D;&#xC0C1; &#xBC1B;&#xC744; &#xAC83;&#xC774;&#xB77C;&#xACE0; &#xAC00;&#xC815;&#xD560; &#xC218; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;.</p><h3 id="virtual-memory">Virtual Memory</h3><hr><p>Macintosh system 7.0&#xC774;&#xC0C1;&#xC5D0;&#xC11C; Maciontosh computer&#xB294; virtual memory&#xB85C; &#xC54C;&#xB824;&#xC9C4; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xC758; &#xAE30;&#xB2A5;&#xC744; &#xD65C;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; &#xC2DC;&#xC2A4;&#xD15C;&#xC740; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xBB3C;&#xB9AC;&#xC801; &#xBA54;&#xBAA8;&#xB9AC;&#xC758; &#xD55C;&#xACC4;&#xB97C; &#xB118;&#xC5B4; &#xD655;&#xC7A5;&#xB418;&#xB294; &#xB17C;&#xB9AC; &#xC8FC;&#xC18C; &#xACF5;&#xAC04;&#xC744; &#xAC00;&#xC9C8; &#xC218; &#xC788;&#xB2E4;. &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xB294; &#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xBCF4;&#xC870; &#xC800;&#xC7A5;&#xC18C;&#xC758; &#xC77C;&#xBD80;(&#xC989; &#xD558;&#xB4DC; &#xB514;&#xC2A4;&#xD06C;&#xC758; &#xC77C;&#xBD80;)&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xC8FC;&#xC18C; &#xACF5;&#xAC04;&#xC744; &#xD655;&#xC7A5;&#xD574; &#xD604;&#xC7AC; RAM&#xC5D0; &#xD544;&#xC694;&#xD558;&#xC9C0; &#xC54A;&#xC740; &#xC751;&#xC6A9; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xBC0F; &#xB370;&#xC774;&#xD130;&#xC758; &#xC77C;&#xBD80;&#xB97C; &#xBCF4;&#xAD00;&#xD55C;&#xB2E4;.</p><blockquote>Intel&#xC774; 80286(1982&#xB144; &#xCD9C;&#xC2DC;) CPU&#xB97C; &#xD1B5;&#xD574; &#xAC00;&#xC0C1; &#xBA54;&#xBAA8;&#xB9AC; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD588;&#xB358; &#xAC83;&#xC5D0; &#xBE44;&#xD574; Apple&#xC740; 9&#xB144;&#xB4A4;&#xC778; 1991&#xB144; &#xBD80;&#xD130; &#xAC00;&#xC0C1; &#xBA54;&#xBAA8;&#xB9AC;&#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD588;&#xB124;&#xC694; &#x1F440;</blockquote><h3 id="addressing-modes">Addressing Modes</h3><hr><p>Macintosh&#xC5D0;&#xC11C; &#xC6B4;&#xC601;&#xCCB4;&#xC81C;&#xB294; 32&#xBE44;&#xD2B8; &#xC8FC;&#xC18C;&#xC9C0;&#xC815;, &#xC989; 32&#xBE44;&#xD2B8;&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC5EC; &#xBA54;&#xBAA8;&#xB9AC; &#xC8FC;&#xC18C;&#xB97C; &#xACB0;&#xC815;&#xD558;&#xB294; &#xAE30;&#xB2A5;&#xC744; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;. &#xAE30;&#xC874; &#xBC29;&#xC2DD;&#xC778; 24&#xBE44;&#xD2B8; &#xC8FC;&#xC18C;&#xC9C0;&#xC815; &#xBC29;&#xC2DD;&#xC740; 24&#xBE44;&#xD2B8; &#xC8FC;&#xC18C; &#xC9C0;&#xC815; &#xBC29;&#xC2DD;&#xC5D0;&#xC11C; &#xB17C;&#xB9AC; &#xC8FC;&#xC18C; &#xACF5;&#xAC04;&#xC758; &#xD06C;&#xAE30;&#xB294; 16MB&#xC774;&#xC9C0;&#xB9CC; 8MB&#xAC00; I/O, ROM &#xBC0F; &#xC2AC;&#xB86F; &#xACF5;&#xAC04;&#xC6A9;&#xC73C;&#xB85C; &#xC608;&#xC57D;&#xB418;&#xC5B4; &#xC788;&#xC73C;&#xBBC0;&#xB85C; &#xAC00;&#xC7A5; &#xD070; &#xC5F0;&#xC18D; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xC8FC;&#xC18C;&#xACF5;&#xAC04;(Contiguous)&#xC740; 8MB&#xC774;&#xB2E4;. 32&#xBE44;&#xD2B8; &#xBC29;&#xC2DD;&#xC5D0;&#xC11C; &#xCD5C;&#xB300; &#xD504;&#xB85C;&#xADF8;&#xB7A8; &#xC8FC;&#xC18C; &#xACF5;&#xAC04;&#xC740; 1GB&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/212103123-c50236db-dc7a-4187-99fc-7c89771a95a6.png" class="kg-image" alt="Apple&#xC758; &#xACFC;&#xAC70; Process memory &#xAD00;&#xB9AC; &#xBAA8;&#xB378;&#xC744; &#xC54C;&#xC544;&#xBCF4;&#xC790;" loading="lazy"></figure><h3 id="summary">Summary</h3><hr><p>&#xC5EC;&#xAE30;&#xAE4C;&#xC9C0; Apple&#xC758; &#xACFC;&#xAC70; Process memory model&#xACFC; &#xD604;&#xB300;&#xC758; &#xC77C;&#xBC18;&#xC801;&#xC778; Process memory model&#xC744; &#xBE44;&#xAD50;&#xD574;&#xBCF4;&#xBA70;, &#xAD6C;&#xC870;&#xB294; &#xC57D;&#xAC04; &#xB2E4;&#xB974;&#xC9C0;&#xB9CC;(global variable&#xC774; stack&#xC758; &#xC0C1;&#xB2E8;&#xC758; A5 World&#xB77C;&#xB294; &#xACF3;&#xC5D0; &#xC788;&#xB294; &#xB4F1;) &#xC804;&#xCCB4;&#xC801;&#xC778; &#xD070; &#xBD80;&#xBD84;&#xC5D0;&#xC11C;&#xC758; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xCEE8;&#xC149;&#xC740; &#xAC19;&#xC774;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xB2E4;&#xB294; &#xC0AC;&#xC2E4;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC5C8;&#xC73C;&#xBA70;, Unix&#xACC4;&#xC5F4;&#xC758; Process memory model&#xACFC; &#xBE44;&#xAD50;&#xD574;&#xBCF4;&#xBA70; &#xAC01; Section&#xC758; (stack, heap, text, &#xAE00;&#xB85C;&#xBC8C; &#xBCC0;&#xC218; GVAR, BSS)&#xC758; &#xC5ED;&#xD560;&#xC5D0; &#xB300;&#xD574; &#xD559;&#xC2B5;&#xD560; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em> &#x1F60A;</p>]]></content:encoded></item><item><title><![CDATA[Observer Pattern]]></title><description><![CDATA[<p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; Noah&#xC785;&#xB2C8;&#xB2E4; :)</p><p>&#xC624;&#xB298;&#xC740; <strong>G</strong>ang <strong>o</strong>f <strong>F</strong>our <strong>&#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;</strong> &#xC911; &#xD589;&#xC704; &#xD328;&#xD134;&#xC5D0; &#xC18D;&#xD558;&#xB294;</p><p><strong>Observer Pattern</strong> &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;</p>]]></description><link>https://noah-ios.dev/observer-pattern/</link><guid isPermaLink="false">64e9974522fba699ec4bbcdc</guid><category><![CDATA[Design-Pattern]]></category><category><![CDATA[Swift]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Wed, 29 Jun 2022 15:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1602734311135-c992a9436ae0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fG9ic2VydmV8ZW58MHx8fHwxNjkzMDMwMjI5fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1602734311135-c992a9436ae0?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fG9ic2VydmV8ZW58MHx8fHwxNjkzMDMwMjI5fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Observer Pattern"><p>&#xC548;&#xB155;&#xD558;&#xC138;&#xC694; Noah&#xC785;&#xB2C8;&#xB2E4; :)</p><p>&#xC624;&#xB298;&#xC740; <strong>G</strong>ang <strong>o</strong>f <strong>F</strong>our <strong>&#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;</strong> &#xC911; &#xD589;&#xC704; &#xD328;&#xD134;&#xC5D0; &#xC18D;&#xD558;&#xB294;</p><p><strong>Observer Pattern</strong> &#xC5D0; &#xB300;&#xD574;&#xC11C; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="ios%EC%97%90%EC%84%9C-observer-pattern%EC%9D%80">iOS&#xC5D0;&#xC11C; Observer Pattern&#xC740;</h3><p>Foundation framework&#xC758; NotificationCenter, KVO(Key Value Observing), Property Observer, Combine framework&#xC758; Publisher, Subscriber &#xB4F1;&#xC5D0;&#xC11C; &#xC4F0;&#xC774;&#xB294;&#xB370;&#xC694;,</p><blockquote>Combine framework&#xC758; Publisher(Observable), Subscriber(Observer)&#xACFC; Notification Center&#xB294; Observer Pattern&#xACFC; &#xBE44;&#xC2B7;&#xD558;&#xC9C0;&#xB9CC; &#xC57D;&#xAC04;&#xC758; &#xCC28;&#xC774;&#xB97C; &#xAC00;&#xC9C4; Pub/Sub Pattern&#xC744; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC774;&#xB7EC;&#xD55C; &#xC5EC;&#xB7EC; &#xAE30;&#xC220;&#xB4E4;&#xC758; <strong>&#xAE30;&#xBCF8; &#xAD6C;&#xD604; &#xCCA0;&#xD559;</strong>&#xC774; &#xB418;&#xB294; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; <strong>&#xB514;&#xC790;&#xC778; &#xD328;&#xD134;</strong>&#xC778; <strong>Observer Pattern</strong>&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBD05;&#xC2DC;&#xB2E4;!!</p><p>Observer Pattern</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/1bf397f5f72f89322abc57172cf5f962/a6d36/1.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="1"></figure><p><strong>Observer</strong>&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xC9C1;&#xC5ED;&#xD558;&#xBA74; <strong>&#xAC10;&#xC2DC;&#xC790;</strong> &#xB77C;&#xACE0; &#xD560; &#xC218; &#xC788;&#xACA0;&#xB124;&#xC694;!</p><p>&#xC774;&#xB984;&#xC5D0;&#xC11C;&#xBD80;&#xD130; &#xB290;&#xB08C;&#xC774; &#xC624;&#xC9C0;&#xB9CC; &#xC9C0;&#xCF1C;&#xBCF4;&#xB294; &#xAC83;&#xACFC; &#xAD00;&#xB828; &#xC788;&#xB294; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;&#xC785;&#xB2C8;&#xB2E4;.</p><p><strong>Observer Pattern</strong>&#xC758; &#xCEE8;&#xC149;&#xC744; &#xAC04;&#xB2E8;&#xD558;&#xAC8C; GIF&#xB85C; &#xB098;&#xD0C0;&#xB0B4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC740;&#xB370;&#xC694;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/a213d176c0bca334e605c045c09988c1/2.gif" class="kg-image" alt="Observer Pattern" loading="lazy"></figure><p>&#xD558;&#xB098; &#xC774;&#xC0C1;&#xC758; <strong>Observer</strong>(&#xAC10;&#xC2DC;&#xC790;) &#xB4E4;&#xC774; &#xD55C; &#xACF3;, &#xD558;&#xB098;&#xC758; <strong>Subject</strong>&#xB97C; &#xBC14;&#xB77C;&#xBCF4;&#xACE0; &#xC788;&#xB2E4;&#xAC00; &#xADF8;&#xACF3;&#xC5D0;&#xC11C; &#xC5B4;&#xB5A0;&#xD55C; event&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xBA74; <strong>Subject</strong>&#xB97C; &#xBC14;&#xB77C;&#xBCF4;&#xB358; <strong>Observer</strong> &#xB4E4;&#xC774; &#xADF8;&#xC5D0; &#xB530;&#xB978; &#xBC18;&#xC751;&#xC744; &#xD558;&#xB294; &#xD328;&#xD134;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB9BC;&#xACFC; &#xAC19;&#xC774; <strong>Observer Pattern</strong>&#xC740; <strong>Observer</strong> &#xB4E4;&#xC774; &#xD55C; &#xACF3; &#xD558;&#xB098;&#xC758; <strong>Subject</strong>&#xB97C; &#xBC14;&#xB77C;&#xBCF4;&#xACE0; &#xC788;&#xB294;&#xB370;&#xC694;,</p><p>&#xB2E4;&#xC2DC; &#xB9D0;&#xD574; &#xD558;&#xB098;&#xC758; <strong>Observer</strong> &#xD639;&#xC740; &#xB2E4;&#xC218;&#xC758; <strong>Observer</strong>&#xB4E4;&#xC740; &#xD558;&#xB098;&#xC758; <strong>Subject</strong>&#xC758; event, &#xC0C1;&#xD0DC; &#xBCC0;&#xD654;&#xC5D0; &#xADC0; &#xAE30;&#xC6B8;&#xC774;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; <strong>Observer Pattern</strong>&#xC740; <strong>one to many</strong> &#xC989;, 1 &#xB300; &#xB2E4;&#xC758; &#xC758;&#xC874; &#xAD00;&#xACC4;&#xB97C; &#xAC16;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC6B0;&#xB9AC;&#xAC00; &#xB9CC;&#xC57D; <strong>Observer Pattern</strong>&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; <strong>Subject</strong>&#xC758; &#xC0C1;&#xD0DC; &#xBCC0;&#xD654;, event&#xB97C; &#xD0D0;&#xC9C0;, &#xC54C;&#xC544;&#xCC28;&#xB9AC;&#xAE30; &#xC704;&#xD574;&#xC11C;&#xB294; &#xC77C;&#xC815;&#xD55C; &#xAC04;&#xACA9;&#xC758; &#xC2DC;&#xAC04; &#xC989;, Time interval&#xC744; &#xB450;&#xACE0; <strong>Subject</strong>&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xACC4;&#xC18D;&#xD574;&#xC11C; &#xCCB4;&#xD06C;&#xD574;&#xC57C; &#xD560; &#xD150;&#xB370;&#xC694;,</p><p>&#xC774;&#xB7EC;&#xD55C; &#xBC29;&#xC2DD;&#xC744; <strong>&#xCEF4;&#xD4E8;&#xD130; &#xACFC;&#xD559;</strong>&#xC5D0;&#xC11C;&#xB294; <strong>&#x201C;Polling&#x201D;</strong>&#xC774;&#xB77C;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/8728b05092590fa05b1a088ed5be8efc/a6d36/3.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="3"></figure><p>&#xBB3C;&#xB860; &#xBAA8;&#xB4E0; &#xC0C1;&#xD669;&#xC5D0; <strong>Polling</strong>&#xACFC; <strong>Observer Pattern</strong> &#xC911; <strong>Observer Pattern</strong>&#xB9CC; &#xC801;&#xC6A9;&#xD560; &#xC218;&#xB294; &#xC5C6;&#xC9C0;&#xB9CC;,</p><p>&#xC8FC;&#xAE30;&#xC801;&#xC73C;&#xB85C; <strong>Subject</strong>&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xACC4;&#xC18D; &#xCCB4;&#xD06C;&#xD574;&#xC57C; &#xD558;&#xB294; <strong>Polling</strong> &#xBC29;&#xC2DD;&#xBCF4;&#xB2E4; <strong>Subject</strong>&#xC758; &#xC0C1;&#xD0DC;&#xBCC0;&#xD654; &#xD639;&#xC740; event&#xAC00; &#xC788;&#xC744; &#xB54C;&#xB9CC; <strong>Observer</strong>&#xC5D0;&#xAC8C; &#xC54C;&#xB9AC;&#xB294; <strong>Observer Pattern</strong>&#xC774; &#xD6E8;&#xC52C; &#xD6A8;&#xC728;&#xC801;&#xC77C; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xACC4;&#xC18D;&#xD574;&#xC11C; <strong>Subject</strong>&#xC758; &#xC0C1;&#xD0DC;&#xB97C; &#xCCB4;&#xD06C;&#xD574;&#xC57C; &#xD558;&#xB294; &#xACBD;&#xC6B0; <strong>Polling</strong>&#xC740; &#xB9AC;&#xC18C;&#xC2A4; &#xB0AD;&#xBE44;&#xB85C; &#xC774;&#xC5B4;&#xC9C8; &#xC218; &#xC788;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC790;, &#xC774;&#xC81C; <strong>Observer Pattern</strong>&#xC758; &#xAD6C;&#xC870;&#xB97C; &#xD30C;&#xD5E4;&#xCCD0;&#xBD05;&#xC2DC;&#xB2E4;.</p><p><strong>Observer Pattern&#xC758; &#xAD6C;&#xC870;</strong></p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/f299e1b96dd180cd03f7b7e7ae35dd23/a6d36/4.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="4"></figure><p><strong>Observer Pattern</strong>&#xC758; UML&#xC740; &#xC704;&#xC640; &#xAC19;&#xC774; &#xC0DD;&#xACBC;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xBA3C;&#xC800; <strong>Observer</strong> &#xBD80;&#xBD84;&#xBD80;&#xD130; &#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/3b16a11c9c72a6c2faa2b21ca0ff6a59/a6d36/5.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="5"></figure><h3 id="observer-protocolinterface">Observer Protocol(Interface)</h3><p>&#xBA3C;&#xC800; event, &#xC54C;&#xB9BC;&#xC744; &#xAC10;&#xC9C0;&#xD560; <strong>Observer Protocol</strong>(Interface)&#xC744; &#xB9CC;&#xB4E4;&#xC5B4;&#xC90D;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/36dd4f3a1bb109834adaeb633228f858/aeb78/6.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="6"></figure><p><strong>Observer Protocol</strong>&#xC740;</p><p>&#xBA54;&#xC18C;&#xB4DC;&#xB85C; Subject&#xC758; event, &#xC54C;&#xB9BC;&#xC744; &#xAC10;&#xC9C0;&#xD588;&#xC744; &#xB54C;</p><p><strong>Observer</strong>&#xAC00; <strong>&#xD574;&#xC57C; &#xD560; &#xC77C;</strong>&#xC744; &#xB2F4;&#xC744; update &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xADF8;&#xB7EC;&#xBA74; &#xC774;&#xC81C; &#xC774; Protocol&#xC744; &#xCC44;&#xD0DD; &#xBC0F; &#xC900;&#xC218;&#xD558;&#xC5EC; &#xAC01; Observer&#xC5D0;&#xC11C; &#xD574;&#xC57C; &#xD560; &#xC77C;&#xC744;</p><p>&#xC815;&#xC758;&#xD55C; &#xC2E4;&#xC81C; Observer&#xB97C; &#xC815;&#xC758;&#xD574;&#xC904; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC774; &#xB9D0;&#xC774;&#xC8E0;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/b9fd9a78f41c793538b698e7194c3a1b/a6d36/7.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="7"></figure><p><code>ConcreteObserverA</code>, <code>ConcreteObserverB</code> &#xB294;</p><p>&#xAC01;&#xAC01; &#xC790;&#xC2E0;&#xC774; event, &#xC54C;&#xB9BC;&#xC744; &#xAC10;&#xC9C0;&#xD574;&#xC57C; &#xD560; &#xC77C;&#xC744; &#xC815;&#xC758;&#xD55C; <code>update()</code> &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;</p><p>Subject&#xC758; event, &#xC54C;&#xB9BC;&#xC744; &#xAC10;&#xC9C0;&#xD588;&#xC744; &#xB54C;&#xB294; &#xAC01; Observer&#xC5D0; &#xB9DE;&#xB294; <code>update()</code>&#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xB420; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xAE30;&#xAE4C;&#xC9C0; Swift Code&#xB85C; &#xC791;&#xC131;&#xD574;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><blockquote>&#xD3B8;&#xC758;&#xC0C1; &#xBCC4;&#xB3C4;&#xC758; &#xB3D9;&#xB4F1; &#xBE44;&#xAD50; &#xC5F0;&#xC0B0;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xC9C0; &#xC54A;&#xACE0; <a href="https://developer.apple.com/documentation/swift/1538988?ref=noah-ios.dev">===</a> &#xC5F0;&#xC0B0;&#xC790;&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xAC19;&#xC740; instance&#xB97C; &#xAC00;&#xB9AC;&#xD0A4;&#xB294;&#xC9C0;(point)&#xC5D0; &#xB300;&#xD55C; &#xC5EC;&#xBD80;&#xB85C; &#xAC1D;&#xCCB4;&#xB97C; &#xBE44;&#xAD50;&#xD558;&#xAE30; &#xC704;&#xD574; class&#xB85C; &#xAD6C;&#xD604;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h3 id="observer">Observer</h3><hr><pre><code class="language-swift">protocol Observer: AnyObject {
	func update()
}

class ConcreteObserverA: Observer {
	func update() {
		print(&quot;ConcreteObserverA: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
	}
}

class ConcreteObserverB: Observer {
	func update() {
		print(&quot;ConcreteObserverB: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
	}
}</code></pre><p>&#xC790;, &#xC774;&#xC81C; Observer&#xC758; &#xAD00;&#xCC30;&#xC758; &#xB300;&#xC0C1;&#xC774; &#xB418;&#xB294; Subject&#xB97C; &#xBD10;&#xC57C; &#xD558;&#xB294;&#xB370;&#xC694;,</p><h3 id="subject">Subject</h3><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/f299e1b96dd180cd03f7b7e7ae35dd23/a6d36/8.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="8"></figure><p><strong>Observer</strong>&#xC640; <strong>Subject</strong>&#xC758; &#xD654;&#xC0B4;&#xD45C;&#xC758; &#xBAA8;&#xC591;&#xC744; &#xBCF4;&#xBA74;</p><p><strong>Subject</strong>&#xC640; <strong>Observer</strong>&#xC758; <strong>&#xAD00;&#xACC4;</strong>&#xB294; <strong>has &#xAD00;&#xACC4;</strong>&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xC2DC; &#xB9D0;&#xD574;, <strong>Subject</strong>&#xAC00; <strong>Observer</strong>&#xB97C; &#xC18C;&#xC720;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xC27D;&#xAC8C; &#xADF8;&#xB9BC;&#xC73C;&#xB85C; &#xD45C;&#xD604;&#xD558;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/6eefcc1e0192a77d7315a80a629af40f/a6d36/9.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="9"></figure><p><strong>Subject</strong>&#xAC00; <code>observerCollection</code>&#xC5D0; <strong>Observer</strong>&#xB97C; &#xC18C;&#xC720;&#xD558;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xB354; &#xC774;&#xD574;&#xD558;&#xAE30; &#xC27D;&#xAC8C; &#xCC38;&#xC870; &#xAD00;&#xACC4;&#xB97C; &#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/8fa50fcb3dd357cc6ac4cc596b907e58/a6d36/10.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="10"></figure><h4 id="%E2%80%9Csubject%EA%B0%80-observer%EB%A5%BC-%EC%86%8C%EC%9C%A0%ED%95%9C%EB%8B%A4%E2%80%9D%EB%9D%BC%EB%8A%94-%EA%B0%9C%EB%85%90%EA%B9%8C%EC%A7%80-swift-code%EB%A1%9C-%EC%9E%91%EC%84%B1%ED%95%B4%EB%B3%B4%EB%A9%B4-%EB%8B%A4%EC%9D%8C%EA%B3%BC-%EA%B0%99%EC%8A%B5%EB%8B%88%EB%8B%A4">&#x201C;Subject&#xAC00; Observer&#xB97C; &#xC18C;&#xC720;&#xD55C;&#xB2E4;&#x201D;&#xB77C;&#xB294; &#xAC1C;&#xB150;&#xAE4C;&#xC9C0; Swift Code&#xB85C; &#xC791;&#xC131;&#xD574;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</h4><pre><code class="language-swift">class Subject {
    var observerCollection: [Observer] = []
}</code></pre><p>&#xC774;&#xC81C; UML&#xC744; &#xB2E4;&#xC2DC; &#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/f299e1b96dd180cd03f7b7e7ae35dd23/a6d36/11.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="11"></figure><p>Subject&#xB294; 3&#xAC1C;&#xC758; &#xB3D9;&#xC791;(&#xBA54;&#xC18C;&#xB4DC;)&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li><code>registerObserver(observer)</code></li><li><code>unregisterObserver(observer)</code></li><li><code>notifyObservers()</code></li></ol><p>3&#xAC1C;&#xC758; &#xBA54;&#xC18C;&#xB4DC;&#xC758; &#xC774;&#xB984;&#xC774; &#xB418;&#xAC8C; &#xC9C1;&#xAD00;&#xC801;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC01;&#xAC01;&#xC758; &#xB3D9;&#xC791;&#xC744; &#xC720;&#xCD94;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xB294;&#xB370;&#xC694;,<br>(&#xC774;&#xB798;&#xC11C; &#xD568;&#xC218;&#xBA85;, &#xBA54;&#xC18C;&#xB4DC; &#xBA85;&#xC744; &#xC798; &#xC9C0;&#xC5B4;&#xC57C; &#xD558;&#xB098; &#xBD05;&#xB2C8;&#xB2E4;..)</p><h2 id="registerobserverobserver"><strong><code>registerObserver(observer)</code></strong></h2><p>Subject&#xC758; <strong>observerCollection</strong>&#xC5D0; &#xC5EC;&#xB7EC; Observer &#xB4E4;&#xC744; <strong>&#xC18C;&#xC720;</strong>&#xD560; &#xC218; &#xC788;&#xAC8C; Observer&#xB97C; <strong>&#xB4F1;&#xB85D;</strong>&#xD574;&#xC8FC;&#xB294; &#xBA54;&#xC18C;&#xB4DC;&#xC785;&#xB2C8;&#xB2E4;.</p><h2 id="unregisterobserverobserver"><strong><code>unregisterObserver(observer)</code></strong></h2><p>observerCollection&#xC5D0; &#xC788;&#xB294; &#xC5EC;&#xB7EC; Observer&#xB4E4; &#xC911; &#xD2B9;&#xC815; Observer&#xC640; Subject&#xAC04;&#xC758; <strong>&#xAD00;&#xACC4;&#xB97C; &#xD574;&#xC81C;</strong>&#xD574;&#xC8FC;&#xB294; &#xBA54;&#xC18C;&#xB4DC;&#xC785;&#xB2C8;&#xB2E4;. &#xC5B4;&#xB5BB;&#xAC8C; &#xBCF4;&#xBA74; &#xAD6C;&#xB3C5; &#xCDE8;&#xC18C;&#xC640;&#xB3C4; &#xBE44;&#xC2B7;&#xD55C; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="notifyobservers"><strong><code>notifyObservers()</code></strong></h2><p>Observer Pattern&#xC758; &#xD575;&#xC2EC;&#xC785;&#xB2C8;&#xB2E4;. &#xBC14;&#xB85C; Subject&#xC758; <strong>event&#xB97C; &#xC54C;&#xB9AC;&#xB294;</strong> &#xBA54;&#xC18C;&#xB4DC;&#xC778;&#xB370;&#xC694;,<br>Subject&#xAC00; &#xC18C;&#xC720;&#xD558;&#xACE0; &#xC788;&#xB294; Observer &#xB4E4;&#xC758; <strong>update&#xBA54;&#xC18C;&#xB4DC;</strong>&#xB97C; <strong>&#xD638;&#xCD9C;</strong>&#xD574;&#xC90D;&#xB2C8;&#xB2E4;.</p><p><code>notifyObservers()</code> &#xC758; &#xBA54;&#xC18C;&#xB4DC; &#xAD6C;&#xD604; &#xBD80;&#xB97C; &#xBCF4;&#xBA74;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/5d82d147c5fb92342bd923d06348e755/17474/12.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="12"></figure><p>&#xC0C1;&#xD0DC;&#xBCC0;&#xD654;, event &#xC54C;&#xB9BC;&#xC744; &#xAC10;&#xC9C0;&#xD588;&#xC744; &#xB54C; &#xAC01; Observer&#xC5D0;&#xC11C; &#xD574;&#xC57C; &#xD560; &#xC77C;&#xC744; &#xC218;&#xD589;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D;</p><p><code>observerCollection</code>&#xC744; &#xC21C;&#xD68C;&#xD558;&#xBA74;&#xC11C;</p><p>&#xAC01;&#xAC01;&#xC758; <code>observer</code> &#xB4E4;&#xC758; <code>update()</code> &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD574;&#xC8FC;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC5EC;&#xAE30;&#xAE4C;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF8; Subject&#xB97C; Swift Code&#xB85C; &#xC791;&#xC131;&#xD574;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h3 id="subject-1">Subject</h3><hr><pre><code class="language-swift">class Subject {
	var observerCollection = [Observer]()
	
	func registerObserver(observer: Observer) {
		print(&quot;Subject: Observer&#xAC00; &#xB4F1;&#xB85D;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
		observerCollection.append(observer)
	}
	
	func unregisterObserver(observer: Observer) {
		print(&quot;Subject: Observer&#xAC00; &#xD574;&#xC81C;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
		observerCollection = observerCollection.filter { $0 !== observer }
	}
	
	func notifyObservers() {
		print(&quot;Subject: Notifying observers...&quot;)
		for observer in observerCollection {
			observer.update()
		}
	}
}
</code></pre><h2 id="implement"><strong>Implement</strong></h2><p>&#xC774;&#xC81C; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xAD6C;&#xD604;&#xD574; &#xC2E4;&#xC81C;&#xB85C; &#xC0AC;&#xC6A9;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC790;, &#xC0AC;&#xC6A9;&#xD558;&#xAE30;&#xC5D0; &#xC55E;&#xC11C; &#xC6B0;&#xB9AC;&#xC758; client&#xB294; &#xBA87; &#xAC00;&#xC9C0; &#xAE30;&#xB2A5;&#xC744; &#xC6D0;&#xD55C;&#xB2E4;&#xACE0; <strong>&#xAC00;&#xC815;</strong>&#xC744; &#xD558;&#xACE0; &#xCF54;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><ol><li>Subject&#xB294; <strong>state</strong>&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;.</li><li>&#xC5B4;&#xB5A0;&#xD55C; <strong>Business Logic</strong>&#xC774; &#xC2E4;&#xD589;&#xB418;&#xBA74; <strong>state</strong>&#xB97C; &#xBCC0;&#xD654;&#xC2DC;&#xD0A4;&#xACE0;, &#xC774; &#xBCC0;&#xD654;&#xC5D0; &#xB300;&#xD55C; &#xC54C;&#xB9BC;&#xC744; Observer &#xB4E4;&#xC5D0;&#xAC8C; <strong>&#xC54C;&#xB9B0;&#xB2E4;.</strong></li><li>&#xAC01;&#xAC01;&#xC758; Observer &#xB4E4;&#xC740; <strong>Subject&#xC758; &#xC54C;&#xB9BC;&#xC5D0; &#xBC18;&#xC751;</strong>&#xD55C;&#xB2E4;.</li></ol><p>&#xC704;&#xC758; &#xAE30;&#xB2A5;&#xC744; &#xAD6C;&#xD604;&#xD55C; &#xCF54;&#xB4DC;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="implement-observer-pattern"><strong>Implement Observer Pattern</strong></h2><pre><code class="language-swift">protocol Observer: AnyObject {
	func update()
}

class ConcreteObserverA: Observer {
	func update() {
		print(&quot;ConcreteObserverA: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
	}
}

class ConcreteObserverB: Observer {
	func update() {
		print(&quot;ConcreteObserverB: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
	}
}

class Subject {
	var state: Int = { return Int.random(in: 0...10) }()
	
	var observerCollection = [Observer]()
	
	func registerObserver(observer: Observer) {
		print(&quot;Subject: Observer&#xAC00; &#xB4F1;&#xB85D;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
		observerCollection.append(observer)
	}
	
	func unregisterObserver(observer: Observer) {
		print(&quot;Subject: Observer&#xAC00; &#xD574;&#xC81C;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.&quot;)
		observerCollection = observerCollection.filter { $0 !== observer }
	}
	
	func notifyObservers() {
		print(&quot;Subject: Notifying observers...&quot;)
		for observer in observerCollection {
			observer.update()
		}
	}
	
	func someBusinessLogic() {
		print(&quot;Subject: I&apos;m doing something important.&quot;)
		state = Int.random(in: 0...10)
		print(&quot;Subject: state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. : \(state)&quot;)
		notifyObservers()
	}
}
</code></pre><p>&#xC774;&#xC81C; &#xC791;&#xC131;&#xB41C; &#xCF54;&#xB4DC;&#xB97C; &#xC774;&#xC6A9;&#xD574; <code>class</code>&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xACE0;, observer&#xB97C; &#xB4F1;&#xB85D;&#xD558;&#xACE0;,<br>&#xD574;&#xC81C;&#xD558;&#xACE0; Business Logic&#xC744; &#xC2E4;&#xD589;&#xD1A0;&#xB85D; &#xD574;&#xBCF4;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">let subject = Subject()

let observer1 = ConcreteObserverA()
let observer2 = ConcreteObserverB()

/// Observer &#xB4F1;&#xB85D;
subject.registerObserver(observer: observer1)
subject.registerObserver(observer: observer2)
/// Business Logic &#xC2E4;&#xD589;
subject.someBusinessLogic()
/// Observer &#xB4F1;&#xB85D; &#xD574;&#xC81C;
subject.unregisterObserver(observer: observer2)
/// Business Logic &#xC2E4;&#xD589;
subject.someBusinessLogic()</code></pre><p>&#xCD9C;&#xB825;&#xC758; &#xACB0;&#xACFC;&#xB294; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-text">Subject: Observer&#xAC00; &#xB4F1;&#xB85D;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.
Subject: Observer&#xAC00; &#xB4F1;&#xB85D;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.

Subject: I&apos;m doing something important.
Subject: state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. : 10
Subject: Notifying observers...

ConcreteObserverA: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.
ConcreteObserverB: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.

Subject: Observer&#xAC00; &#xD574;&#xC81C;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.

Subject: I&apos;m doing something important.
Subject: state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;. : 8
Subject: Notifying observers...

ConcreteObserverA: Subject&#xC758; state&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</code></pre><p>&#xB4F1;&#xB85D;, &#xD574;&#xC81C;&#xC5D0; &#xB530;&#xB77C; <code>someBusinessLogic()</code> &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xC2E4;&#xD589;&#xB418;&#xC5C8;&#xC744; &#xB54C;</p><p>&#xD638;&#xCD9C;&#xB418;&#xB294; Observer&#xC758; <code>update()</code> &#xBA54;&#xC18C;&#xB4DC;&#xAC00; &#xB2E4;&#xB978; &#xAC83;&#xC744; &#xBCF4;&#xB2C8;, &#xC798; &#xC801;&#xC6A9;&#xB41C; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="ios-communication-pattern"><strong>iOS Communication Pattern</strong></h2><p>&#xC5EC;&#xAE30;&#xC11C;&#xBD80;&#xD130;&#xB294; <strong>iOS &#xB0B4;&#xC6A9;</strong>&#xC785;&#xB2C8;&#xB2E4;!! &#x1F34E;</p><p>iOS&#xC5D0;&#xC11C; &#xC815;&#xBCF4;&#xC804;&#xB2EC;&#xC744; &#xC704;&#xD55C; <strong>Communication Pattern</strong>&#xC5D0;&#xB294; &#xD06C;&#xAC8C; &#xB450; &#xAC00;&#xC9C0; Option&#xC774; &#xC788;&#xB294;&#xB370;&#xC694;,</p><ol><li>Delegates &amp; Protocol</li><li>Notification Center &amp; Observers</li></ol><p>&#xAC00; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xAC01;&#xAC01;&#xC758; &#xD2B9;&#xC131;&#xC5D0; &#xB9DE;&#xAC8C; &#xB450; &#xAC00;&#xC9C0; &#xC635;&#xC158;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xB370;&#xC694;,</p><p>&#xC5B4;&#xB5A0;&#xD55C; &#xC0C1;&#xD669;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294;&#xC9C0;&#xB9CC; &#xAC04;&#xB7B5;&#xD558;&#xAC8C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA74;</p><p><strong>Delegates &amp; Protocol</strong>&#xC740; <strong>one to one</strong> 1 &#xB300; 1&#xC758; &#xC758;&#xC874;&#xAD00;&#xACC4;&#xB97C; &#xAC16;&#xB294; &#xACF3;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xBA70;,</p><p><strong>Notification Center &amp; Observers</strong>&#xB294; <strong>one to many</strong> 1 &#xB300; &#xB2E4;&#xC758; &#xC758;&#xC874;&#xAD00;&#xACC4;&#xB97C; &#xAC16;&#xB294; &#xACF3;&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xC790; &#xC5EC;&#xAE30;&#xAE4C;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xC73C;&#xB2C8;,</p><p>&#xC7A0;&#xAE50; <strong>Foundation framework</strong>&#xC758; <strong>NotificationCenter</strong>&#xB97C; &#xC7A0;&#xC2DC; &#xC0B4;&#xD3B4;&#xBCFC;&#xAE4C;&#xC694;?</p><blockquote><a href="https://developer.apple.com/documentation/foundation/notificationcenter?ref=noah-ios.dev">Notification Center Apple &#xACF5;&#xC2DD;&#xBB38;&#xC11C;</a></blockquote><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/135c02f2671c0ec9b44e09b60052bc5a/a6d36/13.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="13"></figure><p>&#xC124;&#xBA85;&#xC744; &#xBCF4;&#xB2C8;, &#xB4F1;&#xB85D;&#xB41C; observer&#xB4E4;&#xC5D0;&#xAC8C; &#xC815;&#xBCF4;&#xB97C; broadcast &#xD560; &#xC218; &#xC788;&#xB294; notification dispatch &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC774;&#xB77C;&#xACE0; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xB9C8;&#xCE58; &#xC6B0;&#xB9AC;&#xAC00; &#xC5EC;&#xD0DC; &#xBD10;&#xC654;&#xB358; Observer Pattern&#xC758; &#xC124;&#xBA85;&#xC744; &#xBCF4;&#xB294; &#xB4EF;&#xD558;&#xB124;&#xC694;!</p><p>&#xC790; &#xC5B4;&#xB5A0;&#xD55C; &#xBA54;&#xC18C;&#xB4DC;&#xB4E4;&#xC774; &#xC788;&#xB294;&#xC9C0; &#xBCFC;&#xAE4C;&#xC694;?</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/b965877683605d01fa52217eaede9635/a6d36/14.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="14"></figure><p><code>addObserver</code> , <code>removeObserver</code> &#xBA54;&#xC18C;&#xB4DC;&#xC758; &#xC124;&#xBA85;&#xC744; &#xBCF4;&#xB2C8;</p><p>&#xC544;&#xAE4C; &#xC6B0;&#xB9AC;&#xAC00; &#xC704;&#xC5D0;&#xC11C; &#xBD24;&#xB358; Subject&#xC758; <code>registerObserver</code> , <code>unregisterObserver</code> &#xC5ED;&#xD560;&#xC744; &#xD558;&#xACE0; &#xC788;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC774;&#xB124;&#xC694;!!</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/31880b23399917f80464e5bf6ac22676/a6d36/15.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="15"></figure><p><code>post</code> &#xBA54;&#xC18C;&#xB4DC;&#xC758; &#xC124;&#xBA85;&#xC744; &#xBCF4;&#xB2C8;</p><p>Subject&#xC758; <code>notifyObservers</code> &#xC640; &#xAC19;&#xC740; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBCF4;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/f828ac3a9a4f4a0bd522d9498ac855e2/b8c8f/16.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="16"></figure><p>Subject&#xB97C; &#xB2E4;&#xC2DC; &#xBCF4;&#xB2C8; &#xD55C;&#xB208;&#xC5D0; &#xB354; &#xC798; &#xB4E4;&#xC5B4;&#xC624;&#xC9C0; &#xC54A;&#xB098;&#xC694;?</p><p>&#xC790; &#xB2E4;&#xC74C;&#xC740; Apple&#xC758; Document Archive&#xC5D0; &#xC788;&#xB294; NSNotificationCenter &#xBB38;&#xC11C;&#xC758; &#xADF8;&#xB9BC;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/d5b8fe6a89700b064fcd9a5b13937b71/a6d36/17.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="17"></figure><blockquote>&#xC774; &#xADF8;&#xB9BC;&#xC740; Notification Center&#xAC00; Event Channel&#xC758; &#xC5ED;&#xD560;&#xC744; &#xD558;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Publish/Subscribe &#xD328;&#xD134;&#xACFC;<br>&#xC720;&#xC0AC;&#xD558;&#xC9C0;&#xB9CC; &#xC124;&#xBA85; &#xD3B8;&#xC758;&#xC0C1; Observer Pattern&#xACFC; &#xAC19;&#xC774; &#xC124;&#xBA85;&#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xC774; &#xADF8;&#xB9BC;&#xC744; &#xC6B0;&#xB9AC;&#xAC00; &#xBD24;&#xB358; Observer Pattern&#xACFC; &#xAC19;&#xC774; &#xC0DD;&#xAC01;&#xD574;&#xBCF4;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC544;&#xC9C8; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/26a75878919a16ebacb8d8e751ce5eea/5fd3e/18.png" class="kg-image" alt="Observer Pattern" loading="lazy" title="18"></figure><p>&#xB610;&#xD55C;, Observer Pattern&#xC740; <a href="https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC?ref=noah-ios.dev">&#xBAA8;&#xB378;-&#xBDF0;-&#xCEE8;&#xD2B8;&#xB864;&#xB7EC;</a>(Model-View-controller, MVC) &#xD328;&#xB7EC;&#xB2E4;&#xC784;&#xACFC; &#xC790;&#xC8FC; &#xACB0;&#xD569;&#xB418;&#xB294;&#xB370;&#xC694;,</p><p>Observer Pattern&#xC740; MVC&#xC5D0;&#xC11C; &#xBAA8;&#xB378;&#xACFC; &#xBDF0; &#xC0AC;&#xC774;&#xB97C; &#xB290;&#xC2A8;&#xD788; &#xC5F0;&#xACB0;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC0AC;&#xC6A9;&#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/ff01dd7519f4284777ab03d76e03fbdf/19.gif" class="kg-image" alt="Observer Pattern" loading="lazy"></figure><p>&#xB300;&#xD45C;&#xC801;&#xC73C;&#xB85C; &#xC704;&#xC640; &#xAC19;&#xC774; &#xBAA8;&#xB378;&#xC5D0;&#xC11C; &#xC77C;&#xC5B4;&#xB098;&#xB294; &#xC774;&#xBCA4;&#xD2B8;&#xB97C; &#xD1B5;&#xBCF4;&#xBC1B;&#xB294; Observer&#xAC00; &#xBDF0;&#xC758; &#xB0B4;&#xC6A9;&#xC744; &#xBC14;&#xAFB8;&#xB3C4;&#xB85D; &#xD558;&#xAC8C; &#xB9D0;&#xC774;&#xC8E0;!!</p><p>&#xC774;&#xB807;&#xAC8C; Observe Pattern&#xC740; &#xC774;&#xBBF8; &#xC815;&#xB9D0; &#xB2E4;&#xC591;&#xD55C; &#xACF3;&#xC5D0;&#xC11C; &#xC4F0;&#xC774;&#xACE0; &#xC788;&#xC74C;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC678;&#xC5D0;&#xB3C4; &#xB2E4;&#xC591;&#xD55C; &#xC0C1;&#xD669;&#xC5D0; &#xB9DE;&#xAC8C;, 1 &#xB300; &#xB2E4; Communication&#xC744; &#xD574;&#xC57C; &#xD560; &#xB54C; Observer Pattern&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xC88B;&#xC744; &#xAC83; &#xAC19;&#xB124;&#xC694;!!</p><h2 id="summary"><strong>Summary</strong></h2><p>&#xC624;&#xB298;&#xC740; Observer Pattern&#xC744; &#xC815;&#xB9AC;&#xD574;&#xBCF4;&#xBA70; &#xC774; &#xAC1C;&#xB150;&#xC774; &#xC5B4;&#xB514;&#xC5D0;&#xC11C; &#xC4F0;&#xC774;&#xB294;&#xC9C0; &#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xBC88; design pattern &#xACF5;&#xBD80;&#xB97C; &#xD558;&#xBA70; &#xAE68;&#xB2EB;&#xAC8C; &#xB41C; &#xAC83;&#xC774; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xAE30;&#xC220;&#xC758; &#xAE30;&#xBCF8; &#xAD6C;&#xD604; &#xCCA0;&#xD559;&#xC774; &#xB418;&#xB294; &#xC18C;&#xD504;&#xD2B8;&#xC6E8;&#xC5B4; &#xB514;&#xC790;&#xC778; &#xD328;&#xD134;&#xACFC; &#xAC19;&#xC740; &#xC774;&#xB860;&#xC758; &#xAE30;&#xBCF8;&#xAE30;&#xB97C; &#xC798; &#xB2E4;&#xC838;&#xB193;&#xC73C;&#xBA74;,</p><p>&#xC0C8;&#xB85C;&#xC6B4; &#xC5B8;&#xC5B4;, &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB97C; &#xD559;&#xC2B5;&#xD560; &#xB54C; &#xC788;&#xC5B4; &#xD559;&#xC2B5;&#xC758; &#xB7EC;&#xB2DD; &#xCEE4;&#xBE0C;&#xB97C; &#xC904;&#xC77C; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xBAB8;&#xC18C; &#xAE68;&#xB2EB;&#xAC8C; &#xB418;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xD750;&#xB984;&#xC5D0; &#xC555;&#xB3C4;&#xB418;&#xAE30;&#xBCF4;&#xB2E4; &#xAE09;&#xD560;&#xC218;&#xB85D; &#xB354; &#xAE30;&#xC220;&#xC758; &#xAE30;&#xBCF8;&#xC774; &#xB418;&#xB294; &#xAE30;&#xBCF8;&#xAE30;&#xC5D0; &#xC9D1;&#xC911;&#xD574;&#xC57C;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC624;&#xB298;&#xB3C4; &#xD3EC;&#xC2A4;&#xD305; &#xBD10;&#xC8FC;&#xC154;&#xC11C; &#xAC10;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;!!</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em>&#x1F60A;</p><blockquote>&#xC774;&#xBBF8;&#xC9C0; &#xCD9C;&#xCC98;</blockquote><ul><li><a href="https://en.wikipedia.org/wiki/Observer_pattern?ref=noah-ios.dev#/media/File:Observer_w_update.svg">Observer Pattern UML</a></li><li><a href="https://developer.apple.com/documentation/?ref=noah-ios.dev">Apple Developer Documentation</a></li><li><a href="https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html?ref=noah-ios.dev">Notification Center Image</a></li><li>&#xC774;&#xC678; &#xB2E4;&#xB978; &#xC774;&#xBBF8;&#xC9C0;&#xB294; &#xC9C1;&#xC811; &#xC81C;&#xC791;&#xD558;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4; :)</li></ul><blockquote>&#xCC38;&#xACE0;</blockquote><ul><li><a href="https://medium.com/@icodespree/communication-patterns-in-swift-89442ff6af29?ref=noah-ios.dev">Communication Patterns in Swift</a></li><li><a href="https://en.wikipedia.org/wiki/Observer_pattern?ref=noah-ios.dev">Observer Pattern</a></li></ul><p><br></p>]]></content:encoded></item><item><title><![CDATA[Value Type은 무조건 Stack에만 할당될까?]]></title><description><![CDATA[<ul><li>WWDC 2016 UnderStanding Swift Performance &#xC138;&#xC158;&#xC744; &#xBCF4;&#xACE0; &#xC798;&#xBABB; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC788;&#xB358; &#xBD80;&#xBD84;&#xC744; &#xBC14;&#xB85C; &#xC7A1;&#xAE30;&#xC704;&#xD574; &#xC2E4;&#xD5D8;&#xC744; &#xD1B5;&#xD574; &#xB2E4;&#xC2DC; &#xD480;&#xC5B4;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><blockquote>&#xC704; &#xC138;&#xC158;&#xC744; &#xC544;&#xB798;&#xC758; &#xD3EC;&#xC2A4;</blockquote>]]></description><link>https://noah-ios.dev/swift-value-type/</link><guid isPermaLink="false">64e8cce822fba699ec4bbc96</guid><category><![CDATA[Swift]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Tue, 28 Jun 2022 15:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIyfHxzdHVkeXxlbnwwfHx8fDE2OTI5MzU0NzN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<ul><li>WWDC 2016 UnderStanding Swift Performance &#xC138;&#xC158;&#xC744; &#xBCF4;&#xACE0; &#xC798;&#xBABB; &#xC774;&#xD574;&#xD558;&#xACE0; &#xC788;&#xB358; &#xBD80;&#xBD84;&#xC744; &#xBC14;&#xB85C; &#xC7A1;&#xAE30;&#xC704;&#xD574; &#xC2E4;&#xD5D8;&#xC744; &#xD1B5;&#xD574; &#xB2E4;&#xC2DC; &#xD480;&#xC5B4;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</li></ul><blockquote>&#xC704; &#xC138;&#xC158;&#xC744; &#xC544;&#xB798;&#xC758; &#xD3EC;&#xC2A4;&#xD2B8;&#xB97C; &#xD1B5;&#xD574; &#xC815;&#xB9AC;&#xD574;&#xBCF4;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;. &#xAD00;&#xC2EC;&#xC788;&#xB294; &#xBD84;&#xB4E4;&#xC740; &#xC544;&#xB798;&#xC758; &#xB9C1;&#xD06C;&#xB97C; &#xCC38;&#xC870;&#xD574;&#xC8FC;&#xC138;&#xC694;!</blockquote><img src="https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIyfHxzdHVkeXxlbnwwfHx8fDE2OTI5MzU0NzN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?"><p><a href="https://noah0316.github.io/Swift/2021-12-21-swift-%EC%84%B1%EB%8A%A5-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-struct-class/?ref=noah-ios.dev">Swift &#xC131;&#xB2A5; &#xC774;&#xD574;&#xD558;&#xAE30; struct-class</a></p><p>&#xB610;&#xD55C; Value Type&#xC774; &#xC815;&#xB9D0; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB418;&#xB294;&#xC9C0;, Heap&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACE0; &#xC2F6;&#xC5B4; &#xC5EC;&#xB7EC;&#xB3C4;&#xAD6C;&#xB97C; &#xD65C;&#xC6A9;&#xD574; Swift&#xCF54;&#xD574;&#xB2F9; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC5B4;&#xB514;&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xB294;&#xC9C0; &#xBD84;&#xC11D;&#xD574;&#xBCF4;&#xBA70; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xB824; &#xD569;&#xB2C8;&#xB2E4;.</p><p>&#xBA3C;&#xC800; Value Type&#xC758; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4; &#xB54C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; struct&#xB97C; &#xD558;&#xB098; &#xC0DD;&#xC131;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">struct ValueType {
    var member1: Int
    var member2: Int
}

func test() {
    var valueTypeObject = ValueType(member1: 10, member2: 11)

    withUnsafePointer(to: &amp;valueTypeObject) {
        print(&quot;valueTypeObject address: \($0)&quot;)
    }
}

test()</code></pre><p><code>test()</code> &#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xC2E4;&#xD589;&#xD558;&#xBA74; valueTypeObject&#xC758; &#xC8FC;&#xC18C;&#xAC00; print&#xB429;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/f752fb6dbb724bd433d869ebf2eea53e/a6d36/1.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="1"></figure><p>valueTypeObject&#xC758; &#xD604;&#xC7AC; &#xC8FC;&#xC18C;&#xB294; &#xC704;&#xC640; &#xAC19;&#xB124;&#xC694;</p><p>&#xD604;&#xC7AC; valueTypeObject&#xC758; &#xC8FC;&#xC18C; <code>0x00007ff7bfeff2c0</code> &#xC758; &#xBA54;&#xBAA8;&#xB9AC;&#xC601;&#xC5ED;&#xC744; &#xD55C;&#xBC88; &#xD655;&#xC778;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;!</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/b13449e0e3b7f070e67ea2353632ba80/a6d36/2.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="2"></figure><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/063195959af7721a8087451d64758592/a6d36/3.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="3"></figure><pre><code class="language-swift">var valueTypeObject = ValueType(member1: 10, member2: 11)</code></pre><p><code>test()</code> &#xC548;&#xC5D0;&#xC11C; ValueType &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC0DD;&#xC131;&#xD560; &#xB54C; &#xBA64;&#xBC84;&#xBCC0;&#xC218;&#xC758; &#xAC12;&#xC73C;&#xB85C; 10, 11&#xC744; &#xC8FC;&#xC5C8;&#xC73C;&#xB2C8;,</p><p><code>0x00007ff7bfeff2c0</code>&#xC601;&#xC5ED;&#xC5D0; 16&#xC9C4;&#xC218; <code>0A</code>, <code>0B</code>&#xAC00; &#xC788;&#xB294;&#xAC78;&#xB85C; &#xBBF8;&#xB8E8;&#xC5B4;&#xBCF4;&#xC544;</p><p>&#xC131;&#xACF5;&#xC801;&#xC73C;&#xB85C; Value Type Object&#xAC00; &#xC0DD;&#xC131;&#xB41C; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C;&#xB294; ReferenceType&#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><pre><code class="language-swift">struct ValueType {
    var member1: Int
    var member2: Int
}

class ReferenceType {
    var member1: Int
    var member2: Int

    init(member1: Int, member2: Int) {
        self.member1 = member1
        self.member2 = member2
    }
}

func test() {
    var referenceTypeObject = ReferenceType(member1: 9, member2: 3)
    var valueTypeObject = ValueType(member1: 10, member2: 11)

    withUnsafePointer(to: &amp;referenceTypeObject) {
        print(&quot;referenceTypeObject address: \($0)&quot;)
    }

    withUnsafePointer(to: &amp;valueTypeObject) {
        print(&quot;valueTypeObject address: \($0)&quot;)
    }
}

test()</code></pre><p>&#xD55C;&#xBC88; &#xC2E4;&#xD589;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/2699d7d798105ee705ee6e9941645558/a6d36/4.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="4"></figure><p>referenceTypeObject&#xC758; &#xC8FC;&#xC18C;&#xC778; <code>0x00007ff7bfeff2c8</code>&#xB97C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/30d99f2b3d3286812fb521792e74fc9a/a6d36/5.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="5"></figure><h3 id="%ED%99%95%EC%9D%B8%ED%95%B4%EB%B3%B4%EA%B8%B0-%EC%A0%84%EC%97%90">&#xD655;&#xC778;&#xD574;&#xBCF4;&#xAE30; &#xC804;&#xC5D0;</h3><p>ReferenceType&#xC740; &#xCC38;&#xC870;&#xD0C0;&#xC785;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0;,</p><p>&#xC8FC;&#xC18C;(<code>0x00007ff7bfeff2c8</code>)&#xC5D0; &#xC811;&#xADFC;&#xD558;&#xAC8C; &#xB418;&#xBA74;</p><p>referenceTypeObject Instance&#xC758; &#xC8FC;&#xC18C;(<code>0x000000010922e180</code>) &#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xC744; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xD55C;&#xBC88; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC8FC;&#xC18C;&#xB97C; &#xC785;&#xB825;&#xD55C; &#xB4A4;&#xC5D0; &#xBA54;&#xBAA8;&#xB9AC; &#xC601;&#xC5ED;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xBA74;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/f0c93decac25c99dd8bc68b98aa3df76/a6d36/6.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="6"></figure><p>&#xC704;&#xC5D0;&#xC11C; &#xC5B8;&#xAE09;&#xD55C; <code>0x000000010922e180</code> &#xC8FC;&#xC18C;&#xAC00; &#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB0AE;&#xC740; &#xC8FC;&#xC18C;(<code>80</code>)&#xBD80;&#xD130; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xBBF8;&#xB8E8;&#xC5B4;&#xBCF4;&#xC544; <strong>&#xB9AC;&#xD2C0; &#xC5D4;&#xB514;&#xC548; &#xBC29;&#xC2DD;</strong>&#xC73C;&#xB85C; &#xC8FC;&#xC18C;&#xB97C; &#xC800;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB294; &#xAC83; &#xB610;&#xD55C; &#xD655;&#xC778;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xB124;&#xC694;!!</p><p>&#xC790; &#xC774;&#xC81C; &#xADF8;&#xB7FC; &#xD574;&#xB2F9; &#xC8FC;&#xC18C;(<code>0x10922e180</code>)&#xC5D0; &#xC811;&#xADFC;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/7b8028e633d5df9e1610124e894c19c7/a6d36/7.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="7"></figure><pre><code class="language-swift">var referenceTypeObject = ReferenceType(member1: 9, member2: 3)</code></pre><p>valueTypeObject&#xC640;&#xB294; &#xB2EC;&#xB9AC; &#xC55E;&#xC5D0; &#xC5B4;&#xB5A0;&#xD55C; &#xAC12;&#xB4E4;&#xC774; &#xB354; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xC9C0;&#xB9CC;,</p><p>&#xC6B0;&#xB9AC;&#xAC00; &#xD560;&#xB2F9;&#xD55C; &#xBA64;&#xBC84; &#xBCC0;&#xC218; 9 , 3&#xC774; &#xC798; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/eaa4b22b30fdec1491d0f343ab0c3c6b/a6d36/8.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="8"></figure><p>&#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xAD6C;&#xC870;&#xB294; &#xC704;&#xC640; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xB192;&#xC740; &#xBA54;&#xBAA8;&#xB9AC; &#xC8FC;&#xC18C;&#xC5D0; Stack&#xC774; &#xC704;&#xCE58;&#xD558;&#xBA70; Stack&#xBCF4;&#xB2E4; &#xC0C1;&#xB300;&#xC801;&#xC73C;&#xB85C; &#xB0AE;&#xC740; &#xBA54;&#xBAA8;&#xB9AC;&#xC8FC;&#xC18C;&#xC5D0; Heap&#xC774; &#xC704;&#xCE58;&#xD558;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC870;&#xC2EC;&#xC2A4;&#xB7FD;&#xAE34; &#xD558;&#xC9C0;&#xB9CC;</p><h3 id="valuetypeobject-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%9D%98-%EC%A3%BC%EC%86%8C-0x7ff7bfeff2b0">valueTypeObject &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC758; &#xC8FC;&#xC18C; : <code>0x7ff7bfeff2b0</code></h3><hr><h3 id="referencetypeobejct-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%9D%98-%EC%A3%BC%EC%86%8C-0x10922e180">referenceTypeObejct &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC758; &#xC8FC;&#xC18C; : <code>0x10922e180</code></h3><hr><p>&#xC704;&#xC758; &#xBA54;&#xBAA8;&#xB9AC; &#xAD6C;&#xC870;&#xB85C; &#xBBF8;&#xB8E8;&#xC5B4;&#xBCF4;&#xC544; &#xD604;&#xC7AC; valueTypeObject&#xB294; Stack&#xC5D0;</p><p>referenceTypeObject&#xB294; Heap&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xC5C8;&#xB2E4;&#xACE0; &#xC608;&#xC0C1;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC800;&#xB294; WWDC 2016 UnderStanding Swift Performance&#xC744; &#xBCF4;&#xACE0; &#xB09C; &#xD6C4;&#xC5D0; &#xC704;&#xC758; &#xACB0;&#xACFC;&#xCC98;&#xB7FC; &#xBAA8;&#xB4E0; Value Type&#xC740; stack&#xC5D0; &#xBAA8;&#xB4E0; Reference Type&#xC740; heap&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xCC29;&#xAC01;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><h3 id="%EB%8B%A4%EC%9D%8C-%EC%82%AC%EB%A1%80%EB%A5%BC-%EC%82%B4%ED%8E%B4%EB%B3%B4%EB%8F%84%EB%A1%9D-%ED%95%98%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4">&#xB2E4;&#xC74C; &#xC0AC;&#xB840;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</h3><pre><code class="language-swift">import Foundation

struct ValueType {
    var member1: Int
    var member2: Int
}

class ReferenceType {
    var member1: Int
    var member2: Int
    var value: ValueType

    init(member1: Int, member2: Int) {
        self.member1 = member1
        self.member2 = member2
        self.value = ValueType(member1: member1 + 1, member2: member2 + 1)
    }
}

func test() {
    var referenceTypeObject = ReferenceType(member1: 9, member2: 3)

    withUnsafePointer(to: &amp;referenceTypeObject) {
        print(&quot;referenceTypeObject address: \($0)&quot;)
    }

    withUnsafePointer(to: &amp;referenceTypeObject.value) {
        print(&quot;ref1.value address: \($0)&quot;)
    }
}

test()</code></pre><p>&#xC704; &#xCF54;&#xB4DC;&#xB294; ReferenceType&#xC774; &#xBA64;&#xBC84;&#xBCC0;&#xC218;&#xB85C; ValueType &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC18C;&#xC720;&#xD558;&#xACE0; &#xC788;&#xB294; &#xACBD;&#xC6B0;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; &#xD55C;&#xBC88; &#xC2E4;&#xD589;&#xC744; &#xD574;&#xBCF4;&#xB3C4;&#xB85D;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/9f4ddfac6e8c788c63c7bf7058bd4f1c/a6d36/9.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="9"></figure><p>ReferenceTypeObject &#xBCC0;&#xC218;&#xB294; <code>0x7ff7bfeff2c8</code>&#xC5D0;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/651e2f8360c1291ea869f0392ea63032/a6d36/10.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="10"></figure><p>&#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB294;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/e8b4217f0f76ac7caebc1d2994a82420/a6d36/11.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="11"></figure><p>&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xC744; &#xAC83;&#xC785;&#xB2C8;&#xB2E4;.</p><p>&#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC788;&#xB294; &#xBA54;&#xBAA8;&#xB9AC;&#xC601;&#xC5ED; <code>0x10101f740</code>&#xC5D0; &#xC811;&#xADFC;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/6c95a9f10e3ddf6ce069388ee37d3676/a6d36/12.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="12"></figure><pre><code class="language-swift">var referenceTypeObject = ReferenceType(member1: 9, member2: 3)</code></pre><p>&#xC6B0;&#xB9AC;&#xAC00; &#xBA64;&#xBC84;&#xBCC0;&#xC218;&#xB85C; &#xC8FC;&#xC785;&#xC2DC;&#xCF1C;&#xC900; 9, 3&#xC774; &#xB4E4;&#xC5B4;&#xAC00;&#xC788;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/9f4ddfac6e8c788c63c7bf7058bd4f1c/a6d36/13.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="13"></figure><p>&#xC774;&#xC81C; referenceObject&#xAC00; &#xC18C;&#xC720;&#xD558;&#xACE0; &#xC788;&#xB294; Value Type &#xAC1D;&#xCCB4;&#xC758; &#xC8FC;&#xC18C;&#xC5D0; &#xC811;&#xADFC;&#xD574;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</p><h2 id="%EC%97%87"><strong><strong>&#xC5C7;</strong></strong></h2><p>&#xADF8;&#xB7F0;&#xB370; &#xC8FC;&#xC18C;&#xB97C; &#xBCF4;&#xB2C8;,</p><p>&#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC788;&#xB294; &#xBA54;&#xBAA8;&#xB9AC;&#xC601;&#xC5ED;&#xC758; &#xC2DC;&#xC791;&#xC810; <code>0x10101f740</code>&#xACFC; &#xBD88;&#xACFC; 32&#xBC88;&#xC9C0;(16&#xC9C4;&#xC218;) &#xBC16;&#xC5D0; &#xCC28;&#xC774;&#xB098;&#xC9C0; &#xC54A;&#xB294; &#xACF3;&#xC5D0;</p><p>ValueType &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xAC00; &#xC800;&#xC7A5;&#xB418;&#xC5B4;&#xC788;&#xB124;&#xC694;.</p><p>&#xD55C;&#xBC88; &#xD655;&#xC778;&#xD574;&#xBD05;&#xC2DC;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/113f62feb1457f2f44cc0e9165b7cbca/a6d36/14.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="14"></figure><pre><code class="language-swift">class ReferenceType {
    var member1: Int
    var member2: Int
    var value: ValueType

    init(member1: Int, member2: Int) {
        self.member1 = member1
        self.member2 = member2
        self.value = ValueType(member1: member1 + 1, member2: member2 + 1)
    }
}

var referenceTypeObject = ReferenceType(member1: 9, member2: 3)</code></pre><p>ValueType&#xC744; &#xC0DD;&#xC131;&#xD574;&#xC904; &#xB54C; ReferenceType&#xC758; &#xBA64;&#xBC84;&#xBCC0;&#xC218;&#xBCF4;&#xB2E4; 1&#xC529; &#xC99D;&#xAC00;&#xD558;&#xB3C4;&#xB85D; &#xBA64;&#xBC84;&#xBCC0;&#xC218;&#xB97C; &#xC0DD;&#xC131;&#xD574;&#xC8FC;&#xC5C8;&#xC73C;&#xB2C8;,</p><p>&#xD604;&#xC7AC; Value Type&#xC778; Object&#xAC00; heap&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xC5B4;&#xC788;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xB97C; &#xD1B5;&#xD574; Value Type&#xC774; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB418;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2D8;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC0C1;&#xD669;&#xC5D0; &#xB530;&#xB77C; Stack, Heap&#xC5D0; &#xD560;&#xB2F9;&#xB418;&#xB294; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xACB0;&#xAD6D; &#xC81C;&#xAC00; &#xC798;&#xBABB; &#xC54C;&#xACE0;&#xC788;&#xC5C8;&#xB358; &#xAC83;&#xC744; &#xB2E4;&#xC2DC; &#xD55C;&#xBC88; &#xD655;&#xC778;&#xD574;&#xBCFC; &#xC218; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><hr><p>&#xC0AC;&#xC2E4; WWDC 2016 UnderStanding Swift Performance&#xC138;&#xC158;&#xC5D0;&#xC11C;&#xB3C4; &#xBAA8;&#xB4E0; ValueType&#xC774; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0; &#xD560;&#xB2F9;&#xB41C;&#xB2E4;&#xACE0; &#xD558;&#xC9C0;&#xB294; &#xC54A;&#xC558;&#xB294;&#xB370;,</p><p>struct&#xC640; class&#xC758; &#xC131;&#xB2A5;&#xC758; &#xCC28;&#xC774;&#xB97C; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; &#xADF8;&#xB798;&#xD504;&#xB97C; &#xBCF4;&#xBA70; &#xBAA8;&#xB4E0; ValueType&#xC774; stack&#xC5D0; &#xC800;&#xC7A5;&#xB418;&#xB294; &#xAC83;&#xC73C;&#xB85C; &#xC624;&#xD574;&#xD558;&#xACE0; &#xC788;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xBC88;&#xAE30;&#xD68C;&#xB97C; &#xD1B5;&#xD574; &#xC798;&#xBABB;&#xB41C; &#xC9C0;&#xC2DD;&#xC744; &#xBC14;&#xB85C; &#xC7A1;&#xC744; &#xC218; &#xC788;&#xC5C8;&#xB358; &#xAC83; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC774;&#xC678;&#xC5D0;&#xB3C4; Stack&#xACFC; Heap&#xBA54;&#xBAA8;&#xB9AC;&#xC5D0; &#xAC1D;&#xCCB4;&#xAC00; &#xD560;&#xB2F9;&#xB418;&#xB294; &#xAC83;&#xC744; &#xCD94;&#xC815;&#xC774; &#xC544;&#xB2CC;, &#xC9C1;&#xC811;&#xC801;&#xC73C;&#xB85C; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACE0; &#xC2F6;&#xC5B4;</p><p>&#xD604;&#xC7AC; SIL&#xACFC; Memory Instrument&#xB97C; &#xD1B5;&#xD574; &#xD655;&#xC778;&#xD574;&#xBCF4;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;&#xB9CC; &#xC0DD;&#xAC01;&#xBCF4;&#xB2E4; &#xC774; &#xACFC;&#xC815;&#xC774; &#xAE38;&#xC5B4;&#xC9C0;&#xB124;&#xC694;..!!</p><blockquote>SIL&#xC774;&#xB780; Swift Intermediate Language&#xC758; &#xC57D;&#xC790;&#xB85C;, Swift&#xC758; &#xC18C;&#xC2A4; &#xCF54;&#xB4DC;&#xB97C; &#xC2E4;&#xD589; &#xAC00;&#xB2A5;&#xD55C; &#xBC14;&#xC774;&#xB108;&#xB9AC; &#xCF54;&#xB4DC;&#xB85C; &#xBC14;&#xAFC0; &#xB54C;,<br>&#xB2E4;&#xB978; &#xCEF4;&#xD30C;&#xC77C;&#xB7EC;(LLVM)&#xAC00; &#xCDE8;&#xAE09;&#xD558;&#xAE30; &#xC26C;&#xC6B4; &#xC911;&#xAC04;&#xD45C;&#xD604;(Intermediate Representation)&#xC73C;&#xB85C; &#xBCC0;&#xD658;&#xD55C; &#xCF54;&#xB4DC;&#xB97C; &#xB9D0;&#xD569;&#xB2C8;&#xB2E4;. (LLVM IR&#xACFC;&#xB294; &#xB2E4;&#xB985;&#xB2C8;&#xB2E4;.)<br>&#xCD9C;&#xCC98; : <a href="https://techblog.woowahan.com/2563/?ref=noah-ios.dev">&#xC6B0;&#xC544;&#xD55C;&#xD615;&#xC81C;&#xB4E4; &#xAE30;&#xC220;&#xBE14;&#xB85C;&#xADF8;</a></blockquote><p>&#xC9C0;&#xAE08; &#xC2E4;&#xD5D8;&#xD574;&#xBCF4;&#xACE0; &#xC788;&#xB294; &#xACFC;&#xC815;&#xC744; &#xC0B4;&#xC9DD; &#xBCF4;&#xC5EC;&#xB4DC;&#xB9AC;&#xC790;&#xBA74; &#xB2E4;&#xC74C;&#xACFC; &#xAC19;&#xC2B5;&#xB2C8;&#xB2E4;&#x314E;&#x314E;</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/25543701432125d93b1c0f731e508b0f/a6d36/15.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="15"></figure><p>SIL &#xCF54;&#xB4DC;&#xB97C; &#xBCF4;&#xBA70;, &#xD560;&#xB2F9; &#xB3D9;&#xC791; &#xD55C; &#xB2E8;&#xACC4; &#xD55C; &#xB2E8;&#xACC4; &#xC0B4;&#xD3B4;&#xBCF4;&#xACE0; &#xC788;&#xB294;&#xB370; &#xC9C0;&#xC2DD;&#xC774; &#xC5C6;&#xC5B4; &#xC2DC;&#xAC04;&#xC774; &#xC880; &#xAC78;&#xB9AC;&#xB124;&#xC694; &#x314E;&#x314E; ^___^</p><figure class="kg-card kg-image-card"><img src="https://noah0316.github.io/static/956b1b52f4cb994694a69c2cb81e1804/a6d36/16.png" class="kg-image" alt="Value Type&#xC740; &#xBB34;&#xC870;&#xAC74; Stack&#xC5D0;&#xB9CC; &#xD560;&#xB2F9;&#xB420;&#xAE4C;?" loading="lazy" title="16"></figure><p>&#xC5F4;&#xC2EC;&#xD788; &#xC5F0;&#xAD6C;&#xD574;&#xBCF4;&#xACE0; &#xACB0;&#xACFC;&#xAC00; &#xB098;&#xC624;&#xB294;&#xB300;&#xB85C; &#xD3EC;&#xC2A4;&#xD2B8;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xD558;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!!</p><p>&#xAC10;&#xC0AC;&#xD569;&#xB2C8;&#xB2E4;!!</p><p><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em> &#x1F60A;</p><blockquote>&#xCC38;&#xACE0;</blockquote><ul><li><a href="https://www.youtube.com/watch?v=LM1BSf25kX0&amp;ref=noah-ios.dev">Value Type&#xC740; &#xD56D;&#xC0C1; &#xC2A4;&#xD0DD;&#xC5D0; &#xC800;&#xC7A5;&#xB41C;&#xB2E4;&#xACE0;?</a></li><li><a href="https://techblog.woowahan.com/2563/?ref=noah-ios.dev">SIL(Swift Intermediate Language)&#xC744; &#xD1B5;&#xD55C; Swift debugging</a></li><li><a href="https://github.com/apple/swift/blob/main/docs/SIL.rst?ref=noah-ios.dev#destroy-addr">apple/swift-sil</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Advances in UI Data Sources]]></title><description><![CDATA[<p></p><h4 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h4><p><a href="https://developer.apple.com/videos/play/wwdc2019/220?ref=noah-ios.dev">Advances in UI Data Sources</a> WWDC &#xC138;&#xC158;&#xC744; &#xBCF4;&#xBA70; diffable datasource&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4; :)</p><h2 id="current-state-of-the-art">Current State-of-the-Art</h2><p>&#xAE30;&#xC874;&#xC5D0;&#xB294; <code>UITableView</code> &#xBC0F; <code>UICollectionView</code> &#xC5D0;&#xC11C; UI data source&#xC640; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0C1;&#xD638;</p>]]></description><link>https://noah-ios.dev/advances-in-ui-data-sources/</link><guid isPermaLink="false">6440eceda03824034f492341</guid><category><![CDATA[iOS]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Sun, 24 Apr 2022 02:05:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1484662020986-75935d2ebc66?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDIzNXx8ZGF0YXxlbnwwfHx8fDE2ODE5NzY2NzY&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1484662020986-75935d2ebc66?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDIzNXx8ZGF0YXxlbnwwfHx8fDE2ODE5NzY2NzY&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Advances in UI Data Sources"><p></p><h4 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h4><p><a href="https://developer.apple.com/videos/play/wwdc2019/220?ref=noah-ios.dev">Advances in UI Data Sources</a> WWDC &#xC138;&#xC158;&#xC744; &#xBCF4;&#xBA70; diffable datasource&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4; :)</p><h2 id="current-state-of-the-art">Current State-of-the-Art</h2><p>&#xAE30;&#xC874;&#xC5D0;&#xB294; <code>UITableView</code> &#xBC0F; <code>UICollectionView</code> &#xC5D0;&#xC11C; UI data source&#xC640; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xD588;&#xC744;&#xAE4C;?</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233298196-08841342-5d7f-4371-8cc4-c449b6e32873.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p><code>UICollectionViewDataSource</code> &#xAD6C;&#xD604; &#xC608;&#xB97C; &#xBCF4;&#xC790;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://user-images.githubusercontent.com/63908856/233300266-07f1eb54-d59b-4759-b339-6716a16df3b1.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"><figcaption>UICollectionViewDataSource &#xD504;&#xB85C;&#xD1A0;&#xCF5C; &#xC120;&#xC5B8;&#xBD80;</figcaption></figure><p>&#xC704; &#xCF54;&#xB4DC;&#xC5D0;&#xC11C;&#xB294; <code>UICollectionViewDatasource</code> &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC5D0;&#xC11C; &#xD544;&#xC218;(required)&#xB85C; &#xAD6C;&#xD604;&#xD574;&#xC57C;&#xD558;&#xB294; &#xB450; &#xAC00;&#xC9C0; &#xBA54;&#xC11C;&#xB4DC;&#xC640; &#xB2E4;&#xB978; &#xD558;&#xB098;&#xC758; &#xBA54;&#xC11C;&#xB4DC;(optional)&#xAC00; &#xAD6C;&#xD604;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><p>&#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB294; &#xC544;&#xB798;&#xC758; &#xB450; &#xAC1C;&#xC758; &#xBA54;&#xC11C;&#xB4DC;</p><pre><code class="language-swift">optional func numberOfSections(in collectionView: UICollectionView) -&gt; Int

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&gt; Int</code></pre><p>&#xB97C; &#xD1B5;&#xD574; section&#xC758; &#xC218;&#xC640; &#xAC01; section&#xC758; item&#xC218;&#xC5D0; &#xB300;&#xD574; &#xBB3C;&#xC5B4;&#xBCF8;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; contents&#xAC00; &#xB80C;&#xB354;&#xB9C1; &#xB420; &#xB54C; cell&#xC744; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;.</p><p>&#xBCF4;&#xD1B5; &#xC774;&#xB294; data source&#xB294; app &#xB0B4;&#xBD80;&#xC758; <code><a href="https://developer.apple.com/documentation/uikit/uicollectionviewdatasource?ref=noah-ios.dev">UICollectionViewDataSource</a></code>&#xC640; &#xAC19;&#xC740; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xCC44;&#xD0DD;&#xD55C; data controller&#xC5D0; &#xC758;&#xD574; &#xC9C0;&#xC6D0;&#xB41C;&#xB2E4;. </p><p>&#xADF8;&#xB9AC;&#xACE0; &#xC774; controller&#xB294; Core Data&#xC640; &#xC0C1;&#xD638; &#xC791;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xACE0; web service&#xC640; &#xC0C1;&#xD638;&#xC791;&#xC6A9;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xB2E4;.</p><p>&#xBA3C;&#xC800; UI&#xB808;&#xC774;&#xC5B4;&#xC640; data&#xB97C; &#xAC00;&#xC838;&#xC624;&#xAE30; &#xC704;&#xD55C; controller&#xAC04;&#xC758; &#xC18C;&#xD1B5;&#xBC29;&#xBC95;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233305578-1805d1aa-035a-456f-8d1e-64579996f833.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>UI&#xB808;&#xC774;&#xC5B4;&#xAC00; Controller&#xC5D0; Section&#xC5D0; item&#xC774; &#xBA87;&#xAC1C;&#xC778;&#xC9C0;, contents&#xB97C; &#xB80C;&#xB354;&#xB9C1; &#xD560; &#xB54C; cell&#xC744; &#xC81C;&#xACF5;&#xD558;&#xB77C;&#xACE0; &#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233310248-44db1100-643a-45eb-a68b-7aa5c85fc0ed.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xC774; Controller&#xAC00; &#xC751;&#xB2F5;&#xC744; &#xBC1B;&#xB294; &#xC6F9; &#xC11C;&#xBE44;&#xC2A4; &#xC694;&#xCCAD;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294; &#xACBD;&#xC6B0;&#xC5D0;&#xB294; &#xC870;&#xAE08; &#xB354; &#xBCF5;&#xC7A1;&#xD574;&#xC9C4;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233310537-357d51d4-e0f8-49fc-8f9e-f66e27494a65.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xB9CC;&#xC57D; &#xC6F9; &#xC11C;&#xBE44;&#xC2A4; &#xC751;&#xB2F5;&#xC744; &#xD1B5;&#xD574; data&#xC758; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC744; &#xC54C;&#xB9B0;&#xB2E4;&#xBA74; &#xC774; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC744; &#xBC18;&#xC601;&#xD558;&#xAE30; &#xC704;&#xD574; UI &#xB808;&#xC774;&#xC5B4;&#xB97C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xD558;&#xC5EC; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC744; &#xBC18;&#xC601;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xAC00;&#xB054; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xAC00; &#xC798;&#xBABB;&#xB418;&#xBA74; &#xC774;&#xB7EC;&#xD55C; &#xC5D0;&#xB7EC;&#xB97C; &#xB9CC;&#xB0A0; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233316068-f8514f7c-a663-4c6c-ab83-fa2e2b1df89c.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p><code><a href="https://developer.apple.com/documentation/uikit/uicollectionview/1618078-reloaddata?ref=noah-ios.dev">reloadData()</a></code> &#xB97C; &#xD638;&#xCD9C;&#xD558;&#xC5EC; &#xBB38;&#xC81C;&#xB97C; &#xD574;&#xACB0;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xB2E4;.</p><blockquote>collection view&#xC758; &#xBAA8;&#xB4E0; item&#xC744; &#xB2E4;&#xC2DC; &#xB85C;&#xB4DC; &#xD574;&#xC57C;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC774; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xB4DC;&#xBB3C;&#xAC8C; &#xD638;&#xCD9C;&#xD560; &#xC218; &#xC788;&#xB2E4;. <br>&#xADF8;&#xB7EC;&#xBA74; collection view&#xAC00; &#xD604;&#xC7AC; &#xD45C;&#xC2DC;&#xB41C; &#xBAA8;&#xB4E0; item(place holder &#xD3EC;&#xD568;)&#xC744; &#xC0AD;&#xC81C;&#xD558;&#xACE0;, data source &#xAC1D;&#xCCB4;&#xC758; &#xD604;&#xC7AC; &#xC0C1;&#xD0DC;&#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; item&#xC744; &#xB2E4;&#xC2DC; &#xB9CC;&#xB4E0;&#xB2E4;.<br> &#xD6A8;&#xC728;&#xC131;&#xC744; &#xC704;&#xD574; collection view&#xC5D0;&#xB294; visible cell&#xACFC; supplementary view&#xB9CC; &#xD45C;&#xC2DC;&#xB41C;&#xB2E4;.<br> reload&#xD55C; &#xACB0;&#xACFC; collection data&#xAC00; &#xCD95;&#xC18C;&#xB418;&#xB294; &#xACBD;&#xC6B0; collection view&#xB294; &#xADF8;&#xC5D0; &#xB530;&#xB77C; scroll offset&#xC744; &#xC870;&#xC815;&#xD55C;&#xB2E4;.<br><br>item&#xC744; insert &#xBC0F; delete&#xD558;&#xB294; animation block &#xC911;&#xAC04;&#xC5D0;&#xB294; &#xC774; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD574;&#xC11C;&#xB294; &#xC548;&#xB41C;&#xB2E4;.<br>item&#xC744; insert &#xBC0F; delete&#xD558;&#xBA74; collection&#xC758; data&#xAC00; &#xC790;&#xB3D9;&#xC73C;&#xB85C; &#xC801;&#xC808;&#xD558;&#xAC8C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xB41C;&#xB2E4;.</blockquote><p>&#xD558;&#xC9C0;&#xB9CC; <code>reloadData()</code>&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74; animation effect&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</p><p>&#xC774;&#xB294; &#xA0;&#xC0AC;&#xC6A9;&#xC790; &#xACBD;&#xD5D8;&#xC744; &#xC88B;&#xC9C0; &#xC54A;&#xAC8C; &#xB9CC;&#xB4E0;&#xB2E4;.</p><p><strong>&#xBB50;&#xAC00; &#xBB38;&#xC81C;&#xC77C;&#xAE4C;?</strong></p><p>&#xC5EC;&#xAE30;&#xC11C; &#xAC00;&#xC7A5; &#xD070; &#xBB38;&#xC81C;&#xB294; &#xA0;data controller(data source &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294;)&#xAC00; &#xC2DC;&#xAC04;&#xC774; &#xC9C0;&#xB0A8;&#xC5D0; &#xB530;&#xB77C; &#xBCC0;&#xACBD;&#xB418;&#xB294; &#xC790;&#xC2E0;&#xB9CC;&#xC758; truth(version)&#xB97C; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; UI&#xC5ED;&#xC2DC; &#xC790;&#xC2E0;&#xB9CC;&#xC758; truth (version)&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;.</p><p>UI, Data &#xAC01;&#xAC01;&#xC758; truth(version)&#xB97C; &#xB9DE;&#xCD94;&#xC5B4; &#xC8FC;&#xC5B4;&#xC57C;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xD604;&#xC7AC;&#xC758; &#xC811;&#xADFC; &#xBC29;&#xC2DD;&#xC740; &#xC624;&#xB958;&#xAC00; &#xBC1C;&#xC0DD;&#xD558;&#xAE30; &#xC27D;&#xB2E4;.</p><blockquote>UI&#xC640; &#xB370;&#xC774;&#xD130;&#xAC00; &#xAC01;&#xAC01;&#xC758; &#xBC84;&#xC804;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB97C; &#xB3D9;&#xAE30;&#xD654;&#xC2DC;&#xCF1C;&#xC918;&#xC57C;&#xD558;&#xB294; &#xBB38;&#xC81C;&#xAC00; &#xBC1C;&#xC0DD;&#xD55C;&#xB2E4;.</blockquote><p></p><h2 id="a-new-approach">A New Approach</h2><h3 id="diffable-data-source">Diffable Data Source</h3><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233521456-d4a72384-208a-4b46-a8c8-1852ca4fe1b3.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p> <a href="https://developer.apple.com/documentation/uikit/uicollectionviewdiffabledatasource/3795617-apply?ref=noah-ios.dev"><code>apply()</code></a> &#xBA54;&#xC11C;&#xB4DC;&#xB294; &#xBB58;&#xAE4C;? </p><p>&#xC54C;&#xC544;&#xBCF4;&#xAE30;&#xC5D0; &#xC55E;&#xC11C; Snapshot&#xC5D0; &#xB300;&#xD55C; &#xAC1C;&#xB150;&#xC744; &#xBA3C;&#xC800; &#xC54C;&#xC544;&#xBCF4;&#xC790;</p><h3 id="snapshots">Snapshots</h3><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233521884-c318c8e1-7e31-48f6-9117-1f3d8c1faa75.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xAC04;&#xB2E8;&#xD558;&#xAC8C; &#xB9D0;&#xD574; Snapshot&#xC740; &#xD604;&#xC7AC; UI state&#xC758; truth(version)&#xC774;&#xB2E4;.</p><p>section&#xACFC; item&#xC5D0; &#xB300;&#xD574; unique identifier&#xAC00; &#xC788;&#xC73C;&#xBA70;, IndexPath &#xB300;&#xC2E0; identifier&#xB97C; &#xC774;&#xC6A9;&#xD574; update&#xD55C;&#xB2E4;.</p><p>&#xC608;&#xC81C;&#xB97C; &#xD1B5;&#xD574; &#xC774;&#xD574;&#xD574;&#xBCF4;&#xC790;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233523628-2fb4c419-1141-4f5c-96e5-5dbe990639aa.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>FOO, BAR, BIF&#xAC00; &#xD654;&#xBA74;&#xC5D0; &#xD45C;&#xC2DC;&#xB41C;&#xB2E4;&#xACE0; &#xD558;&#xC790;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233523873-907ab1a1-9b1e-4f4e-bfda-fb694db9251b.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>Controller(data source &#xC5ED;&#xD560;&#xC744; &#xD558;&#xB294;)&#xAC00; &#xBCC0;&#xACBD;&#xB418;&#xBA74; </p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233524019-b3932a65-ec96-4fe3-ad96-1dca1eb29fd0.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xC801;&#xC6A9;&#xD558;&#xB824;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; Snapshot&#xC774; &#xC0DD;&#xAE34;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233524306-386f5c75-ffa7-45db-9872-b1c3b8217dd7.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>apply &#xD568;&#xC218;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74; &#xD568;&#xC218;&#xC758; &#xC774;&#xB984;&#xCC98;&#xB7FC; &#xC0C8;&#xB85C;&#xC6B4; Snapshot&#xC774; &#xC801;&#xC6A9;&#xB41C;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233524414-433af3f4-8ec7-486f-82e6-85222a9e481d.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>Diffable Data Source&#xB294; &#xBAA8;&#xB4E0; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0; &#xAC78;&#xCCD0; 4&#xAC1C;&#xC758; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;.</p><p>iOS, tvOS&#xC758; &#xACBD;&#xC6B0; <code><a href="https://developer.apple.com/documentation/uikit/uicollectionviewdiffabledatasource?ref=noah-ios.dev">UICollectionViewDiffableDataSource</a></code> , <code><a href="https://developer.apple.com/documentation/uikit/uitableviewdiffabledatasource?ref=noah-ios.dev">UITableViewDiffableDataSource</a></code> &#xAC00; &#xC788;&#xC73C;&#xBA70;</p><p>Mac&#xC5D0;&#xB294; <code><a href="https://developer.apple.com/documentation/appkit/nscollectionviewdiffabledatasource?ref=noah-ios.dev">NSCollectionViewDiffableDataSource</a></code> &#xAC00; &#xC788;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; &#xBAA8;&#xB4E0; &#xD50C;&#xB7AB;&#xD3FC;&#xC5D0;&#xC11C; &#xACF5;&#xD1B5;&#xC801;&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xB418;&#xB294; &#xD604;&#xC7AC; UI &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD55C; &#xCC45;&#xC784;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB294; snapshot &#xD074;&#xB798;&#xC2A4;&#xB294; <code><a href="https://developer.apple.com/documentation/uikit/nsdiffabledatasourcesnapshot?ref=noah-ios.dev">NSDiffableDataSourceSnapshot</a></code> &#xC774;&#xB2E4;.</p><h2 id="%EC%98%88%EC%A0%9C">&#xC608;&#xC81C;</h2><p><a href="https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views?ref=noah-ios.dev">&#xC774;&#xACF3;</a> &#xC5D0;&#xC11C; &#xC608;&#xC81C; &#xD504;&#xB85C;&#xC81D;&#xD2B8;&#xB97C; &#xB2E4;&#xC6B4;&#xBC1B;&#xC544; Diffable Data Source&#xAC00; &#xC5B4;&#xB5BB;&#xAC8C; &#xC791;&#xB3D9; &#xD558;&#xB294;&#xC9C0; &#xA0;&#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xD559;&#xC2B5;&#xD574;&#xBCF4;&#xC790;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233527437-dd4856d8-61b3-4abe-9104-3f1fdbd9462c.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xB2E4;&#xC591;&#xD55C; &#xC608;&#xC81C;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xBA70; &#xBC18;&#xBCF5;&#xB418;&#xB294; &#xD328;&#xD134;&#xC744; &#xCC3E;&#xC544;&#xBCF4;&#xC790;</p><blockquote>&#xCD1D; 3&#xAC1C;&#xB97C; &#xC0B4;&#xD3B4;&#xBCFC; &#xC608;&#xC815;</blockquote><p>&#xBCC0;&#xACBD; &#xD639;&#xC740; &#xC0C8;&#xB85C;&#xC6B4; data set&#xC744; &#xC804;&#xCCB4; data source&#xAC00; &#xC788;&#xB294; collection view&#xB610;&#xB294; table view&#xC5D0; &#xBC18;&#xC601;&#xD558;&#xACE0; &#xC2F6;&#xC744; &#xB54C;&#xB9C8;&#xB2E4; snapshot&#xC744; &#xC0DD;&#xC131;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><p>&#xBA3C;&#xC800; &#xD574;&#xB2F9; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xC8FC;&#xAE30;&#xC5D0; &#xD45C;&#xC2DC;&#xD560; item&#xC5D0; &#xB300;&#xD55C; configuration&#xC73C;&#xB85C; &#xD574;&#xB2F9; snapshot&#xC744; &#xCC44;&#xC6B4;&#xB2E4;.</p><p>&#xADF8; &#xB2E4;&#xC74C; snapshot&#xC744; &#xC801;&#xC6A9;&#xD574;(apply) &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC744; UI&#xC5D0; commit&#xD55C;&#xB2E4;.</p><blockquote>Snapshot &#xC0DD;&#xC131;, Snapshot &#xC124;&#xC815;, Snapshot apply<br>&#xC774; 3&#xB2E8;&#xACC4;&#xC758; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xAC00; &#xC55E;&#xC73C;&#xB85C; &#xACC4;&#xC18D; &#xBC18;&#xBCF5;&#xB420; &#xAC83;&#xC774;&#xB2C8; &#xC720;&#xC758;&#xD574;&#xC11C; &#xBCF4;&#xC790;</blockquote><p>&#xC790;, &#xCCAB;&#xBC88;&#xC9F8; &#xC608;&#xC81C;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><!--kg-card-begin: html--><img src="https://user-images.githubusercontent.com/63908856/233528411-b2b9ced5-5cab-4a55-8aeb-f1a4ef3c99dd.png" width="300px" alt="Advances in UI Data Sources"><!--kg-card-end: html--><p>&#xC6B0;&#xB9AC;&#xAC00; &#xC0B4;&#xD3B4;&#xBCF4;&#xB824;&#xACE0; &#xD558;&#xB294; &#xC608;&#xC81C;&#xB294; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xAC80;&#xC0C9; UI&#xC774;&#xB2E4;.</p><!--kg-card-begin: html--><img src="https://user-images.githubusercontent.com/63908856/233528745-cdfa58a5-9494-49ba-b816-ff0aae063a1c.gif" width="200px /&gt;&lt;!--kg-card-end: html--&gt;&lt;p&gt;&#xC0C1;&#xB2E8;&#xC5D0; &#xAC80;&#xC0C9; &#xD544;&#xB4DC;&#xC5D0; &#xC785;&#xB825;&#xC744; &#xC2DC;&#xC791;&#xD558;&#xBA74; &#xC77C;&#xCE58;&#xB418;&#xB294; item&#xB9CC; list&#xB85C; &#xD544;&#xD130;&#xB9C1; &#xB418;&#xB294; &#xC608;&#xC81C;&#xC774;&#xB2E4;&lt;/p&gt;&lt;p&gt;GIF&#xB97C; &#xBCF4;&#xBA74; &#xC54C; &#xC218; &#xC788;&#xB4EF; &#xBAA8;&#xB450; animation&#xC774; &#xC801;&#xC6A9;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.&lt;/p&gt;&lt;p&gt;&#xC774;&#xB294; Diffable Data Source&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xB9E4;&#xC6B0; &#xC801;&#xC740; &#xCF54;&#xB4DC;&#xB85C; &#xC27D;&#xAC8C; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xB2E4;.&lt;/p&gt;&lt;p&gt;&#xC5B4;&#xB5BB;&#xAC8C; &#xC791;&#xB3D9;&#xD558;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;&lt;/p&gt;&lt;p&gt;&#xC0AC;&#xC6A9;&#xC790;&#xAC00; search bar&#xC5D0; &#xC785;&#xB825;&#xC744; &#xD558;&#xBA74; &#xC791;&#xC5C5;&#xC774; &#xC2DC;&#xC791;&#xB41C;&#xB2E4;.&lt;/p&gt;&lt;p&gt;&#xB530;&#xB77C;&#xC11C; &#xBA3C;&#xC800; &#xC608;&#xC81C;&#xC5D0;&#xC11C; &lt;code&gt;UISearchBarDelegate&lt;/code&gt; &#xBD80;&#xBD84;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;&lt;/p&gt;&lt;pre&gt;&lt;code class=" language-swift" alt="Advances in UI Data Sources">extension MountainsViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        self.performQuery(with: searchText)
    }
}<p>searchBar&#xC5D0;&#xC11C; &#xAC00;&#xC838;&#xC628; searchText&#xB97C; &#xC774;&#xC6A9;&#xD574; performQuery &#xA0;&#xBA54;&#xC18C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD55C;&#xB2E4;.</p><pre><code class="language-swift">func performQuery(with filter: String?) {
        let mountains = mountainsController.filteredMountains(with: filter).sorted { $0.name &lt; $1.name }

        var snapshot = NSDiffableDataSourceSnapshot&lt;Section, MountainsController.Mountain&gt;()
        snapshot.appendSections([.main])
        snapshot.appendItems(mountains)
        self.dataSource.apply(snapshot, animatingDifferences: true)
    }</code></pre><p>performQuery &#xBA54;&#xC18C;&#xB4DC; &#xC790;&#xCCB4;&#xB294; &#xB9E4;&#xC6B0; &#xAC04;&#xB2E8;&#xD558;&#xB2E4;.</p><p>&#xD558;&#xB294; &#xC77C;&#xC740; MountainsController&#xC5D0; &#xC640; &#xC77C;&#xCE58;&#xD558;&#xB294; Mountain&#xC758; &#xD544;&#xD130;&#xB9C1; + &#xC815;&#xB82C;&#xB41C; &#xBAA9;&#xB85D;&#xC744; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;.</p><blockquote>&#xC5EC;&#xAE30;&#xC11C; MontainsController&#xB294; model layer&#xAC1D;&#xCCB4;&#xC785;&#xB2C8;&#xB2E4;.</blockquote><p>&#xD638;&#xCD9C;&#xC758; &#xACB0;&#xACFC;&#xB85C; mountain list&#xB97C; &#xC5BB;&#xAC8C;&#xB41C;&#xB2E4;.</p><p>&#xC55E;&#xC11C; &#xB9D0;&#xD55C; &#xAC83; &#xCC98;&#xB7FC; Snapshot&#xC744; &#xC801;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD574; 3&#xB2E8;&#xACC4;&#xC758; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB97C; &#xAC70;&#xCE5C;&#xB2E4;.</p><p>&#xBA3C;&#xC800; &#xC0C8;&#xB85C;&#xC6B4; <code>NSDiffableDataSourceSnapshot</code>&#xC744; &#xB9CC;&#xB4E0;&#xB2E4;. </p><pre><code class="language-swift">var snapshot = NSDiffableDataSourceSnapshot&lt;Section, MountainsController.Mountain&gt;()</code></pre><p>&#xC774; snapshot&#xC740; &#xCC98;&#xC74C;&#xC5D0;&#xB294; &#xBE44;&#xC5B4;&#xC788;&#xB2E4;. &#xB530;&#xB77C;&#xC11C; &#xC6D0;&#xD558;&#xB294; Section&#xACFC; item&#xC73C;&#xB85C; &#xCC44;&#xC6CC;&#xBCF4;&#xC790;</p><pre><code class="language-swift">enum Section: CaseIterable {
	case main
}</code></pre><pre><code class="language-swift">var snapshot = NSDiffableDataSourceSnapshot&lt;Section, MountainsController.Mountain&gt;()
snapshot.appendSections([.main])</code></pre><p>Section&#xC744; &#xCD94;&#xAC00;&#xD558;&#xACE0;, &#xC784;&#xC758;&#xB85C; &#xC774;&#xB97C; main section&#xC774;&#xB77C;&#xACE0; &#xD574;&#xBCF4;&#xC790;</p><blockquote>Section&#xC5D0; &#xB300;&#xD55C; &#xBD80;&#xBD84;&#xC740; &#xB4A4;&#xC5D0;&#xC11C; &#xC880; &#xB354; &#xC790;&#xC138;&#xD788; &#xB2E4;&#xB8E8;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><pre><code class="language-swift">let mountains = mountainsController.filteredMountains(with: filter).sorted { $0.name &lt; $1.name }

var snapshot = NSDiffableDataSourceSnapshot&lt;Section, MountainsController.Mountain&gt;()
snapshot.appendSections([.main])
snapshot.appendItems(mountains)</code></pre><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C; update&#xC5D0; &#xD45C;&#xC2DC;&#xD558;&#xB824;&#xB294; item&#xC758; identifier(mountiains)&#xB97C; &#xCD94;&#xAC00;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233531440-17a53f01-e489-4f54-b46f-a7fa0127a118.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>appendItems&#xC758; &#xC2DC;&#xADF8;&#xB2C8;&#xCC98;&#xB97C; &#xBCF4;&#xBA74; &#xC54C; &#xC218; &#xC788;&#xB4EF; appendItems &#xBA54;&#xC18C;&#xB4DC;&#xC5D0;&#xB294; identifier &#xBC30;&#xC5F4;&#xC744; &#xC804;&#xB2EC;&#xD55C;&#xB2E4;.</p><blockquote>Hashable&#xACFC; &#xAC19;&#xC740; &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xCC44;&#xD0DD;&#xD55C; &#xAC1D;&#xCCB4;&#xB97C; &#xC804;&#xB2EC;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>snapshot&#xC744; &#xAD6C;&#xC131;&#xD588;&#xC73C;&#xB2C8;, &#xC774;&#xC81C; DiffableDataSource&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xACE0; snapshot&#xC744; &#xC801;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC694;&#xCCAD;&#xD574;&#xBCF4;&#xC790;</p><pre><code class="language-swift">let mountains = mountainsController.filteredMountains(with: filter).sorted { $0.name &lt; $1.name }

var snapshot = NSDiffableDataSourceSnapshot&lt;Section, MountainsController.Mountain&gt;()
snapshot.appendSections([.main])
snapshot.appendItems(mountains)
self.dataSource.apply(snapshot, animatingDifferences: true)
</code></pre><p>apply&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC785;&#xB825;&#xD558;&#xAE30;&#xC804;&#xC5D0; &#xC774;&#xC804; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xC8FC;&#xAE30;&#xC5D0;&#xC11C; &#xD45C;&#xC2DC;&#xD55C; &#xB0B4;&#xC6A9;&#xC5D0; &#xB300;&#xD574; &#xD30C;&#xC545;&#xD574;&#xC57C;&#xD558;&#xB294; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD560; &#xD544;&#xC694;&#xC5C6;&#xC774; &#xC774;&#xC804; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xC640; &#xB2E4;&#xC74C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xC0AC;&#xC774;&#xC758; &#xBCC0;&#xACBD;&#xB41C; &#xC0AC;&#xD56D;&#xC744; &#xD30C;&#xC545;&#xD55C;&#xB2E4;.</p><p>IndexPath&#xC640; &#xAC19;&#xC774; &#xAE68;&#xC9C0;&#xAE30; &#xC27D;&#xACE0; &#xC77C;&#xC2DC;&#xC801;&#xC778; &#xAC83;&#xC744; &#xB2E4;&#xB8E8;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2CC;, identifier&#xB97C; &#xB2E4;&#xB8EC;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233534006-8986c38b-69f9-4ec0-9fca-34b379a7d999.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><blockquote><code><a href="https://developer.apple.com/documentation/uikit/nsdiffabledatasourcesnapshot?ref=noah-ios.dev">NSDiffableDataSourceSnapshot</a></code> &#xC5D0; &#xB300;&#xD574; &#xC870;&#xAE08; &#xB354; &#xC0B4;&#xD3B4;&#xBD05;&#xC2DC;&#xB2E4;.</blockquote><p><code>NSDiffableDataSourceSnapshot&lt;SectionIdentifierType, ItemIdentifierType&gt;</code> &#xC740; Generic class&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <code>SectionIdentifierType</code> &#xBC0F; <code>ItemIdentifierType</code> &#xC5D0; &#xC758;&#xD574; parameterized&#xB41C;&#xB2E4;.</p><pre><code class="language-swift">enum Section: CaseIterable {
	case main
}</code></pre><p>&#xBA3C;&#xC800; snapshot&#xC744; &#xB9CC;&#xB4E4; &#xB54C; &#xC0AC;&#xC6A9;&#xD55C; <code>SectionIdentifierType</code> &#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790; </p><pre><code class="language-swift">var snapshot = NSDiffableDataSourceSnapshot&lt;Section, MountainsController.Mountain&gt;()</code></pre><p>Swift&#xC758; enum type&#xC740; Hashable&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <code>SectionIdentifierType</code> &#xC5D0; enum type&#xC744; &#xC804;&#xB2EC;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC774;&#xC81C; <code>ItemIdentifierType</code> &#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD55C; Mountain type&#xC5D0; &#xB300;&#xD574; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><pre><code class="language-swift">class MountainsController {
    struct Mountain: Hashable {
        let name: String
        let height: Int
        let identifier = UUID()
        
        func hash(into hasher: inout Hasher) {
            hasher.combine(identifier)
        }
        
        static func == (lhs: Mountain, rhs: Mountain) -&gt; Bool {
            return lhs.identifier == rhs.identifier
        }
        
        func contains(_ filter: String?) -&gt; Bool {
            guard let filterText = filter else { return true }
            if filterText.isEmpty { return true }
            let lowercasedFilter = filterText.lowercased()
            return name.lowercased().contains(lowercasedFilter)
        }
    }
    
    func filteredMountains(with filter: String?=nil, limit: Int?=nil) -&gt; [Mountain] {
        let filtered = mountains.filter { $0.contains(filter) }
        if let limit = limit {
            return Array(filtered.prefix(through: limit))
        } else {
            return filtered
        }
    }
    
    private lazy var mountains: [Mountain] = {
        return generateMountains()
    }()
}</code></pre><p>Mountain struct&#xB294; DiffableDataSource&#xC640; &#xD568;&#xAED8; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; Hashable &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xCC44;&#xD0DD;&#xD588;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; DiffableDataSourceSnapshot&#xC758; <code>IdenfitierType</code>&#xC73C;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xAE30; &#xC704;&#xD55C; &#xC911;&#xC694;&#xD55C; &#xC694;&#xAD6C;&#xC0AC;&#xD56D;&#xC740; &#xAC01; Mountain&#xC774; hash &#xAC12;&#xC73C;&#xB85C; &#xACE0;&#xC720;&#xD558;&#xAC8C; &#xC2DD;&#xBCC4;&#xB420; &#xC218; &#xC788;&#xC5B4;&#xC57C; &#xD55C;&#xB2E4;&#xB294; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xADF8;&#xB798;&#xC11C; &#xAC01; Mountain&#xC5D0; &#xACE0;&#xC720;&#xD55C; identifier&#xB97C; &#xBD80;&#xC5EC;&#xD568;&#xC73C;&#xB85C;&#xC368; &#xC774;&#xB97C; &#xB2EC;&#xC131;&#xD588;&#xB2E4;.</p><p>&#xB610;, identifier&#xC758; hash &#xAC12;&#xC740; &#xA0;DiffableDataSource&#xAC00; &#xB2E4;&#xC74C; &#xC5C5;&#xB370;&#xC774;&#xD2B8;&#xC5D0; &#xBB34;&#xC5C7;&#xC744; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xD574;&#xC57C;&#xD558;&#xB294;&#xC9C0; &#xC54C; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xACE0;&#xC720;&#xD558;&#xAC8C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</p><p>&#xB2E4;&#xC2DC; &#xB3CC;&#xC544;&#xC640;&#xC11C; DiffableDataSource&#xC5D0; &#xB300;&#xD55C; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xBC1C;&#xD589;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC744; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><p>&#xC608;&#xC81C;&#xC5D0;&#xC11C; data source&#xB97C; &#xAD6C;&#xC131;&#xD558;&#xB294; configureDataSource&#xB77C;&#xB294; &#xD568;&#xC218;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233603112-5972080d-14dd-4c57-a18e-6f8509acd5b0.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>collection view&#xB85C; &#xC791;&#xC5C5;&#xC744; &#xD558;&#xACE0; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; <code>UICollectionViewDiffableDataSource</code> &#xB97C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xD654; &#xD55C;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C; <code>UICollectionViewDiffablaDataSource</code> &#xAC00; Generic class&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; section &#xBC0F; item type&#xC73C;&#xB85C; parameterize&#xD55C;&#xB2E4;.</p><pre><code class="language-swift">self.dataSource = UICollectionViewDiffableDataSource&lt;Section, MountainsControlelr.Mountain&gt;(collectionView: self.mountainsCollectionView)</code></pre><p>&#xC704;&#xC640; &#xAC19;&#xC774; data source&#xB97C; &#xC5F0;&#xACB0;&#xD558;&#xB824;&#xACE0; &#xD558;&#xB294; Collection View&#xC5D0; &#xB300;&#xD55C; &#xCC38;&#xC870;&#xB97C; &#xC804;&#xB2EC;&#xD55C;&#xB2E4;.</p><p>&#xCC38;&#xC870;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xBA74; Diffable DataSource&#xB294; &#xD574;&#xB2F9; &#xD3EC;&#xC778;&#xD130;&#xB97C; &#xAC00;&#xC838;&#xC640; &#xD574;&#xB2F9; CollectionView&#xC758; data source&#xB85C; &#xC5F0;&#xACB0;&#xD55C;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C; trailing closure &#xB97C; &#xC804;&#xB2EC;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><p>&#xC774; trailing closure&#xB294; <code>UICollectionViewDiffableDataSource</code> &#xC758; init&#xC5D0;&#xC11C; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB4EF; CellProvider&#xC5D0; &#xB300;&#xD574; &#xC791;&#xC131;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-code-card"><pre><code class="language-swift">@MainActor public init(collectionView: UICollectionView, cellProvider: @escaping UICollectionViewDiffableDataSource&lt;SectionIdentifierType, ItemIdentifierType&gt;.CellProvider)</code></pre><figcaption>UICollectionViewDiffableDataSource init &#xC2DC;&#xADF8;&#xB2C8;&#xCC98;</figcaption></figure><pre><code class="language-swift">public typealias CellProvider = (_ collectionView: UICollectionView, _ indexPath: IndexPath, _ itemIdentifier: ItemIdentifierType) -&gt; UICollectionViewCell?</code></pre><p>&#xC774;&#xACF3;&#xC5D0; &#xC791;&#xC131;&#xD560; &#xCF54;&#xB4DC;&#xB294; data source&#xB97C; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; <code>cellForItemAtIndexPath</code> &#xB97C; &#xAD6C;&#xD604;&#xD560; &#xB54C;&#xC758; &#xB0B4;&#xC6A9;&#xACFC; &#xAC19;&#xB2E4;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://user-images.githubusercontent.com/63908856/233604706-dbdd0d77-11bc-45ea-9bb5-c6472f1d176b.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"><figcaption>cellForItemAtIndexPath &#xC120;&#xC5B8;&#xBD80;</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233607517-43a4ce44-299c-4dd5-bf64-6452fdf2c881.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>Collection View&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xACE0;, &#xC6D0;&#xD558;&#xB294; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD45C;&#xC2DC;&#xD560; &#xC801;&#xC808;&#xD55C; type&#xC758; cell&#xC744; &#xC694;&#xCCAD;&#xD55C;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; &#xADF8; cell&#xC744; &#xA0;&#xBCF4;&#xC5EC;&#xC8FC;&#xACE0; &#xC2F6;&#xC740; &#xB0B4;&#xC6A9;&#xC73C;&#xB85C; &#xCC44;&#xC6B4; &#xB2E4;&#xC74C; &#xB2E4;&#xC2DC; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xBC29;&#xAE08; &#xC791;&#xC131;&#xD55C; &#xCF54;&#xB4DC;&#xB294; <code>cellForItemAtIndexPath</code> &#xCF54;&#xB4DC;&#xB97C; data source&#xB97C; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xD654; &#xD560; &#xB54C; &#xC804;&#xB2EC;&#xD558;&#xB294; closure&#xB85C; &#xC774;&#xC2DD;&#xD55C; &#xAC83;&#xACFC; &#xAC19;&#xB2E4;.</p><p>&#xC704; &#xBC29;&#xC2DD;&#xC744; &#xC0AC;&#xC6A9;&#xD558;&#xBA74; &#xD574;&#xB2F9; IndexPath&#xB97C; &#xC774;&#xC6A9;&#xD574; Model layer&#xC5D0; &#xC788;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; &#xCC3E;&#xC744; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xB2E4;.</p><p>Collection View&#xB97C; &#xC124;&#xC815;&#xD558;&#xACE0; &#xAD6C;&#xC131;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD55C; &#xB2E4;&#xB978; &#xBAA8;&#xB4E0; &#xAC83;&#xC740; &#xC774;&#xC804;&#xACFC; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;.</p><p>&#xB2E4;&#xB978; &#xC608;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><!--kg-card-begin: html--><img src="https://user-images.githubusercontent.com/63908856/233834595-cb21bc59-8be1-44e7-851b-b4c4d77554e2.png" width="300px" alt="Advances in UI Data Sources"><!--kg-card-end: html--><p>&#xC774;&#xBC88;&#xC608;&#xC81C;&#xB294; iOS &#xC124;&#xC815; &#xC571;&#xC758; Wi-Fi &#xC124;&#xC815; UI&#xC608;&#xC81C;&#xC774;&#xB2E4;.</p><p>&#xC774; &#xC608;&#xC81C;&#xB294; &#xC139;&#xC158;&#xC774; &#xB450;&#xAC1C;&#xB85C; &#xB098;&#xB258;&#xC5B4;&#xC838;&#xC788;&#xB2E4;&#xB294; &#xD2B9;&#xC9D5;&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#xC0C1;&#xB2E8;&#xC5D0;&#xB294; Wi-Fi &#xD65C;&#xC131;&#xD654; / &#xBE44;&#xD65C;&#xC131;&#xD654; &#xC2A4;&#xC704;&#xCE58;, &#xD604;&#xC7AC; &#xC5F0;&#xACB0;&#xB41C; &#xD604;&#xC7AC; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xAC00; &#xC788;&#xB294; &#xC139;&#xC158;&#xC774; &#xC788;&#xACE0;, </p><p>&#xAC10;&#xC9C0;&#xB41C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; &#xB9AC;&#xC2A4;&#xD2B8;&#xB97C; &#xBCF4;&#xC5EC;&#xC8FC;&#xB294; (&#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xB418;&#xB294;) &#xB610; &#xB2E4;&#xB978; &#xC139;&#xC158;&#xC774; &#xC788;&#xB2E4;.</p><p>Wi-Fi&#xBE44;&#xD65C;&#xC131;&#xD654; &#xC2A4;&#xC704;&#xCE58;&#xB97C; tap&#xD558;&#xAC70;&#xB098; &#xB2E4;&#xC2DC; tap&#xD558;&#xBA74; &#xA0;&#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xC560;&#xB2C8;&#xBA54;&#xC774;&#xC158;&#xC774; &#xC801;&#xC6A9;&#xB41C;&#xB2E4;.</p><!--kg-card-begin: html--><img src="https://user-images.githubusercontent.com/63908856/233834975-ea9e486e-0372-4334-8ccc-db4395c00e67.gif" width="300px" alt="Advances in UI Data Sources"><!--kg-card-end: html--><p>&#xC774;&#xB7EC;&#xD55C; &#xB3D9;&#xC801; UI&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xAD6C;&#xD604;&#xD558;&#xB294;&#xC9C0; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><p>&#xBA3C;&#xC800; (<a href="https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views?ref=noah-ios.dev">&#xC608;&#xC81C;</a>)&#xC758; &#xA0;<code>WiFiSettingsViewController</code>&#xC758; <code>updateUI</code> &#xD568;&#xC218;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><pre><code class="language-swift">    /// - Tag: WiFiUpdate
    func updateUI(animated: Bool = true) {
        guard let controller = self.wifiController else { return }

        let configItems = self.configurationItems.filter { ($0.type == .currentNetwork &amp;&amp; (controller.wifiEnabled == false)) == false }

        self.currentSnapshot = NSDiffableDataSourceSnapshot&lt;Section, Item&gt;()

        self.currentSnapshot.appendSections([.config])
        self.currentSnapshot.appendItems(configItems, toSection: .config)

        if controller.wifiEnabled {
            let sortedNetworks = controller.availableNetworks.sorted { $0.name &lt; $1.name }
            let networkItems = sortedNetworks.map { Item(network: $0) }
            self.currentSnapshot.appendSections([.networks])
            self.currentSnapshot.appendItems(networkItems, toSection: .networks)
        }

        self.dataSource.apply(self.currentSnapshot, animatingDifferences: animated)
    }
</code></pre><p>&#xD45C;&#xC2DC;&#xD574;&#xC57C;&#xD560; &#xB0B4;&#xC6A9;&#xC774; &#xBCC0;&#xACBD;&#xB420; &#xB54C; &#xB9C8;&#xB2E4; &#xC774; &#xD568;&#xC218;&#xAC00; &#xD638;&#xCD9C;&#xB418;&#xB3C4;&#xB85D; &#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><p>&#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; 3&#xB2E8;&#xACC4; &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC640; &#xB3D9;&#xC77C;&#xD558;&#xB2E4;.</p><pre><code class="language-swift">self.currentSnapshot = NSDiffableDataSourceSnapshot&lt;Section, Item&gt;()</code></pre><p>&#xBA3C;&#xC800; snapshot&#xC744; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;. </p><p>snapshot&#xC744; &#xBCF4;&#xC5EC;&#xC8FC;&#xB824;&#xACE0; &#xD558;&#xB294; &#xB0B4;&#xC6A9;&#xC73C;&#xB85C; &#xCC44;&#xC6CC;&#xBCF4;&#xC790;</p><pre><code class="language-swift">enum Section: CaseIterable {
	case config, networks
}
</code></pre><p>&#xBA3C;&#xC800; Section&#xC744; &#xB9CC;&#xB4E4;&#xACE0;, &#xB9E8; &#xC704;&#xC5D0; &#xD45C;&#xC2DC;&#xB418;&#xB294; &#xCCAB;&#xBC88;&#xC9F8; &#xC139;&#xC158;&#xC778; config &#xC139;&#xC158;&#xC744; &#xCD94;&#xAC00;&#xD558;&#xC790;</p><pre><code class="language-swift">func updateUI(animated: Bool = true) {
	guard let controller = self.wifiController else { return }

	let configItems = self.configurationItems.filter { ($0.type == .currentNetwork &amp;&amp; (controller.wifiEnabled == false)) == false }

	self.currentSnapshot = NSDiffableDataSourceSnapshot&lt;Section, Item&gt;()

	self.currentSnapshot.appendSections([.config])
    self.currentSnapshot.appendItems(configItems, toSection: .config)
}</code></pre><p>&#xADF8;&#xB9AC;&#xACE0; config section&#xC5D0; item&#xC744; &#xCD94;&#xAC00;&#xD55C;&#xB2E4;.</p><p>&#xC774;&#xC81C; Wi-Fi&#xAC00; &#xD65C;&#xC131;&#xD654;&#xB418;&#xBA74; Model layer&#xC640; &#xD1B5;&#xC2E0;&#xD558;&#xC5EC; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD55C; &#xB124;&#xD2B8;&#xC6CC;&#xD06C;&#xC758; &#xB9AC;&#xC2A4;&#xD2B8;&#xB97C; &#xBC1B;&#xC544;&#xC628;&#xB2E4;.</p><pre><code class="language-swift">func updateUI(animated: Bool = true) {
	guard let controller = self.wifiController else { return }

	let configItems = self.configurationItems.filter { ($0.type == .currentNetwork &amp;&amp; (controller.wifiEnabled == false)) == false }

	self.currentSnapshot = NSDiffableDataSourceSnapshot&lt;Section, Item&gt;()

	self.currentSnapshot.appendSections([.config])
    self.currentSnapshot.appendItems(configItems, toSection: .config)
    
    if controller.wifiEnabled {
            let sortedNetworks = controller.availableNetworks.sorted { $0.name &lt; $1.name }
            let networkItems = sortedNetworks.map { Item(network: $0) }
            self.currentSnapshot.appendSections([.networks])
            self.currentSnapshot.appendItems(networkItems, toSection: .networks)
        }
}</code></pre><p>&#xADF8;&#xB9AC;&#xACE0; &#xC7A0;&#xC2DC; &#xD6C4;&#xC5D0; &#xC0B4;&#xD3B4;&#xBCFC; Item type&#xC73C;&#xB85C; &#xD574;&#xB2F9; list&#xB97C; wrapping&#xD55C;&#xB2E4;.</p><pre><code class="language-swift">let networkItems = sortedNetworks.map { Item(network: $0) }</code></pre><p>&#xD574;&#xB2F9; network list&#xC5D0; &#xB300;&#xD574; section&#xC744; &#xCD94;&#xAC00;&#xD558;&#xACE0;, section&#xC5D0; item&#xC744; &#xCD94;&#xAC00;&#xD55C;&#xB2E4;.</p><p>&#xB450; &#xAC1C;&#xC758; &#xC11C;&#xB85C; &#xB2E4;&#xB978; section&#xC774; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC01; Item set&#xC744; &#xCD94;&#xAC00;&#xD558;&#xB294; section&#xC744; &#xC704;&#xC640; &#xAC19;&#xC774; &#xBA85;&#xC2DC;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC774;&#xC81C; Diffable DataSource&#xC5D0; &#xC774;&#xB7EC;&#xD55C; &#xBCC0;&#xACBD; &#xC0AC;&#xD56D;&#xC744; &#xC801;&#xC6A9;&#xD558;&#xB3C4;&#xB85D; &#xC694;&#xCCAD;&#xD558;&#xACE0;, &#xC120;&#xD0DD;&#xC801;&#xC73C;&#xB85C; difference&#xC5D0; &#xB300;&#xD574; animation&#xC744; &#xC801;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; UI&#xB97C; &#xCC98;&#xC74C; &#xBD88;&#xB7EC;&#xC624;&#xACE0; &#xCD08;&#xAE30; &#xB370;&#xC774;&#xD130; set&#xC744; &#xD45C;&#xC2DC;&#xD560; &#xB54C; animation&#xC801;&#xC6A9;&#xC744; &#xC6D0;&#xD560; &#xC218;&#xB3C4; &#xC788;&#xACE0;, &#xC6D0;&#xD558;&#xC9C0; &#xC54A;&#xC744; &#xC218;&#xB3C4; &#xC788;&#xB2E4;.</p><pre><code class="language-swift">self.dataSource.apply(self.currentSnapshot, animatingDifferences: animated)</code></pre><p>&#xB530;&#xB77C;&#xC11C; &#xC704;&#xC640; &#xAC19;&#xC774; &#xC635;&#xC158;&#xC744; &#xC904; &#xC218; &#xC788;&#xB2E4;.</p><blockquote>&#xC774; &#xC138;&#xC158;&#xC5D0;&#xC11C;&#xB294; enum type&#xC774; Hashable&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Section&#xC744; enum&#xC73C;&#xB85C; &#xC815;&#xC758;&#xD574; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC744; &#xAD8C;&#xC7A5;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</blockquote><p>&#xC790; &#xC774;&#xC81C; &#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF4;&#xAE30;&#xB85C; &#xD588;&#xB358; Item struct&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><pre><code class="language-swift">enum ItemType {
	case wifiEnabled, currentNetwork, availableNetwork
}

struct Item: Hashable {
	let title: String
    let type: ItemType
    let network: WiFiController.Network?

	init(title: String, type: ItemType) {
    	self.title = title
        self.type = type
        self.network = nil
        self.identifier = UUID()
	}
    
    init(network: WiFiController.Network) {
    	self.title = network.name
        self.type = .availableNetwork
        self.network = network
        self.identifier = network.identifier
	}
    var isConfig: Bool {
    let configItems: [ItemType] = [.currentNetwork, .wifiEnabled]
    return configItems.contains(type)
	}
    
    var isNetwork: Bool {
    	return type == .availableNetwork
	}

	private let identifier: UUID
    
    func hash(into hasher: inout Hasher) {
    	hasher.combine(self.identifier)
	}
}</code></pre><p>Mountain &#xAD6C;&#xC870;&#xCCB4;&#xC640; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; Hashable &#xD504;&#xB85C;&#xD1A0;&#xCF5C;&#xC744; &#xCC44;&#xD0DD;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#xC774; type&#xC744; &#xC120;&#xC5B8;&#xD558;&#xB294; &#xC774;&#xC720;&#xB294; list&#xB97C; &#xBCFC; &#xB54C; &#xB300;&#xBD80;&#xBD84; &#xB124;&#xD2B8;&#xC6CC;&#xD06C; item&#xC778; list&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;.</p><p>&#xD558;&#xC9C0;&#xB9CC; &#xADF8; &#xC678;&#xC5D0;&#xB3C4; &#xB9E8; &#xC704;&#xC5D0; Wi-Fi &#xD65C;&#xC131;&#xD654;/&#xBE44;&#xD65C;&#xC131;&#xD654; &#xC2A4;&#xC704;&#xCE58;&#xB97C; &#xD3EC;&#xD568;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#xC774;&#xB294; network item&#xC774; &#xC544;&#xB2CC;, Configuration item&#xC774;&#xB2E4;.</p><p>&#xC5EC;&#xAE30;&#xC11C; &#xC6B0;&#xB9AC;&#xAC00; &#xD574;&#xC57C;&#xD558;&#xB294; &#xC77C;&#xC740; Item&#xC774;&#xB77C;&#xB294; generic wrapper type&#xC5D0; &#xAC01; item&#xC744; &#xCEA1;&#xC290;&#xD654; &#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;. &#xADF8;&#xB7EC;&#xB098; wrapper type&#xC740; Diffable Data Source&#xB97C; &#xC804;&#xB2EC;&#xD560; Item type&#xC774;&#xBBC0;&#xB85C; Hashable&#xC744; &#xCC44;&#xD0DD;&#xD558;&#xACE0;, Item&#xC774; Hash &#xAC12;&#xC73C;&#xB85C; &#xACE0;&#xC720;&#xD558;&#xAC8C; &#xC2DD;&#xBCC4;&#xB418;&#xB294;&#xC9C0; &#xD655;&#xC778;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; network item&#xC758; &#xACBD;&#xC6B0; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; network list&#xC5D0;&#xC11C; identifier&#xB97C; &#xAC00;&#xC838;&#xC640; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><pre><code class="language-swift">init(network: WiFiController.Network) {
	self.title = network.name
    self.type = .availableNetwork
    self.network = network
    self.identifier = network.identifier
}</code></pre><p>config item&#xC758; &#xACBD;&#xC6B0; UUID&#xB97C; &#xC544;&#xB798;&#xC640; &#xAC19;&#xC774; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;.</p><pre><code class="language-swift">init(title: String, type: ItemType) {
	self.title = title
    self.type = type
    self.network = nil
    self.identifier = UUID()
}</code></pre><pre><code class="language-swift">func hash(into hasher: inout Hasher) {
	hasher.combine(self.identifier)
}</code></pre><p>Item type&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4; &#xBA54;&#xC18C;&#xB4DC; hash&#xB97C; &#xBCF4;&#xBA74; identifier&#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; hash &#xAC12;&#xC744; &#xACC4;&#xC0B0;&#xD55C;&#xB2E4;.</p><p>&#xC774;&#xAC83;&#xC774; Diffable Data Source&#xAC00; &#xD55C; &#xC5C5;&#xB370;&#xC774;&#xD2B8; &#xC8FC;&#xAE30;&#xC5D0;&#xC11C; &#xB2E4;&#xC74C; &#xC8FC;&#xAE30;&#xAE4C;&#xC9C0; &#xB3D9;&#xC77C;&#xD55C; item&#xC744; &#xC2DD;&#xBCC4;&#xD560; &#xC218; &#xC788;&#xB294;&#xB370; &#xD544;&#xC694;&#xD55C; &#xC804;&#xBD80;&#xC774;&#xB2E4;.</p><p>DataSource&#xB97C; configure&#xD558;&#xB294; &#xD568;&#xC218;&#xC778; configureDataSource &#xD568;&#xC218;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><pre><code class="language-swift">func configureDataSource() {
        self.wifiController = WiFiController { [weak self] (controller: WiFiController) in
            guard let self = self else { return }
            self.updateUI()
        }

        self.dataSource = UITableViewDiffableDataSource
        &lt;Section, Item&gt;(tableView: self.tableView) { [weak self]
                (tableView: UITableView, indexPath: IndexPath, item: Item) -&gt; UITableViewCell? in
            guard let self = self, let wifiController = self.wifiController else { return nil }

            let cell = tableView.dequeueReusableCell(
                withIdentifier: WiFiSettingsViewController.reuseIdentifier,
                for: indexPath)
            
            var content = cell.defaultContentConfiguration()
            // network cell
            if item.isNetwork {
                content.text = item.title
                cell.accessoryType = .detailDisclosureButton
                cell.accessoryView = nil

            // configuration cells
            } else if item.isConfig {
                content.text = item.title
                if item.type == .wifiEnabled {
                    let enableWifiSwitch = UISwitch()
                    enableWifiSwitch.isOn = wifiController.wifiEnabled
                    enableWifiSwitch.addTarget(self, action: #selector(self.toggleWifi(_:)), for: .touchUpInside)
                    cell.accessoryView = enableWifiSwitch
                } else {
                    cell.accessoryView = nil
                    cell.accessoryType = .detailDisclosureButton
                }
            } else {
                fatalError(&quot;Unknown item type!&quot;)
            }
            cell.contentConfiguration = content
            return cell
        }
        self.dataSource.defaultRowAnimation = .fade

        self.wifiController.scanForNetworks = true
    }
</code></pre><p>&#xC774;&#xC804; &#xC608;&#xC81C;&#xC640;&#xB294; &#xB2E4;&#xB974;&#xAC8C; UITableView&#xB85C; &#xC791;&#xC5C5;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><blockquote>Snapshot &#xC0DD;&#xC131; &#xBC0F; commit&#xC758; &#xAD00;&#xC810;&#xC5D0;&#xC11C; &#xBCFC; &#xB54C; API&#xB294; &#xB9E4;&#xC6B0; &#xC720;&#xC0AC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; CollectionView, TableView&#xC758; &#xC5EC;&#xBD80;&#xAC00; &#xC774; &#xC608;&#xC81C;&#xC5D0;&#xC11C;&#xB294; &#xC911;&#xC694;&#xD558;&#xC9C0;&#xB294; &#xC54A;&#xC740; &#xAC83; &#xAC19;&#xB2E4;. </blockquote><pre><code class="language-swift">self.dataSource = UITableViewDiffableDataSource
            &lt;Section, Item&gt;(tableView: self.tableView)</code></pre><p><code>UITableViewDiffableDataSource</code>&#xC5ED;&#xC2DC; &#xA0;Generic class &#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Section, Item&#xC73C;&#xB85C; &#xD574;&#xB2F9; &#xD074;&#xB798;&#xC2A4; &#xC774;&#xB984;&#xC744; parameterized &#xD55C;&#xB2E4;.</p><p>&#xADF8;&#xB9AC;&#xACE0; tableView&#xC5D0; &#xB300;&#xD55C; &#xCC38;&#xC870;&#xB97C; &#xC804;&#xB2EC;&#xD558;&#xBA74; &#xBC29;&#xAE08; &#xC0DD;&#xC131;&#xD55C; Diffable DataSource&#xAC00; &#xC5F0;&#xACB0;&#xB41C;&#xB2E4;.</p><p>&#xADF8; &#xB2E4;&#xC74C; cell provider&#xC778; trailing closure&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><p>&#xC5B8;&#xB73B; &#xBCF4;&#xAE30;&#xC5D0; &#xBCF5;&#xC7A1;&#xD574; &#xBCF4;&#xC774;&#xC9C0;&#xB9CC; &#xB2E4;&#xC591;&#xD55C; type&#xC758; item&#xC774; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xADF8;&#xB807;&#xAC8C; &#xBCF4;&#xC77C; &#xBFD0;&#xC774;&#xB2E4;.</p><p>&#xC774; &#xC608;&#xC81C;&#xC5D0;&#xC11C;&#xB294; &#xC138; &#xAC00;&#xC9C0; type&#xC758; item&#xC774; &#xC788;&#xC73C;&#xBA70; &#xC11C;&#xB85C; &#xB2E4;&#xB974;&#xAC8C; &#xCC98;&#xB9AC;&#xD558;&#xACE0; &#xC788;&#xB2E4;.</p><pre><code class="language-swift"> self.dataSource = UITableViewDiffableDataSource
        &lt;Section, Item&gt;(tableView: self.tableView) { [weak self]
                (tableView: UITableView, indexPath: IndexPath, item: Item) -&gt; UITableViewCell? in
            guard let self = self, let wifiController = self.wifiController else { return nil }

            let cell = tableView.dequeueReusableCell(
                withIdentifier: WiFiSettingsViewController.reuseIdentifier,
                for: indexPath)
            
            var content = cell.defaultContentConfiguration()
            // network cell
            if item.isNetwork {
                content.text = item.title
                cell.accessoryType = .detailDisclosureButton
                cell.accessoryView = nil

            // configuration cells
            } else if item.isConfig {
                content.text = item.title
                if item.type == .wifiEnabled {
                    let enableWifiSwitch = UISwitch()
                    enableWifiSwitch.isOn = wifiController.wifiEnabled
                    enableWifiSwitch.addTarget(self, action: #selector(self.toggleWifi(_:)), for: .touchUpInside)
                    cell.accessoryView = enableWifiSwitch
                } else {
                    cell.accessoryView = nil
                    cell.accessoryType = .detailDisclosureButton
                }
            } else {
                fatalError(&quot;Unknown item type!&quot;)
            }
            cell.contentConfiguration = content
            return cell
        }</code></pre><p>&#xB9C8;&#xC9C0;&#xB9C9; &#xC608;&#xC81C;&#xB97C; &#xBCF4;&#xC790; </p><blockquote>&#xC608;&#xC81C;&#xB97C; &#xD1B5;&#xD574; &#xC810;&#xC810; &#xBC18;&#xBCF5;&#xB418;&#xB294; &#xD328;&#xD134;&#xC774; &#xBCF4;&#xC774;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD560; &#xC218; &#xC788;&#xB2E4;.</blockquote><p>&#xB9C8;&#xC9C0;&#xB9C9; &#xC608;&#xC81C;&#xB294; &#xC0C9;&#xC0C1;(Color) &#xACAC;&#xBCF8;&#xC774; &#xD45C;&#xC2DC;&#xB418;&#xB294; item&#xC744; &#xD45C;&#xC2DC;&#xD558;&#xB294; UICollectionView&#xC774;&#xB2E4;.</p><!--kg-card-begin: html--><img src="https://user-images.githubusercontent.com/63908856/233837003-3920bff3-2e71-4092-93bf-64fa5c45c8a2.png" width="300px" alt="Advances in UI Data Sources"><!--kg-card-end: html--><p>&#xCC98;&#xC74C;&#xC5D0;&#xB294; random &#xC21C;&#xC11C;&#xB85C; &#xC0C9;&#xC0C1;&#xC774; &#xC9C0;&#xC815;&#xB41C;&#xB2E4;.</p><p>sort button&#xC744; tap&#xD558;&#xBA74; &#xC2A4;&#xD399;&#xD2B8;&#xB7FC; &#xC21C;&#xC11C;&#xB85C; <a href="https://ko.wikipedia.org/wiki/%EC%82%BD%EC%9E%85_%EC%A0%95%EB%A0%AC?ref=noah-ios.dev">&#xC0BD;&#xC785; &#xC815;&#xB82C;</a>&#xC774; &#xC9C4;&#xD589; &#xB41C;&#xB2E4;.</p><!--kg-card-begin: html--><img src="https://user-images.githubusercontent.com/63908856/233837094-38b3333e-3890-4067-8159-47abf279cc26.gif" width="300px" alt="Advances in UI Data Sources"><!--kg-card-end: html--><p>&#xC704; &#xC608;&#xC81C;&#xB294; update&#xB97C; config&#xD558;&#xACE0; commit&#xD558;&#xB294; &#xBC29;&#xC2DD;&#xC774; &#xB2E4;&#xB978; &#xC608;&#xC81C;&#xC640; &#xC0B4;&#xC9DD; &#xB2E4;&#xB974;&#xB2E4;.</p><blockquote>&#xAD6C;&#xCCB4;&#xC801;&#xC73C;&#xB85C; snapshot&#xC744; &#xBD88;&#xB7EC;&#xC624;&#xB294; &#xBD80;&#xBD84;&#xC774; &#xB2E4;&#xB974;&#xB2E4;.</blockquote><p>&#xBA3C;&#xC800; (<a href="https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/implementing_modern_collection_views?ref=noah-ios.dev">&#xC608;&#xC81C;</a>)&#xC758; &#xA0;<code>InsertionSortViewController</code> &#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><p>&#xBA3C;&#xC800; <code>performSortStep</code> &#xD568;&#xC218;&#xB97C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</p><p>&#xC774;&#xBC88;&#xC5D0;&#xB3C4; &#xC704;&#xC5D0;&#xC11C; &#xC9C4;&#xD589;&#xD588;&#xB358; 3&#xB2E8;&#xACC4;&#xC758; cycle&#xC744; &#xAC00;&#xC9C0;&#xACE0; &#xC788;&#xB2E4;.</p><p>&#xC774;&#xBC88;&#xC5D0;&#xB3C4; snapshot&#xC744; &#xC0DD;&#xC131;&#xD558;&#xACE0;, &#xCC44;&#xC6B4; &#xB2E4;&#xC74C; &#xC801;&#xC6A9;&#xD55C;&#xB2E4;.</p><pre><code class="language-swift">    /// - Tag: InsertionSortStep
    func performSortStep() {
        if self.isSorting == false {
            return
        }

        var sectionCountNeedingSort = 0

        // Get the current state of the UI from the data source.
        var updatedSnapshot = self.dataSource.snapshot()

        // For each section, if needed, step through and perform the next sorting step.
        updatedSnapshot.sectionIdentifiers.forEach {
            let section = $0
            if section.isSorted == false {

                // Step the sort algorithm.
                section.sortNext()
                let items = section.values

                // Replace the items for this section with the newly sorted items.
                updatedSnapshot.deleteItems(items)
                updatedSnapshot.appendItems(items, toSection: section)

                sectionCountNeedingSort += 1
            }
        }

        var shouldReset = false
        var delay = 125
        if sectionCountNeedingSort &gt; 0 {
            self.dataSource.apply(updatedSnapshot)
        } else {
            delay = 1000
            shouldReset = true
        }
        let bounds = insertionCollectionView.bounds
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(delay)) {
            if shouldReset {
                let snapshot = self.randomizedSnapshot(for: bounds)
                self.dataSource.apply(snapshot, animatingDifferences: false)
            }
            self.performSortStep()
        }
    }
</code></pre><p>&#xADF8;&#xB7EC;&#xB098; &#xC704;&#xC758; &#xACBD;&#xC6B0; &#xBE44;&#xC5B4;&#xC788;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; snapshot&#xC744; &#xC0DD;&#xC131;&#xD558;&#xB294; &#xB300;&#xC2E0;&#xC5D0;</p><pre><code class="language-swift">var updatedSnapshot = self.dataSource.snapshot()</code></pre><p>Diffable DataSource&#xC5D0; &#xD604;&#xC7AC; snapshot&#xC744; &#xC694;&#xCCAD;&#xD558;&#xB294; &#xAE30;&#xB2A5;&#xC744; &#xD65C;&#xC6A9;&#xD55C;&#xB2E4;.</p><p>&#xC774;&#xC81C; &#xC774; snapshot&#xC740; <code>UICollectionView</code> &#xC5D0; &#xD45C;&#xC2DC;&#xB418;&#xB294; &#xD604;&#xC7AC; &#xC0C1;&#xD0DC;&#xB85C; snapshot&#xC774; &#xBBF8;&#xB9AC; &#xCC44;&#xC6CC;&#xC9C4;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xCC98;&#xC74C;&#xBD80;&#xD130; &#xB2E4;&#xC2DC; &#xC2DC;&#xC791;&#xD560; &#xD544;&#xC694;&#xAC00; &#xC5C6;&#xACE0;, &#xD574;&#xB2F9; &#xC0C1;&#xD0DC;&#xC5D0;&#xC11C; &#xC2DC;&#xC791;&#xD558;&#xC5EC; &#xB2E4;&#xC74C; &#xC911;&#xAC04; &#xC0C1;&#xD0DC;&#xB97C; &#xACC4;&#xC0B0; &#xD574;&#xB0BC; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xB2E4;&#xC74C;&#xC73C;&#xB85C; snapshot&#xC744; &#xCC44;&#xC6B0;&#xB294; &#xBD80;&#xBD84;&#xC5D0;&#xC11C; </p><pre><code class="language-swift">updatedSnapshot.deleteItems(items)
updatedSnapshot.appendItems(items, toSection: section)</code></pre><p><code>deleteItems</code> , <code>appendItems</code>&#xAC00; &#xD638;&#xCD9C;&#xB418;&#xB294; &#xAC83;&#xC744; &#xBCFC; &#xC218; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233838426-00e91a93-d4cb-4fa1-a6bc-2c15debbcd99.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>Snapshot API&#xB97C; &#xBCF4;&#xBA74; &#xC774;&#xB7EC;&#xD55C; &#xC885;&#xB958;&#xC758; &#xC791;&#xC5C5;&#xC744; &#xC218;&#xD589;&#xD560; &#xB54C; &#xAE30;&#xC874; Snapshot&#xC744; &#xC218;&#xC815;&#xD560; &#xC218; &#xC788;&#xB294; &#xB2E4;&#xC591;&#xD55C; &#xAE30;&#xB2A5;&#xC774; &#xC788;&#xC74C;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><pre><code class="language-swift">self.dataSource.apply(updatedSnapshot)</code></pre><p>&#xC55E;&#xC11C; &#xC0B4;&#xD3B4;&#xBD24;&#xB358; &#xBC29;&#xC2DD;&#xACFC; &#xAC19;&#xC774; &#xB9C8;&#xC9C0;&#xB9C9;&#xC73C;&#xB85C; &#xC644;&#xB8CC;&#xB418;&#xBA74; &#xD574;&#xB2F9; snapshot&#xC744; Diffable DataSource&#xC5D0; &#xC801;&#xC6A9;&#xD558;&#xAE30;&#xB9CC; &#xD558;&#xBA74;&#xB41C;&#xB2E4;.</p><p>Diffable DataSource&#xB97C; &#xC124;&#xC815;&#xD574;&#xC8FC;&#xB294; configureDataSource&#xD568;&#xC218;&#xB97C; &#xBCF4;&#xC790;</p><pre><code class="language-swift">self.dataSource = UICollectionViewDiffableDataSource&lt;InsertionSortArray, InsertionSortArray.SortNode&gt;(collectionView: self.insertionCollectionView) {
            (collectionView: UICollectionView, indexPath: IndexPath, sortNode: InsertionSortArray.SortNode) -&gt; UICollectionViewCell? in
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: InsertionSortViewController.reuseIdentifier, for: indexPath)
            cell.backgroundColor = sortNode.color
            return cell
}</code></pre><p>&#xC0AC;&#xC6A9;&#xC911;&#xC778; type&#xC778; Collection View&#xB97C; &#xC9C0;&#xC815;&#xD55C; &#xB2E4;&#xC74C; cell provider closure&#xB97C; &#xC791;&#xC131;&#xD55C;&#xB2E4;.</p><p>&#xC774; &#xC608;&#xC81C;&#xC5D0;&#xC11C;&#xB294; color&#xB9CC; &#xD45C;&#xC2DC;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xB9E4;&#xC6B0; &#xAC04;&#xB2E8;&#xD558;&#xB2E4;.</p><h2 id="considerations">Considerations</h2><p>&#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; API&#xB97C; &#xD65C;&#xC6A9;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC758; &#xB514;&#xD14C;&#xC77C;&#xC801;&#xC778; &#xBD80;&#xBD84;&#xC5D0; &#xB300;&#xD574; &#xC870;&#xAE08; &#xB354; &#xC54C;&#xC544;&#xBCF4;&#xC790;</p><p>&#xC55E;&#xC11C; &#xCF54;&#xB4DC;&#xC608;&#xC81C;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xB4EF; Diffable DataSource&#xB294; &#xAE30;&#xBCF8;&#xC801;&#xC73C;&#xB85C; &#xC138; &#xB2E8;&#xACC4;&#xB97C; &#xAC70;&#xCE5C;&#xB2E4;.</p><ol><li>Snapshot&#xC744; &#xB9CC;&#xB4E0;&#xB2E4;.</li><li>&#xD544;&#xC694;&#xC5D0; &#xB530;&#xB77C; configure&#xD55C;&#xB2E4;.</li><li>apply</li></ol><p>&#xB530;&#xB77C;&#xC11C; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC774; &#xC0DD;&#xAE30;&#xBA74; &#xD56D;&#xC0C1; apply &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><p>Snapshot&#xC744; &#xB9CC;&#xB4DC;&#xB294; &#xB450;&#xAC00;&#xC9C0; &#xBC29;&#xBC95;&#xC774; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233843807-2ca36701-b7b2-451b-a6b8-6fb4d6c50f40.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xAC00;&#xC7A5; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xBC29;&#xBC95;&#xC740; &#xBE48; snapshot&#xC744; &#xB9CC;&#xB4E4;&#xC5B4; Section &#xBC0F; item&#xC5D0; &#xB300;&#xD55C; type&#xC73C;&#xB85C; snapshot&#xC744; &#xAD6C;&#xC131;&#xD55C;&#xB2E4;.</p><p>&#xB450;&#xBC88;&#xC9F8; &#xBC29;&#xBC95;&#xC740; Color &#xC815;&#xB82C; &#xC608;&#xC81C;&#xC5D0;&#xC11C; &#xBCF8; &#xAC83; &#xCC98;&#xB7FC; &#xD604;&#xC7AC; Collection View, Table View&#xC758; snapshot&#xC744; &#xBD88;&#xB7EC;&#xC62C; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC774; &#xBC29;&#xBC95;&#xC740; &#xC544;&#xC8FC; &#xC791;&#xC740; &#xAC83; &#xD558;&#xB098;&#xB97C; &#xC218;&#xC815;&#xD574;&#xC57C; &#xD558;&#xB294; &#xD2B9;&#xC815; &#xC791;&#xC5C5;&#xC774; &#xBC1C;&#xC0DD;&#xD560; &#xB54C; &#xC720;&#xC6A9;&#xD558;&#xB2E4;.</p><pre><code class="language-swift">let snapshot = self.dataSource.snapshot()</code></pre><p>&#xC704;&#xCC98;&#xB7FC; &#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xBA74; snapshot&#xC774;&#xB77C;&#xB294; &#xC0C1;&#xC218;&#xC5D0;&#xB294; copy(&#xC0AC;&#xBCF8;)&#xAC00; &#xC800;&#xC7A5;&#xB41C;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; <code>self.dataSource</code>&#xC5D0;&#xB294; &#xC601;&#xD5A5;&#xC744; &#xB07C;&#xCE58;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233844128-72e7cc57-615b-451a-b403-8c6d3b19a905.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xB610;, snapshot&#xC758; &#xC0C1;&#xD0DC;&#xC5D0; &#xB300;&#xD574; &#xC54C; &#xC218; &#xC788;&#xB294; API&#xC5ED;&#xC2DC; &#xC874;&#xC7AC;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233844187-54a3fad0-5aed-4228-a277-296d13aef277.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>snapshot&#xC744; configure&#xD560; &#xB54C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; API&#xC5D0;&#xC11C; &#xBCFC; &#xC218; &#xC788;&#xB4EF; IndexPath&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</p><p>&#xC9C0;&#xAE08;&#xAE4C;&#xC9C0; item&#xC744; &#xCD94;&#xAC00;&#xD558;&#xACE0; section&#xC744; &#xCD94;&#xAC00;&#xD558;&#xB294; &#xB4F1;&#xC758; &#xB9E4;&#xC6B0; &#xC77C;&#xBC18;&#xC801;&#xC778; &#xD328;&#xD134;&#xC758; &#xC608;&#xC81C;&#xB97C; &#xBCF4;&#xC558;&#xB2E4;.</p><p>&#xC138;&#xBC88;&#xC9F8; &#xD568;&#xC218;&#xC758; &#xC2DC;&#xADF8;&#xB2C8;&#xCC98;&#xB97C; &#xBCF4;&#xC790;</p><pre><code class="language-swift">func appendItems(_ identifiers: [ItemIdentifierType], toSection sectionIdentifier: SectionIdentifierType? = nil)</code></pre><p>&#xC774; &#xD568;&#xC218; &#xC2DC;&#xADF8;&#xB2C8;&#xCC98;&#xC758; &#xACBD;&#xC6B0; <code>sectionIdentifier</code> &#xC5D0; default parameter&#xAC00; nil&#xB85C; &#xC9C0;&#xC815;&#xB418;&#xC5B4;&#xC788;&#xB2E4;. nil&#xB85C; &#xC9C0;&#xC815;&#xB420; &#xACBD;&#xC6B0;, &#xB9C8;&#xC9C0;&#xB9C9;&#xC73C;&#xB85C; &#xC54C;&#xB824;&#xC9C4; section&#xC5D0; &#xCD94;&#xAC00;&#xB41C;&#xB2E4;.</p><h2 id="identifiers">Identifiers</h2><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233844538-3eba51c1-febf-4dd7-9169-ec20c93b4492.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF4;&#xC558;&#xB358; &#xAC83;&#xCC98;&#xB7FC; Model &#xB370;&#xC774;&#xD130;&#xB97C; identifier&#xB85C; &#xAC00;&#xC838;&#xC62C; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xAC83;&#xC744; &#xD655;&#xC778;&#xD588;&#xB2E4;. </p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233844821-c0034abe-9836-4756-bbaf-4dd7fdef018f.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xC774;&#xB97C; &#xC704;&#xD574;&#xC120; Hashable&#xC744; &#xCC44;&#xD0DD;&#xD558;&#xACE0; &#xC788;&#xC5B4;&#xC57C; &#xD558;&#xBA70;, &#xACE0;&#xC720;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233844879-f6128f16-2a4b-4758-b59d-4574571a4da8.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>DiffableDataSource&#xB294; Idenfier&#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; Model&#xC744; &#xC2DD;&#xBCC4;&#xD588;&#xB294;&#xB370; IndexPath&#xAE30;&#xBC18;&#xC758; API&#xC5D0;&#xC11C;&#xB294; identifier&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD560;&#xAE4C;?</p><p>&#xC608;&#xB97C; &#xBCF4;&#xC790;</p><p>SDK&#xC5D0;&#xB294; &#xC218;&#xB9CE;&#xC740; IndexPath&#xAE30;&#xBC18;&#xC758; API&#xAC00; &#xC788;&#xB2E4;.</p><p>+&#xB300;&#xBD80;&#xBD84; delegate &#xBA54;&#xC11C;&#xB4DC;&#xC5D0; &#xB9CE;&#xC774; &#xC788;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233845080-cc9f725b-eba4-4940-a1b3-44c9a2816e6d.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xB530;&#xB77C;&#xC11C; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xCF58;&#xD150;&#xCE20;&#xC640; interaction&#xD558;&#xACE0;, &#xD56D;&#xBAA9;&#xC744; tap&#xD558;&#xBA74; &#xA0;delegate&#xBA54;&#xC2DC;&#xC9C0; <code>didSelectItemAtIndexPath</code> &#xAC00; &#xD638;&#xCD9C;&#xB41C;&#xB2E4;.</p><p>&#xADF8;&#xB807;&#xB2E4;&#xBA74; &#xC774; &#xBA54;&#xC2DC;&#xC9C0;&#xAC00; &#xBD88;&#xB9AC;&#xBA74; IndexPath&#xB97C; &#xC5B4;&#xB5BB;&#xAC8C; &#xC0AC;&#xC6A9;&#xD574;&#xC57C;&#xD560;&#xAE4C;?</p><p>&#xC774;&#xB294; &#xC0C8;&#xB85C;&#xC6B4; API&#xB97C; &#xC774;&#xC6A9;&#xD574; &#xD574;&#xACB0;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233845239-cf747782-4b89-4370-ad2a-300f91caaade.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xC704; API&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xBA74; Identifier&#xB97C; IndexPath&#xB85C; &#xBCC0;&#xD658;&#xD558;&#xACE0;, IndexPath&#xB97C; Identifier&#xB85C; &#xBCC0;&#xD658;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC608;&#xC81C;&#xB97C; &#xBCF4;&#xC790;</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233844879-f6128f16-2a4b-4758-b59d-4574571a4da8.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>&#xC774; &#xC608;&#xC81C;&#xB294; indexPath&#xC5D0; &#xD574;&#xB2F9;&#xD558;&#xB294; identifier&#xB85C; &#xBCC0;&#xD658;&#xD558;&#xB294; &#xC608;&#xC81C;&#xC774;&#xB2E4;.</p><p>&#xC704; &#xCC98;&#xB7FC; IndexPath&#xB97C; identifier&#xB85C; &#xBCC0;&#xD658;&#xD574; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><h2 id="performance">Performance</h2><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233845314-6187c1f0-c744-4b9e-b416-f5f99e3b9c2f.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>Snapshot API&#xC5D0;&#xC11C; diff&#xB294; O(N)&#xC758; &#xC2DC;&#xAC04;&#xBCF5;&#xC7A1;&#xB3C4;&#xB97C; &#xAC00;&#xC9C0;&#xB294; &#xC120;&#xD615; &#xC5F0;&#xC0B0;&#xC774;&#xB2E4;.</p><p>&#xAC04;&#xB2E8;&#xD788; &#xB9D0;&#xD574;&#xC11C;, item&#xC774; &#xB9CE;&#xC744;&#xC218;&#xB85D; diff&#xB97C; &#xCC3E;&#xB294; &#xB370; &#xB354; &#xC624;&#xB798; &#xAC78;&#xB9B0;&#xB2E4;.</p><p>Main Queue&#xB294; &#xC0AC;&#xC6A9;&#xC790; &#xC774;&#xBCA4;&#xD2B8;&#xC5D0; &#xBC18;&#xC751;&#xD574;&#xC57C;&#xD558;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAC00;&#xB2A5;&#xD55C; &#xD55C; &#xD56D;&#xC0C1; &#xC790;&#xC720;&#xB85C;&#xC6CC;&#xC57C;&#xD55C;&#xB2E4;.</p><p>&#xB9CE;&#xC740; &#xC218;&#xC758; item&#xC774; &#xC788;&#xB294;&#xACBD;&#xC6B0; Background Queue&#xC5D0;&#xC11C; Apply &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC548;&#xC804;&#xD558;&#xB2E4;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://developer.apple.com/documentation/xcode/improving-app-responsiveness?ref=noah-ios.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Improving app responsiveness | Apple Developer Documentation</div><div class="kg-bookmark-description">Create a more immediate user experience by removing hangs and hitches from your app&#x2019;s user interface.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://developer.apple.com/apple-logo.svg" alt="Advances in UI Data Sources"><span class="kg-bookmark-author">Apple Developer Documentation</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://docs.developer.apple.com/tutorials/developer-og.jpg" alt="Advances in UI Data Sources"></div></a></figure><blockquote>&#xC704; &#xBB38;&#xC11C;&#xB97C; &#xCC38;&#xACE0;&#xD574;&#xBCF4;&#xC790;&#xBA74; Main Queue&#xC5D0;&#xC11C; &#xC791;&#xC5C5;&#xD560; &#xB54C; 100ms&#xBCF4;&#xB2E4; &#xC791;&#xC5C5;&#xC2DC;&#xAC04;&#xC774; &#xAE38;&#xC5B4;&#xC9C4;&#xB2E4;&#xBA74; &#xC0AC;&#xC6A9;&#xC790;&#xC758; Interaction&#xC5D0; &#xC989;&#xAC01;&#xC801;&#xC73C;&#xB85C; &#xBC18;&#xC751;&#xD560; &#xC218; &#xC5C6;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; Background Queue&#xC5D0;&#xC11C; Apply&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xB294;&#xAC8C; &#xD569;&#xB9AC;&#xC801; &#xC77C; &#xAC83; &#xAC19;&#xB2E4;.</blockquote><p>Background Queue&#xC5D0;&#xC11C; Apply&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xBA74;, &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xB294; diff&#xAC00; &#xACC4;&#xC0B0;&#xB418;&#xBA74; &#xBA54;&#xC778; &#xD050;&#xB85C; &#xB3CC;&#xC544;&#xAC00;&#xC11C; diff&#xC758; &#xACB0;&#xACFC;&#xB97C; &#xC801;&#xC6A9;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233845813-f2df97a9-3939-4e33-9596-be5489424cf4.png" class="kg-image" alt="Advances in UI Data Sources" loading="lazy"></figure><p>Backgrund Queue&#xC5D0;&#xC11C; Apply&#xB97C; &#xD638;&#xCD9C;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC774; model&#xC744; &#xC120;&#xD0DD;&#xD558;&#xB294; &#xACBD;&#xC6B0; &#xC77C;&#xAD00;&#xC131;&#xC744; &#xC720;&#xC9C0;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><blockquote>Background Queue&#xC5D0;&#xC11C; &#xD638;&#xCD9C;&#xD588;&#xC73C;&#xBA74; &#xD56D;&#xC0C1; Backround Queue&#xC5D0;&#xC11C; &#xD638;&#xCD9C;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</blockquote><p>Background Queue &#xB610;&#xB294; Main Queue&#xC5D0;&#xC11C; &#xD638;&#xCD9C;&#xB41C; &#xACB0;&#xACFC;&#xAC00; mix and match&#xAC00; &#xB420; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC774;&#xB2E4;.</p><h3 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h3><p>&#xC774;&#xC0C1; Advances in UI Data Source &#xC138;&#xC158;&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xB9AC;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>&#xC704;&#xC5D0;&#xC11C; &#xC0B4;&#xD3B4;&#xBCF8; &#xAC83;&#xCC98;&#xB7FC; Diffable DataSourec&#xB294; Model&#xC758; &#xB370;&#xC774;&#xD130;&#xB97C; CollectionView, TableView&#xB85C; &#xAC00;&#xC838;&#xC624;&#xAE30; &#xC704;&#xD574; &#xC218;&#xD589;&#xD574;&#xC57C;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xB4E4;&#xC744; &#xB2E8;&#xC21C;&#xD654; &#xC2DC;&#xD0A8;&#xB2E4;&#xB294; &#xB290;&#xB08C;&#xC744; &#xBC1B;&#xC558;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p>UI&#xC640;, data&#xC758; sync&#xAC00; &#xC548;&#xB9DE;&#xC544; &#xBC1C;&#xC0DD;&#xD560; &#xC218; &#xC788;&#xB294; &#xBB38;&#xC81C;&#xB97C; UI&#xB97C; &#xBC18;&#xC601;&#xD558;&#xACE0; &#xC788;&#xB294; &#xD558;&#xB098;&#xC758; data source&#xB97C; &#xB460;&#xC73C;&#xB85C;&#xC368; &#xD574;&#xACB0;&#xD55C;&#xB2E4;&#xB294; &#xC810; &#xC5ED;&#xC2DC; &#xC778;&#xC0C1; &#xAE4A;&#xC5C8;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em> &#x1F60A;</p><h4 id="wwdc-%EC%84%B8%EC%85%98-%EB%A7%81%ED%81%AC">WWDC &#xC138;&#xC158; &#xB9C1;&#xD06C;</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://developer.apple.com/videos/play/wwdc2019/220?ref=noah-ios.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Advances in UI Data Sources - WWDC19 - Videos - Apple Developer</div><div class="kg-bookmark-description">Use UI Data Sources to simplify updating your table view and collection view items using automatic diffing. High fidelity, quality&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://developer.apple.com/apple-logo.svg" alt="Advances in UI Data Sources"><span class="kg-bookmark-author">Apple Developer</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://devimages-cdn.apple.com/wwdc-services/images/48/2814/2814_wide_250x141_2x.jpg" alt="Advances in UI Data Sources"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Archive 문서로 알아보는 Collection View Basics]]></title><description><![CDATA[<p></p><h3 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h3><p>&#xAE30;&#xBCF8;&#xC5D0; &#xB300;&#xD574; &#xD655;&#xC2E4;&#xD788; &#xC9DA;&#xACE0; &#xB118;&#xC5B4;&#xAC00;&#xAE30; &#xC704;&#xD574; Archive&#xB41C; &#xBB38;&#xC11C;&#xC778; Collection View Basics&#xB97C; &#xBCF4;&#xACE0;, &#xACFC;&#xAC70;&#xB85C; &#xB3CC;&#xC544;&#xAC00; Collection View&#xC758; concept&#xC744; &#xC774;&#xD574;&#xD574;&#xBCF4;&#xC790;</p><h2 id="collection-view">Collection View</h2><p>Collection</p>]]></description><link>https://noah-ios.dev/collection-view/</link><guid isPermaLink="false">64400073a03824034f4920c0</guid><category><![CDATA[iOS]]></category><dc:creator><![CDATA[Noah]]></dc:creator><pubDate>Wed, 20 Apr 2022 07:41:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1507925921958-8a62f3d1a50d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDcyfHxncmlkfGVufDB8fHx8MTY4MTkxNjE0NQ&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1507925921958-8a62f3d1a50d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDcyfHxncmlkfGVufDB8fHx8MTY4MTkxNjE0NQ&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics"><p></p><h3 id="%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70;</h3><p>&#xAE30;&#xBCF8;&#xC5D0; &#xB300;&#xD574; &#xD655;&#xC2E4;&#xD788; &#xC9DA;&#xACE0; &#xB118;&#xC5B4;&#xAC00;&#xAE30; &#xC704;&#xD574; Archive&#xB41C; &#xBB38;&#xC11C;&#xC778; Collection View Basics&#xB97C; &#xBCF4;&#xACE0;, &#xACFC;&#xAC70;&#xB85C; &#xB3CC;&#xC544;&#xAC00; Collection View&#xC758; concept&#xC744; &#xC774;&#xD574;&#xD574;&#xBCF4;&#xC790;</p><h2 id="collection-view">Collection View</h2><p>Collection View&#xB294; contents&#xB97C; &#xD654;&#xBA74;&#xC5D0; &#xD45C;&#xC2DC;&#xD558;&#xAE30; &#xC704;&#xD574; &#xB2E4;&#xC591;&#xD55C; &#xAC1D;&#xCCB4;&#xC640; &#xD611;&#xB825;&#xD55C;&#xB2E4;.</p><p>&#xC774; &#xC911; &#xC77C;&#xBD80; &#xAC1D;&#xCCB4;&#xB294; custom &#xAC1D;&#xCCB4;&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB97C; &#xC791;&#xC131;&#xD574; &#xD504;&#xB808;&#xC784;&#xC6CC;&#xD06C;&#xC5D0; &#xC54C;&#xB824;&#xC57C;&#xD55C;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; Collection View&#xC5D0; &#xD45C;&#xC2DC;&#xD560; item &#xC218;&#xB97C; &#xC54C;&#xB824;&#xC8FC;&#xB294; data source&#xC640; &#xAC19;&#xC740; &#xAC1D;&#xCCB4;&#xB97C; &#xC81C;&#xACF5;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><p>Table View&#xC640; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; Collection View&#xB294; &#xC571;&#xC758; &#xAC1D;&#xCCB4;&#xC640; &#xD611;&#xB825;&#xC744; &#xD1B5;&#xD574; &#xAD6C;&#xD604;&#xB418;&#xB294; data-oriented &#xAC1D;&#xCCB4;&#xC774;&#xB2E4;.</p><p>&#xCF54;&#xB4DC;&#xB97C; &#xC791;&#xC131;&#xD558;&#xAE30; &#xC704;&#xD574; Collection View&#xC758; &#xC791;&#xB3D9; &#xBC29;&#xC2DD;&#xC5D0; &#xB300;&#xD574; &#xC54C;&#xC544;&#xBCF4;&#xC790;</p><h2 id="a-collection-view-is-a-collaboration-of-objects">A Collection View Is a Collaboration of Objects</h2><p>Collection view&#xB294; data&#xC640; data&#xAC00; &#xD654;&#xBA74;&#xC5D0; &#xC815;&#xB82C; &#xBC0F; &#xD45C;&#xC2DC;&#xB418;&#xB294; &#xBC29;&#xC2DD;&#xC758; &#xC5ED;&#xD560;&#xC744; &#xBD84;&#xB9AC;&#xD558;&#xC5EC; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC124;&#xACC4;&#xB418;&#xC5B4;&#xC788;&#xB2E4;.</p><p>&#xD45C;&#xC2DC;&#xD560; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xB300;&#xD55C; &#xAD00;&#xB9AC;&#xB294; &#xC804;&#xC801;&#xC73C;&#xB85C; app&#xC5D0; &#xCC45;&#xC784;&#xC774; &#xC788;&#xC9C0;&#xB9CC; &#xC2DC;&#xAC01;&#xC801;&#xC778; &#xD45C;&#xD604;(visual presentation)&#xC740; &#xB2E4;&#xC591;&#xD55C; &#xAC1D;&#xCCB4;&#xC5D0; &#xC758;&#xD574; &#xAD00;&#xB9AC;&#xB41C;&#xB2E4;.</p><p>&#xC544;&#xB798;&#xC758; &#xD45C;&#xB294;1-1&#xC5D0;&#xB294; UIKit CollectionView &#xD074;&#xB798;&#xC2A4;&#xAC00; &#xB098;&#xC5F4;&#xB418;&#xC5B4;&#xC788;&#xC73C;&#xBA70;, CollectionView &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xAD6C;&#xD604;&#xD560; &#xB54C; &#xC218;&#xD589;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC5D0; &#xB530;&#xB77C; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xAD6C;&#xC131;&#xD55C;&#xB2E4;.</p><p>&#xB300;&#xBD80;&#xBD84;&#xC758; &#xD074;&#xB798;&#xC2A4;&#xB294; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2F1; &#xD560; &#xD544;&#xC694;&#xC5C6;&#xC774; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB3C4;&#xB85D; &#xC124;&#xACC4;&#xB418;&#xC5C8;&#xC73C;&#xBBC0;&#xB85C; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xB9E4;&#xC6B0; &#xC801;&#xC740; &#xCF54;&#xB4DC;&#xB85C; CollectionView&#xB97C; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xB2E4;. </p><p>&#xC81C;&#xACF5;&#xB41C; &#xB3D9;&#xC791;(behavior)&#xBCF4;&#xB2E4; &#xB2E4;&#xC591;&#xD55C; &#xB3D9;&#xC791;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xACE0; &#xC2F6;&#xC744; &#xB54C;&#xB294; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xD574;&#xB2F9; &#xB3D9;&#xC791;&#xC744; &#xC81C;&#xACF5;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><!--kg-card-begin: html--><table class="graybox" border="0" cellspacing="0" cellpadding="5" style="border-top: 1px solid rgb(155, 179, 205); border-left: 1px solid rgb(155, 179, 205); margin-bottom: 4em;"><caption class="tablecaption" style="margin-bottom: 0.417em; text-align: left;"><strong class="caption_number" style="font-family: &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif; font-size: 13px; font-weight: 700;">Table 1-1</strong>&#xA0;&#xA0;The classes and protocols for implementing collection views</caption><tbody><tr><th scope="col" class="TableHeading_TableRow_TableCell" style="text-align: left; font-weight: 400; background: rgb(147, 165, 187); padding: 0.3em 0.667em; font-size: 13.39px; color: rgb(255, 255, 255); border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0.33em; font: 700 13.39px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Purpose</p></th><th scope="col" class="TableHeading_TableRow_TableCell" style="text-align: left; font-weight: 400; background: rgb(147, 165, 187); padding: 0.3em 0.667em; font-size: 13.39px; color: rgb(255, 255, 255); border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0.33em; font: 700 13.39px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Classes/Protocols</p></th><th scope="col" class="TableHeading_TableRow_TableCell" style="text-align: left; font-weight: 400; background: rgb(147, 165, 187); padding: 0.3em 0.667em; font-size: 13.39px; color: rgb(255, 255, 255); border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0.33em; font: 700 13.39px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Description</p></th></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Top-level containment and management</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionview?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionview_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionView</a></code></p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewcontroller?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewcontroller_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewController</a></code></p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">A<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionView</code><span>&#xA0;</span>object defines the visible area for your collection view&#x2019;s content. This class descends from<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uiscrollview?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uiscrollview_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UIScrollView</a></code><span>&#xA0;</span>and can contain a large scrollable area as needed. This class also facilitates the presentation of your data based on the layout information it receives from its layout object.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">A<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewController</code><span>&#xA0;</span>object provides view controller&#x2013;level management support for a collection view. Its use is optional.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Content management</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewdatasource?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewdatasource_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewDataSource</a></code><span>&#xA0;</span>protocol</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewdelegate?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewdelegate_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewDelegate</a></code><span>&#xA0;</span>protocol</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">The<span>&#xA0;</span><em class="newTerm" style="font-family: &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif; font-size: 13px; font-style: italic;">data source object</em><span>&#xA0;</span>is the most important object associated with the collection view and is one that you must provide. The data source manages the content of the collection view and creates the views needed to present that content. To implement a data source object, you must create an object that conforms to the<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewDataSource</code><span>&#xA0;</span><span class="pediaLink" data-header="Protocol" data-contents="A protocol declares a programmatic interface that any class may choose to implement. "><a data-renderer-version="1" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/P_1&quot;;return this.s_oc?this.s_oc(e):true" data-href="../../../../General/Conceptual/DevPedia-CocoaCore/Protocol.html#//apple_ref/doc/uid/TP40008195-CH45" style="color: rgb(51, 102, 204); text-decoration: none; font-style: normal; border-bottom: 1px dashed rgb(51, 102, 204); white-space: nowrap; cursor: pointer; transition-property: color, background-color, border-bottom, -webkit-border-top-left-radius, -webkit-border-top-right-radius, padding, margin; transition-duration: 0.25s;">protocol</a></span>.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">The collection view<span>&#xA0;</span><span class="pediaLink" data-header="Delegation" data-contents="Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. "><a data-renderer-version="1" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/D_1&quot;;return this.s_oc?this.s_oc(e):true" data-href="../../../../General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14" style="color: rgb(51, 102, 204); text-decoration: none; font-style: normal; border-bottom: 1px dashed rgb(51, 102, 204); white-space: nowrap; cursor: pointer; transition-property: color, background-color, border-bottom, -webkit-border-top-left-radius, -webkit-border-top-right-radius, padding, margin; transition-duration: 0.25s;">delegate</a></span><span>&#xA0;</span>object lets you intercept interesting messages from the collection view and customize the view&#x2019;s behavior. For example, you use a delegate object to track the selection and highlighting of items in the collection view. Unlike the data source object, the delegate object is optional.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">For information about how to implement the data source and delegate objects, see<span>&#xA0;</span><span class="content_text" style="margin-top: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em;"><a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCellsandViews/CreatingCellsandViews.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH7-SW1" data-renderer-version="1" onclick="s_objectID=&quot;https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewP_4&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">Designing Your Data Source and Delegate</a></span>.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Presentation</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionreusableview?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionreusableview_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionReusableView</a></code></p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewcell?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewcell_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewCell</a></code></p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">All views displayed in a collection view must be instances of the<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionReusableView</code><span>&#xA0;</span>class. This class supports a recycling mechanism in use by collection views. Recycling views (instead of creating new ones) improves performance in general and especially improves it during scrolling.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">A<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewCell</code><span>&#xA0;</span>object is a specific type of reusable view that you use for your main data items.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Layout</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewlayout?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewlayout_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewLayout</a></code></p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewlayoutattributes?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewlayoutattributes_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewLayoutAttributes</a></code></p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewupdateitem?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewupdateitem_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewUpdateItem</a></code></p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Subclasses of<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewLayout</code><span>&#xA0;</span>are referred to as<span>&#xA0;</span><em class="newTerm" style="font-family: &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif; font-size: 13px; font-style: italic;">layout objects</em><span>&#xA0;</span>and are responsible for defining the location, size, and visual attributes of the cells and reusable views inside a collection view.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">During the layout process, a layout object creates layout attribute objects (instances of the<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewLayoutAttributes</code><span>&#xA0;</span>class) that tell the collection view where and how to display cells and reusable views.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">The layout object receives instances of the<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewUpdateItem</code><span>&#xA0;</span>class whenever data items are inserted, deleted, or moved within the collection view. You never need to create instances of this class yourself.</p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">For more information about the layout object, see<span>&#xA0;</span><span class="content_text" style="margin-top: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em;"><a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CollectionViewBasics/CollectionViewBasics.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH2-SW14" data-renderer-version="1" onclick="s_objectID=&quot;https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewP_5&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">The Layout Object Controls the Visual Presentation</a></span>.</p></td></tr><tr><td scope="row" style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">Flow layout</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewflowlayout?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewflowlayout_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewFlowLayout</a></code></p><p style="margin-top: 0.417em; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;"><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);"><a href="https://developer.apple.com/documentation/uikit/uicollectionviewdelegateflowlayout?ref=noah-ios.dev" class="urlLink" target="_self" onclick="s_objectID=&quot;https://developer.apple.com/documentation/uikit/uicollectionviewdelegateflowlayout_1&quot;;return this.s_oc?this.s_oc(e):true" style="color: rgb(51, 102, 204); text-decoration: none;">UICollectionViewDelegateFlowLayout</a></code><span>&#xA0;</span>protocol</p></td><td style="padding: 0.667em; font-size: 13px; vertical-align: middle; border-bottom: 1px solid rgb(155, 179, 205); border-right: 1px solid rgb(155, 179, 205);"><p style="margin-top: 0px; margin-bottom: 0px; font: 13px &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, Helvetica, Arial, Verdana, sans-serif;">The<span>&#xA0;</span><code style="font-size: 13.39px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102);">UICollectionViewFlowLayout</code><span>&#xA0;</span>class is a concrete layout object that you use to implement grids or other line-based layouts. You can use the class as-is or in conjunction with the flow delegate object, which allows you to customize the layout information dynamically.</p></td></tr></tbody></table><!--kg-card-end: html--><h4 id="%ED%91%9C%EC%9D%98-%EB%82%B4%EC%9A%A9%EC%9D%84-%ED%95%98%EB%82%98%EC%94%A9-%EC%82%B4%ED%8E%B4%EB%B3%B4%EC%9E%90">&#xD45C;&#xC758; &#xB0B4;&#xC6A9;&#xC744; &#xD558;&#xB098;&#xC529; &#xC0B4;&#xD3B4;&#xBCF4;&#xC790;</h4><h2 id="top-level-containment-and-management">Top-level containment and management</h2><h4 id="uicollectionview-uicollectionviewcontroller"><code>UICollectionView</code> , <code>UICollectionViewController</code></h4><p><code>UICollectionView</code> &#xAC1D;&#xCCB4;&#xB294; Collection View&#xC758; &#xCF58;&#xD150;&#xCE20;&#xC5D0; &#xB300;&#xD55C; &#xD45C;&#xC2DC; &#xC601;&#xC5ED;(visible area)&#xC744; &#xC815;&#xC758;&#xD55C;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233250980-d5238bdd-da7a-4810-91fc-680ab6b2dcd0.png" class="kg-image" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics" loading="lazy"></figure><p><code>UICollectionView</code> &#xC758; &#xC120;&#xC5B8;&#xBD80;&#xB97C; &#xBCF4;&#xBA74; &#xC54C; &#xC218; &#xC788;&#xB4EF;, <code>UICollectionView</code>&#xB294; <code>UIScrollView</code>&#xB97C; &#xC0C1;&#xC18D;&#xBC1B;&#xC544; &#xC2A4;&#xD06C;&#xB864; &#xAC00;&#xB2A5;&#xD55C;(Scorollable) &#xC601;&#xC5ED;&#xC744; &#xD3EC;&#xD568;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xB610;&#xD55C; &#xC774; &#xD074;&#xB798;&#xC2A4;&#xB294; layout&#xAC1D;&#xCCB4;&#xC5D0;&#xC11C; &#xC218;&#xC2E0;&#xD55C; layout&#xC815;&#xBCF4;&#xB97C; &#xAE30;&#xBC18;&#xC73C;&#xB85C; &#xB370;&#xC774;&#xD130;&#xB97C; &#xD45C;&#xC2DC;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p><code>UICollectionViewController</code> &#xAC1D;&#xCCB4;&#xB294; Collection View&#xC5D0; &#xB300;&#xD55C; View Controller level&#xC758; &#xAD00;&#xB9AC;&#xB97C; &#xD560; &#xC218; &#xC788;&#xB2E4;. <code>UICollectionViewController</code> &#xC758; &#xC0AC;&#xC6A9;&#xC774; &#xAC15;&#xC81C;&#xB418;&#xC5B4;&#xC788;&#xC9C0;&#xB294; &#xC54A;&#xB2E4;. </p><h2 id="content-management">Content Management</h2><p>data source &#xAC1D;&#xCCB4;&#xB294; Collection View&#xC640; &#xAD00;&#xB828;&#xB41C; &#xAC00;&#xC7A5; &#xC911;&#xC694;&#xD55C; &#xAC1D;&#xCCB4;&#xC774;&#xBA70;, &#xBC18;&#xB4DC;&#xC2DC; &#xD504;&#xB808;&#xC784; &#xC6CC;&#xD06C;&#xC5D0; &#xC81C;&#xACF5;&#xD574;&#xC57C; &#xD558;&#xB294; &#xAC1D;&#xCCB4;&#xC774;&#xB2E4;.</p><p>data source&#xB294; collection view&#xC758; contents&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xACE0;, &#xD574;&#xB2F9; contents&#xB97C; &#xD45C;&#xC2DC;&#xD558;&#xB294; &#xB370; &#xD544;&#xC694;&#xD55C; view&#xB97C; &#xB9CC;&#xB4E0;&#xB2E4;.</p><p>data source &#xAC1D;&#xCCB4;&#xB97C; &#xAD6C;&#xD604;&#xD558;&#xB824;&#xBA74; <a href="https://developer.apple.com/documentation/uikit/uicollectionviewdatasource?ref=noah-ios.dev"><code>UICollectionViewDataSource</code> protocol</a> &#xC744; &#xC900;&#xC218;&#xD558;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</p><p>Collection View delegate &#xAC1D;&#xCCB4;&#xB97C; &#xC774;&#xC6A9;&#xD558;&#xBA74; Collection View&#xC5D0;&#xC11C; &#xBA54;&#xC2DC;&#xC9C0;&#xB97C; &#xAC00;&#xB85C;&#xCC44; View&#xC758; &#xB3D9;&#xC791;&#xC744; custom&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; delegate &#xAC1D;&#xCCB4;&#xB97C; &#xC0AC;&#xC6A9;&#xD574;&#xC11C; Collection View&#xC5D0;&#xC11C; item &#xC120;&#xD0DD; &#xBC0F; highlighting&#xB41C; &#xAC83;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><p>delegate &#xAC1D;&#xCCB4;&#xB97C; &#xAD6C;&#xD604;&#xD558;&#xB824;&#xBA74; <a href="https://developer.apple.com/documentation/uikit/uicollectionviewdelegate?ref=noah-ios.dev"><code>UICollectionViewDelegate</code> protocol</a> &#xC744; &#xC900;&#xC218;&#xD558;&#xB294; &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</p><p>data source &#xAC1D;&#xCCB4;&#xC640; &#xB2EC;&#xB9AC; delegate &#xAC1D;&#xCCB4;&#xB294; &#xC120;&#xD0DD;&#xC0AC;&#xD56D;&#xC774;&#xB2E4;.</p><blockquote>data source &#xBC0F; delegate &#xAC1D;&#xCCB4;&#xB97C; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; data source &#xBC0F; delegate <a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCellsandViews/CreatingCellsandViews.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH7-SW1">&#xC124;&#xACC4; &#xBB38;&#xC11C;</a>&#xC5D0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h3 id="ios-13">iOS 13+</h3><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233291976-c576f8ba-24e7-4088-9797-595a2650720f.png" class="kg-image" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics" loading="lazy"></figure><p><code>iOS 13</code> &#xC774;&#xC0C1; &#xBC84;&#xC804;&#xBD80;&#xD130; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD55C; &#xC774; <code>UICollectionViewDiffableDataSource</code> &#xC5ED;&#xC2DC; </p><p><code>UICollectionViewDataSource</code> &#xC758; &#xC11C;&#xBE0C; &#xD074;&#xB798;&#xC2A4;&#xC774;&#xB2E4;.</p><blockquote>&#xC774;&#xC640; &#xAD00;&#xB828;&#xD574;&#xC11C; <a href="https://developer.apple.com/videos/play/wwdc2019/220/?time=474&amp;ref=noah-ios.dev">Adcances in UI Data Sources</a> WWDC &#xC138;&#xC158;&#xC744; &#xC815;&#xB9AC;&#xD558;&#xB294; &#xC2DC;&#xAC04;&#xC744; &#xB2E4;&#xC74C; &#xD3EC;&#xC2A4;&#xD2B8;&#xC5D0;&#xC11C; &#xAC00;&#xC838;&#xBCF4;&#xB3C4;&#xB85D; &#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h2 id="presentation">Presentation</h2><p>Collection View&#xC5D0; &#xD45C;&#xC2DC;&#xB418;&#xB294; &#xBAA8;&#xB4E0; view&#xB294; <code>UICollectionReusableView</code> &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC5EC;&#xC57C;&#xD55C;&#xB2E4;.</p><p>&#xC774; &#xD074;&#xB798;&#xC2A4;&#xB294; collection view&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xC911;&#xC778; recycling mechanism&#xC744; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;.</p><p>&#xC0C8; view&#xB97C; &#xB9CC;&#xB4DC;&#xB294; &#xB300;&#xC2E0; view&#xB97C; &#xC7AC;&#xD65C;&#xC6A9;&#xD558;&#xBA74; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; &#xC131;&#xB2A5;(performance)&#xAC00; &#xD5A5;&#xC0C1;&#xB418;&#xBA70; &#xD2B9;&#xD788; <strong>&#xC2A4;&#xD06C;&#xB864;&#xACFC; &#xAD00;&#xB828;&#xD558;&#xC5EC; &#xC131;&#xB2A5;&#xC774; &#xD5A5;&#xC0C1;&#xB41C;&#xB2E4;.</strong></p><p><code>UICollectionViewCell</code> &#xAC1D;&#xCCB4;&#xB294; &#xC8FC;&#xC694; data item&#xC5D0; &#xC0AC;&#xC6A9;&#xD558;&#xB294; <strong>&#xC7AC;&#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; view&#xC758; &#xD2B9;&#xC815; &#xD0C0;&#xC785;</strong>&#xC774;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233265155-13ba5574-ca43-4468-b7b2-e0745d7b7b78.png" class="kg-image" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics" loading="lazy"></figure><p><code>UICollectionViewCell</code> class&#xC758; &#xC120;&#xC5B8;&#xBD80;&#xB97C; &#xBCF4;&#xBA74; <code>UICollectionViewCell</code> &#xC774; &#xA0;<code>UICollectionReusableView</code> &#xC758; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2A4;&#xC784;&#xC744; &#xC54C; &#xC218; &#xC788;&#xB2E4;.</p><h2 id="layout">Layout</h2><p><code>UICollectionViewLayout</code> &#xC758; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2A4;&#xB294; layout &#xAC1D;&#xCCB4;&#xB77C;&#xACE0; &#xD558;&#xBA70; collection view&#xB0B4;&#xC5D0;&#xC11C; cell&#xACFC; &#xC7AC;&#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; view&#xC758; &#xC704;&#xCE58;, &#xD06C;&#xAE30;, &#xC2DC;&#xAC01;&#xC801;&#xC778; &#xC18D;&#xC131;&#xC744; &#xC815;&#xC758;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xB2F4;&#xB2F9;&#xD55C;&#xB2E4;.</p><p>layout &#xD504;&#xB85C;&#xC138;&#xC2A4; &#xC911;&#xC5D0; layout &#xAC1D;&#xCCB4;&#xB294; Collection View&#xC5D0; cell&#xACFC; reusable view&#xB97C; &#xD45C;&#xC2DC;&#xD560; &#xC704;&#xCE58;&#xC640; &#xBC29;&#xBC95;&#xC744; &#xC54C;&#xB824;&#xC8FC;&#xB294; &#xB808;&#xC774;&#xC544;&#xC6C3; &#xC18D;&#xC131; &#xAC1D;&#xCCB4;(UICollectionViewLayoutAttributes &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;)&#xB97C; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;.</p><p>layout &#xAC1D;&#xCCB4;&#xB294; Collection View&#xB0B4;&#xC5D0;&#xC11C; data item&#xC774; &#xC0BD;&#xC785;, &#xC0AD;&#xC81C; &#xB610;&#xB294; &#xC774;&#xB3D9;&#xD560; &#xB54C;&#xB9C8;&#xB2E4; <code>UICollectionViewUpdateItem</code> &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC218;&#xC2E0;&#xD55C;&#xB2E4;.</p><p>&#xC774; &#xD074;&#xB798;&#xC2A4;&#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xB97C; &#xC9C1;&#xC811; &#xB9CC;&#xB4E4; &#xD544;&#xC694;&#xB294; &#xC5C6;&#xB2E4;.</p><blockquote>layout &#xA0;&#xAC1D;&#xCCB4;&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; &#xC774; <a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CollectionViewBasics/CollectionViewBasics.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH2-SW14">&#xBB38;&#xC11C;</a>&#xC5D0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h2 id="flow-layout">Flow layout</h2><p><code>UICollectionViewFlowLayout</code> &#xD074;&#xB798;&#xC2A4;&#xB294; grid &#xB610;&#xB294; &#xAE30;&#xD0C0; line-based &#xB808;&#xC774;&#xC544;&#xC6C3;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xB370; &#xC0AC;&#xC6A9;&#xD558;&#xB294; concrete layout&#xAC1D;&#xCCB4;&#xC774;&#xB2E4;.</p><p>&#xC774; &#xD074;&#xB798;&#xC2A4;&#xB97C; &#xADF8;&#xB300;&#xB85C; &#xC0AC;&#xC6A9;&#xD558;&#xAC70;&#xB098; layout &#xC815;&#xBCF4;&#xB97C; &#xB3D9;&#xC801;&#xC73C;&#xB85C; custom&#xD560; &#xC218; &#xC788;&#xB294; flow delegate &#xAC1D;&#xCCB4;&#xC640; &#xD568;&#xAED8; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><blockquote><code>UICollectionView</code>&#xB294; iOS6&#xC5D0;&#xC11C; &#xCD94;&#xAC00;&#xB41C; &#xBDF0;&#xC785;&#xB2C8;&#xB2E4;.<br><code>UITableView</code>&#xC5D0;&#xC11C; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6E0;&#xB358; &#xC5EC;&#xB7EC; &#xAC00;&#xC9C0; &#xB808;&#xC774;&#xC544;&#xC6C3; &#xCEE4;&#xC2A4;&#xD130;&#xB9C8;&#xC774;&#xC9D5; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD569;&#xB2C8;&#xB2E4;. &#xBCC4;&#xB3C4;&#xB85C; &#xB808;&#xC774;&#xC544;&#xC6C3; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC9C0; &#xC54A;&#xACE0; <code>UICollectionViewFlowLayout</code>&#xB97C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xB9CC;&#xC73C;&#xB85C;&#xB3C4; &#xAE30;&#xBCF8;&#xC801;&#xC778; &#xADF8;&#xB9AC;&#xB4DC; &#xB808;&#xC774;&#xC544;&#xC6C3;&#xC744; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xC73C;&#xBA70;, &#xC880; &#xB354; &#xC138;&#xBC00;&#xD558;&#xAC8C; &#xB808;&#xC774;&#xC544;&#xC6C3;&#xC744; &#xC81C;&#xC5B4;&#xD560; &#xD544;&#xC694;&#xAC00; &#xC788;&#xC744; &#xB550; <code>UICollectionViewLayout</code>&#xC758; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4; &#xAD6C;&#xD604;&#xD558;&#xB294; &#xAC83;&#xB3C4; &#xAC00;&#xB2A5;&#xD569;&#xB2C8;&#xB2E4;.<br><br><a href="https://engineering.linecorp.com/ko/blog/ios-refactoring-uicollectionview-1?ref=noah-ios.dev">- UICollectionView&#xB97C; &#xC774;&#xC6A9;&#xD55C; LINE iOS &#xB300;&#xD654;&#xBC29; &#xB9AC;&#xD329;&#xD1A0;&#xB9C1; &#xC911; - </a></blockquote><h3 id="ios13">iOS13+</h3><p>&#xD558;&#xC9C0;&#xB9CC; &#xC2DC;&#xAC04;&#xC774; &#xD750;&#xB984;&#xC5D0; &#xB530;&#xB77C; &#xC810;&#xCC28; &#xBCF5;&#xC7A1;&#xD55C; &#xB808;&#xC774;&#xC544;&#xC6C3;&#xB4E4;&#xC774; &#xB9CE;&#xC774; &#xC0DD;&#xAE30;&#xAC8C; &#xB418;&#xC5C8;&#xACE0;, Flow layout &#xC73C;&#xB85C;&#xB3C4; &#xBCF5;&#xC7A1;&#xD55C; &#xB808;&#xC774;&#xC544;&#xC6C3;&#xC744; &#xAD6C;&#xD604;&#xD558;&#xAE30; &#xC5B4;&#xB824;&#xC6CC;&#xC9D0;&#xC5D0; &#xB530;&#xB77C; &#xC5EC;&#xB7EC; Group&#xC744; Composition&#xD574;&#xC11C; layout&#xC744; &#xAD6C;&#xC131;&#xD560; &#xC218; &#xC788;&#xB294; &#xA0;Compositional Layout&#xC774; &#xB4F1;&#xC7A5;&#xD558;&#xAC8C; &#xB418;&#xC5C8;&#xB2E4;.</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233267701-0ae8291d-7c5f-4df7-820b-41c0eadabe36.png" class="kg-image" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics" loading="lazy"></figure><p><code>iOS 13</code> &#xC774;&#xC0C1; &#xBC84;&#xC804; &#xBD80;&#xD130; &#xC0AC;&#xC6A9;&#xAC00;&#xB2A5;&#xD55C; &#xC774; <code><a href="https://developer.apple.com/documentation/uikit/uicollectionviewcompositionallayout?ref=noah-ios.dev">UICompositionalLayout</a></code> &#xC5ED;&#xC2DC; <code><a href="https://developer.apple.com/documentation/uikit/uicollectionviewlayout?ref=noah-ios.dev">UICollectionViewLayout</a></code> &#xC758; &#xC11C;&#xBE0C;&#xD074;&#xB798;&#xC2A4;&#xC774;&#xB2E4;.</p><blockquote>Collection View&#xC758; &#xCD08;&#xAE30; design&#xC774; data&#xC640; data&#xAC00; &#xD654;&#xBA74;&#xC5D0; &#xC815;&#xB82C; &#xBC0F; &#xD45C;&#xC2DC;&#xB418;&#xB294; &#xBC29;&#xC2DD;&#xC758; &#xC5ED;&#xD560;&#xC744; &#xBD84;&#xB9AC;&#xD558;&#xC5EC; design&#xB418;&#xC5C8;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; layout&#xC5D0; &#xC601;&#xD5A5;&#xC744; &#xC8FC;&#xB294; &#xAD6C;&#xD604;&#xCCB4;&#xAC00; &#xC0C8;&#xB85C; &#xB098;&#xC640;&#xB3C4; &#xC601;&#xD5A5;&#xC744; &#xC8FC;&#xC9C0; &#xC54A;&#xACE0; &#xD655;&#xC7A5;&#xB418;&#xB294; &#xBC29;&#xC2DD;&#xC774; &#xD765;&#xBBF8;&#xB85C;&#xC6E0;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p><strong><strong>Figure 1-1</strong></strong> &#xA0;Merging content and layout to create the final presentation</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233267575-a98f86e7-3f54-4712-ac67-1287175c9a9a.png" class="kg-image" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics" loading="lazy"></figure><p>Figure 1-1&#xC740; Collection View&#xC640; &#xC5F0;&#xACB0;&#xB41C; &#xD575;&#xC2EC; &#xAC1D;&#xCCB4;&#xAC04;&#xC758; &#xAD00;&#xACC4;&#xB97C; &#xBCF4;&#xC5EC;&#xC900;&#xB2E4;.</p><p>Collection View&#xB294; data source&#xC5D0;&#xC11C; &#xD45C;&#xC2DC;&#xD560; cell&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xAC00;&#xC838;&#xC628;&#xB2E4;.</p><p>data source &#xBC0F; delegate &#xAC1D;&#xCCB4;&#xB294; &#xC571;&#xC5D0;&#xC11C; &#xC81C;&#xACF5;&#xD558;&#xB294; custom &#xAC1D;&#xCCB4;&#xC774;&#xBA70; cell &#xC120;&#xD0DD; &#xBC0F; highlight &#xD45C;&#xC2DC;&#xB97C; &#xD3EC;&#xD568;&#xD574; contents&#xB97C; &#xAD00;&#xB9AC;&#xD558;&#xB294;&#xB370; &#xC0AC;&#xC6A9;&#xB41C;&#xB2E4;.</p><p>layout &#xAC1D;&#xCCB4;&#xB294; &#xD574;&#xB2F9; cell&#xC774; &#xC18D;&#xD55C; &#xC704;&#xCE58;&#xB97C; &#xACB0;&#xC815;&#xD558;&#xACE0;, &#xD574;&#xB2F9; &#xC815;&#xBCF4;&#xB97C; &#xD558;&#xB098; &#xC774;&#xC0C1;&#xC758; layout attributes &#xAC1D;&#xCCB4;&#xC758; &#xD615;&#xD0DC;&#xB85C; Collection View&#xC5D0; &#xBCF4;&#xB0B4;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xD55C;&#xB2E4;.</p><p>&#xADF8;&#xB7EC;&#xBA74; Collection View&#xAC00; layout &#xC815;&#xBCF4;&#xB97C; &#xC2E4;&#xC81C; cell(&#xBC0F; &#xB2E4;&#xB978; view)&#xACFC; &#xBCD1;&#xD569;&#xD574; &#xCD5C;&#xC885; visual presentation&#xC744; &#xB9CC;&#xB4E0;&#xB2E4;.</p><p>Collection View &#xC778;&#xD130;&#xD398;&#xC774;&#xC2A4;&#xB97C; &#xB9CC;&#xB4E4; &#xB54C;&#xB294; <code>UICollectionView</code> &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</p><p>Collection View&#xB97C; &#xB2E4;&#xB978; &#xBAA8;&#xB4E0; &#xAC1D;&#xCCB4;&#xAC00; &#xB098;&#xC624;&#xB294; &#xC911;&#xC559; &#xD5C8;&#xBE0C; &#xB77C;&#xACE0; &#xC0DD;&#xAC01;&#xD558;&#xBA74; &#xB41C;&#xB2E4;.</p><p>&#xD574;&#xB2F9; &#xAC1D;&#xCCB4;&#xB97C; &#xCD94;&#xAC00;&#xD55C; &#xD6C4;&#xC5D0;&#xB294; data source &#xB610;&#xB294; delegate&#xC640; &#xAC19;&#xC740; &#xAD00;&#xB828; &#xAC1D;&#xCCB4;&#xB97C; configuration&#xD558;&#xAE30; &#xC2DC;&#xC791;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xBAA8;&#xB4E0; configuration&#xC740; Collection View &#xC790;&#xCCB4;&#xB97C; &#xC911;&#xC2EC;&#xC73C;&#xB85C; &#xC774;&#xB8E8;&#xC5B4;&#xC9C4;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; Collection View &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4;&#xC9C0; &#xC54A;&#xACE0;&#xB294;, layout &#xAC1D;&#xCCB4;&#xB97C; &#xB9CC;&#xB4E4; &#xC218; &#xC5C6;&#xB2E4;.</p><h2 id="reusable-views-improve-performance">Reusable Views Improve Performance</h2><p>Collection View&#xB294; view recycling &#xBA54;&#xCEE4;&#xB2C8;&#xC998;&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xD6A8;&#xC728;&#xC131;&#xC744; &#xB192;&#xC778;&#xB2E4;.</p><p>View&#xAC00; &#xD654;&#xBA74; &#xBC16;&#xC73C;&#xB85C; &#xC774;&#xB3D9;&#xD558;&#xBA74; View&#xC5D0;&#xC11C; &#xC81C;&#xAC70;&#xB418;&#xACE0; &#xC0AD;&#xC81C;&#xB418;&#xB294; &#xB300;&#xC2E0; reuse queue&#xC5D0; &#xBC30;&#xCE58;&#xB41C;&#xB2E4;. &#xC0C8; contents&#xAC00; &#xD654;&#xBA74;&#xC5D0;&#xC11C; &#xC2A4;&#xD06C;&#xB864; &#xB418;&#xBA74; view&#xAC00; reuse queue&#xC5D0;&#xC11C; &#xC81C;&#xAC70;&#xB418;&#xACE0;, &#xC0C8; contents&#xB85C; &#xC6A9;&#xB3C4;&#xAC00; &#xBCC0;&#xACBD;&#xB41C;&#xB2E4;.</p><p>&#xC774;&#xB7EC;&#xD55C; recycling &#xBC0F; reuse&#xB97C; &#xC6A9;&#xC774;&#xD558;&#xAC8C; &#xD558;&#xB824;&#xBA74; &#xBAA8;&#xB4E0; view&#xAC00; <code>UICollectionReusableView</code> &#xC758; &#xD074;&#xB798;&#xC2A4;&#xC5D0;&#xC11C; &#xD30C;&#xC0DD;&#xB418;&#xC5B4;&#xC57C;&#xD55C;&#xB2E4;.</p><p>Collection View&#xB294; &#xC138; &#xAC00;&#xC9C0; &#xD0C0;&#xC785;&#xC758; &#xC7AC;&#xC0AC;&#xC6A9; &#xAC00;&#xB2A5;&#xD55C; &#xAC00;&#xB2A5;&#xD55C; view&#xB97C; &#xC9C0;&#xC6D0;&#xD558;&#xBA70;, &#xAC01; view&#xC5D0;&#xB294; &#xD2B9;&#xC815; &#xC6A9;&#xB3C4;&#xAC00; &#xC788;&#xB2E4;.</p><h4 id="cell">Cell</h4><p>cell&#xC740; Collection View&#xC758; &#xC8FC;&#xC694; contents&#xB97C; &#xD45C;&#xC2DC;&#xD55C;&#xB2E4;.</p><p>cell&#xC758; &#xC5ED;&#xD560;&#xC740; data source &#xAC1D;&#xCCB4;&#xC758; &#xB2E8;&#xC77C; item&#xC5D0; &#xB300;&#xD55C; contents&#xB97C; &#xD45C;&#xC2DC;&#xD558;&#xB294; &#xAC83;&#xC774;&#xB2E4;.</p><p>&#xAC01; cell&#xC740; &#xD544;&#xC694;&#xC5D0; &#xB530;&#xB77C; contents&#xB97C; &#xD45C;&#xC2DC;&#xD558;&#xAE30; &#xC704;&#xD574; subclass&#xD654; &#xD560; &#xC218; &#xC788;&#xB294; <code>UICollectionViewCell</code> &#xC758; &#xC778;&#xC2A4;&#xD134;&#xC2A4;&#xC5EC;&#xC57C;&#xD55C;&#xB2E4;.</p><p>cell &#xAC1D;&#xCCB4;&#xB294; &#xC120;&#xD0DD; &#xBC0F; highlight &#xD45C;&#xC2DC; &#xC0C1;&#xD0DC; &#xAD00;&#xB9AC;&#xB97C; &#xC704;&#xD55C; &#xAE30;&#xB2A5;&#xC744; &#xC81C;&#xACF5;&#xD55C;&#xB2E4;.</p><p>cell&#xC5D0; highlight&#xB97C; &#xC801;&#xC6A9;&#xD558;&#xB824;&#xBA74; code&#xB97C; &#xC791;&#xC131;&#xD574;&#xC57C;&#xD55C;&#xB2E4;.</p><blockquote>&#xAD00;&#xB828; &#xB0B4;&#xC6A9;&#xC740; &#xC774; <a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCellsandViews/CreatingCellsandViews.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH7-SW8">&#xBB38;&#xC11C;</a>&#xC5D0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h4 id="supplementary-views">Supplementary views</h4><p>Supplementary view&#xB294; Section&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xBCF4;&#xB97C; &#xD45C;&#xC2DC;&#xD55C;&#xB2E4;.</p><p>cell&#xACFC; &#xB9C8;&#xCC2C;&#xAC00;&#xC9C0;&#xB85C; Supplementary view&#xC5ED;&#xC2DC; data driven(&#xB370;&#xC774;&#xD130; &#xAE30;&#xBC18;)&#xC774;&#xB2E4;.</p><p>cell&#xACFC; &#xB2EC;&#xB9AC; Supplementary view&#xB294; &#xD544;&#xC218;&#xAC00; &#xC544;&#xB2C8;&#xBA70;&#xC0AC;&#xC6A9; &#xBC0F; &#xBC30;&#xCE58;&#xB294; &#xC0AC;&#xC6A9; &#xC911;&#xC778; layout &#xAC1D;&#xCCB4;&#xC5D0; &#xC758;&#xD574; &#xC81C;&#xC5B4;&#xB41C;&#xB2E4;.</p><p>&#xC608;&#xB97C;&#xB4E4;&#xC5B4; Flow layout&#xC740; Header&#xC640; Footer&#xB97C; Supplementary view&#xB85C; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;.</p><h4 id="decoration-view">Decoration view</h4><p>Decoration view&#xB294; layout &#xAC1D;&#xCCB4;&#xAC00; &#xC804;&#xC801;&#xC73C;&#xB85C; &#xC18C;&#xC720;&#xD558;&#xBA70; data source &#xAC1D;&#xCCB4;&#xC758; &#xB370;&#xC774;&#xD130;&#xC5D0; &#xC5F0;&#xACB0;&#xB418;&#xC9C0; &#xC54A;&#xB294; &#xB9D0;&#xADF8;&#xB300;&#xB85C; &#xC2DC;&#xAC01;&#xC801;&#xC778; &#xC7A5;&#xC2DD;&#xC774;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; layout &#xAC1D;&#xCCB4;&#xB294; Decoration view&#xB97C; &#xC774;&#xC6A9;&#xD574; custom background appearance&#xB97C; &#xAD6C;&#xD604;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>table view&#xC640; &#xB2EC;&#xB9AC; &#xA0;collection view&#xB294; cell &#xBC0F; supplementary view&#xC5D0; &#xD2B9;&#xC815; &#xC2A4;&#xD0C0;&#xC77C;&#xC744; &#xC801;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;. &#xB300;&#xC2E0; reusable view class&#xB294; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC218;&#xC815;&#xD560; &#xC218; &#xC788;&#xB294; &#xBE48; canvas&#xC774;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC608;&#xB97C; &#xB4E4;&#xC5B4; &#xC791;&#xC740; view &#xACC4;&#xCE35;&#xC744; &#xC791;&#xC131;&#xD558;&#xAC70;&#xB098; &#xC774;&#xBBF8;&#xC9C0;&#xB97C; &#xD45C;&#xC2DC;&#xD558;&#xAC70;&#xB098; contents&#xB97C; &#xB3D9;&#xC801;&#xC73C;&#xB85C; &#xADF8;&#xB9AC;&#xB294; &#xB370; &#xC0AC;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>data source &#xAC1D;&#xCCB4;&#xB294; &#xC5F0;&#xACB0;&#xB41C; collection view&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; cell &#xBC0F; supplementary view&#xB97C; &#xC81C;&#xACF5;&#xD560; &#xCC45;&#xC784;&#xC774; &#xC788;&#xC9C0;&#xB9CC; data source &#xAC1D;&#xCCB4;&#xB294; view&#xB97C; &#xC9C1;&#xC811; &#xB9CC;&#xB4E4;&#xC9C0; &#xC54A;&#xB294;&#xB2E4;.</p><p>view&#xB97C; &#xC694;&#xCCAD; &#xBC1B;&#xC73C;&#xBA74; data source&#xB294; collection view&#xC758; &#xBA54;&#xC11C;&#xB4DC;&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xC6D0;&#xD558;&#xB294; &#xD0C0;&#xC785;&#xC758; view&#xB97C; dequeue&#xD55C;&#xB2E4;. </p><p>dequeue &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB294; reuse queue&#xC5D0;&#xC11C; view&#xB97C; &#xAC80;&#xC0C9;&#xD558;&#xAC70;&#xB098; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xC81C;&#xACF5;&#xD55C; class, nib &#xD30C;&#xC77C; &#xB610;&#xB294; Storyboard&#xB97C; &#xC0AC;&#xC6A9;&#xD574; &#xC0C8; view&#xB97C; &#xC0DD;&#xC131;&#xD558;&#xC5EC; &#xC720;&#xD6A8;&#xD55C; view&#xB97C; &#xBC18;&#xD658;&#xD55C;&#xB2E4;.</p><blockquote>data source&#xC5D0;&#xC11C; view&#xB97C; &#xB9CC;&#xB4E4;&#xACE0; configuration&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC694;&#xC740; &#xC774; <a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCellsandViews/CreatingCellsandViews.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH7-SW6">&#xBB38;&#xC11C;</a>&#xC5D0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h2 id="the-layout-object-controls-the-visual-presentation">The Layout Object Controls the Visual Presentation</h2><p>layout &#xAC1D;&#xCCB4;&#xB294; Collection View&#xB0B4;&#xC5D0;&#xC11C; item &#xBC30;&#xCE58; &#xBC0F; &#xC2DC;&#xAC01;&#xC801; &#xC2A4;&#xD0C0;&#xC77C;&#xC744; &#xACB0;&#xC815;&#xD558;&#xB294; &#xC5ED;&#xD560;&#xC744; &#xD55C;&#xB2E4;.</p><p>data source &#xAC1D;&#xCCB4;&#xAC00; view&#xC640; &#xC2E4;&#xC81C; contents&#xB97C; &#xC81C;&#xACF5;&#xD558;&#xC9C0;&#xB9CC; layout &#xAC1D;&#xCCB4;&#xB294; &#xD574;&#xB2F9; view&#xC758; &#xD06C;&#xAE30;, &#xC704;&#xCE58; &#xBC0F; appearance &#xAD00;&#xB828; &#xC18D;&#xC131;&#xC744; &#xACB0;&#xC815;&#xD55C;&#xB2E4;.</p><p>&#xC774;&#xB7EC;&#xD55C; &#xCC45;&#xC784;&#xC758; &#xBD84;&#xB9AC;&#xB97C; &#xD1B5;&#xD574; app&#xC5D0;&#xC11C; &#xAD00;&#xB9AC;&#xD558;&#xB294; data &#xAC1D;&#xCCB4;&#xB97C; &#xBCC0;&#xACBD;&#xD558;&#xC9C0; &#xC54A;&#xACE0;&#xB3C4; layout&#xC744; &#xB3D9;&#xC801;&#xC73C;&#xB85C;&#xBCC0;&#xACBD;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>Collection View&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; layout &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xB294; app&#xC758; &#xB098;&#xBA38;&#xC9C0; view&#xC5D0;&#xC11C; &#xC0AC;&#xC6A9;&#xD558;&#xB294; layout &#xD504;&#xB85C;&#xC138;&#xC2A4;&#xC640; &#xAD00;&#xB828;&#xC774; &#xC788;&#xC9C0;&#xB9CC; &#xBCC4;&#xAC1C;&#xC774;&#xB2E4;.</p><blockquote>&#xC774; &#xB9D0;&#xC740; &#xA0; layout &#xAC1D;&#xCCB4;&#xAC00; &#xC218;&#xD589;&#xD558;&#xB294; &#xC791;&#xC5C5;&#xC744; &#xBD80;&#xBAA8; view &#xB0B4;&#xC5D0;&#xC11C; &#xC790;&#xC2DD; view&#xC758; &#xC704;&#xCE58;&#xB97C; &#xBCC0;&#xACBD;&#xD558;&#xB294; &#xB370; &#xC0AC;&#xC6A9;&#xB418;&#xB294; <code>layoutSubViews</code> &#xBA54;&#xC11C;&#xB4DC;&#xC640; &#xD63C;&#xB3D9;&#xD560; &#xC218; &#xC788;&#xB2E4;&#xB294; &#xB9D0;&#xC785;&#xB2C8;&#xB2E4;.<br>layout &#xAC1D;&#xCCB4;&#xB294; &#xC2E4;&#xC81C;&#xB85C; &#xD574;&#xB2F9; view&#xB97C; &#xC18C;&#xC720;&#xD558;&#xC9C0; &#xC54A;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xAD00;&#xB9AC;&#xD558;&#xB294; &#xBDF0;&#xB97C; &#xC9C1;&#xC811; &#xAC74;&#xB4DC;&#xB9AC;&#xC9C0;&#xB294; &#xC54A;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><p>&#xB300;&#xC2E0; Collection View&#xC5D0;&#xC11C; cell, Supplementary view &#xBC0F; Decoration view&#xC758; &#xC704;&#xCE58;, &#xD06C;&#xAE30; &#xBC0F; &#xC2DC;&#xAC01;&#xC801; appearance&#xB97C; &#xC124;&#xBA85;&#xD558;&#xB294; &#xC18D;&#xC131;&#xC744; &#xC0DD;&#xC131;&#xD55C;&#xB2E4;.</p><p>&#xADF8; &#xB2E4;&#xC74C; &#xC774;&#xB7EC;&#xD55C; &#xC18D;&#xC131;&#xC744; &#xC2E4;&#xC81C; view&#xAC1D;&#xCCB4;&#xC5D0; &#xC801;&#xC6A9;&#xD558;&#xB294; &#xAC83;&#xC740; Collection View&#xC758; &#xC791;&#xC5C5;&#xC774;&#xB2E4;.</p><p><strong><strong>Figure 1-2</strong></strong> &#xA0;The layout object provides layout metrics</p><figure class="kg-card kg-image-card"><img src="https://user-images.githubusercontent.com/63908856/233283356-c6d2eecc-c66a-481a-9871-271556503a64.png" class="kg-image" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics" loading="lazy"></figure><p>layout &#xAC1D;&#xCCB4;&#xB294; view&#xC758; &#xD06C;&#xAE30;&#xC640; &#xC704;&#xCE58;&#xB9CC; &#xC81C;&#xC5B4;&#xD558;&#xB294; &#xAC83;&#xC774; &#xC544;&#xB2C8;&#xB2E4;.</p><p>layout &#xAC1D;&#xCCB4;&#xB294; transparency, 3D &#xACF5;&#xAC04;&#xC5D0;&#xC11C;&#xC758; &#xBCC0;&#xD615;, &#xB2E4;&#xB978; view &#xC704; &#xB610;&#xB294; &#xC544;&#xB798;&#xC758; visibility(&#xC788;&#xB294; &#xACBD;&#xC6B0;) &#xB4F1; &#xAE30;&#xD0C0; view &#xAD00;&#xB828; &#xC18D;&#xC131;&#xC744; &#xC9C0;&#xC815;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; view&#xB97C; &#xC11C;&#xB85C; &#xACB9;&#xCCD0;&#xC11C; &#xBC30;&#xCE58;&#xD558;&#xACE0; z&#xC21C;&#xC11C;&#xB97C; &#xBCC0;&#xACBD;&#xD558;&#xC5EC; cell stack&#xC744; &#xB9CC;&#xB4E4;&#xAC70;&#xB098; transform&#xC744; &#xC0AC;&#xC6A9;&#xD574; &#xC6D0;&#xD558;&#xB294; &#xCD95;&#xC73C;&#xB85C; &#xD68C;&#xC804;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><blockquote>layout&#xAC1D;&#xCCB4;&#xAC00; Collection View&#xC5D0; &#xB300;&#xD55C; &#xCC45;&#xC784;&#xC744; &#xC218;&#xD589;&#xD558;&#xB294; &#xBC29;&#xBC95;&#xC5D0; &#xB300;&#xD55C; &#xC790;&#xC138;&#xD55C; &#xB0B4;&#xC6A9;&#xC740; &#xC774; <a href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCustomLayouts/CreatingCustomLayouts.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH5-SW1">&#xBB38;&#xC11C;</a>&#xC5D0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;.</blockquote><h2 id="collection-views-initiate-animations-automatically">Collection Views Initiate Animations Automatically</h2><p>Collection View&#xB294; fundamental level&#xC5D0;&#xC11C; animation&#xC744; &#xC9C0;&#xC6D0;&#xD55C;&#xB2E4;.</p><p>item &#xB610;&#xB294; Section&#xC744; &#xC0BD;&#xC785;(&#xB610;&#xB294; &#xC0AD;&#xC81C;)&#xD558;&#xBA74; Collection View&#xB294; &#xBCC0;&#xACBD;&#xC0AC;&#xD56D;&#xC758; &#xC601;&#xD5A5;&#xC744; &#xBC1B;&#xB294; &#xBAA8;&#xB4E0; view&#xC5D0; &#xC790;&#xB3D9;&#xC73C;&#xB85C; animation&#xC744; &#xC801;&#xC6A9;&#xD55C;&#xB2E4;.</p><p>&#xC608;&#xB97C; &#xB4E4;&#xC5B4; item&#xC744; &#xC0BD;&#xC785;&#xD558;&#xBA74; &#xC77C;&#xBC18;&#xC801;&#xC73C;&#xB85C; insert &#xC9C0;&#xC810; &#xC774;&#xD6C4;&#xC758; item&#xC774; &#xC0C8; item&#xC744; &#xC704;&#xD55C; &#xACF5;&#xAC04;&#xC744; &#xD655;&#xBCF4;&#xD558;&#xAE30; &#xC704;&#xD574; &#xC774;&#xB3D9;&#xD55C;&#xB2E4;.</p><p>Collection View&#xB294; item&#xC758; &#xD604;&#xC7AC; &#xC704;&#xCE58;&#xB97C; &#xAC10;&#xC9C0;&#xD558;&#xACE0;, insert&#xC774;&#xD6C4; &#xCD5C;&#xC885; &#xC704;&#xCE58;&#xB97C; &#xACC4;&#xC0B0;&#xD560; &#xC218; &#xC788;&#xAE30; &#xB54C;&#xBB38;&#xC5D0; &#xC774;&#xB7EC;&#xD55C; animation&#xC744; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xB2E4;.</p><p>&#xB530;&#xB77C;&#xC11C; &#xAC01; item&#xC758; &#xCD08;&#xAE30; &#xC704;&#xCE58;&#xC5D0;&#xC11C; &#xCD5C;&#xC885; &#xC704;&#xCE58;&#xAE4C;&#xC9C0; animation&#xC744; &#xC801;&#xC6A9;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>insert, delete &#xBC0F; &#xC774;&#xB3D9; &#xC791;&#xC5C5;&#xC5D0; animation&#xC744; &#xC801;&#xC6A9;&#xD558;&#xB294; &#xAC83; &#xC678;&#xC5D0;&#xB3C4; &#xC5B8;&#xC81C;&#xB4E0;&#xC9C0; layout&#xC744; &#xBB34;&#xD6A8;&#xD654; &#xD558;&#xACE0; layout &#xC18D;&#xC131;&#xC744; &#xAC15;&#xC81C;&#xB85C; &#xB2E4;&#xC2DC; &#xACC4;&#xC0B0;&#xD560; &#xC218; &#xC788;&#xB2E4;.</p><p>layout&#xC744; &#xBB34;&#xD6A8;&#xD654;&#xD558;&#xBA74; item&#xC5D0; &#xC9C1;&#xC811; animation&#xC774; &#xC801;&#xC6A9;&#xB418;&#xC9C0;&#xB294; &#xC54A;&#xC73C;&#xBA70;, layout&#xC744; &#xBB34;&#xD6A8;&#xD654;&#xD558;&#xBA74; Collection View&#xC5D0;&#xC11C; item&#xC5D0; animation&#xC744; &#xC801;&#xC6A9;&#xD558;&#xC9C0; &#xC54A;&#xACE0; &#xC0C8;&#xB85C; &#xACC4;&#xC0B0;&#xB41C; &#xC704;&#xCE58;&#xC5D0; item&#xC774; &#xD45C;&#xC2DC;&#xB41C;&#xB2E4;.</p><p>&#xB300;&#xC2E0; custom layout&#xC5D0;&#xC11C; &#xC774; &#xB3D9;&#xC791;&#xC744; &#xC0AC;&#xC6A9;&#xD574; cell&#xC744; &#xC77C;&#xC815;&#xD55C; &#xAC04;&#xACA9;&#xC73C;&#xB85C; &#xBC30;&#xCE58;&#xD558;&#xACE0; animation &#xD6A8;&#xACFC;&#xB97C; &#xB9CC;&#xB4E4; &#xC218; &#xC788;&#xB2E4;.</p><h3 id="%EB%A7%88%EB%AC%B4%EB%A6%AC">&#xB9C8;&#xBB34;&#xB9AC;</h3><p>&#xC774;&#xC0C1; Collection View Baics&#xC5D0; &#xB300;&#xD55C; &#xC815;&#xB9AC;&#xC600;&#xC2B5;&#xB2C8;&#xB2E4;.</p><p><em><em><em><em><em><em><em><em>&#xC544;&#xC9C1; &#xBAA8;&#xB974;&#xB294; &#xAC83;&#xC774; &#xB9CE;&#xACE0; &#xC54C;&#xC544;&#xAC00;&#xB294; &#xACFC;&#xC815;&#xC785;&#xB2C8;&#xB2E4;. &#xC798;&#xBABB;&#xB41C; &#xAC83;&#xC774; &#xC788;&#xB2E4;&#xBA74; &#xB313;&#xAE00;&#xB85C; &#xB0A8;&#xACA8;&#xC8FC;&#xC2E0;&#xB2E4;&#xBA74; &#xAC10;&#xC0AC;&#xD558;&#xACA0;&#xC2B5;&#xB2C8;&#xB2E4;!</em></em></em></em></em></em></em></em> &#x1F60A;</p><h4 id="%EC%B0%B8%EA%B3%A0">&#xCC38;&#xACE0;</h4><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CollectionViewBasics/CollectionViewBasics.html?ref=noah-ios.dev#//apple_ref/doc/uid/TP40012334-CH2-SW1"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Collection View Basics</div><div class="kg-bookmark-description">Describes the use of collection views in iOS apps.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://developer.apple.com/favicon.ico" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics"></div></div><div class="kg-bookmark-thumbnail"><img src="https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/Art/cv_objects_2x.png" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://engineering.linecorp.com/ko/blog/ios-refactoring-uicollectionview-1?ref=noah-ios.dev"><div class="kg-bookmark-content"><div class="kg-bookmark-title">UICollectionView&#xB97C; &#xC774;&#xC6A9;&#xD55C; LINE iOS &#xB300;&#xD654;&#xBC29; &#xB9AC;&#xD329;&#xD1A0;&#xB9C1; - 1</div><div class="kg-bookmark-description">&#xB4E4;&#xC5B4;&#xAC00;&#xBA70; LINE&#xC758; &#xB300;&#xD654;&#xBC29; &#xD654;&#xBA74;&#xC740; &#xC0AC;&#xC6A9;&#xC790;&#xAC00; &#xAC00;&#xC7A5; &#xB9CE;&#xC774;&amp;nbsp;&#xC0AC;&#xC6A9;&#xD558;&#xB294;&amp;nbsp;&#xD654;&#xBA74; &#xC911; &#xD558;&#xB098;&#xC774;&#xBA70; &#xC0C8;&#xB85C;&#xC6B4; &#xAE30;&#xB2A5;&#xC774; &#xACC4;&#xC18D; &#xCD94;&#xAC00;&#xB418;&#xACE0; &#xC788;&#xC2B5;&#xB2C8;&#xB2E4;. &#xADF8;&#xC5D0; &#xB530;&#xB77C; &#xCF54;&#xB4DC;&#xAC00; &#xC810;&#xC810; &#xBCF5;&#xC7A1;&#xD574;&#xC9C0;&#xBA74;&#xC11C; &#xCD5C;&#xADFC;&#xC5D0; &#xB9AC;&#xD329;&#xD1A0;&#xB9C1;&#xC744; &#xC9C4;&#xD589;&#xD588;&#xACE0;, &#xADF8; &#xACFC;&#xC815;&#xC5D0;&#xC11C;&amp;nbsp;UICollectionView&#xB97C; &#xB3C4;&#xC785;&#xD588;&#xC2B5;&#xB2C8;&#xB2E4;&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://engineering.linecorp.com/icons/icon-512x512.png?v=6d6085f233d02c34273fa8a8849b502a" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics"><span class="kg-bookmark-author">LINE ENGINGEERING</span><span class="kg-bookmark-publisher">&#xC7A5;&#xBCD1;&#xAD6D; / &#xC2EC;&#xC7AC;&#xC2DD;</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://vos.line-scdn.net/landpress-content-v2_1761/1666853649908.png?updatedAt=1666853650000" alt="Archive &#xBB38;&#xC11C;&#xB85C; &#xC54C;&#xC544;&#xBCF4;&#xB294; Collection View Basics"></div></a></figure>]]></content:encoded></item></channel></rss>