<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jong133 님의 블로그</title>
    <link>https://jong133.tistory.com/</link>
    <description>jong133 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 00:16:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>jong133</managingEditor>
    <item>
      <title>iOS 프로젝트</title>
      <link>https://jong133.tistory.com/83</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.11.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccJEl0/dJMcadoGWhY/HKKAE2TWmUtm6Pw7jQ9xVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccJEl0/dJMcadoGWhY/HKKAE2TWmUtm6Pw7jQ9xVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccJEl0/dJMcadoGWhY/HKKAE2TWmUtm6Pw7jQ9xVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccJEl0%2FdJMcadoGWhY%2FHKKAE2TWmUtm6Pw7jQ9xVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;333&quot; height=&quot;744&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.11.png&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.27.png&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8Ql1/dJMcacQTyrg/y7WOwGtHcSwdS0SOP3qkq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8Ql1/dJMcacQTyrg/y7WOwGtHcSwdS0SOP3qkq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8Ql1/dJMcacQTyrg/y7WOwGtHcSwdS0SOP3qkq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8Ql1%2FdJMcacQTyrg%2Fy7WOwGtHcSwdS0SOP3qkq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;334&quot; height=&quot;742&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.27.png&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.41.png&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b81WWG/dJMcaijiQ7e/qodEVZNSgtXe5XGvCazaf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b81WWG/dJMcaijiQ7e/qodEVZNSgtXe5XGvCazaf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b81WWG/dJMcaijiQ7e/qodEVZNSgtXe5XGvCazaf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb81WWG%2FdJMcaijiQ7e%2FqodEVZNSgtXe5XGvCazaf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;746&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.41.png&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.59.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ni1FN/dJMcaijiQ7o/27KVnYRbyKuGtjbYaomXsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ni1FN/dJMcaijiQ7o/27KVnYRbyKuGtjbYaomXsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ni1FN/dJMcaijiQ7o/27KVnYRbyKuGtjbYaomXsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNi1FN%2FdJMcaijiQ7o%2F27KVnYRbyKuGtjbYaomXsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1566&quot; height=&quot;858&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.50.59.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.51.17.png&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp2U60/dJMcabqXZ5J/ZZdsluBiHVpQm6qYrENzM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp2U60/dJMcabqXZ5J/ZZdsluBiHVpQm6qYrENzM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp2U60/dJMcabqXZ5J/ZZdsluBiHVpQm6qYrENzM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp2U60%2FdJMcabqXZ5J%2FZZdsluBiHVpQm6qYrENzM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1880&quot; height=&quot;846&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.51.17.png&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.51.32.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckWT1X/dJMcaaew1X9/dSzYBGmG9ZvKqWKwK8uwf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckWT1X/dJMcaaew1X9/dSzYBGmG9ZvKqWKwK8uwf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckWT1X/dJMcaaew1X9/dSzYBGmG9ZvKqWKwK8uwf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckWT1X%2FdJMcaaew1X9%2FdSzYBGmG9ZvKqWKwK8uwf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;597&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.51.32.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;AppDelegate.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;MovieLJY&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;Created by comsoft on 2026/05/04.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; UIKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@main&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;AppDelegate&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UIResponder&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UIApplicationDelegate&lt;/b&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;application&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; application: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UIApplication&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;didFinishLaunchingWithOptions&lt;/b&gt;&lt;/span&gt;&lt;b&gt; launchOptions: [&lt;/b&gt;&lt;span&gt;&lt;b&gt;UIApplication&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;LaunchOptionsKey&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/span&gt;&lt;b&gt;]?) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;Bool&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Override point for customization after application launch.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;return&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;true&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// MARK: UISceneSession Lifecycle&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;application&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; application: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UIApplication&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;configurationForConnecting&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; connectingSceneSession: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UISceneSession&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;options&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UIScene&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;ConnectionOptions&lt;/b&gt;&lt;span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UISceneConfiguration&lt;/b&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Called when a new scene session is being created.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Use this method to select a configuration to create the new scene with.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;UISceneConfiguration&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;Default Configuration&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;sessionRole&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: connectingSceneSession.&lt;/b&gt;&lt;span&gt;&lt;b&gt;role&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;application&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; application: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UIApplication&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;didDiscardSceneSessions&lt;/b&gt;&lt;/span&gt;&lt;b&gt; sceneSessions: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Set&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;UISceneSession&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&amp;gt;) {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Called when the user discards a scene session.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Use this method to release any resources that were specific to the discarded scenes, as they will not return.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AppDelegate.swift&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; UIKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;// MARK: - 축구선수 데이터 구조체&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;team&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;description&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;ViewController&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UIViewController&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UITableViewDelegate&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UITableViewDataSource&lt;/b&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;@IBOutlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;weak&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;table&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// MARK: - 수동 데이터 (TOP 10)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;players&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;] = [&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;1&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;킬리안 음바페&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;레알 마드리드&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;폭발적인 스피드와 결정력, 2024/25 레알 마드리드 이적&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;2&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;에를링 할란드&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;맨체스터 시티&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;역대급 득점력, 시즌 50골 이상 기록&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;3&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;비니시우스 주니오르&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;레알 마드리드&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;현란한 드리블과 빠른 발, 챔피언스리그 결승 골&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;4&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;주드 벨링엄&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;레알 마드리드&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;미드필더의 새로운 기준, 득점력과 창의성 겸비&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;5&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;필 포든&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;맨체스터 시티&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;잉글랜드 최고의 재능, 섬세한 기술과 침착한 마무리&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;6&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;하미 살라&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;리버풀&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;꾸준한 득점과 어시스트, 리버풀의 레전드&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;7&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;리오넬 메시&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;인테르 마이애미&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;역대 최고의 선수, 발롱도르 8회 수상&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;8&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;크리스티아누 호날두&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;알나스르&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;통산 900골 돌파, 불굴의 득점 본능&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;9&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;로드리&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;맨체스터 시티&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;발롱도르 수상, 완벽한 수비형 미드필더&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;),&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;FootballPlayer&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;10&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;name&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;라민 야말&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;team&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;FC 바르셀로나&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;17세 유럽선수권 우승, 차세대 최고 유망주&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// MARK: - TableView&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;tableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;numberOfRowsInSection&lt;/b&gt;&lt;/span&gt;&lt;b&gt; section: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;players&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;count&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;tableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;cellForRowAt&lt;/b&gt;&lt;/span&gt;&lt;b&gt; indexPath: &lt;/b&gt;&lt;span&gt;&lt;b&gt;IndexPath&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableViewCell&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; cell = tableView.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;dequeueReusableCell&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;withIdentifier&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;myCell&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;for&lt;/b&gt;&lt;span&gt;&lt;b&gt;: indexPath) &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;as&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;! &lt;/b&gt;&lt;/span&gt;&lt;b&gt;MyTableViewCell&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; player = &lt;/b&gt;&lt;span&gt;&lt;b&gt;players&lt;/b&gt;&lt;/span&gt;&lt;b&gt;[indexPath.&lt;/b&gt;&lt;span&gt;&lt;b&gt;row&lt;/b&gt;&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cell.&lt;/b&gt;&lt;span&gt;&lt;b&gt;moiveName&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;[&lt;/b&gt;&lt;/span&gt;&lt;b&gt;\(player.&lt;/b&gt;&lt;span&gt;&lt;b&gt;rank&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;span&gt;&lt;b&gt;위] &lt;/b&gt;&lt;/span&gt;&lt;b&gt;\(player.name)&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cell.&lt;/b&gt;&lt;span&gt;&lt;b&gt;audiCount&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;  &lt;/b&gt;&lt;/span&gt;&lt;b&gt;\(player.team)&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cell.&lt;/b&gt;&lt;span&gt;&lt;b&gt;audiAccumulate&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;⭐ &lt;/b&gt;&lt;/span&gt;&lt;b&gt;\(player.description)&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; cell&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;tableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;titleForHeaderInSection&lt;/b&gt;&lt;/span&gt;&lt;b&gt; section: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;b&gt;? {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;⚽ 2024/25 시즌 세계 축구선수 TOP 10 ⚽&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;tableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;titleForFooterInSection&lt;/b&gt;&lt;/span&gt;&lt;b&gt; section: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;b&gt;? {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;made by Lee&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;numberOfSections&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; 1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// MARK: - Life Cycle&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;override&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;func&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;() {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;delegate&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;dataSource&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;rowHeight&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;automaticDimension&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;estimatedRowHeight&lt;/b&gt;&lt;span&gt;&lt;b&gt; = 80&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// MARK: - Segue&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;override&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;prepare&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;b&gt; segue: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UIStoryboardSegue&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;sender&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/span&gt;&lt;b&gt;?) {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; dest = segue.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;destination&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;as&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;? &lt;/b&gt;&lt;/span&gt;&lt;b&gt;DetailViewController&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; indexPath = &lt;/b&gt;&lt;span&gt;&lt;b&gt;table&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;indexPathForSelectedRow&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;b&gt; { &lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; }&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dest.&lt;/b&gt;&lt;span&gt;&lt;b&gt;movieName&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;players&lt;/b&gt;&lt;/span&gt;&lt;b&gt;[indexPath.&lt;/b&gt;&lt;span&gt;&lt;b&gt;row&lt;/b&gt;&lt;/span&gt;&lt;b&gt;].name&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;DetailViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;MovieLJY&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;Created by comsoft on 2026/06/01.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; UIKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; WebKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;DetailViewController&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UIViewController&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;movieName&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;@IBOutlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;weak&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;webView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;WKWebView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;override&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;func&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;() {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;navigationItem&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;title&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;movieName&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; urlKorString =&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;&lt;a href=&quot;https://www.youtube.com/results?search_query=&quot;&gt;https://www.youtube.com/results?search_query=&lt;/a&gt;&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt; + &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;movieName&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;//let urlKorString =&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;&lt;a href=&quot;https://search.naver.com/search.naver?where=nexearch&amp;amp;sm=top_hty&amp;amp;fbm=0&amp;amp;ie=utf8&amp;amp;query=&quot;&gt;https://search.naver.com/search.naver?where=nexearch&amp;amp;sm=top_hty&amp;amp;fbm=0&amp;amp;ie=utf8&amp;amp;query=&lt;/a&gt;&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt; + &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;movieName&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; urlString =&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;urlKorString.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;addingPercentEncoding&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;withAllowedCharacters&lt;/b&gt;&lt;span&gt;&lt;b&gt;: .&lt;/b&gt;&lt;/span&gt;&lt;b&gt;urlQueryAllowed&lt;/b&gt;&lt;span&gt;&lt;b&gt;)!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; url = &lt;/b&gt;&lt;span&gt;&lt;b&gt;URL&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: urlString) &lt;/b&gt;&lt;span&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;b&gt; { &lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; }&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; request = &lt;/b&gt;&lt;span&gt;&lt;b&gt;URLRequest&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: url)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;webView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;load&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(request)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Do any additional setup after loading the view.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;/*&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// MARK: - Navigation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// In a storyboard-based application, you will often want to do a little preparation before navigation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;override func prepare(for segue: UIStoryboardSegue, sender: Any?) {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// Get the new view controller using segue.destination.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// Pass the selected object to the new view controller.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;*/&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DetailViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.53.41.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/noZqK/dJMcadCb04S/ngl8RftbS5hZoUTKWYwLc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/noZqK/dJMcadCb04S/ngl8RftbS5hZoUTKWYwLc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/noZqK/dJMcadCb04S/ngl8RftbS5hZoUTKWYwLc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnoZqK%2FdJMcadCb04S%2Fngl8RftbS5hZoUTKWYwLc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;743&quot; data-filename=&quot;스크린샷 2026-06-08 오후 5.53.41.png&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;MapViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;MovieLJY&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;Created by comsoft on 2026/06/01.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; UIKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; WebKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;MapViewController&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UIViewController&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;@IBOutlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;weak&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;webView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;WKWebView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;override&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;func&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;() {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; urlKorString = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;&lt;a href=&quot;https://map.naver.com/p/search/월드컵경기장&quot;&gt;https://map.naver.com/p/search/월드컵경기장&lt;/a&gt;&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; urlString = urlKorString.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;addingPercentEncoding&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;withAllowedCharacters&lt;/b&gt;&lt;span&gt;&lt;b&gt;: .&lt;/b&gt;&lt;/span&gt;&lt;b&gt;urlQueryAllowed&lt;/b&gt;&lt;span&gt;&lt;b&gt;)!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; url = &lt;/b&gt;&lt;span&gt;&lt;b&gt;URL&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt;&lt;b&gt;:urlString) &lt;/b&gt;&lt;span&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;b&gt; { &lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; }&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; request = &lt;/b&gt;&lt;span&gt;&lt;b&gt;URLRequest&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: url)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;webView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;load&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(request)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// Do any additional setup after loading the view.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;/*&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// MARK: - Navigation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// In a storyboard-based application, you will often want to do a little preparation before navigation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;override func prepare(for segue: UIStoryboardSegue, sender: Any?) {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// Get the new view controller using segue.destination.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// Pass the selected object to the new view controller.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;*/&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MapViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; UIKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;// MARK: - Gemini 요청 구조체 (기존 유지)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;GeminiRequest&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Encodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;contents&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;RequestContent&lt;/b&gt;&lt;span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;RequestContent&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Encodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;parts&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;RequestPart&lt;/b&gt;&lt;span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;RequestPart&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Encodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;// MARK: - Gemini 응답 구조체 (기존 유지)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;GeminiResponse&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Decodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;candidates&lt;/b&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Candidate&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;Candidate&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Decodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;content&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;ResponseContent&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;ResponseContent&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Decodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;parts&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;ResponsePart&lt;/b&gt;&lt;span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;ResponsePart&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Decodable&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;// MARK: - GeminiViewController&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;GeminiViewController&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UIViewController&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;@IBOutlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;weak&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;textField&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UITextField&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;@IBOutlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;weak&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UITextView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;apiKey&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;AQ.Ab8RN6Lp7owFsMpveEjSYMEUW8yMQa3jy-9iZTnBUjA3h6ONjQ&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;@IBAction&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;buttonTapped&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; sender: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UIButton&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; playerName = &lt;/b&gt;&lt;span&gt;&lt;b&gt;textField&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, !playerName.&lt;/b&gt;&lt;span&gt;&lt;b&gt;isEmpty&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;b&gt; { &lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; }&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;⚽ 선수 정보 검색 중...&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;view&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;endEditing&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;getData&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;playerName&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: playerName)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;getData&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;playerName&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;String&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;) {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; geminiURL = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;&lt;a href=&quot;https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=&quot;&gt;https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=&lt;/a&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;\(&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;apiKey&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; url = &lt;/b&gt;&lt;span&gt;&lt;b&gt;URL&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: geminiURL) &lt;/b&gt;&lt;span&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;b&gt; { &lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; }&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;// 축구선수 정보를 요청하는 프롬프트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; prompt = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;축구선수 '&lt;/b&gt;&lt;span&gt;&lt;b&gt;\(playerName)&lt;/b&gt;&lt;/span&gt;&lt;b&gt;'에 대해 아래 형식으로 한국어로 알려줘.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;선수가 존재하지 않으면 &quot;해당 선수를 찾을 수 없습니다&quot;라고만 답해줘.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;⚽ 선수명:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  국적:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  나이:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  키:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;⚖️ 몸무게:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  포지션:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  현재 소속팀:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  주요 커리어:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  대표 기록 (골, 어시스트 등):&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;  특징 및 플레이 스타일:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&quot;&quot;&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; requestBody = &lt;/b&gt;&lt;span&gt;&lt;b&gt;GeminiRequest&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;contents&lt;/b&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;RequestContent&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;parts&lt;/b&gt;&lt;span&gt;&lt;b&gt;: [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;RequestPart&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;text&lt;/b&gt;&lt;span&gt;&lt;b&gt;: prompt)])]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt;&lt;b&gt; request = &lt;/b&gt;&lt;span&gt;&lt;b&gt;URLRequest&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;url&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: url)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;request.&lt;/b&gt;&lt;span&gt;&lt;b&gt;httpMethod&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;POST&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;request.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;setValue&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;application/json&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;forHTTPHeaderField&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;Content-Type&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;request.&lt;/b&gt;&lt;span&gt;&lt;b&gt;httpBody&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;try&lt;/b&gt;&lt;/span&gt;&lt;b&gt;? &lt;/b&gt;&lt;span&gt;&lt;b&gt;JSONEncoder&lt;/b&gt;&lt;/span&gt;&lt;b&gt;().&lt;/b&gt;&lt;span&gt;&lt;b&gt;encode&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(requestBody)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; session = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;URLSession&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;configuration&lt;/b&gt;&lt;span&gt;&lt;b&gt;: .&lt;/b&gt;&lt;/span&gt;&lt;b&gt;default&lt;/b&gt;&lt;span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; task = session.&lt;/b&gt;&lt;span&gt;&lt;b&gt;dataTask&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;with&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: request) { [&lt;/b&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;b&gt;] (data, response, error) &lt;/b&gt;&lt;span&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;b&gt; error != &lt;/b&gt;&lt;span&gt;&lt;b&gt;nil&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;DispatchQueue.&lt;/b&gt;&lt;span&gt;&lt;b&gt;main&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;async&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;❌ 네트워크 오류가 발생했습니다.&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; JSONdata = data &lt;/b&gt;&lt;span&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt;&lt;b&gt; { &lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; }&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; decoder = &lt;/b&gt;&lt;span&gt;&lt;b&gt;JSONDecoder&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;do&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; decodedData = &lt;/b&gt;&lt;span&gt;&lt;b&gt;try&lt;/b&gt;&lt;/span&gt;&lt;b&gt; decoder.&lt;/b&gt;&lt;span&gt;&lt;b&gt;decode&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;GeminiResponse&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: JSONdata)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; text = decodedData.&lt;/b&gt;&lt;span&gt;&lt;b&gt;candidates&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;first&lt;/b&gt;&lt;/span&gt;&lt;b&gt;?.&lt;/b&gt;&lt;span&gt;&lt;b&gt;content&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;parts&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;first&lt;/b&gt;&lt;/span&gt;&lt;b&gt;?.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; ?? &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;결과 없음&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;// 마크다운 기호 제거&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;b&gt; cleanText = text&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;replacingOccurrences&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;**&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;with&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;replacingOccurrences&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;*&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;with&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;replacingOccurrences&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;##&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;with&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;replacingOccurrences&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;#&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;with&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;replacingOccurrences&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;of&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;`&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;with&lt;/b&gt;&lt;/span&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&quot;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;DispatchQueue.&lt;/b&gt;&lt;span&gt;&lt;b&gt;main&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;async&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = cleanText&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;} &lt;/b&gt;&lt;span&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;DispatchQueue.&lt;/b&gt;&lt;span&gt;&lt;b&gt;main&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;async&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;❌ 응답 처리 오류: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;\(error.&lt;/b&gt;&lt;span&gt;&lt;b&gt;localizedDescription&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(error)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;task.&lt;/b&gt;&lt;span&gt;&lt;b&gt;resume&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;override&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;func&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;() {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;textField&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;placeholder&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;선수 이름 입력 (예: 손흥민, Messi)&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;검색할 축구선수 이름을 입력하세요 ⚽&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;textView&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;isEditable&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;false&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GeminiViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cu5PaA/dJMcabYOSrU/tWORWf0SAODKVF1bk4eH4K/202208026LJY.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;202208026LJY.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.35MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.31.27.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0YKXu/dJMb997NXEk/BEqNW557cOGETDBS1knAk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0YKXu/dJMb997NXEk/BEqNW557cOGETDBS1knAk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0YKXu/dJMb997NXEk/BEqNW557cOGETDBS1knAk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0YKXu%2FdJMb997NXEk%2FBEqNW557cOGETDBS1knAk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;350&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.31.27.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.32.03.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IsZMB/dJMcaf7Y9iD/03rQ2nEeTfgI1NTZFjT96K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IsZMB/dJMcaf7Y9iD/03rQ2nEeTfgI1NTZFjT96K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IsZMB/dJMcaf7Y9iD/03rQ2nEeTfgI1NTZFjT96K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIsZMB%2FdJMcaf7Y9iD%2F03rQ2nEeTfgI1NTZFjT96K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;340&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.32.03.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.32.38.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7Gvvd/dJMcabdqXuL/fzCXtD4666a1oKsciJYuJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7Gvvd/dJMcabdqXuL/fzCXtD4666a1oKsciJYuJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7Gvvd/dJMcabdqXuL/fzCXtD4666a1oKsciJYuJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7Gvvd%2FdJMcabdqXuL%2FfzCXtD4666a1oKsciJYuJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;349&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.32.38.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.33.40.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHrDj/dJMcaa6LCXw/j77SQReJZgvxfLXXUZyMgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHrDj/dJMcaa6LCXw/j77SQReJZgvxfLXXUZyMgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHrDj/dJMcaa6LCXw/j77SQReJZgvxfLXXUZyMgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHrDj%2FdJMcaa6LCXw%2Fj77SQReJZgvxfLXXUZyMgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2026-06-15 오후 1.33.40.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.05.18.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cndnJt/dJMcabLo3lT/yoFT7RxjmmqWzhhIMiGfuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cndnJt/dJMcabLo3lT/yoFT7RxjmmqWzhhIMiGfuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cndnJt/dJMcabLo3lT/yoFT7RxjmmqWzhhIMiGfuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcndnJt%2FdJMcabLo3lT%2FyoFT7RxjmmqWzhhIMiGfuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1344&quot; height=&quot;814&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.05.18.png&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.05.34.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekrJOz/dJMcaa6LG9j/dljx8zrA5o9qSAmlwoYSb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekrJOz/dJMcaa6LG9j/dljx8zrA5o9qSAmlwoYSb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekrJOz/dJMcaa6LG9j/dljx8zrA5o9qSAmlwoYSb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekrJOz%2FdJMcaa6LG9j%2Fdljx8zrA5o9qSAmlwoYSb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;760&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.05.34.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.06.16.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKQadM/dJMcabR3pz0/hBfqIcJIUKkSXqtEQTcvj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKQadM/dJMcabR3pz0/hBfqIcJIUKkSXqtEQTcvj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKQadM/dJMcabR3pz0/hBfqIcJIUKkSXqtEQTcvj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKQadM%2FdJMcabR3pz0%2FhBfqIcJIUKkSXqtEQTcvj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;823&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.06.16.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.07.01.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8WWl/dJMcabYUazf/gaWh83Y2k3eHEEAnZwkFQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8WWl/dJMcabYUazf/gaWh83Y2k3eHEEAnZwkFQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8WWl/dJMcabYUazf/gaWh83Y2k3eHEEAnZwkFQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8WWl%2FdJMcabYUazf%2FgaWh83Y2k3eHEEAnZwkFQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1199&quot; height=&quot;726&quot; data-filename=&quot;스크린샷 2026-06-15 오후 2.07.01.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/83</guid>
      <comments>https://jong133.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 8 Jun 2026 17:55:11 +0900</pubDate>
    </item>
    <item>
      <title>202208026이종윤 iOS 13주차과제</title>
      <link>https://jong133.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 2.26.56.png&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxnF2/dJMcabYOGqS/8e70jmpKTOe73o8BikUbtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxnF2/dJMcabYOGqS/8e70jmpKTOe73o8BikUbtk/img.png&quot; data-alt=&quot;wn제미나이 api 비율제한&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxnF2/dJMcabYOGqS/8e70jmpKTOe73o8BikUbtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuxnF2%2FdJMcabYOGqS%2F8e70jmpKTOe73o8BikUbtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1872&quot; height=&quot;821&quot; data-filename=&quot;스크린샷 2026-06-08 오후 2.26.56.png&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;wn제미나이 api 비율제한&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;
&lt;pre class=&quot;livescript&quot; style=&quot;background-color: #f1f3f4; color: #37474f; text-align: left;&quot;&gt;&lt;code&gt;curl &quot;https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-flash:streamGenerateContent&quot; \
  -H &quot;x-goog-api-key: $GEMINI_API_KEY&quot; \
  -H 'Content-Type: application/json' \
  --no-buffer \
  -X POST \
  -d '{
    &quot;contents&quot;: [
      {
        &quot;parts&quot;: [
          {
            &quot;text&quot;: &quot;Explain how AI works in detail&quot;
          }
        ]
      }
    ]
  }'
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #0b0b0b; text-align: start;&quot;&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot;&gt;&lt;br /&gt;오후 2:30&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #0b0b0b; text-align: start;&quot;&gt;
&lt;div data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 Gemini API 응답에 맞는 Swift Codable 구조체를 설계해드릴게요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;import Foundation

// MARK: - Request

struct GeminiRequest: Codable {
    let contents: [Content]
}

// MARK: - Response

struct GeminiResponse: Codable {
    let candidates: [Candidate]
    let usageMetadata: UsageMetadata?
    let modelVersion: String?
}

struct Candidate: Codable {
    let content: Content
    let finishReason: String?
    let avgLogprobs: Double?
}

// MARK: - Shared

struct Content: Codable {
    let parts: [Part]
    let role: String?
}

struct Part: Codable {
    let text: String
}

// MARK: - Usage

struct UsageMetadata: Codable {
    let promptTokenCount: Int?
    let candidatesTokenCount: Int?
    let totalTokenCount: Int?
    let promptTokensDetails: [TokenDetail]?
    let candidatesTokensDetails: [TokenDetail]?
}

struct TokenDetail: Codable {
    let modality: String?
    let tokenCount: Int?
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;편의 extension도 함께:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;roboconf&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;extension GeminiResponse {
    var firstText: String? {
        candidates.first?.content.parts.first?.text
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let decoded = try JSONDecoder().decode(GeminiResponse.self, from: data)
print(decoded.firstText ?? &quot;No response&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설계 포인트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Content는 Request/Response에서 공통으로 재사용&lt;/li&gt;
&lt;li&gt;role은 요청 시엔 보통 생략되므로 Optional&lt;/li&gt;
&lt;li&gt;usageMetadata, modelVersion 등 optional 필드는 ? 처리&lt;/li&gt;
&lt;li&gt;Swift의 camelCase 네이밍을 유지하면서 JSON 키와 자동 매핑 (JSONDecoder 기본 camelCase 전략 활용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snake_case JSON 키가 있다면 decoder.keyDecodingStrategy = .convertFromSnakeCase 설정만 추가하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 2.39.07.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdnqoH/dJMcabYOHvA/nVDrK4K44DXzelszHfjdGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdnqoH/dJMcabYOHvA/nVDrK4K44DXzelszHfjdGk/img.png&quot; data-alt=&quot;텍스뷰는 기본적으로 사용자가 텍스트를 수정 입력을 할수있는데 그것을 안되게 할려면 Behavior에 editable을 해제하면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdnqoH/dJMcabYOHvA/nVDrK4K44DXzelszHfjdGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdnqoH%2FdJMcabYOHvA%2FnVDrK4K44DXzelszHfjdGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1040&quot; height=&quot;605&quot; data-filename=&quot;스크린샷 2026-06-08 오후 2.39.07.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;텍스뷰는 기본적으로 사용자가 텍스트를 수정 입력을 할수있는데 그것을 안되게 할려면 Behavior에 editable을 해제하면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 3.16.20.png&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0GXRx/dJMcaiXQmLS/oESyH54KED1xTeyWJILDFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0GXRx/dJMcaiXQmLS/oESyH54KED1xTeyWJILDFk/img.png&quot; data-alt=&quot;메서드체이닝 시험에 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0GXRx/dJMcaiXQmLS/oESyH54KED1xTeyWJILDFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0GXRx%2FdJMcaiXQmLS%2FoESyH54KED1xTeyWJILDFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1237&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2026-06-08 오후 3.16.20.png&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메서드체이닝 시험에 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 3.25.21.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tGVy2/dJMcaccjxAV/kVKRwCCf8dPfavBnFL78z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGVy2/dJMcaccjxAV/kVKRwCCf8dPfavBnFL78z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGVy2/dJMcaccjxAV/kVKRwCCf8dPfavBnFL78z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGVy2%2FdJMcaccjxAV%2FkVKRwCCf8dPfavBnFL78z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;764&quot; data-filename=&quot;스크린샷 2026-06-08 오후 3.25.21.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오후 3.25.34.png&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctjHYT/dJMcabYOJVh/MHmrQG7MKCGiouqYcJmYfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctjHYT/dJMcabYOJVh/MHmrQG7MKCGiouqYcJmYfk/img.png&quot; data-alt=&quot;깔끔하게 마크다운 기호를 제거해서 잘 출력이 됬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctjHYT/dJMcabYOJVh/MHmrQG7MKCGiouqYcJmYfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctjHYT%2FdJMcabYOJVh%2FMHmrQG7MKCGiouqYcJmYfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1207&quot; height=&quot;754&quot; data-filename=&quot;스크린샷 2026-06-08 오후 3.25.34.png&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깔끔하게 마크다운 기호를 제거해서 잘 출력이 됬다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cbqU9e/dJMcag6QuDR/8fdbKTKT9Iw2EH7hGfBM10/MovieLJY%206.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MovieLJY 6.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.39MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/82</guid>
      <comments>https://jong133.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 8 Jun 2026 15:22:56 +0900</pubDate>
    </item>
    <item>
      <title>202208026이종윤iOS프로그래밍12주차과제</title>
      <link>https://jong133.tistory.com/81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-01 오후 2.28.30.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sfed6/dJMcaf7PSDw/EKgDKnR6SkEBkXpLrVmLbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sfed6/dJMcaf7PSDw/EKgDKnR6SkEBkXpLrVmLbk/img.png&quot; data-alt=&quot;네이게이션 컨트롤러와 세규에이를 쓴다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sfed6/dJMcaf7PSDw/EKgDKnR6SkEBkXpLrVmLbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSfed6%2FdJMcaf7PSDw%2FEKgDKnR6SkEBkXpLrVmLbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;691&quot; data-filename=&quot;스크린샷 2026-06-01 오후 2.28.30.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이게이션 컨트롤러와 세규에이를 쓴다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-01 오후 2.32.43.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMPMf/dJMcabEov4U/dOrIDGQCZdnnkkNKvyLHCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMPMf/dJMcabEov4U/dOrIDGQCZdnnkkNKvyLHCK/img.png&quot; data-alt=&quot;네비게이션 컨트롤러 다음에 테이블 뷰를 넘어가게 하면은 네이게이션 바가 생성이 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMPMf/dJMcabEov4U/dOrIDGQCZdnnkkNKvyLHCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMPMf%2FdJMcabEov4U%2FdOrIDGQCZdnnkkNKvyLHCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;599&quot; data-filename=&quot;스크린샷 2026-06-01 오후 2.32.43.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네비게이션 컨트롤러 다음에 테이블 뷰를 넘어가게 하면은 네이게이션 바가 생성이 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-01 오후 2.34.02.png&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnwnU/dJMcahdy87p/XYMLAvE3mkCQ6KxvugrlnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnwnU/dJMcahdy87p/XYMLAvE3mkCQ6KxvugrlnK/img.png&quot; data-alt=&quot;네비게이션 컨트롤러를 추가하면 바뀌는 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnwnU/dJMcahdy87p/XYMLAvE3mkCQ6KxvugrlnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtnwnU%2FdJMcahdy87p%2FXYMLAvE3mkCQ6KxvugrlnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1268&quot; height=&quot;700&quot; data-filename=&quot;스크린샷 2026-06-01 오후 2.34.02.png&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네비게이션 컨트롤러를 추가하면 바뀌는 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-01 오후 3.16.33.png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSU7eU/dJMcadoBXzq/EEInS1nOKsXauBYSQzL8JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSU7eU/dJMcadoBXzq/EEInS1nOKsXauBYSQzL8JK/img.png&quot; data-alt=&quot;framework를 추가하는 방법이다. 지금은 에러가 안나도 이렇게 안하면 나중에 에러가 날수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSU7eU/dJMcadoBXzq/EEInS1nOKsXauBYSQzL8JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSU7eU%2FdJMcadoBXzq%2FEEInS1nOKsXauBYSQzL8JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1093&quot; height=&quot;207&quot; data-filename=&quot;스크린샷 2026-06-01 오후 3.16.33.png&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;framework를 추가하는 방법이다. 지금은 에러가 안나도 이렇게 안하면 나중에 에러가 날수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-01 오후 4.29.18.png&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M3J9w/dJMcaiKfuPq/6BeTk3088hZ2E4G8cuVcAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M3J9w/dJMcaiKfuPq/6BeTk3088hZ2E4G8cuVcAk/img.png&quot; data-alt=&quot;하루에 최대 20번 쓸수있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M3J9w/dJMcaiKfuPq/6BeTk3088hZ2E4G8cuVcAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM3J9w%2FdJMcaiKfuPq%2F6BeTk3088hZ2E4G8cuVcAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1656&quot; height=&quot;481&quot; data-filename=&quot;스크린샷 2026-06-01 오후 4.29.18.png&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하루에 최대 20번 쓸수있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-01 오후 4.37.25.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJNlP/dJMcajoOtBJ/3miHRESp1FdL5hQdSBSOeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJNlP/dJMcajoOtBJ/3miHRESp1FdL5hQdSBSOeK/img.png&quot; data-alt=&quot;화면에 나오는 root view controller는 최상위 뷰 컨트롤러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJNlP/dJMcajoOtBJ/3miHRESp1FdL5hQdSBSOeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJNlP%2FdJMcajoOtBJ%2F3miHRESp1FdL5hQdSBSOeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;695&quot; data-filename=&quot;스크린샷 2026-06-01 오후 4.37.25.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면에 나오는 root view controller는 최상위 뷰 컨트롤러&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAIQAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;prepare(for:sender:) 메소드는 &lt;b&gt;iOS 앱에서 화면 전환(Segue)이 일어나기 직전에 호출되는 메소드&lt;/b&gt;입니다. 주로 전환되는 다음 화면(목적지 뷰 컨트롤러)에 필요한 &lt;b&gt;데이터를 전달하거나 초기 설정을 하는 용도&lt;/b&gt;로 사용됩니다.&lt;span&gt; [&lt;a href=&quot;https://jcsoohwancho.github.io/2019-07-28-Segue-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0/&quot;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAMQAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이해를 돕기 위해 스토리보드를 활용한 &lt;b&gt;기본적인 사용법과 예시&lt;/b&gt;를 정리해 드립니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIBBAA&quot; data-bfc=&quot;&quot;&gt;&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIBRAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  prepare(for:sender:) 작성 패턴&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIBhAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAYQAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이 메소드를 사용할 때는 보통 다음과 같은 구조를 가집니다.&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIBxAA&quot; data-bfc=&quot;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAcQAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Identifier(식별자) 확인&lt;/b&gt;: 여러 화면 전환이 있을 수 있으므로 어떤 Segue인지 확인합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAcQAg&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Destination(목적지) 가져오기&lt;/b&gt;: 이동할 뷰 컨트롤러의 인스턴스를 가져옵니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAcQAw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;데이터 전달&lt;/b&gt;: 목적지 뷰 컨트롤러의 프로퍼티에 데이터를 대입합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEICBAA&quot; data-bfc=&quot;&quot;&gt;&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEICRAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  실제 코드 예시&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIChAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAoQAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;예를 들어, &lt;b&gt;A 화면(입력 화면)&lt;/b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;에서 &lt;b&gt;B 화면(결과 화면)&lt;/b&gt;으로 넘어가며 사용자가 입력한 &lt;/span&gt;&lt;/span&gt;String 데이터를 전달하는 상황입니다.&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEICxAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 4px 0px 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCAsQAQ&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;JmhW9b_27,JmhW9b_26&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 1px solid rgb(243, 245, 246);&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 500; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;swift&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;
&lt;pre class=&quot;swift&quot; data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 14px 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;&lt;code&gt;import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var nameTextField: UITextField!
    
    // Segue가 실행되기 직전에 호출되는 메소드
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        // 1. Segue의 식별자 확인 (스토리보드에서 설정한 Segue ID)
        if segue.identifier == &quot;showResultSegue&quot; {
            
            // 2. 목적지 뷰 컨트롤러(SecondViewController) 가져오기
            if let destinationVC = segue.destination as? SecondViewController {
                
                // 3. 목적지 뷰 컨트롤러의 변수에 데이터 전달
                destinationVC.receivedName = nameTextField.text
            }
        }
    }
}

class SecondViewController: UIViewController {
    
    // 이전 화면에서 데이터를 받을 변수
    var receivedName: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 전달받은 데이터를 화면에 표시하거나 활용
        print(&quot;전달받은 이름: \(receivedName ?? &quot;없음&quot;)&quot;)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 3px 0px 0px; text-decoration: none; border-bottom: 1px solid rgb(243, 245, 246);&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 12px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;코드를 사용할 때는 주의가 필요합니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-complete=&quot;true&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQh9gSegoIAggACAEICxAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIDBAA&quot; data-bfc=&quot;&quot;&gt;&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIDRAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;⚠️ 필수 확인 사항 (Step-by-Step)&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIDhAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCA4QAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이 코드가 정상적으로 작동하려면 반드시 &lt;b&gt;Xcode 스토리보드에서 다음 2가지를 설정&lt;/b&gt;해야 합니다.&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjElPHyxOWUAxXwhVYBHSF6J1cQi4wTegoIAggACAEIDxAA&quot; data-bfc=&quot;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCA8QAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Segue Identifier 지정&lt;/b&gt;: 스토리보드의 Segue 라인을 클릭하고 우측 Attributes Inspector에서 Identifier를 코드와 동일하게(showResultSegue) 적어줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAIIAAgBCA8QBA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;Destination Class 확인&lt;/b&gt;: Segue의 목적지 뷰 컨트롤러를 클릭하고 Identity Inspector에서 Class가 SecondViewController로 정확히 지정되어 있는지 확인합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-mq=&quot;a.b.com 사이트를 보여주는 스위프트 소스를 작성하고 설명해줘&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;UXVYM_3q,UXVYM_3r,UXVYM_3s,UXVYM_3t,UXVYM_3u,UXVYM_3v&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiq0LbFxeWUAxUpr1YBHc-UNM4Q_sYPegYIAggBECI&quot; data-animation-skip=&quot;&quot; aria-hidden=&quot;false&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px 0px 0px 122.094px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-wiz-attrbind=&quot;class=UXVYM_3p/tPhIrf&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;a.b.com 사이트를 보여주는 스위프트 소스를 작성하고 설명해줘&lt;/span&gt;&lt;/span&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-tr-rsts=&quot;false&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-streaming-container=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-container-id=&quot;EDgdaqzbOo-l2roPtdSlyQE&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-scope-id=&quot;turn&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-subtree=&quot;aimc&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIARAA&quot; data-ved=&quot;2ahUKEwiso4PGxeWUAxWPklYBHTVqKRkQ2O0OegYIAAgBEAA&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;Zggayc_3&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-ved=&quot;2ahUKEwiso4PGxeWUAxWPklYBHTVqKRkQ3KYQegYIAAgBEAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-xid=&quot;VpUvz&quot; data-container-id=&quot;main-col&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-subtree=&quot;aimfl&quot;&gt;스위프트(Swift)에서 특정 웹사이트(&lt;/span&gt;a.b.com)를 화면에 보여주기 위해 가장 널리 쓰이는 표준 방식은 &lt;b&gt;WebKit 프레임워크의 WKWebView를 사용하는 것&lt;/b&gt;입니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;iOS 앱에서 웹 화면을 띄우는 &lt;b&gt;전체 소스 코드와 핵심 설명&lt;/b&gt;을 정리해 드립니다.&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  WKWebView를 활용한 소스 코드&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;iOS 13 버전 이상에서 스토리보드 없이 코드로만 뷰를 구성할 때 사용하는 가장 깔끔한 기본 UIViewController 형태입니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 4px 0px 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAA&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;Zggayc_1b,Zggayc_1a&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 1px solid rgb(240, 242, 245);&quot; data-sae=&quot;&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 500; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;swift&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;pre class=&quot;swift&quot; data-copy-service-computed-style=&quot;font-family: monospace; font-size: 14px; font-weight: 400; margin: 14px 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;&lt;code&gt;import UIKit
import WebKit

class WebViewController: UIViewController, WKNavigationDelegate {

    // 1. 웹뷰 인스턴스 생성
    var webView: WKWebView!

    override func loadView() {
        // 웹뷰 설정 및 초기화
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        
        // 탐색 이벤트를 처리할 대리자(Delegate) 설정
        webView.navigationDelegate = self
        
        // 루트 뷰를 웹뷰로 지정
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // 2. 보여주고자 하는 URL 주소 정의
        let urlString = &quot;https://b.com&quot;
        
        // 3. URL 구조체 생성 및 안전한 언래핑
        guard let myURL = URL(string: urlString) else {
            print(&quot;올바르지 않은 URL 형식입니다.&quot;)
            return
        }
        
        // 4. URL Request 객체 생성 후 웹뷰에 로드
        let myRequest = URLRequest(url: myURL)
        webView.load(myRequest)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 3px 0px 0px; text-decoration: none; border-bottom: 1px solid rgb(240, 242, 245);&quot; data-sae=&quot;&quot; data-animation-atomic=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 12px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;코드를 사용할 때는 주의가 필요합니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-ved=&quot;2ahUKEwiso4PGxeWUAxWPklYBHTVqKRkQh9gSegYIAAgJEAI&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  코드 핵심 동작 설명&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;import WebKit&lt;/b&gt;: 웹 콘텐츠를 앱 내에 표시하고 제어할 수 있게 해주는 애플의 전용 프레임워크를 불러옵니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;WKWebView&lt;/b&gt;: 과거에 쓰이던 UIWebView를 대체하는 고성능 웹 브라우저 엔진 뷰입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;loadView()&lt;/b&gt;: 컨트롤러의 기본 뷰를 생성하는 시점입니다. 여기서 화면 전체 크기를 웹뷰(view = webView)로 교체하여 꽉 찬 웹 화면을 만듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;URL(string:)&lt;/b&gt;: 문자열을 스위프트가 인식할 수 있는 실제 URL 객체로 변환합니다. 주소가 잘못되었을 경우를 대비해 guard let 문으로 안전하게 예외 처리를 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;URLRequest&lt;/b&gt;: 서버에 요청할 URL 정보와 옵션을 담는 바구니 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAF&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;webView.load(myRequest)&lt;/b&gt;: 완성된 요청서(Request)를 웹뷰 엔진에 던져서 실제로 페이지를 부르고 화면에 렌더링하기 시작합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;⚠️ 필수 앱 설정 변경 (App Transport Security)&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;만약 연결하려는 a.b.com 사이트가 보안 연결(https://)이 아닌 &lt;b&gt;일반 HTTP(&lt;a href=&quot;http://b.com&quot;&gt;http://b.com&lt;/a&gt;) 프로토콜을 사용한다면&lt;/b&gt;, iOS의 보안 정책 때문에 페이지가 열리지 않고 흰 화면만 나옵니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIEBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이 경우 프로젝트의 &lt;b&gt;Info.plist&lt;/b&gt; 파일에 아래 옵션을 추가해 주어야 접속이 허용됩니다.&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;Info.plist 파일을 엽니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;App Transport Security Settings&lt;/b&gt; 딕셔너리를 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIERAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;그 하위에 &lt;b&gt;Allow Arbitrary Loads&lt;/b&gt; 키를 추가하고 값을 YES로 변경합니다.&lt;/span&gt;&lt;span&gt; [&lt;a href=&quot;https://weekoding.tistory.com/16&quot;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;0CAAQ_sYPahcKEwjIu-7FxeWUAxUAAAAAHQAAAAAQMQ&quot; aria-hidden=&quot;false&quot; data-animation-skip=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px 0px 0px 321.266px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;load다음에 왜 request를 쓰니?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-streaming-container=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-container-id=&quot;rzgdatLEC-aM2roP1_28GA&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-scope-id=&quot;turn&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-subtree=&quot;aimc&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIARAA&quot; data-ved=&quot;2ahUKEwiS2LyRxuWUAxVmhlYBHdc-DwMQ2O0OegYIAAgBEAA&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;ILULUb_3&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-ved=&quot;2ahUKEwiS2LyRxuWUAxVmhlYBHdc-DwMQ3KYQegYIAAgBEAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-xid=&quot;VpUvz&quot; data-container-id=&quot;main-col&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAAIAxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;webView.load() 메소드가 URL 주소 하나만 받지 않고, 굳이 URLRequest라는 객체를 한 번 더 감싸서 받는 이유는 &lt;b&gt;웹 서버와 통신할 때 주소 외에도 전달해야 하는 '추가 정보'가 많기 때문&lt;/b&gt;입니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;이유를 쉽게 이해하실 수 있도록 &lt;b&gt;택배&lt;/b&gt;에 비유하여 설명해 드립니다.&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  URL과 URLRequest의 차이 (택배 비유)&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;URL (주소지)&lt;/b&gt;: 단순히 &quot;서울시 강남구 역삼동 123&quot;과 같은 &lt;b&gt;목적지 주소&lt;/b&gt;일 뿐입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIBxAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;URLRequest (택배 상자와 송장)&lt;/b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;: 주소(URL)를 포함하여, 물건을 보낼 때 필요한 &lt;b&gt;모든 옵션과 정보(보내는 사람, 배송 요청 사항, 내용물 등)&lt;/b&gt;를 한데 모아놓은 상자입니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt; ️ URLRequest를 사용해서 얻는 장점 (추가 기능)&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIChAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;단순히 페이지를 열 때는 URL만 있으면 될 것 같지만, 실제 앱 개발에서는 웹 서버에 다음과 같은 복잡한 요청을 보내야 할 때가 많습니다. URLRequest는 이 정보들을 모두 담을 수 있습니다.&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;로그인 상태 유지 (헤더 정보)&lt;/b&gt;: &quot;이 사용자는 이미 인증된 회원입니다&quot;라는 토큰(Token)이나 쿠키(Cookie) 정보를 담아 보낼 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;데이터 전송 방식 결정 (HTTP Method)&lt;/b&gt;: 웹페이지를 단순히 보여달라는 요청(GET)인지, 사용자가 작성한 글이나 파일을 서버로 전송하는 요청(POST)인지 설정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAG&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;캐시 정책 설정 (Cache Policy)&lt;/b&gt;: &quot;매번 새로운 페이지를 서버에서 받아올 것인가&quot;, 아니면 &quot;기존에 저장된 스마트폰 내부 데이터(캐시)를 보여줄 것인가&quot;를 결정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAJ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;타임아웃(제한 시간) 설정&lt;/b&gt;: 인터넷이 느릴 때 &quot;몇 초 동안 반응이 없으면 연결을 끊을 것인가&quot;를 정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  한 줄 요약&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;스위프트의 WKWebView는 단순히 주소(URL)로 이동하는 기능뿐만 아니라, &lt;b&gt;서버와 복잡한 통신을 안전하고 다양하게 제어할 수 있도록 설계&lt;/b&gt;되었기 때문에 URLRequest를 매개변수로 받도록 만들어져 있습니다.&lt;/div&gt;
&lt;hr data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 14px; font-weight: 400; margin: 32px 0px; text-decoration: none; border-bottom: 0px rgb(128, 128, 128);&quot; data-sae=&quot;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-pl=&quot;|[]&quot; data-sfc-root=&quot;c&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 평소에 관심있는 피파랭킹같은거를 해봐야겠다. 월드컵이 곧 시작이기 때문이다!&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/81</guid>
      <comments>https://jong133.tistory.com/81#entry81comment</comments>
      <pubDate>Mon, 1 Jun 2026 16:47:32 +0900</pubDate>
    </item>
    <item>
      <title>202208026이종윤 iOS 11주차 과제</title>
      <link>https://jong133.tistory.com/79</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.24.13.png&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EW9QG/dJMcadIJGfe/Fa8UBRJRS5kkX4UHw3CAOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EW9QG/dJMcadIJGfe/Fa8UBRJRS5kkX4UHw3CAOK/img.png&quot; data-alt=&quot;애플에서 기기마다 같은 동작을 하게끔 만드는것이 오토레이아웃이있고 사진과같이 5가지 방법이있다. 초보자들이 의외로 많이 실습을해야되서 어려운 스토리보드 기반으로 스택뷰를 쓸것이다. 초보때 제일 먼저 배우는 방식 스토리보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EW9QG/dJMcadIJGfe/Fa8UBRJRS5kkX4UHw3CAOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEW9QG%2FdJMcadIJGfe%2FFa8UBRJRS5kkX4UHw3CAOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1211&quot; height=&quot;688&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.24.13.png&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애플에서 기기마다 같은 동작을 하게끔 만드는것이 오토레이아웃이있고 사진과같이 5가지 방법이있다. 초보자들이 의외로 많이 실습을해야되서 어려운 스토리보드 기반으로 스택뷰를 쓸것이다. 초보때 제일 먼저 배우는 방식 스토리보드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.33.13.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LxZHe/dJMcabYzlsJ/hOPnVffV0r7rYx1ywtufg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LxZHe/dJMcabYzlsJ/hOPnVffV0r7rYx1ywtufg1/img.png&quot; data-alt=&quot;NSLayoutAnchor란? 오토레이아웃에서 뷰의 위치와 크기를 앵커(기준점) 기반으로 제약 조건을 거는 방식입니다. 코드로 레이아웃을 잡을 때 가장 많이 쓰입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LxZHe/dJMcabYzlsJ/hOPnVffV0r7rYx1ywtufg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLxZHe%2FdJMcabYzlsJ%2FhOPnVffV0r7rYx1ywtufg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;433&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.33.13.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NSLayoutAnchor란? 오토레이아웃에서 뷰의 위치와 크기를 앵커(기준점) 기반으로 제약 조건을 거는 방식입니다. 코드로 레이아웃을 잡을 때 가장 많이 쓰입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NSLayoutAnchor를 이용한 오토레이아웃&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;mcp-app-modal-toolu_01EzM6S2mCJPamtXn99c9eeu&quot;&gt;
&lt;div id=&quot;mcp-app-modal-frame-toolu_01EzM6S2mCJPamtXn99c9eeu&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.35.17.png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqESLT/dJMcaipP24r/ctUlNNpcrKz6yWgmPlSYM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqESLT/dJMcaipP24r/ctUlNNpcrKz6yWgmPlSYM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqESLT/dJMcaipP24r/ctUlNNpcrKz6yWgmPlSYM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqESLT%2FdJMcaipP24r%2FctUlNNpcrKz6yWgmPlSYM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;565&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.35.17.png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;span&gt;visualize&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;visualize&lt;span&gt; show_widget&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;mcp-app-container-toolu_01EzM6S2mCJPamtXn99c9eeu&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NSLayoutAnchor란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오토레이아웃에서 뷰의 위치와 크기를 &lt;b&gt;앵커(기준점)&lt;/b&gt; 기반으로 제약 조건을 거는 방식입니다. 코드로 레이아웃을 잡을 때 가장 많이 쓰입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시: 버튼을 화면 정중앙에 배치&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.setTitle(&quot;로그인 버튼&quot;, for: .normal)
        view.addSubview(button)

        // ⚠️ 이 한 줄 필수! 없으면 제약이 무시됨
        button.translatesAutoresizingMaskIntoConstraints = false

        // 가로 중앙 정렬
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        // 세로 중앙 정렬
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        // 너비 고정
        button.widthAnchor.constraint(equalToConstant: 150).isActive = true
        // 높이 고정
        button.heightAnchor.constraint(equalToConstant: 66).isActive = true
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 앵커 종류&lt;/h4&gt;
&lt;div&gt;앵커의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;centerXAnchor&lt;/td&gt;
&lt;td&gt;가로 중앙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;centerYAnchor&lt;/td&gt;
&lt;td&gt;세로 중앙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;widthAnchor&lt;/td&gt;
&lt;td&gt;너비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;heightAnchor&lt;/td&gt;
&lt;td&gt;높이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;topAnchor&lt;/td&gt;
&lt;td&gt;위쪽 가장자리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;leadingAnchor&lt;/td&gt;
&lt;td&gt;왼쪽 가장자리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;translatesAutoresizingMaskIntoConstraints = false는 코드로 오토레이아웃을 쓸 때 &lt;b&gt;반드시&lt;/b&gt; 설정해야 합니다. 빠트리면 제약 조건이 충돌해서 레이아웃이 깨집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.35.49.png&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2fiOD/dJMcahRX49F/5DYpLQZ3PDuW2xur7M0Vj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2fiOD/dJMcahRX49F/5DYpLQZ3PDuW2xur7M0Vj0/img.png&quot; data-alt=&quot;오토레이아웃을 하기 힘든데 개를 쉽게하게 하기위해 해커가 만들어논 라이브러리이다. 실무에서 가장많이 쓰는 라이브러리중에 하나이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2fiOD/dJMcahRX49F/5DYpLQZ3PDuW2xur7M0Vj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2fiOD%2FdJMcahRX49F%2F5DYpLQZ3PDuW2xur7M0Vj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1239&quot; height=&quot;810&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.35.49.png&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오토레이아웃을 하기 힘든데 개를 쉽게하게 하기위해 해커가 만들어논 라이브러리이다. 실무에서 가장많이 쓰는 라이브러리중에 하나이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.40.21.png&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7REA9/dJMcagZOQTZ/4GUeJrpSl02OKftkGvmTek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7REA9/dJMcagZOQTZ/4GUeJrpSl02OKftkGvmTek/img.png&quot; data-alt=&quot;실행결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7REA9/dJMcagZOQTZ/4GUeJrpSl02OKftkGvmTek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7REA9%2FdJMcagZOQTZ%2F4GUeJrpSl02OKftkGvmTek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;705&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.40.21.png&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.40.41.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LsOIG/dJMcaak09PQ/Kp2wJq6Nkhf7Nnwy0CSRlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LsOIG/dJMcaak09PQ/Kp2wJq6Nkhf7Nnwy0CSRlK/img.png&quot; data-alt=&quot;안녕하세요! 버튼과 버튼 눌러보기 버튼이 이렇게 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LsOIG/dJMcaak09PQ/Kp2wJq6Nkhf7Nnwy0CSRlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLsOIG%2FdJMcaak09PQ%2FKp2wJq6Nkhf7Nnwy0CSRlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;850&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.40.41.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;안녕하세요! 버튼과 버튼 눌러보기 버튼이 이렇게 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.44.22.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3t5F5/dJMcabRJtht/g2GZAfkkox4qkBxf0JBbpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3t5F5/dJMcabRJtht/g2GZAfkkox4qkBxf0JBbpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3t5F5/dJMcabRJtht/g2GZAfkkox4qkBxf0JBbpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3t5F5%2FdJMcabRJtht%2Fg2GZAfkkox4qkBxf0JBbpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;471&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.44.22.png&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;471&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.44.36.png&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btbNgk/dJMcafzTt4Q/cBH0FIn2cPYKBpxLYC7HK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btbNgk/dJMcafzTt4Q/cBH0FIn2cPYKBpxLYC7HK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btbNgk/dJMcafzTt4Q/cBH0FIn2cPYKBpxLYC7HK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtbNgk%2FdJMcafzTt4Q%2FcBH0FIn2cPYKBpxLYC7HK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;556&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.44.36.png&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UIKit vs SwiftUI 비교&lt;/h4&gt;
&lt;div&gt;UIKit (오토레이아웃)SwiftUI
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;translatesAutoresizingMaskIntoConstraints = false&lt;/td&gt;
&lt;td&gt;없음 (자동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;centerXAnchor.constraint(equalTo:...)&lt;/td&gt;
&lt;td&gt;VStack, HStack 으로 배치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;widthAnchor.constraint(equalToConstant: 150)&lt;/td&gt;
&lt;td&gt;.frame(width: 150)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;topAnchor.constraint(equalTo:..., constant: 16)&lt;/td&gt;
&lt;td&gt;.padding(.top, 16)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SwiftUI는 제약 조건을 직접 걸지 않고, &lt;b&gt;컨테이너(VStack, HStack, ZStack)&lt;/b&gt; 안에 뷰를 선언하는 것만으로 레이아웃이 자동으로 잡힙니다. 코드가 훨씬 짧고 직관적인 게 가장 큰 차이점입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.47.29.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfQ2v3/dJMcaiwAsCM/KD1o9RrfcK1Fm1zMAdhxl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfQ2v3/dJMcaiwAsCM/KD1o9RrfcK1Fm1zMAdhxl1/img.png&quot; data-alt=&quot;허밍은 늘리고싶지 않는 특징 컴프래션은 줄어들기싶지 않는 특징이다. Content Hugging 및 Content Compression Resistance Priority  뷰의 크기가 내용에 어떻게 맞춰져야 하는지를 결정  Content Hugging : 내 크기를 더 크게 늘리고 싶지 않아!  Content Compression Resistance : 내 크기를 더 줄이고 싶지 않아! &amp;amp;lt;-시험에 무조건나옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfQ2v3/dJMcaiwAsCM/KD1o9RrfcK1Fm1zMAdhxl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfQ2v3%2FdJMcaiwAsCM%2FKD1o9RrfcK1Fm1zMAdhxl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;670&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.47.29.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;허밍은 늘리고싶지 않는 특징 컴프래션은 줄어들기싶지 않는 특징이다. Content Hugging 및 Content Compression Resistance Priority  뷰의 크기가 내용에 어떻게 맞춰져야 하는지를 결정  Content Hugging : 내 크기를 더 크게 늘리고 싶지 않아!  Content Compression Resistance : 내 크기를 더 줄이고 싶지 않아! &amp;lt;-시험에 무조건나옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.50.04.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcRCLj/dJMcaaFnio1/2wRekvAnSQvAQrcNE3bKi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcRCLj/dJMcaaFnio1/2wRekvAnSQvAQrcNE3bKi1/img.png&quot; data-alt=&quot;제일 오른쪽 아이콘을 클릭하면 이런 창이 뜨는데 이거는 스택뷰이다. 가장 많이 쓸 것이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcRCLj/dJMcaaFnio1/2wRekvAnSQvAQrcNE3bKi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcRCLj%2FdJMcaaFnio1%2F2wRekvAnSQvAQrcNE3bKi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;284&quot; data-filename=&quot;스크린샷 2026-05-18 오후 2.50.04.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제일 오른쪽 아이콘을 클릭하면 이런 창이 뜨는데 이거는 스택뷰이다. 가장 많이 쓸 것이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.06.35.png&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qq7yG/dJMcaarPapf/6tJFRJVdbAuxtKBfUe19p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qq7yG/dJMcaarPapf/6tJFRJVdbAuxtKBfUe19p0/img.png&quot; data-alt=&quot;오른쪽위에 삼각형으로 되있는게 사이드 인스펙터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qq7yG/dJMcaarPapf/6tJFRJVdbAuxtKBfUe19p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQq7yG%2FdJMcaarPapf%2F6tJFRJVdbAuxtKBfUe19p0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;956&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.06.35.png&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;956&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오른쪽위에 삼각형으로 되있는게 사이드 인스펙터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.14.18.png&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3BqC9/dJMcadBX9KV/MqKmrAB1lHxzQqKBtEz9H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3BqC9/dJMcadBX9KV/MqKmrAB1lHxzQqKBtEz9H0/img.png&quot; data-alt=&quot;750,250, 1000 내가 직접 잡으면 우선순위가 높다. 압축해서 내용이 안보이게하는것은 안되니까 내용이 보일때까지만 압축해라해서 750이고 허깅은 251정도 되는것이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3BqC9/dJMcadBX9KV/MqKmrAB1lHxzQqKBtEz9H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3BqC9%2FdJMcadBX9KV%2FMqKmrAB1lHxzQqKBtEz9H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;847&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.14.18.png&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;750,250, 1000 내가 직접 잡으면 우선순위가 높다. 압축해서 내용이 안보이게하는것은 안되니까 내용이 보일때까지만 압축해라해서 750이고 허깅은 251정도 되는것이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.17.13.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfFFb/dJMcagFARid/KccEQV2btatkalteCZQlkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfFFb/dJMcagFARid/KccEQV2btatkalteCZQlkk/img.png&quot; data-alt=&quot;이 콘텐츠의 크기를 고유 콘텐츠 사이즈라고 함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfFFb/dJMcagFARid/KccEQV2btatkalteCZQlkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfFFb%2FdJMcagFARid%2FKccEQV2btatkalteCZQlkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1214&quot; height=&quot;693&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.17.13.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 콘텐츠의 크기를 고유 콘텐츠 사이즈라고 함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.19.20.png&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz9c5K/dJMcafNszew/G1MZ5eA8pOxeBQ4v3bn2O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz9c5K/dJMcafNszew/G1MZ5eA8pOxeBQ4v3bn2O1/img.png&quot; data-alt=&quot;허킹은 늘어나지 않을려고하는것이고 컴프레션 레지스턴스는 쭐어들지 않을려고 하는것이다. 그래서 이런애를 컨스트레인트를 높게 주면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz9c5K/dJMcafNszew/G1MZ5eA8pOxeBQ4v3bn2O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz9c5K%2FdJMcafNszew%2FG1MZ5eA8pOxeBQ4v3bn2O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1261&quot; height=&quot;679&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.19.20.png&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;허킹은 늘어나지 않을려고하는것이고 컴프레션 레지스턴스는 쭐어들지 않을려고 하는것이다. 그래서 이런애를 컨스트레인트를 높게 주면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.22.32.png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7uCsJ/dJMcaaSS9Yv/JPIM2cMhq4Ia0tFha1HRu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7uCsJ/dJMcaaSS9Yv/JPIM2cMhq4Ia0tFha1HRu1/img.png&quot; data-alt=&quot;스택뷰는 정렬과 배분과 간격만 알고있으면된다. 정렬은 Alignment 배분은 distribution 간격은 spacing&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7uCsJ/dJMcaaSS9Yv/JPIM2cMhq4Ia0tFha1HRu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7uCsJ%2FdJMcaaSS9Yv%2FJPIM2cMhq4Ia0tFha1HRu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;683&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.22.32.png&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스택뷰는 정렬과 배분과 간격만 알고있으면된다. 정렬은 Alignment 배분은 distribution 간격은 spacing&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.27.28.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQtsI/dJMcabYzpmW/DwV6B1TQSHEZK2svoZ5tP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQtsI/dJMcabYzpmW/DwV6B1TQSHEZK2svoZ5tP1/img.png&quot; data-alt=&quot;수동으로 사이즈를 줄이면은 왼쪽에 노란 화살표가 뜨며 그거를 클릭시 에메하는식의 경고창이 뜬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQtsI/dJMcabYzpmW/DwV6B1TQSHEZK2svoZ5tP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQtsI%2FdJMcabYzpmW%2FDwV6B1TQSHEZK2svoZ5tP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1055&quot; height=&quot;642&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.27.28.png&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수동으로 사이즈를 줄이면은 왼쪽에 노란 화살표가 뜨며 그거를 클릭시 에메하는식의 경고창이 뜬다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.30.27.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAvBOS/dJMcacwpjgi/WGgsmOktvmNs6k0Nsg6mx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAvBOS/dJMcacwpjgi/WGgsmOktvmNs6k0Nsg6mx0/img.png&quot; data-alt=&quot;자동으로 문제를 해결해주는 기능이 우주선 같이 생긴모양이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAvBOS/dJMcacwpjgi/WGgsmOktvmNs6k0Nsg6mx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAvBOS%2FdJMcacwpjgi%2FWGgsmOktvmNs6k0Nsg6mx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;842&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.30.27.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자동으로 문제를 해결해주는 기능이 우주선 같이 생긴모양이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.36.39.png&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mauPA/dJMcaaFnkKV/w72GargYsGawx4M3ZdHws0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mauPA/dJMcaaFnkKV/w72GargYsGawx4M3ZdHws0/img.png&quot; data-alt=&quot;레이블 두개를 스택뷰에다가 넣었는데 위아래로 되있어서 버티컬이 axis로 값이 되어있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mauPA/dJMcaaFnkKV/w72GargYsGawx4M3ZdHws0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmauPA%2FdJMcaaFnkKV%2Fw72GargYsGawx4M3ZdHws0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;525&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.36.39.png&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레이블 두개를 스택뷰에다가 넣었는데 위아래로 되있어서 버티컬이 axis로 값이 되어있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.37.26.png&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3e8fk/dJMcadorWcK/GCptsGk0iZA6KW7lKDtXck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3e8fk/dJMcadorWcK/GCptsGk0iZA6KW7lKDtXck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3e8fk/dJMcadorWcK/GCptsGk0iZA6KW7lKDtXck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3e8fk%2FdJMcadorWcK%2FGCptsGk0iZA6KW7lKDtXck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;261&quot; height=&quot;654&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.37.26.png&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.40.33.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xds7m/dJMcag6CwO8/hdx8lelGpxwn2g0Z3RKyK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xds7m/dJMcag6CwO8/hdx8lelGpxwn2g0Z3RKyK0/img.png&quot; data-alt=&quot;지금 원래 왼쪽에 있는 레이블 두개를 h스택뷰를해서 넣어놨다. 제일 바깎쪽에 있는것이 h스택뷰고 안쪽에 있는것은 수직 스택뷰이다. 레이블 두개를 추가하여 일정한 간격으로 스택뷰를 지정하고 그다음에 전체를 스택뷰를 한것이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xds7m/dJMcag6CwO8/hdx8lelGpxwn2g0Z3RKyK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxds7m%2FdJMcag6CwO8%2Fhdx8lelGpxwn2g0Z3RKyK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;424&quot; data-filename=&quot;스크린샷 2026-05-18 오후 3.40.33.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지금 원래 왼쪽에 있는 레이블 두개를 h스택뷰를해서 넣어놨다. 제일 바깎쪽에 있는것이 h스택뷰고 안쪽에 있는것은 수직 스택뷰이다. 레이블 두개를 추가하여 일정한 간격으로 스택뷰를 지정하고 그다음에 전체를 스택뷰를 한것이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 4.21.58.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;908&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba0Hh7/dJMcafmmVr7/DYwBBF5nxi5zCEdZqZd340/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba0Hh7/dJMcafmmVr7/DYwBBF5nxi5zCEdZqZd340/img.png&quot; data-alt=&quot;Autoshrink로 minimum font scale을 지정하면 0.5가 디폴트 값으로 나오는데 이값은 원래의 폰트 사이즈 22에서 0.5를 곱한값으로 결과가 나온다고 하면되고 바로 밑에칸에 미니멈 폰트 사이즈는 11로 디폴트가되있는데 그냥 11로 줄이겠다는 이야기이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba0Hh7/dJMcafmmVr7/DYwBBF5nxi5zCEdZqZd340/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba0Hh7%2FdJMcafmmVr7%2FDYwBBF5nxi5zCEdZqZd340%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;908&quot; data-filename=&quot;스크린샷 2026-05-18 오후 4.21.58.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;908&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Autoshrink로 minimum font scale을 지정하면 0.5가 디폴트 값으로 나오는데 이값은 원래의 폰트 사이즈 22에서 0.5를 곱한값으로 결과가 나온다고 하면되고 바로 밑에칸에 미니멈 폰트 사이즈는 11로 디폴트가되있는데 그냥 11로 줄이겠다는 이야기이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 4.30.08.png&quot; data-origin-width=&quot;1635&quot; data-origin-height=&quot;943&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LrIkO/dJMcaaSTdsC/ZzPinUrENxCaPok2dYuhZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LrIkO/dJMcaaSTdsC/ZzPinUrENxCaPok2dYuhZ1/img.png&quot; data-alt=&quot;이렇게 순위랑 누적 : 어제 :도 표기하게 만들어보았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LrIkO/dJMcaaSTdsC/ZzPinUrENxCaPok2dYuhZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLrIkO%2FdJMcaaSTdsC%2FZzPinUrENxCaPok2dYuhZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1635&quot; height=&quot;943&quot; data-filename=&quot;스크린샷 2026-05-18 오후 4.30.08.png&quot; data-origin-width=&quot;1635&quot; data-origin-height=&quot;943&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 순위랑 누적 : 어제 :도 표기하게 만들어보았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-18 오후 4.32.44.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3gJeP/dJMcacb5bIN/NzPIlPLuP6LnheI9dm9f50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3gJeP/dJMcacb5bIN/NzPIlPLuP6LnheI9dm9f50/img.png&quot; data-alt=&quot;앱 아래에 내가 만들었다는 글짜와 위쪽에 제목을 적어보았다. tit만 쓰면은 저렇게 타입형들이 나와서 골라 원하는대로 소스를 짜면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3gJeP/dJMcacb5bIN/NzPIlPLuP6LnheI9dm9f50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3gJeP%2FdJMcacb5bIN%2FNzPIlPLuP6LnheI9dm9f50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1098&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2026-05-18 오후 4.32.44.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 아래에 내가 만들었다는 글짜와 위쪽에 제목을 적어보았다. tit만 쓰면은 저렇게 타입형들이 나와서 골라 원하는대로 소스를 짜면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot;&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot; data-user-message-bubble=&quot;true&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if let aCnt = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiCnt { let numF = NumberFormatter() numF.numberStyle = .decimal let aCount = Int(aCnt)! let result = numF.string(for: aCount)! + &quot;명&quot; cell.audiCount.text = &quot;어제 : \(result)&quot; } 이 부분을 설명해줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 4:44&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot;&gt;
&lt;div data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;코드 설명&lt;/h3&gt;
&lt;h4 style=&quot;color: #121212;&quot; data-ke-size=&quot;size20&quot;&gt;전체 목적&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관객수 숫자(&quot;82482&quot;)를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;천 단위 콤마 형식&lt;/b&gt;(&quot;82,482명&quot;)으로 변환해서 셀에 표시&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #121212;&quot; data-ke-size=&quot;size20&quot;&gt;한 줄씩 분석&lt;/h4&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;if let aCnt = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].audiCnt {&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;movieData가 nil이 아닐 때만 안으로 진입 (옵셔널 바인딩)&lt;/li&gt;
&lt;li&gt;해당 row의&lt;span&gt;&amp;nbsp;&lt;/span&gt;audiCnt&lt;span&gt;&amp;nbsp;&lt;/span&gt;값을&lt;span&gt;&amp;nbsp;&lt;/span&gt;aCnt에 꺼냄&lt;/li&gt;
&lt;li&gt;aCnt는 현재&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;문자열&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;타입 (예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;82482&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;nix&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let numF = NumberFormatter()
numF.numberStyle = .decimal&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NumberFormatter&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 숫자를 원하는 형식의 문자열로 바꿔주는 도구&lt;/li&gt;
&lt;li&gt;.decimal&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 천 단위마다 콤마를 찍는 형식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예)&lt;span&gt;&amp;nbsp;&lt;/span&gt;82482&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;82,482&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let aCount = Int(aCnt)!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;82482&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 정수&lt;span&gt;&amp;nbsp;&lt;/span&gt;82482&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 변환&lt;/li&gt;
&lt;li&gt;Int()는 실패할 수 있어서 옵셔널 반환 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;!로 강제 언래핑
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;⚠️ API 데이터가 항상 숫자라는 확신이 있을 때만&lt;span&gt;&amp;nbsp;&lt;/span&gt;!&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;nimrod&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let result = numF.string(for: aCount)! + &quot;명&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;numF.string(for:)&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 숫자를 콤마 형식 문자열로 변환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;82482&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;82,482&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;뒤에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;명&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문자열을 붙임
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;82,482&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;82,482명&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;cell.audiCount.text = &quot;어제 : \(result)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 보간으로 최종 결과를 셀 레이블에 표시
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종 결과:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;어제 : 82,482명&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;color: #121212;&quot; data-ke-size=&quot;size20&quot;&gt;전체 변환 흐름&lt;/h4&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;autoit&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;&quot;82482&quot;  (String, API 원본)
  &amp;darr;  Int(aCnt)
82482    (Int)
  &amp;darr;  numF.string(for:)
&quot;82,482&quot; (String, 콤마 포맷)
  &amp;darr;  + &quot;명&quot;
&quot;82,482명&quot;
  &amp;darr;  &quot;어제 : \(result)&quot;
&quot;어제 : 82,482명&quot;  &amp;larr; 셀에 표시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cAspKn/dJMcafGFCkb/SE8p4q0cOUrhPcW55leJkk/MovieLJY%203.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MovieLJY 3.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.07MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/79</guid>
      <comments>https://jong133.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 18 May 2026 16:33:48 +0900</pubDate>
    </item>
    <item>
      <title>202208026이종윤 iOS10주차 프로그래밍과제</title>
      <link>https://jong133.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;json&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;{&quot;boxOfficeResult&quot;:{&quot;boxofficeType&quot;:&quot;일별 박스오피스&quot;,&quot;showRange&quot;:&quot;20260510~20260510&quot;,&quot;dailyBoxOfficeList&quot;:[{&quot;rnum&quot;:&quot;1&quot;,&quot;rank&quot;:&quot;1&quot;,&quot;rankInten&quot;:&quot;1&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20259773&quot;,&quot;movieNm&quot;:&quot;슈퍼 마리오 갤럭시&quot;,&quot;openDt&quot;:&quot;2026-04-29&quot;,&quot;salesAmt&quot;:&quot;799924360&quot;,&quot;salesShare&quot;:&quot;28.9&quot;,&quot;salesInten&quot;:&quot;-17890220&quot;,&quot;salesChange&quot;:&quot;-2.2&quot;,&quot;salesAcc&quot;:&quot;12724669750&quot;,&quot;audiCnt&quot;:&quot;82482&quot;,&quot;audiInten&quot;:&quot;-1543&quot;,&quot;audiChange&quot;:&quot;-1.8&quot;,&quot;audiAcc&quot;:&quot;1318717&quot;,&quot;scrnCnt&quot;:&quot;1422&quot;,&quot;showCnt&quot;:&quot;4618&quot;},{&quot;rnum&quot;:&quot;2&quot;,&quot;rank&quot;:&quot;2&quot;,&quot;rankInten&quot;:&quot;-1&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20259791&quot;,&quot;movieNm&quot;:&quot;악마는 프라다를 입는다 2&quot;,&quot;openDt&quot;:&quot;2026-04-29&quot;,&quot;salesAmt&quot;:&quot;709778320&quot;,&quot;salesShare&quot;:&quot;25.6&quot;,&quot;salesInten&quot;:&quot;-171168170&quot;,&quot;salesChange&quot;:&quot;-19.4&quot;,&quot;salesAcc&quot;:&quot;12150628470&quot;,&quot;audiCnt&quot;:&quot;68337&quot;,&quot;audiInten&quot;:&quot;-15964&quot;,&quot;audiChange&quot;:&quot;-18.9&quot;,&quot;audiAcc&quot;:&quot;1221631&quot;,&quot;scrnCnt&quot;:&quot;1132&quot;,&quot;showCnt&quot;:&quot;3898&quot;},{&quot;rnum&quot;:&quot;3&quot;,&quot;rank&quot;:&quot;3&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20254121&quot;,&quot;movieNm&quot;:&quot;살목지&quot;,&quot;openDt&quot;:&quot;2026-04-08&quot;,&quot;salesAmt&quot;:&quot;581454750&quot;,&quot;salesShare&quot;:&quot;21.0&quot;,&quot;salesInten&quot;:&quot;-90855500&quot;,&quot;salesChange&quot;:&quot;-13.5&quot;,&quot;salesAcc&quot;:&quot;30967865120&quot;,&quot;audiCnt&quot;:&quot;56204&quot;,&quot;audiInten&quot;:&quot;-8532&quot;,&quot;audiChange&quot;:&quot;-13.2&quot;,&quot;audiAcc&quot;:&quot;3022843&quot;,&quot;scrnCnt&quot;:&quot;1088&quot;,&quot;showCnt&quot;:&quot;3653&quot;},{&quot;rnum&quot;:&quot;4&quot;,&quot;rank&quot;:&quot;4&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20261782&quot;,&quot;movieNm&quot;:&quot;프로젝트 헤일메리&quot;,&quot;openDt&quot;:&quot;2026-03-18&quot;,&quot;salesAmt&quot;:&quot;257972810&quot;,&quot;salesShare&quot;:&quot;9.3&quot;,&quot;salesInten&quot;:&quot;-61661530&quot;,&quot;salesChange&quot;:&quot;-19.3&quot;,&quot;salesAcc&quot;:&quot;31576050620&quot;,&quot;audiCnt&quot;:&quot;20769&quot;,&quot;audiInten&quot;:&quot;-4527&quot;,&quot;audiChange&quot;:&quot;-17.9&quot;,&quot;audiAcc&quot;:&quot;2782964&quot;,&quot;scrnCnt&quot;:&quot;608&quot;,&quot;showCnt&quot;:&quot;1047&quot;},{&quot;rnum&quot;:&quot;5&quot;,&quot;rank&quot;:&quot;5&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20240532&quot;,&quot;movieNm&quot;:&quot;짱구&quot;,&quot;openDt&quot;:&quot;2026-04-22&quot;,&quot;salesAmt&quot;:&quot;125904100&quot;,&quot;salesShare&quot;:&quot;4.5&quot;,&quot;salesInten&quot;:&quot;-6795680&quot;,&quot;salesChange&quot;:&quot;-5.1&quot;,&quot;salesAcc&quot;:&quot;3669868060&quot;,&quot;audiCnt&quot;:&quot;12231&quot;,&quot;audiInten&quot;:&quot;-682&quot;,&quot;audiChange&quot;:&quot;-5.3&quot;,&quot;audiAcc&quot;:&quot;376605&quot;,&quot;scrnCnt&quot;:&quot;494&quot;,&quot;showCnt&quot;:&quot;869&quot;},{&quot;rnum&quot;:&quot;6&quot;,&quot;rank&quot;:&quot;6&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20242837&quot;,&quot;movieNm&quot;:&quot;왕과 사는 남자&quot;,&quot;openDt&quot;:&quot;2026-02-04&quot;,&quot;salesAmt&quot;:&quot;83398400&quot;,&quot;salesShare&quot;:&quot;3.0&quot;,&quot;salesInten&quot;:&quot;-4351430&quot;,&quot;salesChange&quot;:&quot;-5&quot;,&quot;salesAcc&quot;:&quot;162501475130&quot;,&quot;audiCnt&quot;:&quot;8286&quot;,&quot;audiInten&quot;:&quot;-372&quot;,&quot;audiChange&quot;:&quot;-4.3&quot;,&quot;audiAcc&quot;:&quot;16833524&quot;,&quot;scrnCnt&quot;:&quot;385&quot;,&quot;showCnt&quot;:&quot;566&quot;},{&quot;rnum&quot;:&quot;7&quot;,&quot;rank&quot;:&quot;7&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20262685&quot;,&quot;movieNm&quot;:&quot;란 12.3&quot;,&quot;openDt&quot;:&quot;2026-04-22&quot;,&quot;salesAmt&quot;:&quot;41936150&quot;,&quot;salesShare&quot;:&quot;1.5&quot;,&quot;salesInten&quot;:&quot;-2007610&quot;,&quot;salesChange&quot;:&quot;-4.6&quot;,&quot;salesAcc&quot;:&quot;2302425760&quot;,&quot;audiCnt&quot;:&quot;4210&quot;,&quot;audiInten&quot;:&quot;-112&quot;,&quot;audiChange&quot;:&quot;-2.6&quot;,&quot;audiAcc&quot;:&quot;230387&quot;,&quot;scrnCnt&quot;:&quot;297&quot;,&quot;showCnt&quot;:&quot;398&quot;},{&quot;rnum&quot;:&quot;8&quot;,&quot;rank&quot;:&quot;8&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20262947&quot;,&quot;movieNm&quot;:&quot;모탈 컴뱃 2&quot;,&quot;openDt&quot;:&quot;2026-05-06&quot;,&quot;salesAmt&quot;:&quot;27477950&quot;,&quot;salesShare&quot;:&quot;1.0&quot;,&quot;salesInten&quot;:&quot;-10056190&quot;,&quot;salesChange&quot;:&quot;-26.8&quot;,&quot;salesAcc&quot;:&quot;136112040&quot;,&quot;audiCnt&quot;:&quot;2340&quot;,&quot;audiInten&quot;:&quot;-819&quot;,&quot;audiChange&quot;:&quot;-25.9&quot;,&quot;audiAcc&quot;:&quot;12049&quot;,&quot;scrnCnt&quot;:&quot;335&quot;,&quot;showCnt&quot;:&quot;404&quot;},{&quot;rnum&quot;:&quot;9&quot;,&quot;rank&quot;:&quot;9&quot;,&quot;rankInten&quot;:&quot;0&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20247648&quot;,&quot;movieNm&quot;:&quot;내 이름은&quot;,&quot;openDt&quot;:&quot;2026-04-15&quot;,&quot;salesAmt&quot;:&quot;13356750&quot;,&quot;salesShare&quot;:&quot;0.5&quot;,&quot;salesInten&quot;:&quot;-415750&quot;,&quot;salesChange&quot;:&quot;-3&quot;,&quot;salesAcc&quot;:&quot;1828145980&quot;,&quot;audiCnt&quot;:&quot;1540&quot;,&quot;audiInten&quot;:&quot;-5&quot;,&quot;audiChange&quot;:&quot;-0.3&quot;,&quot;audiAcc&quot;:&quot;204746&quot;,&quot;scrnCnt&quot;:&quot;97&quot;,&quot;showCnt&quot;:&quot;122&quot;},{&quot;rnum&quot;:&quot;10&quot;,&quot;rank&quot;:&quot;10&quot;,&quot;rankInten&quot;:&quot;1&quot;,&quot;rankOldAndNew&quot;:&quot;OLD&quot;,&quot;movieCd&quot;:&quot;20262775&quot;,&quot;movieNm&quot;:&quot;기동전사 건담: 섬광의 하사웨이 키르케의 마녀&quot;,&quot;openDt&quot;:&quot;2026-04-22&quot;,&quot;salesAmt&quot;:&quot;8243550&quot;,&quot;salesShare&quot;:&quot;0.3&quot;,&quot;salesInten&quot;:&quot;-2494900&quot;,&quot;salesChange&quot;:&quot;-23.2&quot;,&quot;salesAcc&quot;:&quot;504187900&quot;,&quot;audiCnt&quot;:&quot;819&quot;,&quot;audiInten&quot;:&quot;-330&quot;,&quot;audiChange&quot;:&quot;-28.7&quot;,&quot;audiAcc&quot;:&quot;41278&quot;,&quot;scrnCnt&quot;:&quot;50&quot;,&quot;showCnt&quot;:&quot;53&quot;}]}}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영화진흥위원회에서 api로 받은 json입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.20.23.png&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvXBAv/dJMcaaZxCOi/8W7DwIxSgFqR4I5fDlzp50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvXBAv/dJMcaaZxCOi/8W7DwIxSgFqR4I5fDlzp50/img.png&quot; data-alt=&quot;네트워킹 4단계 서버에서 내가 먼가를 가져오고 싶다 할때 대부분 4가지 경우를 거쳐서 네트워킹을 합니당.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvXBAv/dJMcaaZxCOi/8W7DwIxSgFqR4I5fDlzp50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvXBAv%2FdJMcaaZxCOi%2F8W7DwIxSgFqR4I5fDlzp50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1239&quot; height=&quot;696&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.20.23.png&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네트워킹 4단계 서버에서 내가 먼가를 가져오고 싶다 할때 대부분 4가지 경우를 거쳐서 네트워킹을 합니당.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.27.01.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yevLy/dJMcagyF7E6/VxoJF2QvviVLOZBMQ3qgQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yevLy/dJMcagyF7E6/VxoJF2QvviVLOZBMQ3qgQk/img.png&quot; data-alt=&quot;getData()함수를 선언시 바로 시작될수있게 소스를 짜보았습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yevLy/dJMcagyF7E6/VxoJF2QvviVLOZBMQ3qgQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyevLy%2FdJMcagyF7E6%2FVxoJF2QvviVLOZBMQ3qgQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;803&quot; height=&quot;341&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.27.01.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;getData()함수를 선언시 바로 시작될수있게 소스를 짜보았습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot; data-user-message-bubble=&quot;true&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;init?(string: String) 여기왜 ?가 있는거니&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 2:28&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claude 응답: Failable Initializer (실패 가능한 이니셜라이저)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;Failable Initializer (실패 가능한 이니셜라이저)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;init?는 Swift의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;failable initializer&lt;/b&gt;입니다. 초기화가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실패할 수 있을 때&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #121212;&quot; data-ke-size=&quot;size20&quot;&gt;반환 타입의 차이&lt;/h4&gt;
&lt;div&gt;구문반환 타입실패 시
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;init(string:)&lt;/td&gt;
&lt;td&gt;반드시 인스턴스 반환&lt;/td&gt;
&lt;td&gt;크래시 or 강제 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;init?(string:)&lt;/td&gt;
&lt;td&gt;Optional&lt;span&gt;&amp;nbsp;&lt;/span&gt;인스턴스&lt;/td&gt;
&lt;td&gt;nil&lt;span&gt;&amp;nbsp;&lt;/span&gt;반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #121212;&quot; data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;lasso&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;struct Color {
    let hex: String
    
    init?(string: String) {
        guard string.hasPrefix(&quot;#&quot;) &amp;amp;&amp;amp; string.count == 7 else {
            return nil  // 조건 불만족 시 nil 반환
        }
        self.hex = string
    }
}

let valid = Color(string: &quot;#FF5733&quot;)   // Optional(Color)
let invalid = Color(string: &quot;FF5733&quot;)  // nil&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #121212;&quot; data-ke-size=&quot;size20&quot;&gt;왜 쓰나?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값이 항상 유효하다고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;보장할 수 없을 때&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용합니다. 예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 &amp;rarr; 숫자 변환 (Int(&quot;abc&quot;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;nil)&lt;/li&gt;
&lt;li&gt;잘못된 형식의 URL, 날짜, 색상 코드&lt;/li&gt;
&lt;li&gt;범위를 벗어난 값&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?&lt;span&gt;&amp;nbsp;&lt;/span&gt;덕분에 호출하는 쪽에서 옵셔널 바인딩으로 안전하게 처리할 수 있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;isbl&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;if let color = Color(string: &quot;#FF5733&quot;) {
    print(&quot;유효한 색상: \(color.hex)&quot;)
} else {
    print(&quot;잘못된 형식&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.30.22.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b88yI7/dJMcacpxJCd/baM2SaNWkhTjQIqXOTyKo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b88yI7/dJMcacpxJCd/baM2SaNWkhTjQIqXOTyKo0/img.png&quot; data-alt=&quot;페일러블 이니셜라이저다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b88yI7/dJMcacpxJCd/baM2SaNWkhTjQIqXOTyKo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb88yI7%2FdJMcacpxJCd%2FbaM2SaNWkhTjQIqXOTyKo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;415&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.30.22.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;페일러블 이니셜라이저다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.35.32.png&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmMSz/dJMcah5s1Dh/mTLmSkQPGD06tLBVaz9xFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmMSz/dJMcah5s1Dh/mTLmSkQPGD06tLBVaz9xFk/img.png&quot; data-alt=&quot;첫번째는 if let으로 푸는방법과 두번째 guard let으로 푸는 방법이 있다. 함수 안에서 옵셔널을 풀때 거의 대부분 guard let을 쓴다. lf let보다 훨씬 더 선호합니다. 더 간결하고 용이하기 때문입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmMSz/dJMcah5s1Dh/mTLmSkQPGD06tLBVaz9xFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwmMSz%2FdJMcah5s1Dh%2FmTLmSkQPGD06tLBVaz9xFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;284&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.35.32.png&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫번째는 if let으로 푸는방법과 두번째 guard let으로 푸는 방법이 있다. 함수 안에서 옵셔널을 풀때 거의 대부분 guard let을 쓴다. lf let보다 훨씬 더 선호합니다. 더 간결하고 용이하기 때문입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이렇게 해서 네트워킹 1단계 주소 만들기는 끝났습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.42.56.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p6voA/dJMcabRD7ME/kXyK2mKK5gFGi6VMpEkHWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p6voA/dJMcabRD7ME/kXyK2mKK5gFGi6VMpEkHWk/img.png&quot; data-alt=&quot;dataTask는 시험에 자주 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p6voA/dJMcabRD7ME/kXyK2mKK5gFGi6VMpEkHWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp6voA%2FdJMcabRD7ME%2FkXyK2mKK5gFGi6VMpEkHWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;901&quot; height=&quot;427&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.42.56.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dataTask는 시험에 자주 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.44.08.png&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mTM48/dJMcaa6k7Gf/OZbprOF3JVTPVDzE6bwBVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mTM48/dJMcaa6k7Gf/OZbprOF3JVTPVDzE6bwBVk/img.png&quot; data-alt=&quot;후행클로저스타일로 바꿀건데 바꿀려면 엔터를 치면 자동으로 바꿔준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mTM48/dJMcaa6k7Gf/OZbprOF3JVTPVDzE6bwBVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmTM48%2FdJMcaa6k7Gf%2FOZbprOF3JVTPVDzE6bwBVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;405&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.44.08.png&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;후행클로저스타일로 바꿀건데 바꿀려면 엔터를 치면 자동으로 바꿔준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.45.14.png&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boEaWc/dJMcagyF9uC/3YXJrjJNT6fOJiEfmepM5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boEaWc/dJMcagyF9uC/3YXJrjJNT6fOJiEfmepM5K/img.png&quot; data-alt=&quot;세개의 자료형이 옵셔널 형이다. 소스를 후행클로저 스타일로 바꿨습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boEaWc/dJMcagyF9uC/3YXJrjJNT6fOJiEfmepM5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboEaWc%2FdJMcagyF9uC%2F3YXJrjJNT6fOJiEfmepM5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;279&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.45.14.png&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;세개의 자료형이 옵셔널 형이다. 소스를 후행클로저 스타일로 바꿨습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.48.28.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1nkt/dJMcagMgs5V/ZkIkIknW1wGsiIFVgzqnm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1nkt/dJMcagMgs5V/ZkIkIknW1wGsiIFVgzqnm1/img.png&quot; data-alt=&quot;error가 있으면 여기서 끝낸다는 return문으로 마무리했다. 데이터를 받을 건데 그전에 에러가 있는지 먼저 체크를해서말이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1nkt/dJMcagMgs5V/ZkIkIknW1wGsiIFVgzqnm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1nkt%2FdJMcagMgs5V%2FZkIkIknW1wGsiIFVgzqnm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;308&quot; data-filename=&quot;스크린샷 2026-05-11 오후 2.48.28.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;error가 있으면 여기서 끝낸다는 return문으로 마무리했다. 데이터를 받을 건데 그전에 에러가 있는지 먼저 체크를해서말이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;getData() 함수 전체 설명&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 흐름: 네트워크에서 데이터 받아오기&lt;/h4&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1단계 (48번줄) - URL 만들기&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;guard let url = URL(string: movieURL) else { return }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;movieURL(문자열)을 실제 URL 객체로 변환&lt;/li&gt;
&lt;li&gt;변환 실패 시 (nil) 함수 종료&lt;/li&gt;
&lt;li&gt;URL(string:)이 init?이라 guard let으로 언래핑&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2단계 (50번줄) - URLSession 만들기&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let session = URLSession(configuration: .default)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 요청을 담당하는 &lt;b&gt;세션&lt;/b&gt; 생성&lt;/li&gt;
&lt;li&gt;.default = 기본 설정 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3단계 (51~58번줄) - dataTask 만들기&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let task = session.dataTask(with: url) { data, response, error in
    if error != nil {
        print(error!)
        return
    }
    guard let JSONdata = data else { return }
    print(JSONdata)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url로 실제 네트워크 요청을 준비&lt;/li&gt;
&lt;li&gt;요청이 완료되면 클로저 { } 안이 실행됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;error != nil&lt;/b&gt; &amp;rarr; 에러 있으면 출력 후 종료&lt;/li&gt;
&lt;li&gt;&lt;b&gt;data&lt;/b&gt; &amp;rarr; 서버에서 받은 실제 데이터 (옵셔널이라 guard로 언래핑)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 여기까지는 &lt;b&gt;준비만&lt;/b&gt; 한 것, 아직 요청 안 보냄&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4단계 (60번줄) - 요청 시작&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;task.resume()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이걸 호출해야 &lt;b&gt;실제로 네트워크 요청이 시작&lt;/b&gt;됨&lt;/li&gt;
&lt;li&gt;dataTask는 기본이 일시정지 상태라 resume()이 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 요약&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;movieURL(String) &amp;rarr; URL 객체 &amp;rarr; URLSession &amp;rarr; dataTask 생성 &amp;rarr; resume()으로 요청 &amp;rarr; 응답 수신&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nSArF/dJMcaicfj2Z/sIaHHG3EBTMfZhK3es1jk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nSArF/dJMcaicfj2Z/sIaHHG3EBTMfZhK3es1jk1/img.png&quot; data-alt=&quot;http프로토콜을 쓰면 이렇게 에러가 뜬다. 한번 클로드에게 물어보았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nSArF/dJMcaicfj2Z/sIaHHG3EBTMfZhK3es1jk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnSArF%2FdJMcaicfj2Z%2FsIaHHG3EBTMfZhK3es1jk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1054&quot; height=&quot;491&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http프로토콜을 쓰면 이렇게 에러가 뜬다. 한번 클로드에게 물어보았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Transport Security (ATS) 오류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP&lt;/b&gt;로 요청하려고 해서 막힌 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS는 기본적으로 &lt;b&gt;HTTPS만 허용&lt;/b&gt;하고 HTTP는 보안상 차단합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;해결 방법 2가지&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 방법 1: URL을 HTTPS로 바꾸기 (권장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;movieURL이 http://로 시작하면 https://로 변경&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ceylon&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let movieURL = &quot;https://tokobis.or.kr/...&quot;  // http &amp;rarr; https&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 2: Info.plist에 예외 추가 (임시/테스트용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Info.plist에 아래 항목 추가:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;xml&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;&amp;lt;key&amp;gt;NSAppTransportSecurity&amp;lt;/key&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;NSExceptionDomains&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;tokobis.or.kr&amp;lt;/key&amp;gt;
        &amp;lt;dict&amp;gt;
            &amp;lt;key&amp;gt;NSExceptionAllowsInsecureHTTPLoads&amp;lt;/key&amp;gt;
            &amp;lt;true/&amp;gt;
        &amp;lt;/dict&amp;gt;
    &amp;lt;/dict&amp;gt;
&amp;lt;/dict&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 방법 2는 앱스토어 심사에서 사유 소명이 필요할 수 있으니, &lt;b&gt;가능하면 방법 1(HTTPS)&lt;/b&gt; 을 쓰는 게 좋습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스링크를 http에서 https로 수정하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.17.57.png&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjHHz/dJMcaicfklZ/6j4kfX8zwxgWbIKuXleD41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjHHz/dJMcaicfklZ/6j4kfX8zwxgWbIKuXleD41/img.png&quot; data-alt=&quot;어떤 api오픈소스를 접속해서 그런 데이터를 가져올수 있다. 소스 그대로 쓰면 되고 주소만 바꾸면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjHHz/dJMcaicfklZ/6j4kfX8zwxgWbIKuXleD41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjHHz%2FdJMcaicfklZ%2F6j4kfX8zwxgWbIKuXleD41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;835&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.17.57.png&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어떤 api오픈소스를 접속해서 그런 데이터를 가져올수 있다. 소스 그대로 쓰면 되고 주소만 바꾸면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp;This&amp;nbsp;file&amp;nbsp;was&amp;nbsp;generated&amp;nbsp;from&amp;nbsp;JSON&amp;nbsp;Schema&amp;nbsp;using&amp;nbsp;quicktype,&amp;nbsp;do&amp;nbsp;not&amp;nbsp;modify&amp;nbsp;it&amp;nbsp;directly.&lt;br /&gt;//&amp;nbsp;To&amp;nbsp;parse&amp;nbsp;the&amp;nbsp;JSON,&amp;nbsp;add&amp;nbsp;this&amp;nbsp;file&amp;nbsp;to&amp;nbsp;your&amp;nbsp;project&amp;nbsp;and&amp;nbsp;do:&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;welcome&amp;nbsp;=&amp;nbsp;try?&amp;nbsp;JSONDecoder().decode(Welcome.self,&amp;nbsp;from:&amp;nbsp;jsonData)&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;Foundation&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;Welcome&lt;br /&gt;struct&amp;nbsp;Welcome&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxOfficeResult:&amp;nbsp;BoxOfficeResult&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;BoxOfficeResult&lt;br /&gt;struct&amp;nbsp;BoxOfficeResult&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxofficeType,&amp;nbsp;showRange:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;dailyBoxOfficeList:&amp;nbsp;[DailyBoxOfficeList]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;DailyBoxOfficeList&lt;br /&gt;struct&amp;nbsp;DailyBoxOfficeList&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rnum,&amp;nbsp;rank,&amp;nbsp;rankInten:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rankOldAndNew:&amp;nbsp;RankOldAndNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;movieCD,&amp;nbsp;movieNm,&amp;nbsp;openDt,&amp;nbsp;salesAmt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesShare,&amp;nbsp;salesInten,&amp;nbsp;salesChange,&amp;nbsp;salesAcc:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiCnt,&amp;nbsp;audiInten,&amp;nbsp;audiChange,&amp;nbsp;audiAcc:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;scrnCnt,&amp;nbsp;showCnt:&amp;nbsp;String&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;enum&amp;nbsp;RankOldAndNew:&amp;nbsp;String&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;old&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.23.04.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LGeRA/dJMcadPrTHA/3TiQ1nuE9Px3foEGBS7eO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LGeRA/dJMcadPrTHA/3TiQ1nuE9Px3foEGBS7eO1/img.png&quot; data-alt=&quot;구조체 3개가 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LGeRA/dJMcadPrTHA/3TiQ1nuE9Px3foEGBS7eO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLGeRA%2FdJMcadPrTHA%2F3TiQ1nuE9Px3foEGBS7eO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1850&quot; height=&quot;827&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.23.04.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구조체 3개가 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영화&amp;nbsp;박스오피스&amp;nbsp;JSON&amp;nbsp;데이터를&amp;nbsp;쉽게&amp;nbsp;파싱하기&amp;nbsp;위한&amp;nbsp;Swift&amp;nbsp;구조체를&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;작성할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;또한&amp;nbsp;`Codable`&amp;nbsp;프로토콜을&amp;nbsp;채택하여&amp;nbsp;`JSONDecoder`로&amp;nbsp;간편하게&amp;nbsp;디코딩할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;하였습니다.&amp;nbsp;빠뜨리지&amp;nbsp;않도록&amp;nbsp;각&amp;nbsp;프로퍼티&amp;nbsp;타입과&amp;nbsp;네이밍을&amp;nbsp;JSON&amp;nbsp;키에&amp;nbsp;맞추고,&amp;nbsp;`CodingKeys`를&amp;nbsp;사용해&amp;nbsp;스네이크케이스&amp;nbsp;등도&amp;nbsp;대응합니다.&lt;br /&gt;&lt;br /&gt;```swift&lt;br /&gt;import&amp;nbsp;Foundation&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;MovieData&amp;nbsp;(Welcome&amp;nbsp;상응)&lt;br /&gt;struct&amp;nbsp;MovieData:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxOfficeResult:&amp;nbsp;BoxOfficeResult&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;BoxOfficeResult&lt;br /&gt;struct&amp;nbsp;BoxOfficeResult:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxofficeType:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;showRange:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;dailyBoxOfficeList:&amp;nbsp;[DailyBoxOffice]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enum&amp;nbsp;CodingKeys:&amp;nbsp;String,&amp;nbsp;CodingKey&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;boxofficeType&amp;nbsp;=&amp;nbsp;&quot;boxofficeType&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;showRange&amp;nbsp;=&amp;nbsp;&quot;showRange&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;dailyBoxOfficeList&amp;nbsp;=&amp;nbsp;&quot;dailyBoxOfficeList&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;DailyBoxOffice&lt;br /&gt;struct&amp;nbsp;DailyBoxOffice:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rnum:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rank:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rankInten:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rankOldAndNew:&amp;nbsp;RankOldAndNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;movieCD:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;movieNm:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;openDt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesAmt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesShare:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesInten:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesChange:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesAcc:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiCnt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiInten:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiChange:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiAcc:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;scrnCnt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;showCnt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enum&amp;nbsp;CodingKeys:&amp;nbsp;String,&amp;nbsp;CodingKey&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rnum&amp;nbsp;=&amp;nbsp;&quot;rnum&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rank&amp;nbsp;=&amp;nbsp;&quot;rank&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rankInten&amp;nbsp;=&amp;nbsp;&quot;rankInten&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rankOldAndNew&amp;nbsp;=&amp;nbsp;&quot;rankOldAndNew&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;movieCD&amp;nbsp;=&amp;nbsp;&quot;movieCD&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;movieNm&amp;nbsp;=&amp;nbsp;&quot;movieNm&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;openDt&amp;nbsp;=&amp;nbsp;&quot;openDt&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;salesAmt&amp;nbsp;=&amp;nbsp;&quot;salesAmt&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;salesShare&amp;nbsp;=&amp;nbsp;&quot;salesShare&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;salesInten&amp;nbsp;=&amp;nbsp;&quot;salesInten&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;salesChange&amp;nbsp;=&amp;nbsp;&quot;salesChange&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;salesAcc&amp;nbsp;=&amp;nbsp;&quot;salesAcc&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;audiCnt&amp;nbsp;=&amp;nbsp;&quot;audiCnt&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;audiInten&amp;nbsp;=&amp;nbsp;&quot;audiInten&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;audiChange&amp;nbsp;=&amp;nbsp;&quot;audiChange&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;audiAcc&amp;nbsp;=&amp;nbsp;&quot;audiAcc&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;scrnCnt&amp;nbsp;=&amp;nbsp;&quot;scrnCnt&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;showCnt&amp;nbsp;=&amp;nbsp;&quot;showCnt&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;enum&amp;nbsp;RankOldAndNew:&amp;nbsp;String,&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;old&amp;nbsp;=&amp;nbsp;&quot;OLD&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;new&amp;nbsp;=&amp;nbsp;&quot;NEW&quot;&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;###&amp;nbsp;설명&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;최상위&amp;nbsp;구조체명을&amp;nbsp;`MovieData`로&amp;nbsp;변경하여&amp;nbsp;의미를&amp;nbsp;명확히&amp;nbsp;하였습니다.&lt;br /&gt;-&amp;nbsp;각&amp;nbsp;구조체는&amp;nbsp;`Codable`을&amp;nbsp;채택해&amp;nbsp;JSON&amp;nbsp;디코딩&amp;nbsp;시&amp;nbsp;자동으로&amp;nbsp;매핑되도록&amp;nbsp;하였습니다.&lt;br /&gt;-&amp;nbsp;`dailyBoxOfficeList`&amp;nbsp;배열&amp;nbsp;안에&amp;nbsp;영화별&amp;nbsp;일별&amp;nbsp;박스오피스&amp;nbsp;정보가&amp;nbsp;들어있어,&amp;nbsp;반복문으로&amp;nbsp;쉽게&amp;nbsp;접근&amp;nbsp;가능하도록&amp;nbsp;설계했습니다.&lt;br /&gt;-&amp;nbsp;`RankOldAndNew`&amp;nbsp;열거형은&amp;nbsp;JSON&amp;nbsp;값에&amp;nbsp;맞게&amp;nbsp;대소문자&amp;nbsp;구분하여&amp;nbsp;`old`,&amp;nbsp;`new`&amp;nbsp;값을&amp;nbsp;처리하도록&amp;nbsp;구현했습니다.&lt;br /&gt;-&amp;nbsp;별도의&amp;nbsp;`CodingKeys`를&amp;nbsp;명시해&amp;nbsp;JSON&amp;nbsp;키와&amp;nbsp;프로퍼티&amp;nbsp;이름&amp;nbsp;매핑을&amp;nbsp;명확하게&amp;nbsp;했습니다.&amp;nbsp;(필수는&amp;nbsp;아니지만&amp;nbsp;구조체&amp;nbsp;필드명과&amp;nbsp;다를&amp;nbsp;때&amp;nbsp;안전한&amp;nbsp;방법입니다.)&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;구조체를&amp;nbsp;프로젝트에&amp;nbsp;추가하고,&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;데이터를&amp;nbsp;파싱할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;```swift&lt;br /&gt;if&amp;nbsp;let&amp;nbsp;decoded&amp;nbsp;=&amp;nbsp;try?&amp;nbsp;JSONDecoder().decode(MovieData.self,&amp;nbsp;from:&amp;nbsp;jsonData)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;decoded.boxOfficeResult.dailyBoxOfficeList&amp;nbsp;배열&amp;nbsp;접근&amp;nbsp;가능&lt;br /&gt;}&lt;br /&gt;```&lt;br /&gt;&lt;br /&gt;필요하다면&amp;nbsp;타입을&amp;nbsp;`String`&amp;nbsp;대신&amp;nbsp;`Int`나&amp;nbsp;`Double`로&amp;nbsp;변환해&amp;nbsp;처리도&amp;nbsp;가능합니다.&amp;nbsp;원하시면&amp;nbsp;추가&amp;nbsp;도움&amp;nbsp;드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Codable을 사용하는 이유는 한마디로 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;0&quot;&gt;&quot;Swift 객체와 외부 데이터(주로 JSON) 사이의 번역기&quot;&lt;/b&gt; 역할을 하기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;우리가 서버에서 데이터를 받아오면 보통 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;1&quot;&gt;JSON&lt;/b&gt;이라는 텍스트 형태의 덩어리입니다. 하지만 우리가 코드를 짤 때는 이 텍스트를 그대로 쓰지 않고, movieNm, rank 같은 변수가 담긴 구조체(Struct)로 다루고 싶어 하죠.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. Codable이 하는 일&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;Codable은 사실 두 가지 프로토콜이 합쳐진 별명(Typealias)입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;Decodable:&lt;/b&gt; JSON 같은 외부 데이터를 Swift 구조체나 클래스로 변환(해독)하는 능력&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;Encodable:&lt;/b&gt; Swift 구조체나 클래스를 JSON 같은 데이터로 변환(부호화)하는 능력&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 왜 굳이 이걸 써야 하나요?&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;① 자동 매칭 (편의성)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;Codable을 쓰지 않으면, JSON에 있는 수십 개의 데이터를 우리가 일일이 꺼내서 변수에 담아줘야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;Codable 미사용:&lt;/b&gt; &quot;JSON의 'movieNm'이라는 키를 찾아서 String으로 바꾼 다음, 내 구조체의 movieNm 변수에 넣어줘...&quot; (매우 귀찮음)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;Codable 사용:&lt;/b&gt; &quot;이 구조체는 Codable 하니까, 알아서 JSON이랑 이름 똑같은 것끼리 쏙쏙 집어넣어!&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;② 타입 안전성 (Type Safety)&lt;/h4&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;JSON은 그냥 텍스트일 뿐이지만, Swift 구조체에 담는 순간 audiCnt는 숫자형인지 문자열형인지 명확해집니다. Codable은 이 과정에서 데이터 타입이 맞지 않으면 에러를 내뱉어주어, 잘못된 데이터가 앱에 들어오는 것을 방지합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;3. 질문하신 코드에서의 의미&lt;/h3&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjI982CvrCUAxUAAAAAHQAAAAAQ7wE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;Swift&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;struct DailyBoxOfficeList : Codable {
    let movieNm : String
    let audiCnt : String
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;여기서 : Codable을 붙임으로써, Swift는 이제 이 구조체를 보고 이렇게 이해합니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;15&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;15,0&quot; data-ke-size=&quot;size16&quot;&gt;&quot;아하! 이 구조체는 서버에서 오는 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;15,0&quot;&gt;JSON 데이터의 'movieNm'과 'audiCnt' 키값을 찾아서 자기 변수에 자동으로 저장&lt;/b&gt;할 줄 아는 애구나!&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;요약하자면&lt;/h3&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;서버에서 받아온 &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;17&quot;&gt;JSON 덩어리&lt;/b&gt;를 우리가 쓰기 편한 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;17&quot;&gt;Swift 구조체&lt;/b&gt;로 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;17&quot;&gt;자동 변환&lt;/b&gt;하기 위해 Codable을 사용합니다. 만약 이걸 안 쓰면 JSON 파싱 코드를 수십 줄 직접 작성해야 하는 고난의 길이 시작됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.33.09.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGpKEe/dJMcagk9ur8/JB5C6EnvlBbFaon6PHUPDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGpKEe/dJMcagk9ur8/JB5C6EnvlBbFaon6PHUPDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGpKEe/dJMcagk9ur8/JB5C6EnvlBbFaon6PHUPDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGpKEe%2FdJMcagk9ur8%2FJB5C6EnvlBbFaon6PHUPDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;814&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.33.09.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.37.01.png&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bp86k/dJMcaaSN12K/KQD8oRJJuE5URBYkbHbkE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bp86k/dJMcaaSN12K/KQD8oRJJuE5URBYkbHbkE1/img.png&quot; data-alt=&quot;함수 뒤에 보니 throws라고 되 있다. 이 메소드는 반드시 예외처리 해야되는 메소드입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bp86k/dJMcaaSN12K/KQD8oRJJuE5URBYkbHbkE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBp86k%2FdJMcaaSN12K%2FKQD8oRJJuE5URBYkbHbkE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;627&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.37.01.png&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;함수 뒤에 보니 throws라고 되 있다. 이 메소드는 반드시 예외처리 해야되는 메소드입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.44.38.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wlLZX/dJMcagrVwGb/Tk0HFBl7ANfagzWdmIGCSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wlLZX/dJMcagrVwGb/Tk0HFBl7ANfagzWdmIGCSk/img.png&quot; data-alt=&quot;우리가 이제 데이터 파싱까지 해버린것이다! 와우, 배열리스트 안에 0은 영화 순위1등을 표시하는것인데 네임,몇명이 봤는지, 어제 몇명이 봤는지 각 각 다 출력 됬다. 각각의 필요한 정보만 얻을 수있게 구조체로 접근해서 출력하는 것이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wlLZX/dJMcagrVwGb/Tk0HFBl7ANfagzWdmIGCSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwlLZX%2FdJMcagrVwGb%2FTk0HFBl7ANfagzWdmIGCSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1101&quot; height=&quot;705&quot; data-filename=&quot;스크린샷 2026-05-11 오후 3.44.38.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우리가 이제 데이터 파싱까지 해버린것이다! 와우, 배열리스트 안에 0은 영화 순위1등을 표시하는것인데 네임,몇명이 봤는지, 어제 몇명이 봤는지 각 각 다 출력 됬다. 각각의 필요한 정보만 얻을 수있게 구조체로 접근해서 출력하는 것이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.10.42.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lM6Mf/dJMcagFvdz7/vBAsfok0zgeZkj5FJtpyw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lM6Mf/dJMcagFvdz7/vBAsfok0zgeZkj5FJtpyw1/img.png&quot; data-alt=&quot;자료형이라 =은 안되고 :로 해야된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lM6Mf/dJMcagFvdz7/vBAsfok0zgeZkj5FJtpyw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlM6Mf%2FdJMcagFvdz7%2FvBAsfok0zgeZkj5FJtpyw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;157&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.10.42.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자료형이라 =은 안되고 :로 해야된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.11.24.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ns2Y/dJMcabjTx7I/nFHtaBFTMnbk3nST1a8ZgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ns2Y/dJMcabjTx7I/nFHtaBFTMnbk3nST1a8ZgK/img.png&quot; data-alt=&quot;프로퍼티를 클로저안에서 참고할려고 하면 반드시 self.을 써야된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ns2Y/dJMcabjTx7I/nFHtaBFTMnbk3nST1a8ZgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ns2Y%2FdJMcabjTx7I%2FnFHtaBFTMnbk3nST1a8ZgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;953&quot; height=&quot;369&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.11.24.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로퍼티를 클로저안에서 참고할려고 하면 반드시 self.을 써야된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.12.18.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3jiHq/dJMcahYFy1O/DzDVNJJ2X270uzLh0QxzY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3jiHq/dJMcahYFy1O/DzDVNJJ2X270uzLh0QxzY0/img.png&quot; data-alt=&quot;self.을 쓰니 에러가 없다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3jiHq/dJMcahYFy1O/DzDVNJJ2X270uzLh0QxzY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3jiHq%2FdJMcahYFy1O%2FDzDVNJJ2X270uzLh0QxzY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;367&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.12.18.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;self.을 쓰니 에러가 없다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.14.44.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfkF4U/dJMcahj7b16/7n8RRuVwow2mPOULoV9vy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfkF4U/dJMcahj7b16/7n8RRuVwow2mPOULoV9vy1/img.png&quot; data-alt=&quot;네트웍을 통해 결과를 가지고올려고하는데 아무것도 안뜬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfkF4U/dJMcahj7b16/7n8RRuVwow2mPOULoV9vy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfkF4U%2FdJMcahj7b16%2F7n8RRuVwow2mPOULoV9vy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1468&quot; height=&quot;706&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.14.44.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네트웍을 통해 결과를 가지고올려고하는데 아무것도 안뜬다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.16.12.png&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xKrqo/dJMcadomQeC/uiKSkSuOAGNErlUVLyWljk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKrqo/dJMcadomQeC/uiKSkSuOAGNErlUVLyWljk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKrqo/dJMcadomQeC/uiKSkSuOAGNErlUVLyWljk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKrqo%2FdJMcadomQeC%2FuiKSkSuOAGNErlUVLyWljk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1211&quot; height=&quot;701&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.16.12.png&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;//
//  ViewController.swift
//  MovieLJY
//
//  Created by comsoft on 2026/05/04.
//

import UIKit

// ============================================================
// MARK: - 전역 데이터
// ============================================================

// 영화 이름 하드코딩 배열 (현재는 API 데이터로 대체되어 미사용)
let name = [&quot;1:슈퍼 마리오 갤럭시&quot;,
            &quot;2:악마는 프라다를 입는다 2&quot;,
            &quot;3:살목지&quot;,
            &quot;4:프로젝트 헤일메리&quot;,
            &quot;5:짱구&quot;,
            &quot;6:왕과 사는 남자&quot;,
            &quot;7:란 12.3&quot;,
            &quot;8:내 이름은&quot;,
            &quot;9:사랑의 하츄핑 특별판&quot;,
            &quot;10:극장판 반짝반짝 달님이: 싱어롱 파티&quot;]

// ============================================================
// MARK: - JSON 파싱용 구조체 (Codable)
// ============================================================

// 최상위 JSON 구조 { &quot;boxOfficeResult&quot;: { ... } }
struct MovieData: Codable {
    let boxOfficeResult: BoxOfficeResult
}

// boxOfficeResult 안의 구조 { &quot;dailyBoxOfficeList&quot;: [ ... ] }
struct BoxOfficeResult: Codable {
    let dailyBoxOfficeList: [DailyBoxOfficeList]
}

// dailyBoxOfficeList 배열의 각 영화 항목
struct DailyBoxOfficeList: Codable {
    let movieNm: String  // 영화 이름
    let audiCnt: String  // 당일 관객수
    let audiAcc: String  // 누적 관객수
    let rank: String     // 현재 순위
}

// ============================================================
// MARK: - ViewController
// ============================================================

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // 스토리보드에서 연결한 테이블뷰
    @IBOutlet weak var table: UITableView!

    // API에서 받아온 데이터를 저장하는 변수 (처음엔 nil)
    var movieData: MovieData?

    // 박스오피스 API 주소 (날짜: 20260510)
    let movieURL = &quot;https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=536e058824a8f5bcc8c39f075897985f&amp;amp;targetDt=20260510&quot;

    // ============================================================
    // MARK: - UITableViewDataSource
    // ============================================================

    // 테이블 셀 개수: 고정 10개
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&amp;gt; Int {
        return 10
    }

    // 각 셀 구성
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&amp;gt; UITableViewCell {
        // &quot;myCell&quot; 식별자로 재사용 셀 꺼내기 (커스텀 셀 MyTableViewCell로 캐스팅)
        let cell = tableView.dequeueReusableCell(withIdentifier: &quot;myCell&quot;, for: indexPath) as! MyTableViewCell

        // movieData가 있으면 해당 row의 영화 이름을 셀에 표시
        // indexPath.row = 0~9 &amp;rarr; dailyBoxOfficeList[0]~[9]
        cell.moiveName.text = movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].movieNm

        return cell
    }

    // 섹션 개수: 1개
    func numberOfSections(in tableView: UITableView) -&amp;gt; Int {
        return 1
    }

    // ============================================================
    // MARK: - 생명주기
    // ============================================================

    override func viewDidLoad() {
        super.viewDidLoad()

        // 테이블뷰의 delegate, dataSource를 이 ViewController가 담당
        table.delegate = self
        table.dataSource = self

        // 화면 로드 시 API 호출
        getData()
    }

    // ============================================================
    // MARK: - 네트워크 통신
    // ============================================================

    func getData() {

        // 1단계: 문자열 &amp;rarr; URL 객체 변환 (실패 시 함수 종료)
        guard let url = URL(string: movieURL) else { return }

        // 2단계: URLSession 인스턴스 생성 (기본 설정)
        let session = URLSession(configuration: .default)

        // 3단계: dataTask 생성 - url로 요청 후 응답을 클로저에서 처리
        let task = session.dataTask(with: url) { data, response, error in

            // 에러 발생 시 출력 후 종료
            if error != nil {
                print(error!)
                return
            }

            // data가 nil이면 종료
            guard let JSONdata = data else { return }

            // JSONDecoder로 Data &amp;rarr; MovieData 구조체 변환
            let decoder = JSONDecoder()
            do {
                let decodedData = try decoder.decode(MovieData.self, from: JSONdata)

                // 파싱 확인용 출력
                print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].movieNm)
                print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].audiAcc)
                print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].audiCnt)

                // 파싱한 데이터를 멤버변수에 저장
                self.movieData = decodedData

                // ⚠️ UI 업데이트는 반드시 메인 스레드에서!
                // (네트워크 응답은 백그라운드 스레드에서 오기 때문)
                DispatchQueue.main.async {
                    self.table.reloadData()  // 테이블뷰 새로고침
                }

            } catch {
                // JSON 파싱 실패 시 에러 출력
                print(error)
            }
        }

        // 4단계: 요청 시작 (resume 호출 전까지 요청 안 보냄)
        task.resume()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 동작 흐름 요약&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;viewDidLoad()
    └── getData()
            ├── URL 생성
            ├── URLSession으로 API 호출
            ├── JSON 수신
            ├── JSONDecoder로 MovieData 구조체에 파싱
            ├── self.movieData에 저장
            └── 메인스레드에서 table.reloadData()
                    └── cellForRowAt 호출
                            └── movieData[row].movieNm &amp;rarr; 셀에 표시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;핵심 포인트 2가지&lt;/h4&gt;
&lt;div&gt;포인트설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Codable&lt;/td&gt;
&lt;td&gt;JSON 키와 프로퍼티 이름만 맞추면 자동 파싱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DispatchQueue.main.async&lt;/td&gt;
&lt;td&gt;네트워크는 백그라운드 스레드, UI는 반드시 메인 스레드에서 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DispatchQueue.&lt;/b&gt;&lt;span&gt;&lt;b&gt;main&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;async&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;table&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;reloadData&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}ㅇ 여기안에서 리로드 데이터를 하면 제대로 잘뜬다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.33.07.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v0N4F/dJMcaiiYjvb/T8zKGzvmBKscLM6mu6N3gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v0N4F/dJMcaiiYjvb/T8zKGzvmBKscLM6mu6N3gk/img.png&quot; data-alt=&quot;다음에는 이렇게 만들것이다. 네비게이션 컨트롤바등 다른 뷰가 나오게 할 것이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v0N4F/dJMcaiiYjvb/T8zKGzvmBKscLM6mu6N3gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv0N4F%2FdJMcaiiYjvb%2FT8zKGzvmBKscLM6mu6N3gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;733&quot; data-filename=&quot;스크린샷 2026-05-11 오후 4.33.07.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다음에는 이렇게 만들것이다. 네비게이션 컨트롤바등 다른 뷰가 나오게 할 것이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bhxom0/dJMcad2ZCvc/geAcIpxMU4yVvEc3yDuH81/MovieLJY%202.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MovieLJY 2.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.04MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;ViewController.swift&lt;br /&gt;//&amp;nbsp;&amp;nbsp;MovieLJY&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;comsoft&amp;nbsp;on&amp;nbsp;2026/05/04.&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;UIKit&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;============================================================&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;JSON&amp;nbsp;파싱용&amp;nbsp;구조체&lt;br /&gt;//&amp;nbsp;============================================================&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;최상위&amp;nbsp;JSON&amp;nbsp;{&amp;nbsp;&quot;boxOfficeResult&quot;:&amp;nbsp;{&amp;nbsp;...&amp;nbsp;}&amp;nbsp;}&lt;br /&gt;struct&amp;nbsp;MovieData:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxOfficeResult:&amp;nbsp;BoxOfficeResult&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;boxOfficeResult&amp;nbsp;안의&amp;nbsp;{&amp;nbsp;&quot;dailyBoxOfficeList&quot;:&amp;nbsp;[&amp;nbsp;...&amp;nbsp;]&amp;nbsp;}&lt;br /&gt;struct&amp;nbsp;BoxOfficeResult:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;dailyBoxOfficeList:&amp;nbsp;[DailyBoxOfficeList]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;dailyBoxOfficeList&amp;nbsp;배열의&amp;nbsp;각&amp;nbsp;영화&amp;nbsp;항목&lt;br /&gt;struct&amp;nbsp;DailyBoxOfficeList:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;movieNm:&amp;nbsp;String&amp;nbsp;&amp;nbsp;//&amp;nbsp;영화&amp;nbsp;이름&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiCnt:&amp;nbsp;String&amp;nbsp;&amp;nbsp;//&amp;nbsp;당일&amp;nbsp;관객수&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiAcc:&amp;nbsp;String&amp;nbsp;&amp;nbsp;//&amp;nbsp;누적&amp;nbsp;관객수&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rank:&amp;nbsp;String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;순위&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;============================================================&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;ViewController&lt;br /&gt;//&amp;nbsp;============================================================&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;ViewController:&amp;nbsp;UIViewController,&amp;nbsp;UITableViewDelegate,&amp;nbsp;UITableViewDataSource&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;스토리보드에서&amp;nbsp;연결한&amp;nbsp;테이블뷰&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@IBOutlet&amp;nbsp;weak&amp;nbsp;var&amp;nbsp;table:&amp;nbsp;UITableView!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;API에서&amp;nbsp;받아온&amp;nbsp;데이터&amp;nbsp;저장&amp;nbsp;변수&amp;nbsp;(초기값&amp;nbsp;nil)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;movieData:&amp;nbsp;MovieData?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;API&amp;nbsp;기본&amp;nbsp;주소&amp;nbsp;(날짜는&amp;nbsp;뒤에&amp;nbsp;동적으로&amp;nbsp;붙임&amp;nbsp;&amp;rarr;&amp;nbsp;var로&amp;nbsp;선언)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;movieURL&amp;nbsp;=&amp;nbsp;&quot;&lt;a href=&quot;https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=536e058824a8f5bcc8c39f075897985f&amp;amp;targetDt=&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=536e058824a8f5bcc8c39f075897985f&amp;amp;targetDt=&lt;/a&gt;&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;UITableViewDataSource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;셀&amp;nbsp;개수:&amp;nbsp;고정&amp;nbsp;10개&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;tableView(_&amp;nbsp;tableView:&amp;nbsp;UITableView,&amp;nbsp;numberOfRowsInSection&amp;nbsp;section:&amp;nbsp;Int)&amp;nbsp;-&amp;gt;&amp;nbsp;Int&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;각&amp;nbsp;셀&amp;nbsp;구성&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;tableView(_&amp;nbsp;tableView:&amp;nbsp;UITableView,&amp;nbsp;cellForRowAt&amp;nbsp;indexPath:&amp;nbsp;IndexPath)&amp;nbsp;-&amp;gt;&amp;nbsp;UITableViewCell&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&quot;myCell&quot;&amp;nbsp;식별자로&amp;nbsp;재사용&amp;nbsp;셀&amp;nbsp;꺼내기&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;cell&amp;nbsp;=&amp;nbsp;tableView.dequeueReusableCell(withIdentifier:&amp;nbsp;&quot;myCell&quot;,&amp;nbsp;for:&amp;nbsp;indexPath)&amp;nbsp;as!&amp;nbsp;MyTableViewCell&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;row&amp;nbsp;번호에&amp;nbsp;해당하는&amp;nbsp;영화&amp;nbsp;이름을&amp;nbsp;셀에&amp;nbsp;표시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;movieData가&amp;nbsp;nil이면&amp;nbsp;아무것도&amp;nbsp;표시&amp;nbsp;안&amp;nbsp;함&amp;nbsp;(옵셔널&amp;nbsp;체이닝&amp;nbsp;?.)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cell.moiveName.text&amp;nbsp;=&amp;nbsp;movieData?.boxOfficeResult.dailyBoxOfficeList[indexPath.row].movieNm&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;cell&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;섹션&amp;nbsp;개수:&amp;nbsp;1개&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;numberOfSections(in&amp;nbsp;tableView:&amp;nbsp;UITableView)&amp;nbsp;-&amp;gt;&amp;nbsp;Int&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;생명주기&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;func&amp;nbsp;viewDidLoad()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.viewDidLoad()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table.delegate&amp;nbsp;=&amp;nbsp;self&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table.dataSource&amp;nbsp;=&amp;nbsp;self&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;기본&amp;nbsp;URL&amp;nbsp;뒤에&amp;nbsp;어제&amp;nbsp;날짜&amp;nbsp;문자열을&amp;nbsp;붙여서&amp;nbsp;완성&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;예:&amp;nbsp;&quot;...&amp;amp;targetDt=&quot;&amp;nbsp;+&amp;nbsp;&quot;20260510&quot;&amp;nbsp;&amp;rarr;&amp;nbsp;&quot;...&amp;amp;targetDt=20260510&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;movieURL&amp;nbsp;+=&amp;nbsp;makeYesterdayString()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;완성된&amp;nbsp;URL로&amp;nbsp;API&amp;nbsp;호출&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getData()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;어제&amp;nbsp;날짜&amp;nbsp;문자열&amp;nbsp;생성&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;makeYesterdayString()&amp;nbsp;-&amp;gt;&amp;nbsp;String&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;오늘&amp;nbsp;날짜에서&amp;nbsp;-1일&amp;nbsp;&amp;rarr;&amp;nbsp;어제&amp;nbsp;날짜&amp;nbsp;계산&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;y&amp;nbsp;=&amp;nbsp;Calendar.current.date(byAdding:&amp;nbsp;.day,&amp;nbsp;value:&amp;nbsp;-1,&amp;nbsp;to:&amp;nbsp;Date())!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;날짜&amp;nbsp;형식&amp;nbsp;지정:&amp;nbsp;yyyyMMdd&amp;nbsp;(예:&amp;nbsp;20260510)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;dateF&amp;nbsp;=&amp;nbsp;DateFormatter()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateF.dateFormat&amp;nbsp;=&amp;nbsp;&quot;yyyyMMdd&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Date&amp;nbsp;&amp;rarr;&amp;nbsp;String&amp;nbsp;변환&amp;nbsp;후&amp;nbsp;반환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;day&amp;nbsp;=&amp;nbsp;dateF.string(from:&amp;nbsp;y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;day&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;네트워크&amp;nbsp;통신&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;============================================================&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;getData()&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;1단계:&amp;nbsp;문자열&amp;nbsp;&amp;rarr;&amp;nbsp;URL&amp;nbsp;객체&amp;nbsp;변환&amp;nbsp;(실패&amp;nbsp;시&amp;nbsp;함수&amp;nbsp;종료)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard&amp;nbsp;let&amp;nbsp;url&amp;nbsp;=&amp;nbsp;URL(string:&amp;nbsp;movieURL)&amp;nbsp;else&amp;nbsp;{&amp;nbsp;return&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;2단계:&amp;nbsp;URLSession&amp;nbsp;인스턴스&amp;nbsp;생성&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;session&amp;nbsp;=&amp;nbsp;URLSession(configuration:&amp;nbsp;.default)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;3단계:&amp;nbsp;dataTask&amp;nbsp;생성&amp;nbsp;-&amp;nbsp;응답은&amp;nbsp;클로저에서&amp;nbsp;처리&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;task&amp;nbsp;=&amp;nbsp;session.dataTask(with:&amp;nbsp;url)&amp;nbsp;{&amp;nbsp;data,&amp;nbsp;response,&amp;nbsp;error&amp;nbsp;in&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;에러&amp;nbsp;발생&amp;nbsp;시&amp;nbsp;출력&amp;nbsp;후&amp;nbsp;종료&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;error&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(error!)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;data가&amp;nbsp;nil이면&amp;nbsp;종료&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard&amp;nbsp;let&amp;nbsp;JSONdata&amp;nbsp;=&amp;nbsp;data&amp;nbsp;else&amp;nbsp;{&amp;nbsp;return&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;JSONDecoder로&amp;nbsp;Data&amp;nbsp;&amp;rarr;&amp;nbsp;MovieData&amp;nbsp;구조체&amp;nbsp;변환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;decoder&amp;nbsp;=&amp;nbsp;JSONDecoder()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;decodedData&amp;nbsp;=&amp;nbsp;try&amp;nbsp;decoder.decode(MovieData.self,&amp;nbsp;from:&amp;nbsp;JSONdata)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;파싱&amp;nbsp;확인용&amp;nbsp;콘솔&amp;nbsp;출력&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].movieNm)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].audiAcc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(decodedData.boxOfficeResult.dailyBoxOfficeList[0].audiCnt)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;파싱&amp;nbsp;데이터를&amp;nbsp;멤버변수에&amp;nbsp;저장&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.movieData&amp;nbsp;=&amp;nbsp;decodedData&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;⚠️&amp;nbsp;UI&amp;nbsp;업데이트는&amp;nbsp;반드시&amp;nbsp;메인&amp;nbsp;스레드에서!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;네트워크&amp;nbsp;응답은&amp;nbsp;백그라운드&amp;nbsp;스레드로&amp;nbsp;오기&amp;nbsp;때문&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DispatchQueue.main.async&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.table.reloadData()&amp;nbsp;&amp;nbsp;//&amp;nbsp;테이블뷰&amp;nbsp;새로고침&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;파싱&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;에러&amp;nbsp;출력&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(error)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;4단계:&amp;nbsp;요청&amp;nbsp;시작&amp;nbsp;(이&amp;nbsp;전까지는&amp;nbsp;요청&amp;nbsp;안&amp;nbsp;보냄)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;task.resume()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이전 버전과 달라진 점&lt;/h4&gt;
&lt;div&gt;항목이전이번
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;movieURL&lt;/td&gt;
&lt;td&gt;let (날짜 고정)&lt;/td&gt;
&lt;td&gt;var (날짜 동적으로 붙임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;날짜&lt;/td&gt;
&lt;td&gt;targetDt=20260510 하드코딩&lt;/td&gt;
&lt;td&gt;makeYesterdayString()으로 자동 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;결과&lt;/td&gt;
&lt;td&gt;항상 같은 날 데이터&lt;/td&gt;
&lt;td&gt;&lt;b&gt;실행할 때마다 어제 데이터&lt;/b&gt; 자동 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;makeYesterdayString() 흐름&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;Date()         &amp;rarr;  오늘 날짜
byAdding: -1   &amp;rarr;  어제 날짜
dateFormat     &amp;rarr;  &quot;yyyyMMdd&quot;
return         &amp;rarr;  &quot;20260510&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/78</guid>
      <comments>https://jong133.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 11 May 2026 16:37:26 +0900</pubDate>
    </item>
    <item>
      <title>iOS프로그래밍실무9주차 과제</title>
      <link>https://jong133.tistory.com/75</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 2.25.53.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;917&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oABJc/dJMcaffrXJI/hBd7voG3xZRbsqSdhPjGEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oABJc/dJMcaffrXJI/hBd7voG3xZRbsqSdhPjGEk/img.png&quot; data-alt=&quot;영진위api를 이용해 키를 발급받아 05 03 영화순위의 데이터를 json을 한번 출력해보았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oABJc/dJMcaffrXJI/hBd7voG3xZRbsqSdhPjGEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoABJc%2FdJMcaffrXJI%2FhBd7voG3xZRbsqSdhPjGEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;917&quot; data-filename=&quot;스크린샷 2026-05-04 오후 2.25.53.png&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;917&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;영진위api를 이용해 키를 발급받아 05 03 영화순위의 데이터를 json을 한번 출력해보았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 2.28.56.png&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zpoY9/dJMb99MZGJj/d56uo9zkiLhNUVGvXUX4Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zpoY9/dJMb99MZGJj/d56uo9zkiLhNUVGvXUX4Q1/img.png&quot; data-alt=&quot;네이버와 오픈api를 비교해 보았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zpoY9/dJMb99MZGJj/d56uo9zkiLhNUVGvXUX4Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzpoY9%2FdJMb99MZGJj%2Fd56uo9zkiLhNUVGvXUX4Q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1190&quot; height=&quot;891&quot; data-filename=&quot;스크린샷 2026-05-04 오후 2.28.56.png&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버와 오픈api를 비교해 보았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&amp;ldquo;&lt;/span&gt;&lt;span&gt;슈퍼&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;마리오&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;갤럭시&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&quot;&lt;/span&gt;&lt;span&gt;악마는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프라다를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입는다&lt;/span&gt;&lt;span&gt; 2&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&amp;rdquo;&lt;/span&gt;&lt;span&gt;살목지&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&amp;rdquo;&lt;/span&gt;&lt;span&gt;프로젝트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;헤일메리&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&quot;&lt;/span&gt;&lt;span&gt;짱구&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&amp;rdquo;&lt;/span&gt;&lt;span&gt;왕과&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;남자&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&quot;&lt;/span&gt;&lt;span&gt;란&lt;/span&gt;&lt;span&gt; 12.3&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&quot;&lt;/span&gt;&lt;span&gt;내&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이름은&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&quot;&lt;/span&gt;&lt;span&gt;사랑의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하츄핑&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;특별판&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;,&quot;&lt;/span&gt;&lt;span&gt;극장판&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반짝반짝&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;달님이&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;싱어롱&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파티&lt;/span&gt;&lt;span&gt;&amp;rdquo;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 2.39.10.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oy4ts/dJMcagyAZwC/viYEevvmSquWZJPyQWIEK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oy4ts/dJMcagyAZwC/viYEevvmSquWZJPyQWIEK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oy4ts/dJMcagyAZwC/viYEevvmSquWZJPyQWIEK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foy4ts%2FdJMcagyAZwC%2FviYEevvmSquWZJPyQWIEK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;869&quot; data-filename=&quot;스크린샷 2026-05-04 오후 2.39.10.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codebeautify.org/jsonviewer&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codebeautify.org/jsonviewer&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1777873191038&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Best JSON Viewer and JSON Beautifier Online&quot; data-og-description=&quot;Online JSON Viewer, JSON Beautifier and Formatter to beautify and tree view of JSON data - It works as JSON Pretty Print to pretty print JSON data.&quot; data-og-host=&quot;codebeautify.org&quot; data-og-source-url=&quot;https://codebeautify.org/jsonviewer&quot; data-og-url=&quot;https://codebeautify.org/jsonviewer&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x8FVM/dJMb87gadcb/NRLZbE8J0uQznGYCmPUMj1/img.png?width=1329&amp;amp;height=553&amp;amp;face=870_353_948_438,https://scrap.kakaocdn.net/dn/IKl60/dJMb88e4oOU/ZTYkn0WV0tOuADK0x0zKp1/img.png?width=1329&amp;amp;height=553&amp;amp;face=870_353_948_438&quot;&gt;&lt;a href=&quot;https://codebeautify.org/jsonviewer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codebeautify.org/jsonviewer&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x8FVM/dJMb87gadcb/NRLZbE8J0uQznGYCmPUMj1/img.png?width=1329&amp;amp;height=553&amp;amp;face=870_353_948_438,https://scrap.kakaocdn.net/dn/IKl60/dJMb88e4oOU/ZTYkn0WV0tOuADK0x0zKp1/img.png?width=1329&amp;amp;height=553&amp;amp;face=870_353_948_438');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Best JSON Viewer and JSON Beautifier Online&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Online JSON Viewer, JSON Beautifier and Formatter to beautify and tree view of JSON data - It works as JSON Pretty Print to pretty print JSON data.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codebeautify.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;open api를 해석하는 방법&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;import Foundation

// MARK: - Root
struct BoxOfficeResponse: Codable {
    let boxOfficeResult: BoxOfficeResult
}

// MARK: - BoxOfficeResult
struct BoxOfficeResult: Codable {
    let boxofficeType: String
    let showRange: String
    let dailyBoxOfficeList: [DailyBoxOffice]
}

// MARK: - DailyBoxOffice
struct DailyBoxOffice: Codable {
    let rnum: String           // 순번
    let rank: String           // 해당일자 순위
    let rankInten: String      // 전일 대비 순위 변동분
    let rankOldAndNew: String  // 신규진입여부 (NEW / OLD)
    let movieCd: String        // 영화코드
    let movieNm: String        // 영화명
    let openDt: String         // 개봉일
    let salesAmt: String       // 해당일 매출액
    let salesShare: String     // 해당일 점유율
    let salesInten: String     // 전일 대비 매출액 증감분
    let salesChange: String    // 전일 대비 매출액 증감 비율
    let salesAcc: String       // 누적 매출액
    let audiCnt: String        // 해당일 관객수
    let audiInten: String      // 전일 대비 관객수 증감분
    let audiChange: String     // 전일 대비 관객수 증감 비율
    let audiAcc: String        // 누적 관객수
    let scrnCnt: String        // 해당일 상영 스크린수
    let showCnt: String        // 해당일 상영횟수
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 필드를 적절한 타입으로 변환하고 싶다면 아래처럼 Int / Double로 선언하고 CodingKeys로 매핑할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;zephir&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// MARK: - DailyBoxOffice (타입 변환 버전)
struct DailyBoxOffice: Codable {
    let rnum: String
    let rank: Int
    let rankInten: Int         // 음수 가능
    let rankOldAndNew: RankStatus
    let movieCd: String
    let movieNm: String
    let openDt: String
    let salesAmt: Int
    let salesShare: Double
    let salesInten: Int        // 음수 가능
    let salesChange: Double    // 음수 가능
    let salesAcc: Int
    let audiCnt: Int
    let audiInten: Int         // 음수 가능
    let audiChange: Double     // 음수 가능
    let audiAcc: Int
    let scrnCnt: Int
    let showCnt: Int
}

// MARK: - RankStatus
enum RankStatus: String, Codable {
    case new = &quot;NEW&quot;
    case old = &quot;OLD&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;zephir&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let jsonData = json.data(using: .utf8)!
let decoder = JSONDecoder()

do {
    let result = try decoder.decode(BoxOfficeResponse.self, from: jsonData)
    let list = result.boxOfficeResult.dailyBoxOfficeList
    list.forEach { print(&quot;\($0.rank)위: \($0.movieNm)&quot;) }
} catch {
    print(&quot;Decoding error: \(error)&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON의 모든 숫자값이 String 형태로 전달되고 있어서, 서버 스펙이 확실하다면 &lt;b&gt;타입 변환 버전&lt;/b&gt;을 쓰되 String으로 디코딩 후 직접 변환하는 방법도 안전합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp;This&amp;nbsp;file&amp;nbsp;was&amp;nbsp;generated&amp;nbsp;from&amp;nbsp;JSON&amp;nbsp;Schema&amp;nbsp;using&amp;nbsp;quicktype,&amp;nbsp;do&amp;nbsp;not&amp;nbsp;modify&amp;nbsp;it&amp;nbsp;directly.&lt;br /&gt;//&amp;nbsp;To&amp;nbsp;parse&amp;nbsp;the&amp;nbsp;JSON,&amp;nbsp;add&amp;nbsp;this&amp;nbsp;file&amp;nbsp;to&amp;nbsp;your&amp;nbsp;project&amp;nbsp;and&amp;nbsp;do:&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;welcome&amp;nbsp;=&amp;nbsp;try?&amp;nbsp;JSONDecoder().decode(Welcome.self,&amp;nbsp;from:&amp;nbsp;jsonData)&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;Foundation&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;Welcome&lt;br /&gt;struct&amp;nbsp;Welcome:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxOfficeResult:&amp;nbsp;BoxOfficeResult&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;BoxOfficeResult&lt;br /&gt;struct&amp;nbsp;BoxOfficeResult:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;boxofficeType,&amp;nbsp;showRange:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;dailyBoxOfficeList:&amp;nbsp;[DailyBoxOfficeList]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;MARK:&amp;nbsp;-&amp;nbsp;DailyBoxOfficeList&lt;br /&gt;struct&amp;nbsp;DailyBoxOfficeList:&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rnum,&amp;nbsp;rank,&amp;nbsp;rankInten:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rankOldAndNew:&amp;nbsp;RankOldAndNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;movieCD,&amp;nbsp;movieNm,&amp;nbsp;openDt,&amp;nbsp;salesAmt:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;salesShare,&amp;nbsp;salesInten,&amp;nbsp;salesChange,&amp;nbsp;salesAcc:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;audiCnt,&amp;nbsp;audiInten,&amp;nbsp;audiChange,&amp;nbsp;audiAcc:&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;scrnCnt,&amp;nbsp;showCnt:&amp;nbsp;String&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enum&amp;nbsp;CodingKeys:&amp;nbsp;String,&amp;nbsp;CodingKey&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rnum,&amp;nbsp;rank,&amp;nbsp;rankInten,&amp;nbsp;rankOldAndNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;movieCD&amp;nbsp;=&amp;nbsp;&quot;movieCd&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;movieNm,&amp;nbsp;openDt,&amp;nbsp;salesAmt,&amp;nbsp;salesShare,&amp;nbsp;salesInten,&amp;nbsp;salesChange,&amp;nbsp;salesAcc,&amp;nbsp;audiCnt,&amp;nbsp;audiInten,&amp;nbsp;audiChange,&amp;nbsp;audiAcc,&amp;nbsp;scrnCnt,&amp;nbsp;showCnt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;enum&amp;nbsp;RankOldAndNew:&amp;nbsp;String,&amp;nbsp;Codable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;old&amp;nbsp;=&amp;nbsp;&quot;OLD&quot;&lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Kotlin (Data Class)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;kotlin&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;import com.google.gson.annotations.SerializedName

// Root
data class BoxOfficeResponse(
    @SerializedName(&quot;boxOfficeResult&quot;)
    val boxOfficeResult: BoxOfficeResult
)

// BoxOfficeResult
data class BoxOfficeResult(
    @SerializedName(&quot;boxofficeType&quot;)
    val boxofficeType: String,
    @SerializedName(&quot;showRange&quot;)
    val showRange: String,
    @SerializedName(&quot;dailyBoxOfficeList&quot;)
    val dailyBoxOfficeList: List&amp;lt;DailyBoxOffice&amp;gt;
)

// DailyBoxOffice
data class DailyBoxOffice(
    @SerializedName(&quot;rnum&quot;)
    val rnum: String,           // 순번
    @SerializedName(&quot;rank&quot;)
    val rank: String,           // 순위
    @SerializedName(&quot;rankInten&quot;)
    val rankInten: String,      // 순위 변동분
    @SerializedName(&quot;rankOldAndNew&quot;)
    val rankOldAndNew: String,  // 신규진입여부 (NEW / OLD)
    @SerializedName(&quot;movieCd&quot;)
    val movieCd: String,        // 영화코드
    @SerializedName(&quot;movieNm&quot;)
    val movieNm: String,        // 영화명
    @SerializedName(&quot;openDt&quot;)
    val openDt: String,         // 개봉일
    @SerializedName(&quot;salesAmt&quot;)
    val salesAmt: String,       // 매출액
    @SerializedName(&quot;salesShare&quot;)
    val salesShare: String,     // 매출 점유율
    @SerializedName(&quot;salesInten&quot;)
    val salesInten: String,     // 매출액 증감분
    @SerializedName(&quot;salesChange&quot;)
    val salesChange: String,    // 매출액 증감 비율
    @SerializedName(&quot;salesAcc&quot;)
    val salesAcc: String,       // 누적 매출액
    @SerializedName(&quot;audiCnt&quot;)
    val audiCnt: String,        // 관객수
    @SerializedName(&quot;audiInten&quot;)
    val audiInten: String,      // 관객수 증감분
    @SerializedName(&quot;audiChange&quot;)
    val audiChange: String,     // 관객수 증감 비율
    @SerializedName(&quot;audiAcc&quot;)
    val audiAcc: String,        // 누적 관객수
    @SerializedName(&quot;scrnCnt&quot;)
    val scrnCnt: String,        // 스크린수
    @SerializedName(&quot;showCnt&quot;)
    val showCnt: String         // 상영횟수
)

// 사용 예시 (Gson)
// val response = Gson().fromJson(jsonString, BoxOfficeResponse::class.java)
// val list = response.boxOfficeResult.dailyBoxOfficeList
// list.forEach { println(&quot;${it.rank}위: ${it.movieNm}&quot;) }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Java (POJO + Gson)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;java&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;import com.google.gson.annotations.SerializedName;
import java.util.List;

// Root
public class BoxOfficeResponse {
    @SerializedName(&quot;boxOfficeResult&quot;)
    private BoxOfficeResult boxOfficeResult;

    public BoxOfficeResult getBoxOfficeResult() { return boxOfficeResult; }
    public void setBoxOfficeResult(BoxOfficeResult boxOfficeResult) {
        this.boxOfficeResult = boxOfficeResult;
    }
}

// BoxOfficeResult
public class BoxOfficeResult {
    @SerializedName(&quot;boxofficeType&quot;)
    private String boxofficeType;

    @SerializedName(&quot;showRange&quot;)
    private String showRange;

    @SerializedName(&quot;dailyBoxOfficeList&quot;)
    private List&amp;lt;DailyBoxOffice&amp;gt; dailyBoxOfficeList;

    public String getBoxofficeType() { return boxofficeType; }
    public void setBoxofficeType(String boxofficeType) { this.boxofficeType = boxofficeType; }

    public String getShowRange() { return showRange; }
    public void setShowRange(String showRange) { this.showRange = showRange; }

    public List&amp;lt;DailyBoxOffice&amp;gt; getDailyBoxOfficeList() { return dailyBoxOfficeList; }
    public void setDailyBoxOfficeList(List&amp;lt;DailyBoxOffice&amp;gt; list) { this.dailyBoxOfficeList = list; }
}

// DailyBoxOffice
public class DailyBoxOffice {
    @SerializedName(&quot;rnum&quot;)
    private String rnum;        // 순번

    @SerializedName(&quot;rank&quot;)
    private String rank;        // 순위

    @SerializedName(&quot;rankInten&quot;)
    private String rankInten;   // 순위 변동분

    @SerializedName(&quot;rankOldAndNew&quot;)
    private String rankOldAndNew; // 신규진입여부 (NEW / OLD)

    @SerializedName(&quot;movieCd&quot;)
    private String movieCd;     // 영화코드

    @SerializedName(&quot;movieNm&quot;)
    private String movieNm;     // 영화명

    @SerializedName(&quot;openDt&quot;)
    private String openDt;      // 개봉일

    @SerializedName(&quot;salesAmt&quot;)
    private String salesAmt;    // 매출액

    @SerializedName(&quot;salesShare&quot;)
    private String salesShare;  // 매출 점유율

    @SerializedName(&quot;salesInten&quot;)
    private String salesInten;  // 매출액 증감분

    @SerializedName(&quot;salesChange&quot;)
    private String salesChange; // 매출액 증감 비율

    @SerializedName(&quot;salesAcc&quot;)
    private String salesAcc;    // 누적 매출액

    @SerializedName(&quot;audiCnt&quot;)
    private String audiCnt;     // 관객수

    @SerializedName(&quot;audiInten&quot;)
    private String audiInten;   // 관객수 증감분

    @SerializedName(&quot;audiChange&quot;)
    private String audiChange;  // 관객수 증감 비율

    @SerializedName(&quot;audiAcc&quot;)
    private String audiAcc;     // 누적 관객수

    @SerializedName(&quot;scrnCnt&quot;)
    private String scrnCnt;     // 스크린수

    @SerializedName(&quot;showCnt&quot;)
    private String showCnt;     // 상영횟수

    // Getters &amp;amp; Setters
    public String getRnum() { return rnum; }
    public void setRnum(String rnum) { this.rnum = rnum; }

    public String getRank() { return rank; }
    public void setRank(String rank) { this.rank = rank; }

    public String getRankInten() { return rankInten; }
    public void setRankInten(String rankInten) { this.rankInten = rankInten; }

    public String getRankOldAndNew() { return rankOldAndNew; }
    public void setRankOldAndNew(String rankOldAndNew) { this.rankOldAndNew = rankOldAndNew; }

    public String getMovieCd() { return movieCd; }
    public void setMovieCd(String movieCd) { this.movieCd = movieCd; }

    public String getMovieNm() { return movieNm; }
    public void setMovieNm(String movieNm) { this.movieNm = movieNm; }

    public String getOpenDt() { return openDt; }
    public void setOpenDt(String openDt) { this.openDt = openDt; }

    public String getSalesAmt() { return salesAmt; }
    public void setSalesAmt(String salesAmt) { this.salesAmt = salesAmt; }

    public String getSalesShare() { return salesShare; }
    public void setSalesShare(String salesShare) { this.salesShare = salesShare; }

    public String getSalesInten() { return salesInten; }
    public void setSalesInten(String salesInten) { this.salesInten = salesInten; }

    public String getSalesChange() { return salesChange; }
    public void setSalesChange(String salesChange) { this.salesChange = salesChange; }

    public String getSalesAcc() { return salesAcc; }
    public void setSalesAcc(String salesAcc) { this.salesAcc = salesAcc; }

    public String getAudiCnt() { return audiCnt; }
    public void setAudiCnt(String audiCnt) { this.audiCnt = audiCnt; }

    public String getAudiInten() { return audiInten; }
    public void setAudiInten(String audiInten) { this.audiInten = audiInten; }

    public String getAudiChange() { return audiChange; }
    public void setAudiChange(String audiChange) { this.audiChange = audiChange; }

    public String getAudiAcc() { return audiAcc; }
    public void setAudiAcc(String audiAcc) { this.audiAcc = audiAcc; }

    public String getScrnCnt() { return scrnCnt; }
    public void setScrnCnt(String scrnCnt) { this.scrnCnt = scrnCnt; }

    public String getShowCnt() { return showCnt; }
    public void setShowCnt(String showCnt) { this.showCnt = showCnt; }
}

// 사용 예시
// BoxOfficeResponse response = new Gson().fromJson(jsonString, BoxOfficeResponse.class);
// List&amp;lt;DailyBoxOffice&amp;gt; list = response.getBoxOfficeResult().getDailyBoxOfficeList();
// for (DailyBoxOffice movie : list) {
//     System.out.println(movie.getRank() + &quot;위: &quot; + movie.getMovieNm());
// }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python (dataclass + dacite)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;python&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;from dataclasses import dataclass
from typing import List
import json

@dataclass
class DailyBoxOffice:
    rnum: str           # 순번
    rank: str           # 순위
    rankInten: str      # 순위 변동분
    rankOldAndNew: str  # 신규진입여부 (NEW / OLD)
    movieCd: str        # 영화코드
    movieNm: str        # 영화명
    openDt: str         # 개봉일
    salesAmt: str       # 매출액
    salesShare: str     # 매출 점유율
    salesInten: str     # 매출액 증감분
    salesChange: str    # 매출액 증감 비율
    salesAcc: str       # 누적 매출액
    audiCnt: str        # 관객수
    audiInten: str      # 관객수 증감분
    audiChange: str     # 관객수 증감 비율
    audiAcc: str        # 누적 관객수
    scrnCnt: str        # 스크린수
    showCnt: str        # 상영횟수

@dataclass
class BoxOfficeResult:
    boxofficeType: str
    showRange: str
    dailyBoxOfficeList: List[DailyBoxOffice]

@dataclass
class BoxOfficeResponse:
    boxOfficeResult: BoxOfficeResult


# 사용 예시 (dacite 사용)
# pip install dacite
from dacite import from_dict

with open(&quot;boxoffice.json&quot;, encoding=&quot;utf-8&quot;) as f:
    raw = json.load(f)

response = from_dict(data_class=BoxOfficeResponse, data=raw)

for movie in response.boxOfficeResult.dailyBoxOfficeList:
    print(f&quot;{movie.rank}위: {movie.movieNm}&quot;)


# dacite 없이 순수하게 파싱하려면:
def parse_response(data: dict) -&amp;gt; BoxOfficeResponse:
    result = data[&quot;boxOfficeResult&quot;]
    movies = [DailyBoxOffice(**item) for item in result[&quot;dailyBoxOfficeList&quot;]]
    box_result = BoxOfficeResult(
        boxofficeType=result[&quot;boxofficeType&quot;],
        showRange=result[&quot;showRange&quot;],
        dailyBoxOfficeList=movies
    )
    return BoxOfficeResponse(boxOfficeResult=box_result)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;언어별 핵심 비교&lt;/h4&gt;
&lt;div&gt;항목KotlinJavaPython
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;모델 형태&lt;/td&gt;
&lt;td&gt;data class&lt;/td&gt;
&lt;td&gt;POJO&lt;/td&gt;
&lt;td&gt;@dataclass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON 직렬화&lt;/td&gt;
&lt;td&gt;Gson / Moshi&lt;/td&gt;
&lt;td&gt;Gson / Jackson&lt;/td&gt;
&lt;td&gt;json + dacite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보일러플레이트&lt;/td&gt;
&lt;td&gt;최소&lt;/td&gt;
&lt;td&gt;많음&lt;/td&gt;
&lt;td&gt;적음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Null 안전성&lt;/td&gt;
&lt;td&gt;컴파일 타임&lt;/td&gt;
&lt;td&gt;런타임&lt;/td&gt;
&lt;td&gt;런타임&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.07.56.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euh640/dJMcabcYx8X/p0GUsGtbvoDZ7q6KfPyOQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euh640/dJMcabcYx8X/p0GUsGtbvoDZ7q6KfPyOQK/img.png&quot; data-alt=&quot;보통 url은 명사만 넣는다. restful은 주소와 명사를 철저하게 분리한다. url은 말그대로 어디에있는 머 이런식으로 된다. rest의 규칙을 최대한 잘 지켜서 만든 서비스라고 불린다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euh640/dJMcabcYx8X/p0GUsGtbvoDZ7q6KfPyOQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feuh640%2FdJMcabcYx8X%2Fp0GUsGtbvoDZ7q6KfPyOQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;676&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.07.56.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보통 url은 명사만 넣는다. restful은 주소와 명사를 철저하게 분리한다. url은 말그대로 어디에있는 머 이런식으로 된다. rest의 규칙을 최대한 잘 지켜서 만든 서비스라고 불린다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.11.42.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmDu59/dJMcafmbQi3/TNrnDBtCCXdeN6XXLamf8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmDu59/dJMcafmbQi3/TNrnDBtCCXdeN6XXLamf8K/img.png&quot; data-alt=&quot;파싱은 xml데이터를 추출하여 분석한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmDu59/dJMcafmbQi3/TNrnDBtCCXdeN6XXLamf8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmDu59%2FdJMcafmbQi3%2FTNrnDBtCCXdeN6XXLamf8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;668&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.11.42.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파싱은 xml데이터를 추출하여 분석한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.15.31.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QV6w0/dJMcafGuDBM/waPNjc85iJPscxKRyFPV2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QV6w0/dJMcafGuDBM/waPNjc85iJPscxKRyFPV2K/img.png&quot; data-alt=&quot;여러개의 객체들을 나열할때는 대괄호를 해서 배열처럼 표현한다. xml보다는 훨씬더 깔끔하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QV6w0/dJMcafGuDBM/waPNjc85iJPscxKRyFPV2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQV6w0%2FdJMcafGuDBM%2FwaPNjc85iJPscxKRyFPV2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1223&quot; height=&quot;673&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.15.31.png&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여러개의 객체들을 나열할때는 대괄호를 해서 배열처럼 표현한다. xml보다는 훨씬더 깔끔하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.18.59.png&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gb7Jk/dJMcahj1Xh2/KYGtDdOBTmwuFdEyCYIba0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gb7Jk/dJMcahj1Xh2/KYGtDdOBTmwuFdEyCYIba0/img.png&quot; data-alt=&quot;데이터를파씽한다고 한다. 필요한 데이터를 얻을때 이 슬라이드는 JSON 데이터를 Swift 구조체로 모델링하는 방법을 설명하는 강의 자료입니다. 슬라이드 구성 설명   왼쪽 - JSON 원본 데이터 실제 박스오피스 API의 JSON 응답 데이터입니다. ① boxOfficeResult &amp;amp;rarr; 최상위 객체 ② dailyBoxOfficeList &amp;amp;rarr; 배열 ([ ]) ③ movieNm, audiCnt &amp;amp;rarr; 배열 안 각 항목의 필드   가운데 - JSON Viewer (트리 구조) codebeautify.org/jsonviewer 사이트에서 JSON을 트리 형태로 시각화한 모습입니다. ① boxOfficeResult 객체 안에 ② dailyBoxOfficeList 배열 (10개 항목)이 있고 ③ 각 항목 안에 movieNm 등 필드가 있음   오른쪽 - Swift 구조체 코드 JSON 구조를 그대로 Swift struct로 매핑한 모습입니다. swiftstruct MovieData: Codable { // ① 최상위 let boxOfficeResult: BoxOfficeResult } struct BoxOfficeResult: Codable { // ② 중간 객체 let dailyBoxOfficeList: [DailyBoxOfficeList] } struct DailyBoxOfficeList: Codable { // ③ 배열 안 항목 let movieNm: String let audiCnt: String }   하단 - 데이터 접근 방법 swiftdecodedData.boxOfficeResult.dailyBoxOfficeList[0].movieNm 디코딩된 데이터에서 첫 번째 영화의 이름에 접근하는 방법 핵심 메시지 요약 JSON 구조Swift 타입{ } 객체struct[ ] 배열[타입]문자열 값String전체 구조중첩 struct로 계층 표현 JSON의 계층 구조(depth)를 그대로 Swift struct의 중첩 구조로 옮기는 것이 핵심입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gb7Jk/dJMcahj1Xh2/KYGtDdOBTmwuFdEyCYIba0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGb7Jk%2FdJMcahj1Xh2%2FKYGtDdOBTmwuFdEyCYIba0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1251&quot; height=&quot;687&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.18.59.png&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터를파씽한다고 한다. 필요한 데이터를 얻을때 이 슬라이드는 JSON 데이터를 Swift 구조체로 모델링하는 방법을 설명하는 강의 자료입니다. 슬라이드 구성 설명   왼쪽 - JSON 원본 데이터 실제 박스오피스 API의 JSON 응답 데이터입니다. ① boxOfficeResult &amp;rarr; 최상위 객체 ② dailyBoxOfficeList &amp;rarr; 배열 ([ ]) ③ movieNm, audiCnt &amp;rarr; 배열 안 각 항목의 필드   가운데 - JSON Viewer (트리 구조) codebeautify.org/jsonviewer 사이트에서 JSON을 트리 형태로 시각화한 모습입니다. ① boxOfficeResult 객체 안에 ② dailyBoxOfficeList 배열 (10개 항목)이 있고 ③ 각 항목 안에 movieNm 등 필드가 있음   오른쪽 - Swift 구조체 코드 JSON 구조를 그대로 Swift struct로 매핑한 모습입니다. swiftstruct MovieData: Codable { // ① 최상위 let boxOfficeResult: BoxOfficeResult } struct BoxOfficeResult: Codable { // ② 중간 객체 let dailyBoxOfficeList: [DailyBoxOfficeList] } struct DailyBoxOfficeList: Codable { // ③ 배열 안 항목 let movieNm: String let audiCnt: String }   하단 - 데이터 접근 방법 swiftdecodedData.boxOfficeResult.dailyBoxOfficeList[0].movieNm 디코딩된 데이터에서 첫 번째 영화의 이름에 접근하는 방법 핵심 메시지 요약 JSON 구조Swift 타입{ } 객체struct[ ] 배열[타입]문자열 값String전체 구조중첩 struct로 계층 표현 JSON의 계층 구조(depth)를 그대로 Swift struct의 중첩 구조로 옮기는 것이 핵심입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.43.10.png&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eklvkL/dJMcagFpW8h/r8mkoyoedblOJhHGkOAebK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eklvkL/dJMcagFpW8h/r8mkoyoedblOJhHGkOAebK/img.png&quot; data-alt=&quot;테이블뷰로 뷰를 완전히 화면 가득히 다 덮혔다. 이렇게 하는것을 컨스트레인트를 만든다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eklvkL/dJMcagFpW8h/r8mkoyoedblOJhHGkOAebK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeklvkL%2FdJMcagFpW8h%2Fr8mkoyoedblOJhHGkOAebK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;875&quot; data-filename=&quot;스크린샷 2026-05-04 오후 3.43.10.png&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테이블뷰로 뷰를 완전히 화면 가득히 다 덮혔다. 이렇게 하는것을 컨스트레인트를 만든다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 4.20.35.png&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgBfDI/dJMcabYoqyv/CZoPgx0lh3pwwMEfK70DV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgBfDI/dJMcabYoqyv/CZoPgx0lh3pwwMEfK70DV0/img.png&quot; data-alt=&quot;보통 컨스트레인토 마진스를 체크를 하고 많이 쓴다. 그러면 딱 예쁘게 사각형이 채워져서이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgBfDI/dJMcabYoqyv/CZoPgx0lh3pwwMEfK70DV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgBfDI%2FdJMcabYoqyv%2FCZoPgx0lh3pwwMEfK70DV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1371&quot; height=&quot;753&quot; data-filename=&quot;스크린샷 2026-05-04 오후 4.20.35.png&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보통 컨스트레인토 마진스를 체크를 하고 많이 쓴다. 그러면 딱 예쁘게 사각형이 채워져서이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 4.30.45.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7psBT/dJMcafGuIN1/m9ZaGvD8lIDacYAFUVh0L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7psBT/dJMcafGuIN1/m9ZaGvD8lIDacYAFUVh0L1/img.png&quot; data-alt=&quot;기말에 나온다. dequeueReusableCell은 리턴값이 UITableViewCell형이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7psBT/dJMcafGuIN1/m9ZaGvD8lIDacYAFUVh0L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7psBT%2FdJMcafGuIN1%2Fm9ZaGvD8lIDacYAFUVh0L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;530&quot; data-filename=&quot;스크린샷 2026-05-04 오후 4.30.45.png&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기말에 나온다. dequeueReusableCell은 리턴값이 UITableViewCell형이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-04 오후 4.34.00.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciJDcO/dJMcagyA7v2/Jr5teP8g4DTc0oOK0CPeI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciJDcO/dJMcagyA7v2/Jr5teP8g4DTc0oOK0CPeI1/img.png&quot; data-alt=&quot;indexPath.description하면은 이렇게 각각의 배열식으로 문자열이 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciJDcO/dJMcagyA7v2/Jr5teP8g4DTc0oOK0CPeI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciJDcO%2FdJMcagyA7v2%2FJr5teP8g4DTc0oOK0CPeI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;654&quot; data-filename=&quot;스크린샷 2026-05-04 오후 4.34.00.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;indexPath.description하면은 이렇게 각각의 배열식으로 문자열이 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;ViewController.swift&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;MovieLJY&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;span&gt;&amp;nbsp; &lt;/span&gt;Created by comsoft on 2026/05/04.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;b&gt; UIKit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; = [&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;1:슈퍼 마리오 갤럭시&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;2:악마는 프라다를 입는다 2&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;3:살목지&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;4:프로젝트 헤일메리&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;5:짱구&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;6:왕과 사는 남자&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;7:란 12.3&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;span&gt;&lt;b&gt;&quot;8:내 이름은&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;9:사랑의 하츄핑 특별판&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;10:극장판 반짝반짝 달님이: 싱어롱 파티&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;ViewController&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;b&gt;UIViewController&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;UITableViewDelegate&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;UITableViewDataSource&lt;/b&gt;&lt;span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;@IBOutlet&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;weak&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;table&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;tableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;numberOfRowsInSection&lt;/b&gt;&lt;/span&gt;&lt;b&gt; section: &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; 10&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;tableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;_&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;, &lt;/b&gt;&lt;span&gt;&lt;b&gt;cellForRowAt&lt;/b&gt;&lt;/span&gt;&lt;b&gt; indexPath: &lt;/b&gt;&lt;span&gt;&lt;b&gt;IndexPath&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableViewCell&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; cell = tableView.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;dequeueReusableCell&lt;/b&gt;&lt;span&gt;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;b&gt;withIdentifier&lt;/b&gt;&lt;span&gt;&lt;b&gt;: &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;&quot;myCell&quot;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;, &lt;/b&gt;&lt;/span&gt;&lt;b&gt;for&lt;/b&gt;&lt;span&gt;&lt;b&gt;: indexPath) &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;as&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;! &lt;/b&gt;&lt;/span&gt;&lt;b&gt;MyTableViewCell&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cell.&lt;/b&gt;&lt;span&gt;&lt;b&gt;moiveName&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;text&lt;/b&gt;&lt;/span&gt;&lt;b&gt; = &lt;/b&gt;&lt;span&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;&lt;b&gt;[indexPath.&lt;/b&gt;&lt;span&gt;&lt;b&gt;row&lt;/b&gt;&lt;/span&gt;&lt;b&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(indexPath.&lt;/b&gt;&lt;span&gt;&lt;b&gt;description&lt;/b&gt;&lt;/span&gt;&lt;b&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; cell&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;numberOfSections&lt;/b&gt;&lt;/span&gt;&lt;b&gt;(&lt;/b&gt;&lt;span&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt;&lt;b&gt; tableView: &lt;/b&gt;&lt;span&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/span&gt;&lt;b&gt;) -&amp;gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;Int&lt;/b&gt;&lt;/span&gt;&lt;b&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;b&gt; 5&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;override&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;func&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;() {&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;b&gt;.&lt;/b&gt;&lt;span&gt;&lt;b&gt;viewDidLoad&lt;/b&gt;&lt;/span&gt;&lt;b&gt;()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;delegate&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;table&lt;/b&gt;&lt;span&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;dataSource&lt;/b&gt;&lt;span&gt;&lt;b&gt; = &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ViewController.swift 코드 설명&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 구조 한눈에 보기&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;ViewController
├── UITableViewDelegate   (테이블 동작/이벤트 처리)
└── UITableViewDataSource (테이블 데이터 제공)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 전역 데이터&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;lasso&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let name = [&quot;1:슈퍼 마리오 갤럭시&quot;, &quot;2:악마는 프라다를 입는다 2&quot;, ...]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영화 이름 &lt;b&gt;10개&lt;/b&gt;를 담은 문자열 배열&lt;/li&gt;
&lt;li&gt;class 밖에 선언된 &lt;b&gt;전역 상수&lt;/b&gt;라 앱 어디서든 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Protocol 채택&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;프로토콜역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UIViewController&lt;/td&gt;
&lt;td&gt;화면(View) 기본 기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UITableViewDelegate&lt;/td&gt;
&lt;td&gt;셀 선택, 높이 등 &lt;b&gt;동작&lt;/b&gt; 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UITableViewDataSource&lt;/td&gt;
&lt;td&gt;셀 개수, 셀 내용 등 &lt;b&gt;데이터&lt;/b&gt; 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. IBOutlet&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;@IBOutlet weak var table: UITableView!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스토리보드의 &lt;b&gt;TableView&lt;/b&gt;와 코드를 연결한 변수&lt;/li&gt;
&lt;li&gt;weak &amp;rarr; 메모리 순환 참조 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. DataSource 메서드&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;섹션 수&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func numberOfSections(in tableView: UITableView) -&amp;gt; Int {
    return 5  // 섹션 5개
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;행(Row) 수&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&amp;gt; Int {
    return 10  // 각 섹션마다 10행
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;주의&lt;/b&gt;: 섹션 5개 &amp;times; 행 10개 = &lt;b&gt;총 50개 셀&lt;/b&gt;이 생성되는데,&lt;br /&gt;name 배열은 10개뿐이라 indexPath.row가 0~9를 반복하므로&lt;br /&gt;의도한 동작인지 확인이 필요합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;셀 구성&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&amp;gt; UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: &quot;myCell&quot;, for: indexPath) as! MyTableViewCell
    cell.moiveName.text = name[indexPath.row]
    print(indexPath.description)
    return cell
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;코드설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dequeueReusableCell&lt;/td&gt;
&lt;td&gt;셀을 &lt;b&gt;재사용&lt;/b&gt;해서 메모리 절약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&quot;myCell&quot;&lt;/td&gt;
&lt;td&gt;스토리보드에서 지정한 셀 &lt;b&gt;Identifier&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;as! MyTableViewCell&lt;/td&gt;
&lt;td&gt;커스텀 셀 클래스로 &lt;b&gt;강제 캐스팅&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cell.moiveName.text&lt;/td&gt;
&lt;td&gt;셀 안의 Label에 영화 이름 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;print(indexPath.description)&lt;/td&gt;
&lt;td&gt;몇 번째 섹션, 몇 번째 행인지 콘솔 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. viewDidLoad&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;override func viewDidLoad() {
    super.viewDidLoad()
    table.delegate = self
    table.dataSource = self
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화면이 메모리에 로드될 때 &lt;b&gt;최초 1회&lt;/b&gt; 실행&lt;/li&gt;
&lt;li&gt;테이블뷰의 delegate와 dataSource를 &lt;b&gt;자기 자신(ViewController)&lt;/b&gt; 으로 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 개선이 필요한 부분&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 1. name 배열 크기와 행 수를 하드코딩 대신 연동 권장
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&amp;gt; Int {
    return name.count  // 10 대신 name.count 사용
}

// 2. 오타 수정
cell.moiveName.text  &amp;rarr;  cell.movieName.text  // &quot;moive&quot; &amp;rarr; &quot;movie&quot;

// 3. 섹션이 5개면 각 섹션별로 다른 데이터를 보여줄 의도인지 확인 필요&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/75</guid>
      <comments>https://jong133.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 4 May 2026 16:40:44 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드실무9주차 정리</title>
      <link>https://jong133.tistory.com/74</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;pre class=&quot;crmsh&quot; style=&quot;background-color: #f7f7f7; color: #262626;&quot; width=&quot;auto&quot;&gt;&lt;code&gt;activity_main.xml



    

        
        
    










    &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-message-id=&quot;69f063172184e60dfe902564&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000; color: #262626;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div&gt;
&lt;p style=&quot;color: #656565;&quot; data-ke-size=&quot;size16&quot;&gt;레디언트&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 activity_main.xml 코드는 세 개 버튼이 가로로 나란히 배치되고, 아래에 FrameLayout 영역에 세 개 TextView가 겹쳐진 구조입니다. 버튼 클릭 시 동일한 onClick 메서드를 호출하게 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서 의도한 기능은 보통 버튼 클릭에 따라 특정 TextView만 보이도록 하여 내용이 전환되게 하는 것입니다. 하지만 현재 XML만 보았을 때 각 버튼과 TextView가 겹쳐서 모두 보이고, 버튼 안 크기가 모두 match_parent여서 한 줄에 다 담기 어려움과 크기 문제, 클릭 함수 연결은 되어 있지만 실제 동작 정의가 없는 상태입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;XML 태그별 핵심 포인트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LinearLayout (root)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 수직 배치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LinearLayout (내부)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 수평으로 버튼 3개 배치, 각 버튼이 width=match_parent라서 한 줄에 다 나오기 어렵고 겹침 발생&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Button&lt;/b&gt;: backgroundTint, onClick 속성으로 버튼 클릭 이벤트 연결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FrameLayout&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 겹치는 TextView 3개 배치 (각각 배경색과 텍스트 다름)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제안하는 개선점 및 구상&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;버튼을 가로로 동일 영역에 나눠 갖도록&lt;span&gt;&amp;nbsp;&lt;/span&gt;android:layout_width=&quot;0dp&quot;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;android:layout_weight=&quot;1&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성 주기 (한 줄에 3개 균등 분배)&lt;/li&gt;
&lt;li&gt;FrameLayout 내 TextView는 모두 겹쳐있으므로 기본적으로 첫 번째 텍스트만 보이게 나머지는&lt;span&gt;&amp;nbsp;&lt;/span&gt;android:visibility=&quot;gone&quot;으로 숨김 처리&lt;/li&gt;
&lt;li&gt;버튼 클릭 시 버튼별로 보일 TextView를 프래그먼트나 직접적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;findViewById&lt;span&gt;&amp;nbsp;&lt;/span&gt;후&lt;span&gt;&amp;nbsp;&lt;/span&gt;setVisibility로 전환 처리하는 onClick 메서드 구현 필요&lt;/li&gt;
&lt;li&gt;텍스트 색상이 지정되어 있지 않은 부분은 필요에 따라 명확하게 지정&lt;/li&gt;
&lt;li&gt;버튼의 높이&lt;span&gt;&amp;nbsp;&lt;/span&gt;match_parent보다는 적절한 dp값 또는 부모의 wrap_content 권장&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시로 간략히 수정한 버튼 부분 XML 일부&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;background-color: #e2e2e2; color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;xml&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;background-color: #000000; color: #eaeaea;&quot;&gt;&lt;code&gt;&amp;lt;LinearLayout
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:orientation=&quot;horizontal&quot; &amp;gt;

    &amp;lt;Button
        android:id=&quot;@+id/button1&quot;
        android:layout_width=&quot;0dp&quot;
        android:layout_weight=&quot;1&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:backgroundTint=&quot;#3F51b5&quot;
        android:text=&quot;지옥같은시간&quot;
        android:onClick=&quot;onClick&quot;/&amp;gt;

    &amp;lt;Button
        android:id=&quot;@+id/button2&quot;
        android:layout_width=&quot;0dp&quot;
        android:layout_weight=&quot;1&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:backgroundTint=&quot;#FF9800&quot;
        android:text=&quot;구멍이보이기시작&quot;
        android:onClick=&quot;onClick&quot; /&amp;gt;

    &amp;lt;Button
        android:id=&quot;@+id/button3&quot;
        android:layout_width=&quot;0dp&quot;
        android:layout_weight=&quot;1&quot;
        android:layout_height=&quot;wrap_content&quot;
        android:backgroundTint=&quot;#009688&quot;
        android:text=&quot;최종결전의날이다용사&quot;
        android:onClick=&quot;onClick&quot;/&amp;gt;
&amp;lt;/LinearLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;view1, view2, view3 초기 상태 예시 (view1만 보임, 나머지는 숨김)&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;background-color: #e2e2e2; color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;xml&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #000000; color: #eaeaea;&quot;&gt;&lt;code&gt;&amp;lt;TextView
    android:id=&quot;@+id/view1&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:background=&quot;#3F51B5&quot;
    android:text=&quot;@string/body01&quot;
    android:textColor=&quot;#92CD4D&quot;
    android:visibility=&quot;visible&quot; /&amp;gt;

&amp;lt;TextView
    android:id=&quot;@+id/view2&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:background=&quot;#FFC107&quot;
    android:text=&quot;@string/body02&quot;
    android:visibility=&quot;gone&quot;/&amp;gt;

&amp;lt;TextView
    android:id=&quot;@+id/view3&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:background=&quot;#4CAF50&quot;
    android:text=&quot;@string/body03&quot;
    android:textColor=&quot;#ff0000&quot;
    android:visibility=&quot;gone&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버튼 클릭 onClick 메서드 예시 (Kotlin 기준)&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;background-color: #e2e2e2; color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;kotlin&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #000000; color: #eaeaea;&quot;&gt;&lt;code&gt;fun onClick(view: View) {
    val view1 = findViewById&amp;lt;TextView&amp;gt;(R.id.view1)
    val view2 = findViewById&amp;lt;TextView&amp;gt;(R.id.view2)
    val view3 = findViewById&amp;lt;TextView&amp;gt;(R.id.view3)

    view1.visibility = View.GONE
    view2.visibility = View.GONE
    view3.visibility = View.GONE

    when(view.id) {
        R.id.button1 -&amp;gt; view1.visibility = View.VISIBLE
        R.id.button2 -&amp;gt; view2.visibility = View.VISIBLE
        R.id.button3 -&amp;gt; view3.visibility = View.VISIBLE
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조로 하면 버튼 클릭에 따라 화면 중앙의 텍스트 영역이 바뀌면서 각기 다른 배경색과 텍스트 내용을 보여줄 수 있어 사용자 경험도 부드럽고 명확해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요하면 버튼과 텍스트 뷰 간 간격, 패딩, 폰트 크기 등도 조절해보면 좋겠어요. 더 개선할 점이나 질문 있으면 편하게 알려줘~ㅎ&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;오후 4:34&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;오후 4:35&lt;/p&gt;
&lt;/div&gt;
&lt;pre class=&quot;livescript&quot; style=&quot;background-color: #f7f7f7; color: #262626;&quot; width=&quot;auto&quot;&gt;&lt;code&gt;&amp;lt;resources&amp;gt;
    &amp;lt;string name=&quot;app_name&quot;&amp;gt;FrameLayoutApplication&amp;lt;/string&amp;gt;
    &amp;lt;string name=&quot;body01&quot;&amp;gt;
        내 윈도우가 망가진지 벌써\n
        한달이 된것 같다\n
        나는 너무 걱정이 된다\n
        그래도 진전들이 계속보인다\n
        나도 용준이처럼 구멍이 보이기 시작했다\n
        용준아 날 위해 기도해주렴\n
        컴퓨터가 잘 고쳐지는 그날까지\n
        난 끝내 고치고 마리라\n

    &amp;lt;/string&amp;gt;
    &amp;lt;string name=&quot;body02&quot;&amp;gt;
        지금까지 물리적으로 망가졌다하면은\n
        이번에 망가진건 물리적인게 아니라\n
        너무나 억까이니라\n
        마이크로소프트를 원망할수밖에\n
        내가 다운그레이드를 연속으로\n
        2 번 3 번 해서 그런가\n
        system파일이 많이 아픈거 같다\n

    &amp;lt;/string&amp;gt;
    &amp;lt;string name=&quot;body03&quot;&amp;gt;
        오늘 결전의 날이다\n
        드디어 컴퓨터를 고칠수 있을거같다\n
        윈도우11의 흔적 하나도 남김없이\n
        delete you win11 youre 암호명\n
        다들 아점저 먹고 와요!\n

    &amp;lt;/string&amp;gt;
&amp;lt;/resources&amp;gt; 
strings.xml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-message-id=&quot;69f063362184e60dfe9026b3&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000; color: #262626;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div&gt;
&lt;p style=&quot;color: #656565;&quot; data-ke-size=&quot;size16&quot;&gt;레디언트&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 요청하신 것은 strings.xml에 들어갈 문자열 리소스 내용을 XML 형식으로 작성하는 것입니다. 주어진 내용을 그대로 잘 태그로 감싸서 XML 구조로 만들어야 해요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필요한 XML 태그&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최상위 루트로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;resources&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그가 있어야 합니다.&lt;/li&gt;
&lt;li&gt;각각의 문자열은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;string name=&quot;...&quot;&amp;gt; ... &amp;lt;/string&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;형태로 감싸야 합니다.&lt;/li&gt;
&lt;li&gt;내부 줄바꿈은&lt;span&gt;&amp;nbsp;&lt;/span&gt;\n으로 표시되어 있으니 그대로 넣어주면 됩니다.&lt;/li&gt;
&lt;li&gt;&amp;lt;string name=&quot;app_name&quot;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;항목처럼 앱 이름도 함께 포함되어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 답변 구조 및 내용&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;background-color: #e2e2e2; color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;xml&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;livescript&quot; style=&quot;background-color: #000000; color: #eaeaea;&quot;&gt;&lt;code&gt;&amp;lt;resources&amp;gt;
    &amp;lt;string name=&quot;app_name&quot;&amp;gt;FrameLayoutApplication&amp;lt;/string&amp;gt;
    &amp;lt;string name=&quot;body01&quot;&amp;gt;
내 윈도우가 망가진지 벌써\n
한달이 된것 같다\n
나는 너무 걱정이 된다\n
그래도 진전들이 계속보인다\n
나도 용준이처럼 구멍이 보이기 시작했다\n
용준아 날 위해 기도해주렴\n
컴퓨터가 잘 고쳐지는 그날까지\n
난 끝내 고치고 마리라\n
    &amp;lt;/string&amp;gt;
    &amp;lt;string name=&quot;body02&quot;&amp;gt;
지금까지 물리적으로 망가졌다하면은\n
이번에 망가진건 물리적인게 아니라\n
너무나 억까이니라\n
마이크로소프트를 원망할수밖에\n
내가 다운그레이드를 연속으로\n
2 번 3 번 해서 그런가\n
system파일이 많이 아픈거 같다\n
    &amp;lt;/string&amp;gt;
    &amp;lt;string name=&quot;body03&quot;&amp;gt;
오늘 결전의 날이다\n
드디어 컴퓨터를 고칠수 있을거같다\n
윈도우11의 흔적 하나도 남김없이\n
delete you win11 youre 암호명\n
다들 아점저 먹고 와요!\n
    &amp;lt;/string&amp;gt;
&amp;lt;/resources&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 XML 내부에 줄바꿈과 텍스트가 그대로 유지되어 앱에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;@string/body01&lt;span&gt;&amp;nbsp;&lt;/span&gt;등으로 호출했을 때 의도한 대로 텍스트가 표현됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #656565;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;레디언트&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 코드는 안드로이드 앱에서 버튼 클릭에 따라 세 개의 텍스트뷰 중 하나만 보이도록 처리하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;MainActivity&lt;span&gt;&amp;nbsp;&lt;/span&gt;클래스입니다. XML 레이아웃과 함께 동작하는 자바 코드라, 전반적인 역할과 흐름을 차근차근 설명할게.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 XML 태그와 연결점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;R.layout.activity_main&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 이 액티비티가 사용할 XML 레이아웃 리소스 (예: activity_main.xml)&lt;/li&gt;
&lt;li&gt;R.id.view1,&lt;span&gt;&amp;nbsp;&lt;/span&gt;R.id.view2,&lt;span&gt;&amp;nbsp;&lt;/span&gt;R.id.view3&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 각각 세 개의 TextView 아이디&lt;/li&gt;
&lt;li&gt;R.id.button1,&lt;span&gt;&amp;nbsp;&lt;/span&gt;R.id.button2,&lt;span&gt;&amp;nbsp;&lt;/span&gt;R.id.button3&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 각각 세 개의 버튼 아이디 (XML에 온클릭 이벤트 연결)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 흐름 핵심&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;onCreate()&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;액티비티가 만들어질 때 호출된다.&lt;/li&gt;
&lt;li&gt;setContentView(R.layout.activity_main)로 화면 레이아웃을 세팅한다.&lt;/li&gt;
&lt;li&gt;findViewById()로 레이아웃 안에 정의된 TextView 3개를 각 멤버변수(tv1, tv2, tv3)에 연결한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;onClick(View view)&lt;span&gt;&amp;nbsp;&lt;/span&gt;메서드:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 버튼에 사전 지정된 클릭 이벤트 핸들러로 연결되어 있다.&lt;/li&gt;
&lt;li&gt;클릭되면 먼저 세 TextView 모두를&lt;span&gt;&amp;nbsp;&lt;/span&gt;INVISIBLE&lt;span&gt;&amp;nbsp;&lt;/span&gt;상태로 숨긴다.&lt;/li&gt;
&lt;li&gt;클릭된 버튼 아이디를 확인해, 그에 맞는 TextView만&lt;span&gt;&amp;nbsp;&lt;/span&gt;VISIBLE&lt;span&gt;&amp;nbsp;&lt;/span&gt;상태로 다시 보이게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동작 결과&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화면에는 버튼 3개와 TextView 3개가 중첩되어 있다.&lt;/li&gt;
&lt;li&gt;사용자 클릭에 따라 각 버튼이 눌리면 대응하는 텍스트뷰만 보이며 다른 텍스트뷰는 숨겨진다.&lt;/li&gt;
&lt;li&gt;즉, 버튼 1 클릭 &amp;rarr; 첫 번째 텍스트뷰 보임&lt;/li&gt;
&lt;li&gt;버튼 2 클릭 &amp;rarr; 두 번째 텍스트뷰 보임&lt;/li&gt;
&lt;li&gt;버튼 3 클릭 &amp;rarr; 세 번째 텍스트뷰 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;덧붙임&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;View.INVISIBLE은 화면에서 안 보이지만 자리를 차지하며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;View.GONE은 완전히 사라져 레이아웃에 영향도 준다.&lt;/li&gt;
&lt;li&gt;본 코드에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;INVISIBLE&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용했기 때문에 자리가 유지된다.&lt;/li&gt;
&lt;li&gt;버튼과 텍스트뷰 크기 및 배치, 초기 보임 상태는 XML 레이아웃에서 설정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테이블레이아웃(TableLayout)은 안드로이드에서 위젯을 표(테이블) 형태로 배치할 때 사용하는 레이아웃이에요. 사용자가 위젯들을 행과 열로 깔끔하게 나누어 관리하고 싶을 때 아주 유용하답니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;테이블레이아웃의 핵심&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;행(Row)의 개수&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;태그의 개수와 같아요. 각&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;가 한 행(row)을 의미해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;열(Column)의 개수&lt;/b&gt;: 각&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;안에 들어있는 위젯(뷰)의 개수로 결정돼요. 예를 들어 3행 4열 짜리 테이블이라면 각&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;안에 4개의 위젯이 들어가 있어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주로 표 형태로 위젯을 구성&lt;/b&gt;할 때 쓰여서, 깔끔한 행과 열 구분이 필요할 때 좋죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;테이블레이아웃 속성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;layout_column&lt;br /&gt;특정 위젯을 테이블 내 지정한 열(column)에 배치하라는 의미입니다.&lt;br /&gt;예를 들어,&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_column=&quot;2&quot;는 그 위젯을 2번째 열에 위치시키려는 의도입니다.&lt;/li&gt;
&lt;li&gt;stretchColumns&lt;br /&gt;지정한 열의 폭을 늘려서 화면을 꽉 채우도록 하는 속성입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;stretchColumns=&quot;*&quot;&lt;br /&gt;모든 열의 폭을 고르게 늘려, 화면 가득 테이블을 채울 수 있어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;그림으로 구성 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이미지에서 보이는 것처럼,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3개의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;가 있어 행이 3개&lt;/li&gt;
&lt;li&gt;각&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;안에 위젯 4개씩 있으니 4열짜리 테이블이 되는 구조&lt;/li&gt;
&lt;li&gt;각 행은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;하나가 담당해서 그 안에 여러 위젯들이 들어가요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;요약하자면&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인트설명&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #262626; text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TableLayout&lt;/td&gt;
&lt;td&gt;위젯을 행과 열로 나눈 표 형태 배치에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TableRow&lt;/td&gt;
&lt;td&gt;행 하나, 각 행마다 포함된 위젯의 개수로 열 결정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_column&lt;/td&gt;
&lt;td&gt;위젯을 특정 열에 배치 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stretchColumns&lt;/td&gt;
&lt;td&gt;열의 폭을 늘려 화면 가득 채우도록 설정 (&quot;*&quot;는 모든 열)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #656565;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;레디언트&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블레이아웃 관련 속성과 예제 XML 코드를 설명해줄게.&lt;br /&gt;주어진 내용에는 테이블레이아웃의 중요한 속성인&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_span,&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_column,&lt;span&gt;&amp;nbsp;&lt;/span&gt;stretchColumns가 등장하고, 이걸 구현한 예제 XML 코드와 화면 배치 이미지도 있어.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 속성 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;layout_span&lt;/b&gt;&lt;br /&gt;여러 개의 열(셀)을 합쳐서 한 위젯을 크게 표시할 때 사용해.&lt;br /&gt;예를 들어, 한 버튼이 2칸 넓이(2열)를 차지하도록 할 수 있어.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;layout_column&lt;/b&gt;&lt;br /&gt;위젯을 특정 열 위치에 배치하도록 설정하는 속성이야.&lt;br /&gt;열 번호는 0부터 시작해서 몇 번째 열에 놓을지 정하는 거야.&lt;br /&gt;예를 들어&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_column=&quot;1&quot;이면 두 번째 열에 위치시킨다는 뜻.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stretchColumns&lt;/b&gt;&lt;br /&gt;&amp;lt;TableLayout&amp;gt;에 설정하는 속성으로, 지정한 열들의 폭을 화면에 맞게 늘려주는 역할을 해.&lt;br /&gt;이 값을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;*&quot;로 주면 모든 열이 균등하게 폭을 늘려서 화면을 꽉 채우게 만들어줘.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 예제 XML 코드 설명&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;div style=&quot;background-color: #e2e2e2; color: #262626;&quot;&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;p style=&quot;color: #8a8a8a;&quot; data-ke-size=&quot;size16&quot;&gt;xml&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;xml&quot; style=&quot;background-color: #000000; color: #eaeaea;&quot;&gt;&lt;code&gt;&amp;lt;TableLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&amp;gt;
    &amp;lt;TableRow&amp;gt;
        &amp;lt;Button android:text=&quot;1&quot; /&amp;gt;
        &amp;lt;Button android:layout_span=&quot;2&quot; android:text=&quot;2&quot; /&amp;gt;
        &amp;lt;Button android:text=&quot;3&quot; /&amp;gt;
    &amp;lt;/TableRow&amp;gt;

    &amp;lt;TableRow&amp;gt;
        &amp;lt;Button android:layout_column=&quot;1&quot; android:text=&quot;4&quot; /&amp;gt;
        &amp;lt;Button android:text=&quot;5&quot; /&amp;gt;
        &amp;lt;Button android:text=&quot;6&quot; /&amp;gt;
    &amp;lt;/TableRow&amp;gt;
&amp;lt;/TableLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #262626;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼 &quot;1&quot;은 첫 번째 열(0번 열)&lt;/li&gt;
&lt;li&gt;버튼 &quot;2&quot;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_span=&quot;2&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성으로 2열을 합쳐 넓게 차지함 (두 번째와 세 번째 열)&lt;/li&gt;
&lt;li&gt;버튼 &quot;3&quot;은 다음 열(실제로 3열이 되지만 span 때문에 위치가 밀릴 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;두 번째&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;TableRow&amp;gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼 &quot;4&quot;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_column=&quot;1&quot;로 두 번째 열에 위치&lt;/li&gt;
&lt;li&gt;버튼 &quot;5&quot;는 자동으로 다음 열에 위치 (세 번째 열)&lt;/li&gt;
&lt;li&gt;버튼 &quot;6&quot;은 다음 열에 위치 (네 번째 열)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 화면 구성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 행에는&lt;br /&gt;1 | 2(2열 합침) | 3&lt;/li&gt;
&lt;li&gt;두 번째 행에는&lt;br /&gt;(빈 공간) | 4 | 5 | 6&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 열 병합과 열 위치 지정이 가능해, 보다 자유로운 표 구성이 가능하지~&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
속성명역할참고
&lt;table style=&quot;text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;layout_span&lt;/td&gt;
&lt;td&gt;열 여러 개를 합쳐 하나의 위젯으로 표시&lt;/td&gt;
&lt;td&gt;버튼 넓이 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_column&lt;/td&gt;
&lt;td&gt;위젯을 특정 열에 위치시키기 (0부터 시작)&lt;/td&gt;
&lt;td&gt;열 위치 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stretchColumns&lt;/td&gt;
&lt;td&gt;테이블의 특정 열 폭을 늘려 화면 가득 채움&lt;/td&gt;
&lt;td&gt;균등 폭 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리드레이아웃(GridLayout)에 대해 설명할게! 테이블레이아웃과 비슷하게 위젯을 표 형태로 배치할 때 쓰는데, 좀 더 직관적이고 유연해서 Android 4.0 (API 14) 이상에서 지원해.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;그리드레이아웃(GridLayout)이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;표 형태로 위젯을 배치하는 레이아웃&lt;/b&gt;인데, 테이블레이아웃보다 직관적이라 복잡한 배치에 더 편리해&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행(Row)과 열(Column)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기준으로 위치를 지정 가능&lt;/li&gt;
&lt;li&gt;Android 4.0부터 지원되어 최신 버전에서 안정적으로 사용 가능&lt;/li&gt;
&lt;li&gt;특히 동적인 UI나 다양한 크기의 셀 배치에 유리해&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;그림 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행은&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_row&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성으로 지정하고,&lt;/li&gt;
&lt;li&gt;열은&lt;span&gt;&amp;nbsp;&lt;/span&gt;layout_column&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성으로 지정하는 방식을 사용해&lt;/li&gt;
&lt;li&gt;그림에서 3행 4열짜리 표에 각 위젯이 배치된 모습 보이지?&lt;/li&gt;
&lt;li&gt;(0,0)부터 시작해서 좌표로 쉽게 배치 가능하다 보면 돼&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;비교&lt;/h3&gt;
&lt;p&gt;특징TableLayoutGridLayout&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #262626; text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API 지원 버전&lt;/td&gt;
&lt;td&gt;초기부터 지원&lt;/td&gt;
&lt;td&gt;Android 4.0 (API 14)부터 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배치 방식&lt;/td&gt;
&lt;td&gt;&amp;lt;TableRow&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기준 행 단위&lt;/td&gt;
&lt;td&gt;행, 열 좌표 직접 지정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유연성&lt;/td&gt;
&lt;td&gt;비교적 덜 유연&lt;/td&gt;
&lt;td&gt;더 유연하고 직관적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사용 용도&lt;/td&gt;
&lt;td&gt;단순 표 형태 배치&lt;/td&gt;
&lt;td&gt;복잡한 그리드 레이아웃 디자인에 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리드레이아웃(GridLayout) 속성에 대해 정리해볼게!&lt;br /&gt;앞서 그리드레이아웃 개념을 알았으니까, 이번엔 그 안에서 자주 쓰이는 주요 속성들을 중심으로 쉽게 설명할게.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. GridLayout 자체에 자주 쓰이는 속성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;rowCount&lt;/b&gt;: 그리드의 행(가로 줄) 개수를 지정하는 속성이야.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;columnCount&lt;/b&gt;: 그리드의 열(세로 줄) 개수를 지정하는 속성이야.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Orientation&lt;/b&gt;: 그리드를 수평 방향(row 위주 배치)으로 할지, 수직 방향(column 위주 배치)으로 할지 정하는 속성이야.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어 수평 방향이면 한 행씩 먼저 채우고 다음 행으로 넘어가는 식이 돼.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. GridLayout 안에 포함되는 위젯에서 자주 쓰는 속성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;layout_row&lt;/b&gt;: 해당 위젯이 위치할 &amp;lsquo;행 번호&amp;rsquo;를 지정해. 행 번호는 0부터 시작!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;layout_column&lt;/b&gt;: 해당 위젯이 위치할 &amp;lsquo;열 번호&amp;rsquo;를 지정해. 열도 0부터 시작해.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;layout_rowSpan&lt;/b&gt;: 위젯이 차지할 행의 개수를 지정해. 예를 들어 2를 지정하면 2행을 합쳐서 사용한다는 뜻!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;layout_columnSpan&lt;/b&gt;: 위젯이 차지할 열의 개수를 지정하는 것으로, 복수 열을 합쳐서 큰 영역을 만들 때 쓴다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;layout_gravity&lt;/b&gt;: 위젯이 셀 안에서 어떻게 배치될지 정하는 속성.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예:&lt;span&gt;&amp;nbsp;&lt;/span&gt;fill,&lt;span&gt;&amp;nbsp;&lt;/span&gt;fill_vertical,&lt;span&gt;&amp;nbsp;&lt;/span&gt;fill_horizontal&lt;span&gt;&amp;nbsp;&lt;/span&gt;등으로 셀을 꽉 채우거나, 중앙 정렬, 왼쪽 정렬 등 다양하게 조절 가능해.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;요약 표&lt;/h3&gt;
&lt;p&gt;속성명설명비고&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #262626; text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rowCount&lt;/td&gt;
&lt;td&gt;그리드 행 개수 지정&lt;/td&gt;
&lt;td&gt;GridLayout 자체 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;columnCount&lt;/td&gt;
&lt;td&gt;그리드 열 개수 지정&lt;/td&gt;
&lt;td&gt;GridLayout 자체 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orientation&lt;/td&gt;
&lt;td&gt;배치 우선 방향 (수평 or 수직)&lt;/td&gt;
&lt;td&gt;GridLayout 자체 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_row&lt;/td&gt;
&lt;td&gt;위젯이 위치할 행 번호 (0부터 시작)&lt;/td&gt;
&lt;td&gt;포함 위젯 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_column&lt;/td&gt;
&lt;td&gt;위젯이 위치할 열 번호 (0부터 시작)&lt;/td&gt;
&lt;td&gt;포함 위젯 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_rowSpan&lt;/td&gt;
&lt;td&gt;위젯이 확장할 행 개수&lt;/td&gt;
&lt;td&gt;포함 위젯 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_columnSpan&lt;/td&gt;
&lt;td&gt;위젯이 확장할 열 개수&lt;/td&gt;
&lt;td&gt;포함 위젯 속성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;layout_gravity&lt;/td&gt;
&lt;td&gt;위젯의 셀 내 배치 방식 지정 (채우기 등)&lt;/td&gt;
&lt;td&gt;포함 위젯 속성, 레이아웃 조절&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프레임레이아웃(FrameLayout)에 대해 설명해줄게!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;프레임레이아웃(FrameLayout)이란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;레이아웃 내에 위젯들을 겹쳐서 출력&lt;/b&gt;하는 가장 단순한 형태의 레이아웃이야.&lt;/li&gt;
&lt;li&gt;화면 왼쪽 상단부터 쌓아 올리듯이 위젯들을 겹쳐서 배치해.&lt;/li&gt;
&lt;li&gt;보통 프레임레이아웃 단독으로 쓰기보다는 탭 위젯 같은 다른 UI와 함께 쓸 때 활용도가 높아.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;주요 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 위젯을 겹겹이 쌓아야 할 때 용이해&lt;/li&gt;
&lt;li&gt;화면에 겹쳐 보이기 때문에 각 위젯의 위치와 투명도 등을 잘 조절해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;프레임레이아웃 속성&lt;/h3&gt;
&lt;p&gt;속성명설명&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #262626; text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;foreground&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프레임레이아웃의 전경(앞면) 이미지 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;foregroundGravity&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;전경 이미지가 화면 내에서 어느 위치에 배치될지 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;그림 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지에서 보듯 프레임레이아웃은 여러 위젯이 왼쪽 상단부터 차곡차곡 쌓임.&lt;/li&gt;
&lt;li&gt;가장 위에 있는 위젯이 화면에 보이므로, 쌓인 순서에 따라 가려지기도 함.&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/74</guid>
      <comments>https://jong133.tistory.com/74#entry74comment</comments>
      <pubDate>Tue, 28 Apr 2026 16:41:05 +0900</pubDate>
    </item>
    <item>
      <title>202208026 iOS프로그래밍 7주차 수업과제</title>
      <link>https://jong133.tistory.com/71</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.38.06.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPEhye/dJMcaipvIO7/VPpyzhE8YD3QiEFgxmkCck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPEhye/dJMcaipvIO7/VPpyzhE8YD3QiEFgxmkCck/img.png&quot; data-alt=&quot;4개의 케이스가 있고 열거형으로 하나를 선택할수있다. 시험에 무조건 나옴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPEhye/dJMcaipvIO7/VPpyzhE8YD3QiEFgxmkCck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPEhye%2FdJMcaipvIO7%2FVPpyzhE8YD3QiEFgxmkCck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;612&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.38.06.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4개의 케이스가 있고 열거형으로 하나를 선택할수있다. 시험에 무조건 나옴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.38.48.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVGvN/dJMcageacJl/7FDRHAFsKsKkdUBVe3IWB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVGvN/dJMcageacJl/7FDRHAFsKsKkdUBVe3IWB1/img.png&quot; data-alt=&quot;열거형에서 .을 찍으면 그다음에는 열거형에 있는 4개의 case에 접근할수있다. 을 찍어서 접근할때 f라는 case가 4개라는 것이다. 이것도 시험엔아ㅗㅁ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVGvN/dJMcageacJl/7FDRHAFsKsKkdUBVe3IWB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVGvN%2FdJMcageacJl%2F7FDRHAFsKsKkdUBVe3IWB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;551&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.38.48.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;열거형에서 .을 찍으면 그다음에는 열거형에 있는 4개의 case에 접근할수있다. 을 찍어서 접근할때 f라는 case가 4개라는 것이다. 이것도 시험엔아ㅗㅁ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.44.27.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddQnjs/dJMcagrF3YV/rsUQ2zvEm3gSX7XY5aNuiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddQnjs/dJMcagrF3YV/rsUQ2zvEm3gSX7XY5aNuiK/img.png&quot; data-alt=&quot;열거형에서 rawvalue라는 것은 int값을 잡아주면 0부터 3까지 차례대로 증가한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddQnjs/dJMcagrF3YV/rsUQ2zvEm3gSX7XY5aNuiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddQnjs%2FdJMcagrF3YV%2FrsUQ2zvEm3gSX7XY5aNuiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;399&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.44.27.png&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;열거형에서 rawvalue라는 것은 int값을 잡아주면 0부터 3까지 차례대로 증가한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.46.44.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEd18Y/dJMcahxnqBZ/LnTbMECJtevFBmUDakx0w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEd18Y/dJMcahxnqBZ/LnTbMECJtevFBmUDakx0w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEd18Y/dJMcahxnqBZ/LnTbMECJtevFBmUDakx0w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEd18Y%2FdJMcahxnqBZ%2FLnTbMECJtevFBmUDakx0w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;582&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.46.44.png&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.49.18.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uMk47/dJMcaju9BDj/QHubLWnkgaV0E8gIT5S0o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uMk47/dJMcaju9BDj/QHubLWnkgaV0E8gIT5S0o0/img.png&quot; data-alt=&quot;주석처리하면 4월 30일이 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uMk47/dJMcaju9BDj/QHubLWnkgaV0E8gIT5S0o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuMk47%2FdJMcaju9BDj%2FQHubLWnkgaV0E8gIT5S0o0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1101&quot; height=&quot;504&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.49.18.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주석처리하면 4월 30일이 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.51.41.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PjHzL/dJMcahqBQT5/kRRDHeakfPs0KkaTQOwJ61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PjHzL/dJMcahqBQT5/kRRDHeakfPs0KkaTQOwJ61/img.png&quot; data-alt=&quot;옵셔널이니까 자료형을 안다고하면 optional을 열거형이름을 생략하고 .을 치면 결과가 똑같이 나온다. none과 some의 값을 기본적으로 받는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PjHzL/dJMcahqBQT5/kRRDHeakfPs0KkaTQOwJ61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPjHzL%2FdJMcahqBQT5%2FkRRDHeakfPs0KkaTQOwJ61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;236&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.51.41.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;옵셔널이니까 자료형을 안다고하면 optional을 열거형이름을 생략하고 .을 치면 결과가 똑같이 나온다. none과 some의 값을 기본적으로 받는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.54.08.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yWtbb/dJMcadPcEu1/ndQC1czMMDUrkjGeVnkLFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yWtbb/dJMcadPcEu1/ndQC1czMMDUrkjGeVnkLFK/img.png&quot; data-alt=&quot;이거는몰라도되지만&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yWtbb/dJMcadPcEu1/ndQC1czMMDUrkjGeVnkLFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyWtbb%2FdJMcadPcEu1%2FndQC1czMMDUrkjGeVnkLFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.54.08.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이거는몰라도되지만&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.54.22.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9k8VP/dJMcaiiI1wp/37nqZKjDpKNiFjiUycfJv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9k8VP/dJMcaiiI1wp/37nqZKjDpKNiFjiUycfJv1/img.png&quot; data-alt=&quot;이건 시험에 꼭 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9k8VP/dJMcaiiI1wp/37nqZKjDpKNiFjiUycfJv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9k8VP%2FdJMcaiiI1wp%2F37nqZKjDpKNiFjiUycfJv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;445&quot; data-filename=&quot;스크린샷 2026-04-20 오후 2.54.22.png&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이건 시험에 꼭 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.11.15.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A0tDF/dJMcaa55lQv/7DdU1zQcLkqX7UGQ18KAjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A0tDF/dJMcaa55lQv/7DdU1zQcLkqX7UGQ18KAjK/img.png&quot; data-alt=&quot;애플에서는 구조체를 굉장히 좋아하고 memberwise initializer가 자동으로 만들어진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A0tDF/dJMcaa55lQv/7DdU1zQcLkqX7UGQ18KAjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA0tDF%2FdJMcaa55lQv%2F7DdU1zQcLkqX7UGQ18KAjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1208&quot; height=&quot;676&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.11.15.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;애플에서는 구조체를 굉장히 좋아하고 memberwise initializer가 자동으로 만들어진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;struct를 사용하는 프로그래밍언어를 모두다 알려줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 3:08&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;struct를 지원하는 프로그래밍 언어&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;mcp-app-container-toolu_01Uum6SYMCbRNQ9fGrnsKbg9&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카드를 클릭하면 각 언어별 struct 코드 예제를 볼 수 있어요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언어별 struct 핵심 차이 요약:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;구분언어특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드 그대로 사용&lt;/td&gt;
&lt;td&gt;C, C++, C#, Swift, Rust, Go, Zig, V&lt;/td&gt;
&lt;td&gt;키워드 동일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struct 대신 다른 방식 사용&lt;/td&gt;
&lt;td&gt;Kotlin (data class), Python (@dataclass), TypeScript (interface), Scala (case class)&lt;/td&gt;
&lt;td&gt;키워드 다름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;class가 아예 없고 struct만 있음&lt;/td&gt;
&lt;td&gt;Go, Rust&lt;/td&gt;
&lt;td&gt;struct가 유일한 객체 표현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;값 타입 struct&lt;/td&gt;
&lt;td&gt;Swift, C, C++, C#, Rust, Go&lt;/td&gt;
&lt;td&gt;복사 시 독립적인 복사본 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;참조 타입 struct 대용&lt;/td&gt;
&lt;td&gt;Kotlin, Python, Scala&lt;/td&gt;
&lt;td&gt;복사 시 같은 객체를 가리킴&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;class&lt;span&gt;&amp;nbsp;&lt;/span&gt;대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct를 더 많이 쓰는 이유가 바로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;값 타입&lt;/b&gt;이라서 예상치 못한 데이터 변경을 막아주기 때문이에요!  ️&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.12.22.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JAp08/dJMcadhqkFO/SlrpbInnGxHiuIH6wPQMV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JAp08/dJMcadhqkFO/SlrpbInnGxHiuIH6wPQMV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JAp08/dJMcadhqkFO/SlrpbInnGxHiuIH6wPQMV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJAp08%2FdJMcadhqkFO%2FSlrpbInnGxHiuIH6wPQMV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.12.22.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.14.12.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uRJJO/dJMcahKUC6c/xcvkXp1DBQeqhH0hiPSR50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uRJJO/dJMcahKUC6c/xcvkXp1DBQeqhH0hiPSR50/img.png&quot; data-alt=&quot;프로퍼티의 초기값이라고 말한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uRJJO/dJMcahKUC6c/xcvkXp1DBQeqhH0hiPSR50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuRJJO%2FdJMcahKUC6c%2FxcvkXp1DBQeqhH0hiPSR50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;860&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.14.12.png&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로퍼티의 초기값이라고 말한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.19.12.png&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OYelh/dJMb99TCDYv/833627TuKGBKeavvQ1ZbqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OYelh/dJMb99TCDYv/833627TuKGBKeavvQ1ZbqK/img.png&quot; data-alt=&quot;class은 int을 지정해줘야된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OYelh/dJMb99TCDYv/833627TuKGBKeavvQ1ZbqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOYelh%2FdJMb99TCDYv%2F833627TuKGBKeavvQ1ZbqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;456&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.19.12.png&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;class은 int을 지정해줘야된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.19.59.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPnHZ1/dJMcac3RGc1/JAjnSLV0CKeEHLJPJMwjHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPnHZ1/dJMcac3RGc1/JAjnSLV0CKeEHLJPJMwjHk/img.png&quot; data-alt=&quot;struct는 에러가 안뜬다. 멤버롸이즈로 그 멤버들을 다 초기화 시켜주는 이니셜라이저를 자동으로 만들어준다. 어차피 구조체는 항상 얘내들을 접근해서 초기화하는게 원칙이여서,swift의 구조체에는 멤버라이즈이니셜라이저가 자동으로 만들어준다. 주석으로 해준 부분처럼 멤버라이즈 이니셜라이저라는 것은 멤버들의 값을 초기화할수있는 이니셜라이저이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPnHZ1/dJMcac3RGc1/JAjnSLV0CKeEHLJPJMwjHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPnHZ1%2FdJMcac3RGc1%2FJAjnSLV0CKeEHLJPJMwjHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;401&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.19.59.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;struct는 에러가 안뜬다. 멤버롸이즈로 그 멤버들을 다 초기화 시켜주는 이니셜라이저를 자동으로 만들어준다. 어차피 구조체는 항상 얘내들을 접근해서 초기화하는게 원칙이여서,swift의 구조체에는 멤버라이즈이니셜라이저가 자동으로 만들어준다. 주석으로 해준 부분처럼 멤버라이즈 이니셜라이저라는 것은 멤버들의 값을 초기화할수있는 이니셜라이저이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.26.29.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxD8HV/dJMcagZvbwh/pBdd9JdSTRoaiEXGVUAzB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxD8HV/dJMcagZvbwh/pBdd9JdSTRoaiEXGVUAzB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxD8HV/dJMcagZvbwh/pBdd9JdSTRoaiEXGVUAzB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxD8HV%2FdJMcagZvbwh%2FpBdd9JdSTRoaiEXGVUAzB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;380&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.26.29.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.28.40.png&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7qPGg/dJMcabDU1bW/hrmD8SwUIn6q2nR0ONcYBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7qPGg/dJMcabDU1bW/hrmD8SwUIn6q2nR0ONcYBk/img.png&quot; data-alt=&quot;인터뷰할때 class만 상속이되고 구조체는 상속이 될수 없다. 구조체는 멤버라이저이니셜라이저를 자동으로 만들어준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7qPGg/dJMcabDU1bW/hrmD8SwUIn6q2nR0ONcYBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7qPGg%2FdJMcabDU1bW%2FhrmD8SwUIn6q2nR0ONcYBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1197&quot; height=&quot;356&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.28.40.png&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인터뷰할때 class만 상속이되고 구조체는 상속이 될수 없다. 구조체는 멤버라이저이니셜라이저를 자동으로 만들어준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.31.45.png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOtcni/dJMcabjDRnw/H44K1HX4bHQfYtuV2bHU6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOtcni/dJMcabjDRnw/H44K1HX4bHQfYtuV2bHU6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOtcni/dJMcabjDRnw/H44K1HX4bHQfYtuV2bHU6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOtcni%2FdJMcabjDRnw%2FH44K1HX4bHQfYtuV2bHU6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1077&quot; height=&quot;364&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.31.45.png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.31.59.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2z6Sx/dJMcafsLAZg/RgPE6e2x6TeMMF9qRpdHWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2z6Sx/dJMcafsLAZg/RgPE6e2x6TeMMF9qRpdHWk/img.png&quot; data-alt=&quot;var x = 1 var y = x //처음에 초기값만정해진거고 값타입을 정해준것이다. 그다음에 x나 y에 넣는다고 위에 대칭으로 값이 똑같이 나오지 않는다, print(x,y) x = 2 print(x,y) y = 3 print(x,y)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2z6Sx/dJMcafsLAZg/RgPE6e2x6TeMMF9qRpdHWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2z6Sx%2FdJMcafsLAZg%2FRgPE6e2x6TeMMF9qRpdHWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.31.59.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;var x = 1 var y = x //처음에 초기값만정해진거고 값타입을 정해준것이다. 그다음에 x나 y에 넣는다고 위에 대칭으로 값이 똑같이 나오지 않는다, print(x,y) x = 2 print(x,y) y = 3 print(x,y)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;x와 y은 전혀 별개라는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.35.46.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2c4zf/dJMcafsLA8i/zQl6MqbxWCN1zpklafN2rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2c4zf/dJMcafsLA8i/zQl6MqbxWCN1zpklafN2rk/img.png&quot; data-alt=&quot;클래스로 바꾸면은 말도안되는 결과가 나오는데 우리가 지금 바꾼거는 구조체에서 클래스로 바꾼건데 프로그래밍언어에서 레퍼런스는 주소를 의미하고있고, 스트럭트는 값타입이라 처음값만 복사해주고 바이바이였는데 클래스가 레퍼런스라는 kim을 복사해주면 kim의 주소가 복사가 되는것이다. kim의 값이 아닌,&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2c4zf/dJMcafsLA8i/zQl6MqbxWCN1zpklafN2rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2c4zf%2FdJMcafsLA8i%2FzQl6MqbxWCN1zpklafN2rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;441&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.35.46.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스로 바꾸면은 말도안되는 결과가 나오는데 우리가 지금 바꾼거는 구조체에서 클래스로 바꾼건데 프로그래밍언어에서 레퍼런스는 주소를 의미하고있고, 스트럭트는 값타입이라 처음값만 복사해주고 바이바이였는데 클래스가 레퍼런스라는 kim을 복사해주면 kim의 주소가 복사가 되는것이다. kim의 값이 아닌,&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에서 왜 이런 결과가 나온지 이해가 안되서 그런데 설명해줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;오후 3:38&lt;/span&gt;
&lt;div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-state=&quot;closed&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1&gt;class는 참조 타입! 이게 핵심이에요&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 분석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;class Human {
    var age: Int = 1
}

var kim = Human()
var lee = kim    // ⚠️ 값 복사가 아니라 &quot;같은 객체를 가리킴&quot;!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 개념 &amp;mdash; 참조 타입 시각화&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;kim ──┐
      ├──&amp;rarr; [ Human 객체: age = 1 ]  &amp;larr; 메모리 어딘가에 딱 하나 존재
lee ──┘&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var lee = kim 은 &lt;b&gt;kim을 복사한 게 아니라&lt;/b&gt; &lt;b&gt;kim이 가리키는 곳을 lee도 같이 가리키게 된 것!&lt;/b&gt; 즉 kim과 lee는 &lt;b&gt;같은 객체를 공유&lt;/b&gt;해요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄씩 실행 추적&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var kim = Human()
var lee = kim
// kim &amp;rarr; [age: 1]
// lee &amp;rarr; [age: 1]  (같은 객체!)

print(kim.age, lee.age)
// 결과: 1 1  &amp;larr; 당연히 둘 다 같음


lee.age = 20
// lee를 통해 나이를 바꿨는데...
// kim과 lee가 같은 객체라서 kim.age도 바뀜!
//
// kim &amp;rarr; [age: 20]
// lee &amp;rarr; [age: 20]  (여전히 같은 객체!)

print(kim.age, lee.age)
// 결과: 20 20  &amp;larr; lee만 바꿨는데 kim도 20!


kim.age = 30
// 이번엔 kim을 통해 바꿔도 마찬가지
// kim &amp;rarr; [age: 30]
// lee &amp;rarr; [age: 30]  (같은 객체!)

print(kim.age, lee.age)
// 결과: 30 30&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;class vs struct 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ❌ class = 참조 타입 (같은 객체 공유)
class HumanClass {
    var age: Int = 1
}
var kim = HumanClass()
var lee = kim          // 같은 객체를 가리킴
lee.age = 20
print(kim.age)   // 20  &amp;larr; kim도 바뀜!!


// ✅ struct = 값 타입 (복사본 생성)
struct HumanStruct {
    var age: Int = 1
}
var kim2 = HumanStruct()
var lee2 = kim2        // 완전히 독립된 복사본 생성
lee2.age = 20
print(kim2.age)  // 1   &amp;larr; kim2는 그대로!!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메모리 구조로 이해하기&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;[ class 참조 타입 ]

kim  &amp;rarr;  주소: 0x001
lee  &amp;rarr;  주소: 0x001  &amp;larr; 같은 주소를 가리킴!

메모리 0x001: [ age: 1 &amp;rarr; 20 &amp;rarr; 30 ]
                         &amp;uarr;
              lee가 바꿔도 kim에 반영
              kim이 바꿔도 lee에 반영


[ struct 값 타입 ]

kim2  &amp;rarr;  [ age: 1 ]   &amp;larr; 독립된 공간
lee2  &amp;rarr;  [ age: 1 ]   &amp;larr; 독립된 복사본
                &amp;uarr;
         lee2를 바꿔도 kim2는 절대 안 바뀜!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄 요약&lt;/h2&gt;
&lt;div&gt;타입var lee = kimlee 변경 시
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;class (참조)&lt;/td&gt;
&lt;td&gt;같은 객체를 함께 가리킴&lt;/td&gt;
&lt;td&gt;kim도 같이 바뀜  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struct (값)&lt;/td&gt;
&lt;td&gt;독립된 복사본 생성&lt;/td&gt;
&lt;td&gt;kim은 그대로 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심:&lt;/b&gt; class는 변수에 &lt;b&gt;객체 자체&lt;/b&gt;가 담기는 게 아니라 &lt;b&gt;객체가 있는 주소&lt;/b&gt;가 담겨요. 그래서 lee = kim 하면 주소를 복사하는 거라 둘 다 &lt;b&gt;같은 객체&lt;/b&gt;를 건드리게 되는 거예요!&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23페이지에 있는 예제는 제외&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.44.18.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GtTY7/dJMcadoabpl/tpFUIf3kIR8z1s7AeHaGCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GtTY7/dJMcadoabpl/tpFUIf3kIR8z1s7AeHaGCk/img.png&quot; data-alt=&quot;1차적으로는 왠만한 구조체를 쓰고 상속해야되거나 공유해야되는 일이 있으면 구조체를 써야된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GtTY7/dJMcadoabpl/tpFUIf3kIR8z1s7AeHaGCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtTY7%2FdJMcadoabpl%2FtpFUIf3kIR8z1s7AeHaGCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;676&quot; data-filename=&quot;스크린샷 2026-04-20 오후 3.44.18.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차적으로는 왠만한 구조체를 쓰고 상속해야되거나 공유해야되는 일이 있으면 구조체를 써야된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS앱 개발에서 클래스와 구조체를 선택하는 기준이 머야?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 3:45&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;iOS 앱 개발 &amp;mdash; class vs struct 선택 기준&lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;핵심 차이 한 줄 요약&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;struct = 값 타입  &amp;rarr;  복사 시 독립적인 복사본
class  = 참조 타입 &amp;rarr;  복사 시 같은 객체 공유&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;struct를 선택하는 경우 ✅&lt;/h2&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;1. 단순한 데이터 묶음&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ 좌표, 크기, 색상 같은 단순 데이터
struct Point {
    var x: Double
    var y: Double
}

struct Size {
    var width: Double
    var height: Double
}

struct Color {
    var red: Double
    var green: Double
    var blue: Double
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;2. 데이터 모델 (서버에서 받아오는 JSON)&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ 서버 응답 데이터는 struct가 적합
struct User: Codable {
    let id: Int
    let name: String
    let email: String
}

struct Post: Codable {
    let title: String
    let content: String
    let author: User
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;3. SwiftUI 뷰 모델&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ SwiftUI는 struct 기반
struct ContentView: View {
    var body: some View {
        Text(&quot;안녕!&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;class를 선택하는 경우 ✅&lt;/h2&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;1. UIKit 뷰 / 뷰컨트롤러&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ UIKit은 class 기반
class MainViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

class CustomButton: UIButton {
    // UIButton 상속 &amp;rarr; 반드시 class!
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;2. 상속이 필요할 때&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ 상속 구조가 필요하면 class
class Animal {
    var name: String
    init(name: String) { self.name = name }
    func speak() { }
}

class Dog: Animal {
    override func speak() {
        print(&quot;\(name): 멍멍!&quot;)
    }
}

class Cat: Animal {
    override func speak() {
        print(&quot;\(name): 야옹!&quot;)
    }
}

// ❌ struct는 상속 불가!
struct Animal { }
struct Dog: Animal { }  // 컴파일 에러!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;3. 여러 곳에서 같은 객체를 공유해야 할 때&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ 앱 전체에서 하나만 존재해야 하는 것
class UserSession {
    static let shared = UserSession()  // 싱글톤
    var isLoggedIn: Bool = false
    var currentUser: User?
    private init() { }
}

// 어디서든 같은 객체 접근
UserSession.shared.isLoggedIn = true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;4. 생명주기 관리가 필요할 때&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ 네트워크, 데이터베이스 등 리소스 관리
class NetworkManager {
    private var session: URLSession
    
    init() {
        session = URLSession.shared
    }
    
    deinit {
        // 메모리 해제될 때 정리 작업
        print(&quot;NetworkManager 해제됨&quot;)
    }
    
    func fetchData(url: String) { }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;Apple 공식 권장 기준&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;crystal&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;다음 중 하나라도 해당하면 class 사용:

1. ☑️ Objective-C 코드와 함께 써야 할 때
2. ☑️ 상속이 필요할 때
3. ☑️ 참조를 공유해야 할 때
4. ☑️ deinit이 필요할 때

나머지는 전부 struct 사용! ✅&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;실전 iOS 프로젝트 예시&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ struct &amp;mdash; 데이터 모델
struct Product: Codable {
    let id: Int
    let name: String
    let price: Int
}

// ✅ struct &amp;mdash; UI 상태
struct CartState {
    var items: [Product] = []
    var totalPrice: Int {
        items.reduce(0) { $0 + $1.price }
    }
}

// ✅ class &amp;mdash; 뷰컨트롤러
class CartViewController: UIViewController {
    var state = CartState()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

// ✅ class &amp;mdash; 싱글톤 매니저
class CartManager {
    static let shared = CartManager()
    private var cart = CartState()
    private init() { }
    
    func addItem(_ product: Product) {
        cart.items.append(product)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;한눈에 비교 정리&lt;/h2&gt;
&lt;div&gt;기준structclass
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터 모델 (JSON 등)&lt;/td&gt;
&lt;td&gt;✅ 적합&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SwiftUI 뷰&lt;/td&gt;
&lt;td&gt;✅ 필수&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UIKit 뷰/뷰컨트롤러&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상속&lt;/td&gt;
&lt;td&gt;❌ 불가&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;싱글톤&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;데이터 공유&lt;/td&gt;
&lt;td&gt;❌ 복사됨&lt;/td&gt;
&lt;td&gt;✅ 공유됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;성능&lt;/td&gt;
&lt;td&gt;✅ 빠름 (스택)&lt;/td&gt;
&lt;td&gt;보통 (힙)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;멀티스레드 안전&lt;/td&gt;
&lt;td&gt;✅ 비교적 안전&lt;/td&gt;
&lt;td&gt;⚠️ 주의 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;결론:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SwiftUI&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;개발 &amp;rarr; struct 위주로 작성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UIKit&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;개발 &amp;rarr; UIViewController, UIView 등은 class 필수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 모델&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 거의 항상 struct&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공유&amp;middot;상속&amp;middot;UIKit&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; class&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르겠으면 일단&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;struct&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 만들고, 컴파일러가 class 쓰라고 하거나 상속이 필요해지면 그때 class로 바꾸면 돼요!  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/71</guid>
      <comments>https://jong133.tistory.com/71#entry71comment</comments>
      <pubDate>Mon, 20 Apr 2026 16:03:44 +0900</pubDate>
    </item>
    <item>
      <title>iOS프로그래밍 6주차 202208026이종윤</title>
      <link>https://jong133.tistory.com/70</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-13 오후 3.03.24.png&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be3vzc/dJMcadn4SFU/LOcCCSaFTP3LfDiUrcKBt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be3vzc/dJMcadn4SFU/LOcCCSaFTP3LfDiUrcKBt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be3vzc/dJMcadn4SFU/LOcCCSaFTP3LfDiUrcKBt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe3vzc%2FdJMcadn4SFU%2FLOcCCSaFTP3LfDiUrcKBt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;959&quot; data-filename=&quot;스크린샷 2026-04-13 오후 3.03.24.png&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;ViewController.swift&lt;br /&gt;//&amp;nbsp;&amp;nbsp;tableview&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;comsoft&amp;nbsp;on&amp;nbsp;2026/04/13.&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;UIKit&amp;nbsp;&amp;nbsp;//&amp;nbsp;UIKit&amp;nbsp;프레임워크&amp;nbsp;가져오기&amp;nbsp;(UI&amp;nbsp;구성&amp;nbsp;요소&amp;nbsp;사용을&amp;nbsp;위해&amp;nbsp;필수)&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;name&amp;nbsp;=&amp;nbsp;[&quot;학식&quot;,&quot;분식&quot;,&quot;짜장&quot;,&quot;왜안되&quot;,&quot;양고기&quot;]&amp;nbsp;&amp;nbsp;//&amp;nbsp;테이블&amp;nbsp;뷰&amp;nbsp;각&amp;nbsp;셀에&amp;nbsp;표시할&amp;nbsp;문자열&amp;nbsp;배열&amp;nbsp;(전역&amp;nbsp;변수)&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;ViewController&amp;nbsp;클래스&amp;nbsp;선언&lt;br /&gt;//&amp;nbsp;UIViewController를&amp;nbsp;상속하고,&amp;nbsp;UITableViewDelegate와&amp;nbsp;UITableViewDataSource&amp;nbsp;프로토콜을&amp;nbsp;채택&lt;br /&gt;class&amp;nbsp;ViewController:&amp;nbsp;UIViewController,&amp;nbsp;UITableViewDelegate,&amp;nbsp;UITableViewDataSource&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@IBOutlet&amp;nbsp;weak&amp;nbsp;var&amp;nbsp;Table:&amp;nbsp;UITableView!&amp;nbsp;&amp;nbsp;//&amp;nbsp;스토리보드에서&amp;nbsp;연결된&amp;nbsp;테이블&amp;nbsp;뷰&amp;nbsp;아울렛&amp;nbsp;(weak:&amp;nbsp;강한&amp;nbsp;순환&amp;nbsp;참조&amp;nbsp;방지)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;[필수&amp;nbsp;메서드]&amp;nbsp;각&amp;nbsp;섹션에&amp;nbsp;표시할&amp;nbsp;행(row)의&amp;nbsp;개수를&amp;nbsp;반환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;tableView(_&amp;nbsp;tableView:&amp;nbsp;UITableView,&amp;nbsp;numberOfRowsInSection&amp;nbsp;section:&amp;nbsp;Int)&amp;nbsp;-&amp;gt;&amp;nbsp;Int&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;5&amp;nbsp;&amp;nbsp;//&amp;nbsp;각&amp;nbsp;섹션마다&amp;nbsp;5개의&amp;nbsp;행을&amp;nbsp;표시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;[선택&amp;nbsp;메서드]&amp;nbsp;사용자가&amp;nbsp;특정&amp;nbsp;셀을&amp;nbsp;탭했을&amp;nbsp;때&amp;nbsp;호출&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;tableView(_&amp;nbsp;tableView:&amp;nbsp;UITableView,&amp;nbsp;didSelectRowAt&amp;nbsp;indexPath:&amp;nbsp;IndexPath)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(indexPath.description)&amp;nbsp;&amp;nbsp;//&amp;nbsp;선택된&amp;nbsp;셀의&amp;nbsp;섹션과&amp;nbsp;행&amp;nbsp;번호를&amp;nbsp;콘솔에&amp;nbsp;출력&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;[필수&amp;nbsp;메서드]&amp;nbsp;각&amp;nbsp;행(indexPath)에&amp;nbsp;표시할&amp;nbsp;셀을&amp;nbsp;구성하고&amp;nbsp;반환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;tableView(_&amp;nbsp;tableView:&amp;nbsp;UITableView,&amp;nbsp;cellForRowAt&amp;nbsp;indexPath:&amp;nbsp;IndexPath)&amp;nbsp;-&amp;gt;&amp;nbsp;UITableViewCell&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;재사용&amp;nbsp;큐에서&amp;nbsp;&quot;myCell&quot;&amp;nbsp;식별자를&amp;nbsp;가진&amp;nbsp;셀을&amp;nbsp;꺼내오고&amp;nbsp;MyTableViewCell&amp;nbsp;타입으로&amp;nbsp;강제&amp;nbsp;캐스팅&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;cell&amp;nbsp;=&amp;nbsp;tableView.dequeueReusableCell(withIdentifier:&amp;nbsp;&quot;myCell&quot;,&amp;nbsp;for:&amp;nbsp;indexPath)&amp;nbsp;as!&amp;nbsp;MyTableViewCell&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cell.MyLabel.text&amp;nbsp;=&amp;nbsp;name[indexPath.row]&amp;nbsp;&amp;nbsp;//&amp;nbsp;셀의&amp;nbsp;레이블에&amp;nbsp;name&amp;nbsp;배열의&amp;nbsp;값을&amp;nbsp;행&amp;nbsp;번호&amp;nbsp;기준으로&amp;nbsp;설정&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;⚠️&amp;nbsp;섹션이&amp;nbsp;7개이고&amp;nbsp;행이&amp;nbsp;5개이므로&amp;nbsp;총&amp;nbsp;35개&amp;nbsp;셀이&amp;nbsp;생성되지만&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name&amp;nbsp;배열은&amp;nbsp;5개뿐이라&amp;nbsp;indexPath.row(0~4)만&amp;nbsp;반복&amp;nbsp;사용됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(indexPath.row)&amp;nbsp;&amp;nbsp;//&amp;nbsp;현재&amp;nbsp;셀의&amp;nbsp;행&amp;nbsp;번호를&amp;nbsp;콘솔에&amp;nbsp;출력&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;cell&amp;nbsp;&amp;nbsp;//&amp;nbsp;구성된&amp;nbsp;셀&amp;nbsp;반환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;[선택&amp;nbsp;메서드]&amp;nbsp;테이블&amp;nbsp;뷰의&amp;nbsp;섹션(구역)&amp;nbsp;개수를&amp;nbsp;반환&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func&amp;nbsp;numberOfSections(in&amp;nbsp;tableView:&amp;nbsp;UITableView)&amp;nbsp;-&amp;gt;&amp;nbsp;Int&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;7&amp;nbsp;&amp;nbsp;//&amp;nbsp;테이블&amp;nbsp;뷰를&amp;nbsp;7개의&amp;nbsp;섹션으로&amp;nbsp;나눔&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;⚠️&amp;nbsp;섹션이&amp;nbsp;7개,&amp;nbsp;행이&amp;nbsp;5개이므로&amp;nbsp;name&amp;nbsp;배열(5개)과&amp;nbsp;행&amp;nbsp;수는&amp;nbsp;맞지만&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;섹션&amp;nbsp;구분&amp;nbsp;의미가&amp;nbsp;없는&amp;nbsp;상태&amp;nbsp;(모든&amp;nbsp;섹션이&amp;nbsp;동일하게&amp;nbsp;표시됨)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;뷰가&amp;nbsp;메모리에&amp;nbsp;로드된&amp;nbsp;직후&amp;nbsp;호출되는&amp;nbsp;생명주기&amp;nbsp;메서드&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;func&amp;nbsp;viewDidLoad()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.viewDidLoad()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;부모&amp;nbsp;클래스(UIViewController)의&amp;nbsp;viewDidLoad&amp;nbsp;먼저&amp;nbsp;실행&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Table.delegate&amp;nbsp;=&amp;nbsp;self&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;테이블&amp;nbsp;뷰의&amp;nbsp;delegate를&amp;nbsp;현재&amp;nbsp;ViewController로&amp;nbsp;지정&amp;nbsp;(이벤트&amp;nbsp;처리&amp;nbsp;담당)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Table.dataSource&amp;nbsp;=&amp;nbsp;self&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;테이블&amp;nbsp;뷰의&amp;nbsp;dataSource를&amp;nbsp;현재&amp;nbsp;ViewController로&amp;nbsp;지정&amp;nbsp;(데이터&amp;nbsp;제공&amp;nbsp;담당)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제내용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배열 범위 초과 위험&lt;/td&gt;
&lt;td&gt;name 배열은 5개인데 섹션이 7개 &amp;times; 행 5개 = 35셀 &amp;rarr; indexPath.row는 0~4라서 현재는 괜찮지만, 행 수가 5를 넘으면 &lt;b&gt;크래시&lt;/b&gt; 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;섹션 의미 없음&lt;/td&gt;
&lt;td&gt;7개 섹션이 모두 동일한 데이터를 보여줌 &amp;rarr; 섹션 헤더나 다른 데이터 분기가 없으면 의미 없는 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;return 5 하드코딩&lt;/td&gt;
&lt;td&gt;name.count로 바꾸면 배열 크기 변경 시 자동 반영되어 더 안전함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트의 옵셔널 체이닝을&amp;nbsp; 최대한 쉽게 12살에게 설명해줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 3:14&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;옵셔널 체이닝 쉽게 이해하기  &lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;먼저 &quot;옵셔널&quot;이 뭔지부터!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;친구한테&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;선물 상자&lt;/b&gt;를 받았다고 상상해봐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 상자 안에는...&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;선물이 있을 수도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;있고&lt;/li&gt;
&lt;li&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;아무것도 없을 수도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;있어 (빈 상자)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에서 옵셔널이 딱 이거야.&lt;/p&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;값이 있을 수도 있고, 없을 수도 있는 것&quot;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;dart&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var 학생이름: String? = &quot;민준&quot;
//                 &amp;uarr;
//        물음표 = &quot;있을 수도, 없을 수도!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이 이름을 그냥 쓰려고 하면...&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;print(학생이름.count)  // ❌ 오류!!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트가 이렇게 말해:&lt;/p&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;야, 그 안에 진짜 값이 있는지 없는지 확인도 안 하고 쓰면 어떡해!&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;옵셔널 체이닝 등장!&lt;span&gt;&amp;nbsp;&lt;/span&gt;?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상자를 열어보지 않고도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;있으면 써, 없으면 그냥 넘어가&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;하는 방법이야.&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;print(학생이름?.count)  // ✅ 물음표 하나로 해결!
//            &amp;uarr;
//   &quot;값이 있으면 .count 해줘,
//    없으면 그냥 nil(빈값) 줘&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;실생활 예시로 이해하기  &lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;dart&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;class 학교 {
    var 교장선생님: 선생님?  // 교장이 있을 수도, 없을 수도
}

class 선생님 {
    var 이름: String = &quot;김선생&quot;
    var 핸드폰: 핸드폰?     // 핸드폰이 있을 수도, 없을 수도
}

class 핸드폰 {
    var 번호: String = &quot;010-1234-5678&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교장선생님 핸드폰 번호를 알고 싶어!&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let 우리학교 = 학교()

//   옵셔널 체이닝 없이 하면 이렇게 복잡해:
if let 교장 = 우리학교.교장선생님 {
    if let 폰 = 교장.핸드폰 {
        print(폰.번호)
    }
}

//   옵셔널 체이닝 쓰면 한 줄로 끝!
print(우리학교.교장선생님?.핸드폰?.번호)
//                      &amp;uarr;         &amp;uarr;
//               &quot;교장 있어?&quot;  &quot;폰 있어?&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;체이닝이 뭔 뜻이냐면... ⛓️&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;체인(chain) = 쇠사슬&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이잖아.&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;우리학교 &amp;rarr; 교장선생님? &amp;rarr; 핸드폰? &amp;rarr; 번호
        ⛓️     &amp;zwj;     ⛓️       ⛓️   &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;?로 연결연결&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;하는 게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;옵셔널 체이닝&lt;/b&gt;이야!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;핵심 정리 ✅&lt;/h2&gt;
&lt;div&gt;상황결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;중간에 값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;있으면&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;쭉쭉 진행해서 최종 값 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중간에 값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;없으면&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;거기서 멈추고&lt;span&gt;&amp;nbsp;&lt;/span&gt;nil&lt;span&gt;&amp;nbsp;&lt;/span&gt;반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 교장선생님이 없는 경우
우리학교.교장선생님 = nil

print(우리학교.교장선생님?.핸드폰?.번호)
// 결과: nil  &amp;lt;- 교장이 없으니 거기서 그냥 멈춤!
// 오류가 나지 않아! 그냥 &quot;없어요~&quot; 하고 끝  &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;한 줄 요약:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵셔널 체이닝은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&quot;혹시 없을 수도 있는 것들을 안전하게 꺼내 쓰는 방법&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이야. 없으면 오류 대신 그냥&lt;span&gt;&amp;nbsp;&lt;/span&gt;nil을 돌려줘서 앱이 터지지 않아!  ️&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에서&amp;nbsp;옵셔널&amp;nbsp;체이닝을&amp;nbsp;사용하는&amp;nbsp;이유는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;###&amp;nbsp;1.&amp;nbsp;안전한&amp;nbsp;값&amp;nbsp;접근&amp;nbsp;&amp;nbsp;&lt;br /&gt;옵셔널&amp;nbsp;체이닝을&amp;nbsp;사용하면&amp;nbsp;옵셔널&amp;nbsp;값이&amp;nbsp;`nil`인지&amp;nbsp;매번&amp;nbsp;확인하지&amp;nbsp;않고도&amp;nbsp;해당&amp;nbsp;값의&amp;nbsp;속성이나&amp;nbsp;메서드에&amp;nbsp;안전하게&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;만약&amp;nbsp;중간에&amp;nbsp;옵셔널&amp;nbsp;값이&amp;nbsp;`nil`이라면,&amp;nbsp;전체&amp;nbsp;표현식이&amp;nbsp;자동으로&amp;nbsp;`nil`이&amp;nbsp;되어&amp;nbsp;런타임&amp;nbsp;오류&amp;nbsp;없이&amp;nbsp;안전하게&amp;nbsp;처리됩니다.&lt;br /&gt;&lt;br /&gt;###&amp;nbsp;2.&amp;nbsp;코드&amp;nbsp;간결성&amp;nbsp;및&amp;nbsp;가독성&amp;nbsp;향상&amp;nbsp;&amp;nbsp;&lt;br /&gt;일일이&amp;nbsp;옵셔널&amp;nbsp;바인딩(`if&amp;nbsp;let`&amp;nbsp;또는&amp;nbsp;`guard&amp;nbsp;let`)을&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;사용하는&amp;nbsp;대신,&amp;nbsp;`?.`&amp;nbsp;연산자를&amp;nbsp;연결하여&amp;nbsp;한&amp;nbsp;줄로&amp;nbsp;표현&amp;nbsp;가능하기&amp;nbsp;때문에&amp;nbsp;코드가&amp;nbsp;훨씬&amp;nbsp;간결해지고&amp;nbsp;읽기&amp;nbsp;쉬워집니다.&lt;br /&gt;&lt;br /&gt;###&amp;nbsp;3.&amp;nbsp;런타임&amp;nbsp;크래시&amp;nbsp;예방&amp;nbsp;&amp;nbsp;&lt;br /&gt;옵셔널&amp;nbsp;체이닝&amp;nbsp;없이&amp;nbsp;강제로&amp;nbsp;값을&amp;nbsp;추출하려&amp;nbsp;할&amp;nbsp;때&amp;nbsp;`nil`이면&amp;nbsp;앱이&amp;nbsp;크래시됩니다.&amp;nbsp;옵셔널&amp;nbsp;체이닝은&amp;nbsp;이러한&amp;nbsp;위험을&amp;nbsp;줄여주어&amp;nbsp;앱&amp;nbsp;안정성을&amp;nbsp;높여줍니다.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;###&amp;nbsp;요약&amp;nbsp;&amp;nbsp;&lt;br /&gt;옵셔널&amp;nbsp;체이닝은&amp;nbsp;옵셔널인&amp;nbsp;값&amp;nbsp;안에&amp;nbsp;있는&amp;nbsp;속성,&amp;nbsp;메서드,&amp;nbsp;서브스크립트에&amp;nbsp;안전하고&amp;nbsp;간단하게&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하여&amp;nbsp;코드를&amp;nbsp;깔끔하게&amp;nbsp;만들고&amp;nbsp;예외&amp;nbsp;상황&amp;nbsp;발생을&amp;nbsp;예방하는&amp;nbsp;중요한&amp;nbsp;문법입니다.&lt;br /&gt;&lt;br /&gt;필요하시면&amp;nbsp;예제&amp;nbsp;코드와&amp;nbsp;함께&amp;nbsp;더&amp;nbsp;자세히도&amp;nbsp;설명&amp;nbsp;가능하니&amp;nbsp;말씀해&amp;nbsp;주세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍언어에서 예외처리하는 방법을 표로 정리해줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 3:33&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;프로그래밍 언어별 예외처리 비교  ️&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;mcp-app-container-toolu_01WpjgYnisQFdHi4b6V2fTyY&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탭을 클릭하면 각 언어별 상세 설명과 코드 예제를 볼 수 있어요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 차이점 요약:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;finally&lt;span&gt;&amp;nbsp;&lt;/span&gt;없는 언어 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Swift&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;defer, **C++**는&lt;span&gt;&amp;nbsp;&lt;/span&gt;RAII 패턴으로 대체&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Python&lt;/b&gt;만&lt;span&gt;&amp;nbsp;&lt;/span&gt;except&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드 사용, 나머지는 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;catch&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Python&lt;/b&gt;만&lt;span&gt;&amp;nbsp;&lt;/span&gt;raise로 예외 던지기, 나머지는 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;throw&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Swift&lt;/b&gt;만 예외 던지는 함수에&lt;span&gt;&amp;nbsp;&lt;/span&gt;throws를 반드시 명시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kotlin&lt;/b&gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;try를 값처럼 쓸 수 있는 유일한 언어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java&lt;/b&gt;는 Checked / Unchecked 예외를 엄격하게 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍&amp;nbsp;언어의&amp;nbsp;예외처리&amp;nbsp;방법을&amp;nbsp;비교하는&amp;nbsp;표를&amp;nbsp;작성하기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;주요&amp;nbsp;요소는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;언어&amp;nbsp;이름&amp;nbsp;(예:&amp;nbsp;Swift,&amp;nbsp;Java,&amp;nbsp;Python&amp;nbsp;등)&amp;nbsp;&amp;nbsp;&lt;br /&gt;2.&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;구문&amp;nbsp;및&amp;nbsp;키워드&amp;nbsp;(try,&amp;nbsp;catch,&amp;nbsp;throw&amp;nbsp;등)&amp;nbsp;&amp;nbsp;&lt;br /&gt;3.&amp;nbsp;예외&amp;nbsp;던지기&amp;nbsp;방법&amp;nbsp;&amp;nbsp;&lt;br /&gt;4.&amp;nbsp;예외&amp;nbsp;잡기&amp;nbsp;및&amp;nbsp;처리&amp;nbsp;방법&amp;nbsp;&amp;nbsp;&lt;br /&gt;5.&amp;nbsp;특이사항&amp;nbsp;또는&amp;nbsp;특징&amp;nbsp;(예:&amp;nbsp;옵셔널과&amp;nbsp;연계,&amp;nbsp;checked/unchecked&amp;nbsp;예외&amp;nbsp;등)&lt;br /&gt;&lt;br /&gt;이제&amp;nbsp;위&amp;nbsp;내용을&amp;nbsp;바탕으로&amp;nbsp;한국어로&amp;nbsp;정중하고&amp;nbsp;간결한&amp;nbsp;설명과&amp;nbsp;함께&amp;nbsp;표를&amp;nbsp;만들어&amp;nbsp;드리겠습니다.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;|&amp;nbsp;프로그래밍&amp;nbsp;언어&amp;nbsp;|&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;구문&amp;nbsp;및&amp;nbsp;키워드&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;예외&amp;nbsp;던지기&amp;nbsp;방법&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;예외&amp;nbsp;잡기&amp;nbsp;및&amp;nbsp;처리&amp;nbsp;방법&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;특이사항&amp;nbsp;및&amp;nbsp;특징&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;|---|------------------------------|--------------------------|----------------------------|------------------------------------------|&lt;br /&gt;|&amp;nbsp;Swift&amp;nbsp;|&amp;nbsp;`do`,&amp;nbsp;`try`,&amp;nbsp;`catch`,&amp;nbsp;`throw`&amp;nbsp;|&amp;nbsp;`throw`&amp;nbsp;키워드&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`do`&amp;nbsp;블록&amp;nbsp;내&amp;nbsp;`try`&amp;nbsp;사용,&amp;nbsp;`catch`로&amp;nbsp;처리&amp;nbsp;|&amp;nbsp;`try?`&amp;nbsp;옵셔널&amp;nbsp;반환,&amp;nbsp;`try!`&amp;nbsp;강제&amp;nbsp;처리&amp;nbsp;가능&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;|&amp;nbsp;Java&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`,&amp;nbsp;`catch`,&amp;nbsp;`finally`,&amp;nbsp;`throw`,&amp;nbsp;`throws`&amp;nbsp;|&amp;nbsp;`throw`&amp;nbsp;키워드&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`&amp;nbsp;블록에&amp;nbsp;`catch`&amp;nbsp;및&amp;nbsp;`finally`&amp;nbsp;추가&amp;nbsp;|&amp;nbsp;Checked&amp;nbsp;예외와&amp;nbsp;Unchecked&amp;nbsp;예외&amp;nbsp;구분&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;|&amp;nbsp;Python&amp;nbsp;|&amp;nbsp;`try`,&amp;nbsp;`except`,&amp;nbsp;`finally`,&amp;nbsp;`raise`&amp;nbsp;&amp;nbsp;|&amp;nbsp;`raise`&amp;nbsp;키워드&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`&amp;nbsp;블록&amp;nbsp;내&amp;nbsp;`except`로&amp;nbsp;처리&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;다양한&amp;nbsp;예외&amp;nbsp;클래스,&amp;nbsp;다중&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;가능&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;|&amp;nbsp;C#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`,&amp;nbsp;`catch`,&amp;nbsp;`finally`,&amp;nbsp;`throw`&amp;nbsp;|&amp;nbsp;`throw`&amp;nbsp;키워드&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`&amp;nbsp;블록에&amp;nbsp;`catch`&amp;nbsp;및&amp;nbsp;`finally`&amp;nbsp;추가&amp;nbsp;|&amp;nbsp;LINQ&amp;nbsp;등과&amp;nbsp;연계된&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;지원&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;|&amp;nbsp;JavaScript&amp;nbsp;|&amp;nbsp;`try`,&amp;nbsp;`catch`,&amp;nbsp;`finally`,&amp;nbsp;`throw`&amp;nbsp;|&amp;nbsp;`throw`&amp;nbsp;키워드&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`&amp;nbsp;블록에서&amp;nbsp;`catch`로&amp;nbsp;처리&amp;nbsp;&amp;nbsp;|&amp;nbsp;비동기&amp;nbsp;처리시&amp;nbsp;`Promise`와&amp;nbsp;함께&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;|&amp;nbsp;Kotlin&amp;nbsp;|&amp;nbsp;`try`,&amp;nbsp;`catch`,&amp;nbsp;`finally`,&amp;nbsp;`throw`&amp;nbsp;|&amp;nbsp;`throw`&amp;nbsp;키워드&amp;nbsp;사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;`try`&amp;nbsp;블록&amp;nbsp;내&amp;nbsp;`catch`로&amp;nbsp;처리&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Checked&amp;nbsp;예외&amp;nbsp;없음,&amp;nbsp;간결한&amp;nbsp;구문&amp;nbsp;지원&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;###&amp;nbsp;간략&amp;nbsp;설명&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;대부분&amp;nbsp;언어가&amp;nbsp;`try`-`catch`&amp;nbsp;구조를&amp;nbsp;기본으로&amp;nbsp;하여&amp;nbsp;예외를&amp;nbsp;잡고&amp;nbsp;처리합니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;예외를&amp;nbsp;던질&amp;nbsp;때는&amp;nbsp;`throw`&amp;nbsp;혹은&amp;nbsp;`raise`&amp;nbsp;키워드를&amp;nbsp;쓰며,&amp;nbsp;처리하지&amp;nbsp;않는&amp;nbsp;예외는&amp;nbsp;상위&amp;nbsp;호출부로&amp;nbsp;전파합니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;Swift는&amp;nbsp;옵셔널과&amp;nbsp;연계된&amp;nbsp;`try?`&amp;nbsp;등&amp;nbsp;특이한&amp;nbsp;문법을&amp;nbsp;제공하여&amp;nbsp;예외&amp;nbsp;처리와&amp;nbsp;값&amp;nbsp;추출을&amp;nbsp;쉽게&amp;nbsp;합니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;Java는&amp;nbsp;Checked&amp;nbsp;예외(강제&amp;nbsp;처리&amp;nbsp;필요)와&amp;nbsp;Unchecked&amp;nbsp;예외를&amp;nbsp;구분해&amp;nbsp;예외&amp;nbsp;관리에&amp;nbsp;엄격함을&amp;nbsp;더합니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;Python은&amp;nbsp;문법이&amp;nbsp;간단하고&amp;nbsp;다양한&amp;nbsp;예외&amp;nbsp;타입과&amp;nbsp;다중&amp;nbsp;예외&amp;nbsp;처리를&amp;nbsp;지원합니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;-&amp;nbsp;JavaScript는&amp;nbsp;비동기&amp;nbsp;작업과&amp;nbsp;함께&amp;nbsp;예외&amp;nbsp;처리를&amp;nbsp;조합해&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;필요하시면&amp;nbsp;특정&amp;nbsp;언어별&amp;nbsp;자세한&amp;nbsp;예제도&amp;nbsp;함께&amp;nbsp;준비해&amp;nbsp;드릴&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 예외처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성요소키워드설명&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 처리 블록&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;try:&lt;/td&gt;
&lt;td&gt;예외 발생 가능한 코드 작성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 잡기&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;except 예외타입:&lt;/td&gt;
&lt;td&gt;특정 예외 처리, 여러 개 나열 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;성공 시 실행&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;else:&lt;/td&gt;
&lt;td&gt;예외 없이 성공했을 때만 실행 (선택)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;항상 실행&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;finally:&lt;/td&gt;
&lt;td&gt;예외 여부 관계없이 항상 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 던지기&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;raise&lt;/td&gt;
&lt;td&gt;예외 발생시키기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 정의&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;class ... (Exception)&lt;/td&gt;
&lt;td&gt;Exception 상속으로 커스텀 예외 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #141413; text-align: start;&quot;&gt;class 재고없음에러(Exception): pass def 음식만들기(재료): if not 재료: raise 재고없음에러(&quot;재료가 없어요!&quot;) return f&quot;{재료} 완성!&quot; try: 결과 = 음식만들기(&quot;파스타&quot;) except 재고없음에러 as e: print(f&quot;재고 오류: {e}&quot;) except Exception as e: print(f&quot;기타 오류: {e}&quot;) else: print(결과) # 성공했을 때만 실행 finally: print(&quot;항상 실행됨&quot;)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift 예외처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성요소키워드설명&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 정의&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;enum ... : Error&lt;/td&gt;
&lt;td&gt;Error 프로토콜을 채택한 열거형으로 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 던지기&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;throw&lt;/td&gt;
&lt;td&gt;함수 내에서 예외 발생시킴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;던지는 함수 선언&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;throws&lt;/td&gt;
&lt;td&gt;함수 시그니처에 반드시 명시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;예외 처리 블록&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;do { try } catch&lt;/td&gt;
&lt;td&gt;try 앞에 do 블록 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;정리 코드&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;defer&lt;/td&gt;
&lt;td&gt;finally 대신 사용, 블록 종료 시 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;강제 실행&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;try!&lt;/td&gt;
&lt;td&gt;예외 없다고 확신 시 사용 (없으면 크래시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #141413;&quot;&gt;옵셔널 변환&lt;/td&gt;
&lt;td style=&quot;color: #3d3d3a;&quot;&gt;try?&lt;/td&gt;
&lt;td&gt;실패 시 nil 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #141413; text-align: start;&quot;&gt;enum 음식에러: Error { case 재고없음 case 조리실패 } func 음식만들기(재료: String) throws -&amp;gt; String { if 재료 == &quot;&quot; { throw 음식에러.재고없음 } return &quot;\(재료) 완성!&quot; } do { let 결과 = try 음식만들기(재료: &quot;파스타&quot;) print(결과) } catch 음식에러.재고없음 { print(&quot;재료가 없어요&quot;) } catch { print(&quot;알 수 없는 오류: \(error)&quot;) }&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-13 오후 3.36.10.png&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cweZ30/dJMcagrAYja/TLr1OOQQAcUaptEU2RCGz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cweZ30/dJMcagrAYja/TLr1OOQQAcUaptEU2RCGz1/img.png&quot; data-alt=&quot;런타임 오류가 있을때 끝까지 버티는 프로그램을 만들기위한 방법이 에러핸들링, 리샙션 핸들링이라고 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cweZ30/dJMcagrAYja/TLr1OOQQAcUaptEU2RCGz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcweZ30%2FdJMcagrAYja%2FTLr1OOQQAcUaptEU2RCGz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1253&quot; height=&quot;696&quot; data-filename=&quot;스크린샷 2026-04-13 오후 3.36.10.png&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;런타임 오류가 있을때 끝까지 버티는 프로그램을 만들기위한 방법이 에러핸들링, 리샙션 핸들링이라고 한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: start;&quot; data-v-19155b9d=&quot;&quot; data-v-975f0fc2=&quot;&quot;&gt;
&lt;div data-v-975f0fc2=&quot;&quot;&gt;
&lt;div data-v-975f0fc2=&quot;&quot; data-v-19155b9d=&quot;&quot; data-v-38feae48=&quot;&quot;&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-38feae48=&quot;&quot;&gt;Class&lt;/span&gt;
&lt;h1 style=&quot;color: #1d1d1f;&quot; data-v-38feae48=&quot;&quot;&gt;&lt;span data-v-38feae48=&quot;&quot; data-v-19155b9d=&quot;&quot;&gt;AVAudioPlayer&lt;/span&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div data-v-975f0fc2=&quot;&quot; data-v-19155b9d=&quot;&quot; data-v-611b62f7=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;An object that plays audio data from a file or buffer.&lt;/div&gt;
&lt;div data-v-975f0fc2=&quot;&quot; data-v-19155b9d=&quot;&quot; data-v-46b6209d=&quot;&quot; data-v-d4791104=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;iOS 2.2+&lt;/span&gt;&lt;/span&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;iPadOS 2.2+&lt;/span&gt;&lt;/span&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;Mac Catalyst 13.1+&lt;/span&gt;&lt;/span&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;macOS 10.7+&lt;/span&gt;&lt;/span&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;tvOS 9.0+&lt;/span&gt;&lt;/span&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;visionOS 1.0+&lt;/span&gt;&lt;/span&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;&lt;span data-v-d4791104=&quot;&quot; data-v-46b6209d=&quot;&quot;&gt;watchOS 3.0+&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div data-v-975f0fc2=&quot;&quot; data-v-19155b9d=&quot;&quot;&gt;
&lt;div data-v-7a9fb639=&quot;&quot; data-v-ebf88138=&quot;&quot;&gt;
&lt;div data-v-ebf88138=&quot;&quot;&gt;
&lt;div data-v-ebf88138=&quot;&quot;&gt;
&lt;div data-v-ebf88138=&quot;&quot; data-v-223aca69=&quot;&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f5f5f7; color: #000000;&quot; data-v-223aca69=&quot;&quot; data-v-fee2098e=&quot;&quot;&gt;&lt;code&gt;class AVAudioPlayer&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: start;&quot; data-v-19155b9d=&quot;&quot;&gt;
&lt;div data-v-19155b9d=&quot;&quot;&gt;
&lt;div data-v-19155b9d=&quot;&quot;&gt;
&lt;div data-v-19155b9d=&quot;&quot; data-v-60225a94=&quot;&quot;&gt;
&lt;h2 id=&quot;mentions&quot; style=&quot;color: #1d1d1f;&quot; data-v-220404f1=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer#mentions&quot; data-after-text=&quot;in page link&quot; data-v-220404f1=&quot;&quot;&gt;Mentioned in&lt;/a&gt;&lt;/h2&gt;
&lt;div data-v-75610838=&quot;&quot;&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/routing-audio-to-specific-devices-in-multidevice-sessions&quot; data-v-75610838=&quot;&quot;&gt;
&lt;div data-v-75610838=&quot;&quot; data-v-2b4070b0=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
Routing audio to specific devices in multidevice sessions&lt;/a&gt;&lt;/div&gt;
&lt;div data-v-60225a94=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;
&lt;h2 id=&quot;overview&quot; style=&quot;color: #1d1d1f;&quot; data-v-220404f1=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer#overview&quot; data-after-text=&quot;in page link&quot; data-v-220404f1=&quot;&quot;&gt;Overview&lt;/a&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use an audio player to:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Play audio of any duration from a file or buffer&lt;/li&gt;
&lt;li&gt;Control the volume, panning, rate, and looping behavior of the played audio&lt;/li&gt;
&lt;li&gt;Access playback-level metering data&lt;/li&gt;
&lt;li&gt;Play multiple sounds simultaneously by synchronizing the playback of multiple players&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For more information about preparing your app to play audio, see&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/AVFoundation/configuring-your-app-for-media-playback&quot;&gt;Configuring your app for media playback&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #9e6700;&quot; data-v-e001ace6=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;Important&lt;/p&gt;
&lt;p data-v-e001ace6=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;For more advanced playback capabilities, like playing streaming or positional audio, use&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioengine&quot; data-v-e001ace6=&quot;&quot;&gt;AVAudioEngine&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;instead.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-v-68542180=&quot;&quot;&gt;
&lt;h2 id=&quot;topics&quot; style=&quot;color: #1d1d1f;&quot; data-v-68542180=&quot;&quot; data-v-220404f1=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer#topics&quot; data-after-text=&quot;in page link&quot; data-v-220404f1=&quot;&quot;&gt;Topics&lt;/a&gt;&lt;/h2&gt;
&lt;div data-v-68542180=&quot;&quot; data-v-bbeda56a=&quot;&quot; data-v-6420792f=&quot;&quot;&gt;
&lt;div data-v-6420792f=&quot;&quot;&gt;
&lt;h3 id=&quot;Creating-an-audio-player&quot; style=&quot;color: #1d1d1f;&quot; data-v-6420792f=&quot;&quot; data-v-220404f1=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer#Creating-an-audio-player&quot; data-after-text=&quot;in page link&quot; data-v-220404f1=&quot;&quot;&gt;Creating an audio player&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div data-v-6420792f=&quot;&quot;&gt;
&lt;div data-v-6420792f=&quot;&quot; data-v-bbeda56a=&quot;&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer/init(contentsof:)&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;init&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;(&lt;/span&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;contentsOf&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;URL&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;throws&lt;/span&gt;&lt;/a&gt;
&lt;div data-v-105d4a46=&quot;&quot;&gt;
&lt;div data-v-105d4a46=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;Creates a player to play audio from a file.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-v-6420792f=&quot;&quot; data-v-bbeda56a=&quot;&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer/init(contentsof:filetypehint:)&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;init&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;(&lt;/span&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;contentsOf&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;URL&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;fileTypeHint&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;?)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;throws&lt;/span&gt;&lt;/a&gt;
&lt;div data-v-105d4a46=&quot;&quot;&gt;
&lt;div data-v-105d4a46=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;Creates a player to play audio from a file of a particular type.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-v-6420792f=&quot;&quot; data-v-bbeda56a=&quot;&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer/init(data:)&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;init&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;(&lt;/span&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;throws&lt;/span&gt;&lt;/a&gt;
&lt;div data-v-105d4a46=&quot;&quot;&gt;
&lt;div data-v-105d4a46=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;Creates a player to play in-memory audio data.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-v-6420792f=&quot;&quot; data-v-bbeda56a=&quot;&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;a style=&quot;color: #0066cc;&quot; href=&quot;https://developer.apple.com/documentation/avfaudio/avaudioplayer/init(data:filetypehint:)&quot; data-v-105d4a46=&quot;&quot;&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;init&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;(&lt;/span&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span data-v-f1e1f964=&quot;&quot;&gt;fileTypeHint&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;?)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #6e6e73;&quot; data-v-f1e1f964=&quot;&quot;&gt;throws&lt;/span&gt;&lt;/a&gt;
&lt;div data-v-105d4a46=&quot;&quot;&gt;
&lt;div data-v-105d4a46=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;Creates a player to play in-memory audio data of a particular type.&lt;/div&gt;
&lt;div data-v-105d4a46=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;인스턴스 객체를 만들기 위해 위 4개중에 하나를 쓰는데 뒤에 무조건 throws 라는 키워드가 붙는다.&lt;/div&gt;
&lt;div data-v-105d4a46=&quot;&quot; data-v-15d7e6ba=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-v-68542180=&quot;&quot; data-v-bbeda56a=&quot;&quot; data-v-6420792f=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-13 오후 3.41.19.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coTH1J/dJMcagSGia4/bXTlkDh1E7rgDMaTFdxzR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coTH1J/dJMcagSGia4/bXTlkDh1E7rgDMaTFdxzR0/img.png&quot; data-alt=&quot;throws 앞에 화살표가 리턴값이 있으면 화살표뒤에 리턴형을 써준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coTH1J/dJMcagSGia4/bXTlkDh1E7rgDMaTFdxzR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoTH1J%2FdJMcagSGia4%2FbXTlkDh1E7rgDMaTFdxzR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1208&quot; height=&quot;686&quot; data-filename=&quot;스크린샷 2026-04-13 오후 3.41.19.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;throws 앞에 화살표가 리턴값이 있으면 화살표뒤에 리턴형을 써준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에서 do catch 블럭을 이용해서 예외처리를하는법을 알려줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 3:56&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;Swift do-catch 예외처리 완벽 가이드&lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;기본 구조&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;haxe&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;do {
    try 예외가_발생할_수_있는_함수()  // 실행 시도
} catch 특정에러 {
    // 특정 에러 처리
} catch {
    // 나머지 모든 에러 처리
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;Step 1 - 에러 타입 정의&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// Error 프로토콜을 채택한 열거형으로 에러 종류 정의
enum 주문에러: Error {
    case 재고없음
    case 결제실패
    case 배달불가(지역: String)  // 연관값으로 추가 정보 전달 가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;Step 2 - throws 함수 만들기&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// throws 키워드 = &quot;나는 에러를 던질 수 있어요!&quot; 선언
func 주문하기(메뉴: String, 재고: Int) throws -&amp;gt; String {
    
    if 재고 &amp;lt;= 0 {
        throw 주문에러.재고없음         // 에러 던지기
    }
    if 메뉴 == &quot;금지메뉴&quot; {
        throw 주문에러.결제실패         // 에러 던지기
    }
    
    return &quot;\(메뉴) 주문 완료!&quot;         // 성공 시 반환
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;Step 3 - do-catch로 처리하기&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;do {
    let 결과 = try 주문하기(메뉴: &quot;파스타&quot;, 재고: 5)
    print(결과)  // &quot;파스타 주문 완료!&quot;
    
} catch 주문에러.재고없음 {
    // 특정 에러만 잡기
    print(&quot;재고가 없습니다!&quot;)
    
} catch 주문에러.결제실패 {
    print(&quot;결제에 실패했습니다!&quot;)
    
} catch 주문에러.배달불가(let 지역) {
    // 연관값 꺼내기
    print(&quot;\(지역)은 배달이 안 돼요!&quot;)
    
} catch {
    // 위에서 못 잡은 나머지 모든 에러
    // 'error' 키워드로 에러 접근 가능
    print(&quot;알 수 없는 에러: \(error)&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;defer - finally 대신 쓰는 정리 코드&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func 파일열기() throws {
    defer {
        print(&quot;무조건 마지막에 실행!&quot;)  // 에러가 나도 항상 실행
        // 파일 닫기, 네트워크 연결 해제 등 정리 코드 여기에
    }
    
    // 에러가 발생해도 defer는 반드시 실행됨
    throw 주문에러.재고없음
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;try? - 에러를 nil로 변환&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 에러가 나면 nil 반환, 성공하면 Optional 값 반환
let 결과 = try? 주문하기(메뉴: &quot;파스타&quot;, 재고: 0)
print(결과)  // nil (에러 발생)

// if let 과 함께 자주 사용
if let 성공결과 = try? 주문하기(메뉴: &quot;파스타&quot;, 재고: 5) {
    print(성공결과)  // &quot;파스타 주문 완료!&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;try! - 강제 실행 (⚠️ 위험!)&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ceylon&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 에러가 절대 안 난다고 확신할 때만 사용
// 에러 발생 시 앱이 즉시 크래시!!
let 결과 = try! 주문하기(메뉴: &quot;파스타&quot;, 재고: 5)

// ❌ 이러면 앱 터짐!
let 위험 = try! 주문하기(메뉴: &quot;파스타&quot;, 재고: 0)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;실전 예제 - 전체 코드&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;import Foundation

// 1. 에러 정의
enum 로그인에러: Error {
    case 아이디없음
    case 비밀번호틀림
    case 계정잠김(남은시간: Int)
}

// 2. throws 함수
func 로그인(아이디: String, 비번: String) throws -&amp;gt; String {
    guard 아이디 == &quot;user123&quot; else {
        throw 로그인에러.아이디없음
    }
    guard 비번 == &quot;pass123&quot; else {
        throw 로그인에러.비밀번호틀림
    }
    return &quot;환영합니다, \(아이디)님!&quot;
}

// 3. do-catch 처리
do {
    let 메시지 = try 로그인(아이디: &quot;user123&quot;, 비번: &quot;틀린비번&quot;)
    print(메시지)
    
} catch 로그인에러.아이디없음 {
    print(&quot;존재하지 않는 아이디입니다&quot;)
    
} catch 로그인에러.비밀번호틀림 {
    print(&quot;비밀번호가 틀렸습니다&quot;)   // &amp;larr; 이게 출력됨
    
} catch 로그인에러.계정잠김(let 시간) {
    print(&quot;계정 잠김. \(시간)분 후 재시도하세요&quot;)
    
} catch {
    print(&quot;오류: \(error.localizedDescription)&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;한눈에 정리&lt;/h2&gt;
&lt;div&gt;방법문법에러 처리 방식사용 시기
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;do-catch&lt;/td&gt;
&lt;td&gt;do { try } catch { }&lt;/td&gt;
&lt;td&gt;직접 처리&lt;/td&gt;
&lt;td&gt;에러별로 다르게 처리할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;try?&lt;/td&gt;
&lt;td&gt;let x = try? func()&lt;/td&gt;
&lt;td&gt;nil 반환&lt;/td&gt;
&lt;td&gt;실패해도 괜찮을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;try!&lt;/td&gt;
&lt;td&gt;let x = try! func()&lt;/td&gt;
&lt;td&gt;앱 크래시&lt;/td&gt;
&lt;td&gt;100% 성공 확신할 때만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defer&lt;/td&gt;
&lt;td&gt;defer { }&lt;/td&gt;
&lt;td&gt;항상 실행&lt;/td&gt;
&lt;td&gt;자원 정리가 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;try!는 최대한 피하기 &amp;rarr; 앱이 터질 수 있어요!&lt;/li&gt;
&lt;li&gt;에러 종류가 많으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;enum으로 깔끔하게 정리하기&lt;/li&gt;
&lt;li&gt;defer는 함수 시작부분에 써두면 정리코드를 까먹지 않아요&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Call can throw, but it is not marked with 'try' and the error is not handled 이런 에러는 왜뜨니?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 3:58&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;&quot;Call can throw, but it is not marked with 'try'&quot; 에러&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 에러는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;throws&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 호출할 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;try를 안 붙였기 때문&lt;/b&gt;이에요!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;원인 한눈에 보기&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func 주문하기() throws -&amp;gt; String {
    throw 주문에러.재고없음
}

// ❌ 에러 발생!
let 결과 = 주문하기()
//         ~~~~~~~~
//   Call can throw, but it is not marked with 'try'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swift는 이렇게 말하는 거예요:&lt;/p&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 함수는 에러를 던질 수 있는데, 너&lt;span&gt;&amp;nbsp;&lt;/span&gt;try&lt;span&gt;&amp;nbsp;&lt;/span&gt;안 붙였잖아! 에러 처리는 어떻게 할 거야?&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;해결 방법 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1 - do-catch로 제대로 처리 ✅ (권장)&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;do {
    let 결과 = try 주문하기()  // try 붙이기
    print(결과)
} catch {
    print(&quot;에러 발생: \(error)&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2 - try? 로 nil 반환&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 에러나면 그냥 nil로 처리해도 될 때
let 결과 = try? 주문하기()
print(결과 ?? &quot;실패&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 3 - try! 강제 실행 ⚠️&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ceylon&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 절대 에러 안 난다고 100% 확신할 때만!
// 에러 나면 앱 즉시 크래시!
let 결과 = try! 주문하기()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;자주 하는 실수 패턴&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ❌ 실수 1 - do 없이 try만 씀
let 결과 = try 주문하기()  // do-catch 없으면 또 에러!

// ❌ 실수 2 - try 위치가 잘못됨
do {
    let 결과 = 주문하기()  // try를 깜빡!
} catch { }

// ✅ 올바른 방법
do {
    let 결과 = try 주문하기()  // do 안에 try!
} catch { }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;throws&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수 호출 = 반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;try&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;붙이기 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;do-catch&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 감싸기! Swift는 에러를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;무시하는 걸 절대 허용하지 않아요&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; ️&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[]은 배열 ,{} 블럭(어떤것의 시작과끝), () 함수의 매개변수를 나열할때 쓰는것,&amp;lt;&amp;gt; 제네릭&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[],{},(),&amp;lt;&amp;gt; 프로그래밍언어에서 각 괄호들의 용도를 설명해줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 4:01&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;mcp-app-container-toolu_014b28QQmWuXvKQpPWy5Gnya&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 괄호를 클릭하면 언어별 상세 용도와 코드 예제를 볼 수 있어요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심만 한 줄 요약:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ]&lt;span&gt;&amp;nbsp;&lt;/span&gt;대괄호 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;배열, 인덱스, 딕셔너리 접근&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;{ }&lt;span&gt;&amp;nbsp;&lt;/span&gt;중괄호 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;코드 블록, 객체, 클로저&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;( )&lt;span&gt;&amp;nbsp;&lt;/span&gt;소괄호 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;함수 호출, 매개변수, 연산 우선순위&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;lt; &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;꺽쇠괄호 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;제네릭, HTML 태그, 비교 연산자&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 괄호도 언어마다 역할이 조금씩 달라서, Swift 기준으로 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;[ ]는 배열과 딕셔너리 둘 다 쓰고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;{ }는 클로저에도 많이 쓰는 게 특징이에요!&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그래밍언어에서 꺽쇠괄호의 용도를 예를 들어 설명해줘&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 4:02&lt;/span&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;꺽쇠괄호&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;완벽 가이드&lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;1. 제네릭 (Generic) &amp;mdash; 가장 많이 쓰는 용도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제네릭 = &quot;어떤 타입이든 받을 수 있는 틀&quot;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ❌ 제네릭 없이 &amp;rarr; 타입마다 함수를 따로 만들어야 함
func 정수출력(값: Int)    { print(값) }
func 문자출력(값: String) { print(값) }
func 실수출력(값: Double) { print(값) }

// ✅ 제네릭 사용 &amp;rarr; 함수 하나로 모든 타입 처리!
func 출력&amp;lt;T&amp;gt;(값: T) {   // &amp;lt;T&amp;gt; = &quot;T 자리에 어떤 타입이든 와도 돼&quot;
    print(값)
}

출력(값: 123)       // T = Int
출력(값: &quot;안녕&quot;)    // T = String
출력(값: 3.14)      // T = Double&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;2. 컬렉션 타입 선언&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;haxe&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// Swift
var 숫자목록: Array&amp;lt;Int&amp;gt; = [1, 2, 3]      // [Int] 와 동일
var 이름목록: Array&amp;lt;String&amp;gt; = [&quot;민준&quot;]
var 딕셔너리: Dictionary&amp;lt;String, Int&amp;gt; = [&quot;나이&quot;: 20]
var 집합: Set&amp;lt;Int&amp;gt; = [1, 2, 3]

// Java / Kotlin
List&amp;lt;String&amp;gt; names = new ArrayList&amp;lt;&amp;gt;();
Map&amp;lt;String, Int&amp;gt; dict = new HashMap&amp;lt;&amp;gt;();

// TypeScript
let numbers: Array&amp;lt;number&amp;gt; = [1, 2, 3];&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;3. 제네릭 클래스 / 구조체&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 어떤 타입이든 담을 수 있는 상자
struct 상자&amp;lt;T&amp;gt; {
    var 내용물: T
    
    func 꺼내기() -&amp;gt; T {
        return 내용물
    }
}

let 정수상자 = 상자(내용물: 42)
let 문자상자 = 상자(내용물: &quot;선물&quot;)
let 배열상자 = 상자(내용물: [1, 2, 3])

print(정수상자.꺼내기())  // 42
print(문자상자.꺼내기())  // &quot;선물&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;4. 타입 제약 (where, :)&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// T는 아무 타입이나 안 되고, 숫자(Numeric)만 허용!
func 합계&amp;lt;T: Numeric&amp;gt;(배열: [T]) -&amp;gt; T {
    return 배열.reduce(0, +)
}

print(합계(배열: [1, 2, 3]))        // 6  (Int)
print(합계(배열: [1.1, 2.2, 3.3]))  // 6.6 (Double)
// print(합계(배열: [&quot;a&quot;, &quot;b&quot;]))    // ❌ 컴파일 에러! String은 Numeric이 아님&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;5. HTML / XML 태그&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;html&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;xml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;&amp;lt;!-- 여는 태그 &amp;lt;태그명&amp;gt;  닫는 태그 &amp;lt;/태그명&amp;gt; --&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;제목&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;문단&amp;lt;/p&amp;gt;
    &amp;lt;img src=&quot;사진.jpg&quot; /&amp;gt;   &amp;lt;!-- 단독 태그 --&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;6. C++ 템플릿 &amp;amp; 스트림&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;cpp&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;

// 템플릿 - Swift 제네릭과 같은 개념
template&amp;lt;typename T&amp;gt;
T 더하기(T a, T b) {
    return a + b;
}

더하기&amp;lt;int&amp;gt;(1, 2);       // &amp;rarr; 3
더하기&amp;lt;double&amp;gt;(1.1, 2.2); // &amp;rarr; 3.3

// &amp;lt;&amp;lt; &amp;gt;&amp;gt; 스트림 연산자 (꺽쇠 2개)
std::cout &amp;lt;&amp;lt; &quot;출력&quot; &amp;lt;&amp;lt; std::endl;  // 화면에 출력
std::cin &amp;gt;&amp;gt; 변수;                  // 입력 받기

// 컨테이너 타입
std::vector&amp;lt;int&amp;gt; v = {1, 2, 3};
std::map&amp;lt;std::string, int&amp;gt; m;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;7. 비교 연산자 (꺽쇠의 또 다른 얼굴)&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 꺽쇠는 괄호 역할도 하고, 비교 연산자 역할도 해요!
let a = 5
let b = 10

if a &amp;lt; b  { print(&quot;a가 더 작다&quot;) }   // 미만
if a &amp;gt; b  { print(&quot;a가 더 크다&quot;) }   // 초과
if a &amp;lt;= b { print(&quot;a가 이하&quot;)    }   // 이하
if a &amp;gt;= b { print(&quot;a가 이상&quot;)    }   // 이상&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;언어별 꺽쇠 용도 한눈에 보기&lt;/h2&gt;
&lt;div&gt;용도SwiftJava/KotlinC++TypeScriptHTML
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;제네릭&lt;/td&gt;
&lt;td&gt;Array&amp;lt;Int&amp;gt;&lt;/td&gt;
&lt;td&gt;List&amp;lt;String&amp;gt;&lt;/td&gt;
&lt;td&gt;vector&amp;lt;int&amp;gt;&lt;/td&gt;
&lt;td&gt;Array&amp;lt;number&amp;gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;템플릿&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;template&amp;lt;T&amp;gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML 태그&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&amp;lt;div&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비교 연산자&lt;/td&gt;
&lt;td&gt;a &amp;lt; b&lt;/td&gt;
&lt;td&gt;a &amp;lt; b&lt;/td&gt;
&lt;td&gt;a &amp;lt; b&lt;/td&gt;
&lt;td&gt;a &amp;lt; b&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;타입 단언&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&amp;lt;Type&amp;gt;값&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스트림&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;cout &amp;lt;&amp;lt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제네릭에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;T&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;T 자리에 어떤 타입이든 넣을 수 있어요&quot;&lt;/li&gt;
&lt;li&gt;HTML에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;태그&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;이 안에 있는 내용을 이렇게 표시해줘&quot;&lt;/li&gt;
&lt;li&gt;비교 연산자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;왼쪽이 더 작다 / 크다&quot;&lt;/li&gt;
&lt;li&gt;C++에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;데이터를 이쪽 방향으로 흘려보내&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;p style=&quot;color: #141413;&quot; data-ke-size=&quot;size16&quot;&gt;대괄호 &amp;mdash; Square Brackets&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size16&quot;&gt;배열, 인덱스, 딕셔너리 접근에 주로 사용&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #e1f5ee; color: #085041;&quot;&gt;Swift / Kotlin / Java&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;배열 선언 &amp;amp; 접근&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;var arr = [1, 2, 3] // 배열 리터럴 print(arr[0]) // 인덱스로 접근 &amp;rarr; 1&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #e1f5ee; color: #085041;&quot;&gt;Swift&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;딕셔너리 접근&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;var dict = [&quot;name&quot;: &quot;민준&quot;] print(dict[&quot;name&quot;]) // &amp;rarr; Optional(&quot;민준&quot;)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #e1f5ee; color: #085041;&quot;&gt;Python&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;리스트 / 슬라이싱&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;arr = [1, 2, 3, 4, 5] print(arr[1:3]) // &amp;rarr; [2, 3] 슬라이싱!&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #e1f5ee; color: #085041;&quot;&gt;JavaScript&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;배열 &amp;amp; 객체 동적 접근&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;const obj = { name: &quot;민준&quot; } const key = &quot;name&quot; console.log(obj[key]) // &amp;rarr; &quot;민준&quot; 동적 키 접근&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #e1f5ee; color: #085041;&quot;&gt;TypeScript&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;타입 선언&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;let numbers: number[] = [1, 2, 3] // 배열 타입&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #3c3489;&quot;&gt;{ }&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #141413;&quot; data-ke-size=&quot;size16&quot;&gt;중괄호 &amp;mdash; Curly Brackets&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size16&quot;&gt;코드 블록, 객체, 딕셔너리, 클로저에 사용&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #eeedfe; color: #3c3489;&quot;&gt;대부분의 언어&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;코드 블록&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;if (조건) { // 이 안이 코드 블록 } func 함수이름() { // 함수 본문 }&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #eeedfe; color: #3c3489;&quot;&gt;JavaScript / TypeScript&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;객체(Object) 리터럴&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;const person = { name: &quot;민준&quot;, age: 20 }&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #eeedfe; color: #3c3489;&quot;&gt;Python&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;딕셔너리 &amp;amp; 집합(set)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;dict = {&quot;name&quot;: &quot;민준&quot;, &quot;age&quot;: 20} // 딕셔너리 s = {1, 2, 3} // 집합(set)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #eeedfe; color: #3c3489;&quot;&gt;Swift / Kotlin&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;클로저(Closure)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;let 더하기 = { (a: Int, b: Int) -&amp;gt; Int in return a + b } // 후행 클로저 [1,2,3].map { $0 * 2 }&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #eeedfe; color: #3c3489;&quot;&gt;CSS / SCSS&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;스타일 선언 블록&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;.button { color: red; font-size: 14px; }&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;p style=&quot;color: #141413;&quot; data-ke-size=&quot;size16&quot;&gt;소괄호 &amp;mdash; Parentheses&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size16&quot;&gt;함수 호출, 매개변수, 연산 우선순위에 사용&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #faeeda; color: #633806;&quot;&gt;모든 언어&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;함수 호출 &amp;amp; 매개변수&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;print(&quot;안녕&quot;) // 함수 호출 func 더하기(a: Int, b: Int) { } // 매개변수 선언&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #faeeda; color: #633806;&quot;&gt;모든 언어&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;연산 우선순위&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;let 결과 = (2 + 3) * 4 // &amp;rarr; 20 let 결과2 = 2 + 3 * 4 // &amp;rarr; 14 (괄호 없으면 다름!)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #faeeda; color: #633806;&quot;&gt;Swift / Kotlin&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;튜플(Tuple)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;let 좌표 = (x: 10, y: 20) // 튜플 선언 print(좌표.x) // &amp;rarr; 10&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #faeeda; color: #633806;&quot;&gt;Python&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;튜플 &amp;amp; 제너레이터&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;t = (1, 2, 3) // 튜플 (변경 불가!) gen = (x*2 for x in t) // 제너레이터 표현식&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #faeeda; color: #633806;&quot;&gt;Swift&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;타입 캐스팅&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;let num = (someValue as? Int) ?? 0&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #faeeda; color: #633806;&quot;&gt;정규표현식&lt;/span&gt;&lt;span style=&quot;color: #141413;&quot;&gt;그룹 캡처&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;let pattern = &quot;(\\d+)-(\\d+)&quot; // 숫자 그룹 캡처&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #f5f4ed; color: #3d3d3a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;p style=&quot;color: #141413;&quot; data-ke-size=&quot;size16&quot;&gt;꺽쇠괄호 &amp;mdash; Angle Brackets&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size16&quot;&gt;제네릭, HTML 태그, 비교 연산자에 사용&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;div style=&quot;background-colo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var number : [Int] = [] var odd = [Int]() var even : Array = Array()&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 4:29&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;Swift 배열 선언 3가지 방법 분석&lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;코드 뜯어보기&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;zephir&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var number : [Int] = []
//      &amp;uarr;       &amp;uarr;     &amp;uarr;
//   변수명   타입선언  빈배열
//
// [Int] = &quot;Int 타입만 담는 배열&quot;
// []    = &quot;지금은 비어있어&quot;
// 가장 많이 쓰는 기본 방법 ✅


var odd = [Int]()
//    &amp;uarr;      &amp;uarr;  &amp;uarr;
//  변수명  타입  ()=생성자 호출
//
// [Int]() = &quot;Int 배열을 새로 만들어줘&quot;
// 타입 추론으로 odd의 타입이 [Int]로 자동 결정
// 두 번째로 자주 쓰는 방법 ✅


var even : Array&amp;lt;Int&amp;gt; = Array&amp;lt;Int&amp;gt;()
//              &amp;uarr;               &amp;uarr;
//         제네릭 문법!      생성자 호출
//
// Array&amp;lt;Int&amp;gt; = 위에서 배운 제네릭 클래스!
// Array = Swift 내장 제네릭 구조체
// [Int] 는 사실 Array&amp;lt;Int&amp;gt; 의 축약형&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;세 줄이 완전히 동일한 이유&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 이 세 줄은 100% 동일해요!
var number : [Int]        = []
var odd    : [Int]        = [Int]()
var even   : Array&amp;lt;Int&amp;gt;   = Array&amp;lt;Int&amp;gt;()

//  [Int]  ==  Array&amp;lt;Int&amp;gt;
//  &amp;uarr;           &amp;uarr;
//  축약형      원래 제네릭 형태
//  Swift가 [] 문법을 제공해서 짧게 쓸 수 있는 것!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;배열에 값 넣고 사용하기&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var number: [Int] = []
var odd   = [Int]()
var even  : Array&amp;lt;Int&amp;gt; = Array&amp;lt;Int&amp;gt;()

// 값 추가
number.append(1)
number.append(2)
number.append(3)   // [1, 2, 3]

odd  = [1, 3, 5, 7, 9]
even = [2, 4, 6, 8, 10]

// 접근
print(odd[0])          // 1
print(even.first!)     // 2
print(number.count)    // 3

// ❌ 타입이 다르면 에러!
number.append(&quot;안녕&quot;)  // 컴파일 에러!
//             &amp;uarr;
//   Int 배열에 String 넣으면 안됨!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;선언 방법 총정리&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// 방법 1 - 타입 명시 + 빈 배열
var a: [Int] = []

// 방법 2 - 타입 추론 + 초기값
var b = [1, 2, 3]          // [Int] 자동 추론

// 방법 3 - 생성자 호출
var c = [Int]()

// 방법 4 - 제네릭 원형
var d: Array&amp;lt;Int&amp;gt; = Array&amp;lt;Int&amp;gt;()

// 방법 5 - 초기값으로 채우기
var e = [Int](repeating: 0, count: 5)  // [0, 0, 0, 0, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;한눈에 비교&lt;/h2&gt;
&lt;div&gt;선언 방법코드특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;기본형&lt;/td&gt;
&lt;td&gt;var a: [Int] = []&lt;/td&gt;
&lt;td&gt;가장 많이 쓰는 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추론형&lt;/td&gt;
&lt;td&gt;var b = [1, 2, 3]&lt;/td&gt;
&lt;td&gt;초기값으로 타입 자동 결정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;생성자형&lt;/td&gt;
&lt;td&gt;var c = [Int]()&lt;/td&gt;
&lt;td&gt;생성자 호출 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제네릭 원형&lt;/td&gt;
&lt;td&gt;var d: Array&amp;lt;Int&amp;gt;&lt;/td&gt;
&lt;td&gt;[Int]의 원래 모습&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;반복 초기화&lt;/td&gt;
&lt;td&gt;[Int](repeating:count:)&lt;/td&gt;
&lt;td&gt;같은 값으로 n개 채우기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;핵심 포인트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[Int]는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Array&amp;lt;Int&amp;gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;축약형&lt;/b&gt;이에요&lt;/li&gt;
&lt;li&gt;아까 배운&lt;span&gt;&amp;nbsp;&lt;/span&gt;Box&amp;lt;T&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;Array&amp;lt;T&amp;gt;도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;제네릭 구조체&lt;/b&gt;예요&lt;/li&gt;
&lt;li&gt;Swift의&lt;span&gt;&amp;nbsp;&lt;/span&gt;Array,&lt;span&gt;&amp;nbsp;&lt;/span&gt;Dictionary,&lt;span&gt;&amp;nbsp;&lt;/span&gt;Set&lt;span&gt;&amp;nbsp;&lt;/span&gt;모두 내부적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;제네릭&lt;/b&gt;으로 만들어졌어요!  &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let number : [Int] = [] //빈 배열을 let으로 만들 수는 있지만 초기값에서 변경 불가이니 배열의 의미 없음 var odd = [Int]() var even : Array = Array() print(number) //[] print(number[0]) //오류, 빈 배열을 값을 넣은 다음에 접근 number.append(100) //let으로 선언한 불변형 배열이라 추가 불가능 //error: cannot use mutating member on immutable value: 'number' is a 'let' constant print(number[0]) number.append(200) print(number[0], number[1],number)  가변형(mutable)  var animal = [&quot;dog&quot;, &quot;cat&quot;,&quot;cow&quot;]  불변형 (immutable)  초기화 후 변경 불가  let animal1 = [&quot;dog&quot;, &quot;cat&quot;,&quot;cow&quot;]&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 4:32&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;Swift 배열&lt;span&gt;&amp;nbsp;&lt;/span&gt;var&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;let&lt;span&gt;&amp;nbsp;&lt;/span&gt;완벽 정리&lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;핵심 개념 먼저&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var = 변수 (Variable)  &amp;rarr; 변경 가능 ✅
let = 상수 (Constant) &amp;rarr; 변경 불가 ❌&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;코드 한 줄씩 분석&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;let number: [Int] = []
//  ^^^
//  let = 불변! 빈 배열로 고정됨
//  처음부터 [] 이고 영원히 [] 
//  배열인데 값을 못 넣으니 사실상 의미없음  

var odd = [Int]()         // 변경 가능한 빈 Int 배열
var even: Array&amp;lt;Int&amp;gt; = Array&amp;lt;Int&amp;gt;()  // 위와 동일


print(number)     // []  &amp;larr; 빈 배열 출력은 됨
print(number[0])  //   런타임 에러!!
//               &amp;uarr;
//  빈 배열에 인덱스 접근 &amp;rarr; 앱 크래시!
//  &quot;Index out of range&quot;


number.append(100)
//   컴파일 에러!!
// error: cannot use mutating member on
//        immutable value: 'number' is a 'let' constant
//  &amp;uarr;
//  let으로 선언한 배열은 append 자체가 불가능!
//  컴파일 단계에서 막아버림 (앱 실행도 안됨)


print(number[0])             // 위 에러 때문에 실행 안됨
number.append(200)           // 위 에러 때문에 실행 안됨
print(number[0], number[1], number)  // 위 에러 때문에 실행 안됨&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;var 배열 vs let 배열 비교&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ var - 가변형 (mutable)
var animal = [&quot;dog&quot;, &quot;cat&quot;, &quot;cow&quot;]

animal.append(&quot;bird&quot;)     // ✅ 추가 가능
animal.remove(at: 0)      // ✅ 삭제 가능
animal[0] = &quot;lion&quot;        // ✅ 수정 가능
print(animal)             // [&quot;lion&quot;, &quot;cat&quot;, &quot;bird&quot;]


// ❌ let - 불변형 (immutable)
let animal1 = [&quot;dog&quot;, &quot;cat&quot;, &quot;cow&quot;]

animal1.append(&quot;bird&quot;)    // ❌ 컴파일 에러!
animal1.remove(at: 0)     // ❌ 컴파일 에러!
animal1[0] = &quot;lion&quot;       // ❌ 컴파일 에러!
print(animal1)            // ✅ 읽기는 가능
print(animal1[0])         // ✅ &quot;dog&quot;  읽기는 가능&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;에러 종류 2가지 구분&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;//   컴파일 에러 - 아예 실행조차 안됨
let nums = [1, 2, 3]
nums.append(4)
// error: cannot use mutating member on immutable value
// &amp;uarr; 코드 작성 중에 Xcode가 빨간줄로 바로 알려줌


//   런타임 에러 - 실행은 되지만 도중에 터짐
var empty = [Int]()
print(empty[0])
// Fatal error: Index out of range
// &amp;uarr; 앱 실행 중에 갑자기 크래시 발생!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;안전하게 배열 접근하는 방법&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var animal = [&quot;dog&quot;, &quot;cat&quot;, &quot;cow&quot;]

// ❌ 위험한 방법
print(animal[5])   // 크래시!!

// ✅ 안전한 방법 1 - 범위 체크
if animal.count &amp;gt; 5 {
    print(animal[5])
}

// ✅ 안전한 방법 2 - first, last 사용
print(animal.first ?? &quot;없음&quot;)   // &quot;dog&quot;
print(animal.last  ?? &quot;없음&quot;)   // &quot;cow&quot;

// ✅ 안전한 방법 3 - 옵셔널 확장 (커스텀)
// 인덱스가 범위 밖이면 nil 반환
extension Array {
    subscript(safe index: Int) -&amp;gt; Element? {
        return indices.contains(index) ? self[index] : nil
    }
}
print(animal[safe: 5] ?? &quot;없음&quot;)  // &quot;없음&quot;  크래시 없음!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;전체 정리&lt;/h2&gt;
&lt;div&gt;구분var&amp;nbsp;배열let&amp;nbsp;배열
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;선언&lt;/td&gt;
&lt;td&gt;var arr = [1,2,3]&lt;/td&gt;
&lt;td&gt;let arr = [1,2,3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;읽기&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추가&lt;span&gt;&amp;nbsp;&lt;/span&gt;append&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;td&gt;❌ 컴파일 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;삭제&lt;span&gt;&amp;nbsp;&lt;/span&gt;remove&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;td&gt;❌ 컴파일 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수정&lt;span&gt;&amp;nbsp;&lt;/span&gt;arr[0]=&lt;/td&gt;
&lt;td&gt;✅ 가능&lt;/td&gt;
&lt;td&gt;❌ 컴파일 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빈 배열 접근&lt;/td&gt;
&lt;td&gt;  런타임 에러&lt;/td&gt;
&lt;td&gt;  런타임 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변경이 필요없는 배열은&lt;span&gt;&amp;nbsp;&lt;/span&gt;let으로 선언 &amp;rarr; 실수로 수정하는 걸 컴파일러가 막아줌&lt;/li&gt;
&lt;li&gt;배열 접근 전엔 항상&lt;span&gt;&amp;nbsp;&lt;/span&gt;isEmpty&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;count&lt;span&gt;&amp;nbsp;&lt;/span&gt;확인하는 습관 들이기&lt;/li&gt;
&lt;li&gt;first,&lt;span&gt;&amp;nbsp;&lt;/span&gt;last&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 빈 배열이면&lt;span&gt;&amp;nbsp;&lt;/span&gt;nil&lt;span&gt;&amp;nbsp;&lt;/span&gt;반환이라 안전해요  ️&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-13 오후 4.33.37.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsBgYo/dJMcahYleQ8/GFuoeUfHlczf8CIbGwB6rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsBgYo/dJMcahYleQ8/GFuoeUfHlczf8CIbGwB6rK/img.png&quot; data-alt=&quot;빈배열은 어팬드도 하지 않은 상태에서 값을 접근하면 값이 없다고 에러가 뜬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsBgYo/dJMcahYleQ8/GFuoeUfHlczf8CIbGwB6rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsBgYo%2FdJMcahYleQ8%2FGFuoeUfHlczf8CIbGwB6rK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;442&quot; data-filename=&quot;스크린샷 2026-04-13 오후 4.33.37.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;빈배열은 어팬드도 하지 않은 상태에서 값을 접근하면 값이 없다고 에러가 뜬다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;2&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #efeeeb; color: #121212;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-testid=&quot;user-message&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var num = [1, 2, 3, 4] print(num[0], num[3]) print(num.first!) for i in 0...num.count-1{ print(num[i]) } print(num[1...2]) num[0...2] = [10,20,30] print(num)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;
&lt;div style=&quot;color: #373734;&quot;&gt;&lt;span style=&quot;color: #7b7974;&quot; data-state=&quot;closed&quot;&gt;오후 4:38&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f8f6; color: #121212; text-align: start;&quot; data-test-render-count=&quot;1&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-is-streaming=&quot;false&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 style=&quot;color: #121212;&quot;&gt;Swift 배열 순회 &amp;amp; 슬라이싱 코드 분석&lt;/h1&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;한 줄씩 완전 분석&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;dart&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var num = [1, 2, 3, 4]
//  인덱스:  0  1  2  3
//  배열 생성, 타입 추론으로 [Int] 자동 결정


print(num[0], num[3])
//    num[0] = 1 (첫 번째)
//    num[3] = 4 (마지막)
//    출력: 1 4


print(num.first!)
//         &amp;uarr;
//   first = Optional(1) 을 반환
//   !     = 강제 언래핑 &amp;rarr; 1
//   빈 배열이면 ! 때문에   크래시!
//   출력: 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;for 반복문 분석&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;for i in 0...num.count-1 {
    print(num[i])
}
// 0...num.count-1
//     num.count = 4
//     4 - 1     = 3
//     0...3     = 0, 1, 2, 3
//
// i = 0 &amp;rarr; num[0] = 1
// i = 1 &amp;rarr; num[1] = 2
// i = 2 &amp;rarr; num[2] = 3
// i = 3 &amp;rarr; num[3] = 4
//
// 출력:
// 1
// 2
// 3
// 4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #121212;&quot; data-ke-size=&quot;size23&quot;&gt;⚠️ 더 안전한 for문 작성법&lt;/h3&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;dart&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ❌ 위험 - num이 빈 배열이면 0...(-1) 크래시!
for i in 0...num.count-1 { }

// ✅ 안전 방법 1 - indices 사용
for i in num.indices {
    print(num[i])
}

// ✅ 안전 방법 2 - 직접 순회 (가장 Swift다운 방법)
for n in num {
    print(n)
}

// ✅ 안전 방법 3 - 인덱스도 필요할 때
for (index, value) in num.enumerated() {
    print(&quot;\(index)번째: \(value)&quot;)
}
// 0번째: 1
// 1번째: 2
// 2번째: 3
// 3번째: 4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;슬라이싱 분석&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;print(num[1...2])
//        ^^^^^
//   1...2 = 인덱스 1부터 2까지
//   num[1] = 2
//   num[2] = 3
//   출력: [2, 3]
//
//   ⚠️ 결과 타입은 Array가 아니라
//      ArraySlice&amp;lt;Int&amp;gt; 임!
//      원본 배열의 일부를 &quot;참조&quot;하는 방식


num[0...2] = [10, 20, 30]
//  ^^^^^    ^^^^^^^^^^^^
//  인덱스 0~2 범위를   새 값으로 교체
//
//  전: [1,  2,  3,  4]
//       &amp;uarr;   &amp;uarr;   &amp;uarr;
//      [10, 20, 30]  으로 교체
//  후: [10, 20, 30, 4]
//                   &amp;uarr;
//              3번 인덱스는 그대로!

print(num)  // [10, 20, 30, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;범위 연산자 종류&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;color: #7b7974;&quot;&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var num = [1, 2, 3, 4, 5]

print(num[1...3])   // [2, 3, 4]  1이상 3이하 (닫힌 범위)
print(num[1..&amp;lt;3])   // [2, 3]     1이상 3미만 (반열린 범위)
print(num[2...])    // [3, 4, 5]  2부터 끝까지
print(num[...2])    // [1, 2, 3]  처음부터 2까지&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;전체 실행 결과&lt;/h2&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var num = [1, 2, 3, 4]

print(num[0], num[3])   &amp;rarr; 1 4
print(num.first!)       &amp;rarr; 1

for i in 0...num.count-1
    print(num[i])       &amp;rarr; 1
                           2
                           3
                           4

print(num[1...2])       &amp;rarr; [2, 3]

num[0...2] = [10,20,30]
print(num)              &amp;rarr; [10, 20, 30, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #121212;&quot; data-ke-size=&quot;size26&quot;&gt;배열 접근 방법 총정리&lt;/h2&gt;
&lt;div&gt;방법코드결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;인덱스 접근&lt;/td&gt;
&lt;td&gt;num[0]&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;첫 번째 (안전)&lt;/td&gt;
&lt;td&gt;num.first&lt;/td&gt;
&lt;td&gt;Optional(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;첫 번째 (강제)&lt;/td&gt;
&lt;td&gt;num.first!&lt;/td&gt;
&lt;td&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;(빈배열이면 크래시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마지막 (안전)&lt;/td&gt;
&lt;td&gt;num.last&lt;/td&gt;
&lt;td&gt;Optional(4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;닫힌 범위 슬라이싱&lt;/td&gt;
&lt;td&gt;num[1...2]&lt;/td&gt;
&lt;td&gt;[2, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;반열린 범위 슬라이싱&lt;/td&gt;
&lt;td&gt;num[1..&amp;lt;2]&lt;/td&gt;
&lt;td&gt;[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;범위 치환&lt;/td&gt;
&lt;td&gt;num[0...2] = [10,20,30]&lt;/td&gt;
&lt;td&gt;해당 범위 교체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전체 순회&lt;/td&gt;
&lt;td&gt;for n in num&lt;/td&gt;
&lt;td&gt;가장 Swift다운 방법 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #373734;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;핵심 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;first,&lt;span&gt;&amp;nbsp;&lt;/span&gt;last&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 옵셔널 반환 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;!&lt;span&gt;&amp;nbsp;&lt;/span&gt;대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;??&lt;span&gt;&amp;nbsp;&lt;/span&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;if let&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용 권장&lt;/li&gt;
&lt;li&gt;0...num.count-1&lt;span&gt;&amp;nbsp;&lt;/span&gt;대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;num.indices&lt;span&gt;&amp;nbsp;&lt;/span&gt;쓰면 빈 배열 크래시 예방&lt;/li&gt;
&lt;li&gt;슬라이싱 결과는&lt;span&gt;&amp;nbsp;&lt;/span&gt;ArraySlice&lt;span&gt;&amp;nbsp;&lt;/span&gt;타입 &amp;rarr; 다시 배열로 쓰려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;Array(num[1...2])&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 변환!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;Swift 배열 max() min() 완벽 분석&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 한 줄씩 분석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var num = [1, 2, 3, 10, 20]
//  인덱스: 0  1  2   3   4


print(num)
// 배열 전체 출력
// 결과: [1, 2, 3, 10, 20]


print(num.min())
//         ^^^
//   min() = 가장 작은 값 반환
//   반환 타입이 Optional(Int) &amp;larr; 중요!
//   왜냐면 빈 배열이면 최솟값이 없으니까
//   결과: Optional(1)


print(num.max())
//         ^^^
//   max() = 가장 큰 값 반환
//   이것도 Optional(Int) 반환
//   결과: Optional(20)


print(num.min()!)
//              ^
//   ! = 강제 언래핑
//   Optional(1) &amp;rarr; 1  껍데기 벗기기
//   결과: 1


print(num.max()!)
//              ^
//   ! = 강제 언래핑
//   Optional(20) &amp;rarr; 20
//   결과: 20&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 Optional을 반환할까?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ✅ 값이 있는 배열 &amp;rarr; 정상
var num = [1, 2, 3, 10, 20]
print(num.min())   // Optional(1)
print(num.max())   // Optional(20)


// ❌ 빈 배열 &amp;rarr; 최댓값/최솟값이 존재하지 않음!
var empty = [Int]()
print(empty.min())   // nil  &amp;larr; 없으니까 nil!
print(empty.max())   // nil

// 만약 Optional이 아니었다면?
print(empty.min()!)  //   크래시!!
//   그래서 Swift가 Optional로 감싸서 돌려주는 것!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;안전하게 사용하는 방법 3가지&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var num = [1, 2, 3, 10, 20]

// 방법 1 - ! 강제 언래핑 (값 있다고 확신할 때만)
print(num.min()!)   // 1
print(num.max()!)   // 20
// ⚠️ 빈 배열이면 앱 크래시!


// 방법 2 - ?? 기본값 지정 (권장 ✅)
print(num.min() ?? 0)   // 1   (없으면 0)
print(num.max() ?? 0)   // 20  (없으면 0)
// ✅ 빈 배열이어도 0 출력, 크래시 없음!


// 방법 3 - if let 안전하게 꺼내기 (권장 ✅)
if let 최솟값 = num.min() {
    print(&quot;최솟값: \(최솟값)&quot;)   // 최솟값: 1
}
if let 최댓값 = num.max() {
    print(&quot;최댓값: \(최댓값)&quot;)   // 최댓값: 20
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전체 실행 결과&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var num = [1, 2, 3, 10, 20]

print(num)        &amp;rarr; [1, 2, 3, 10, 20]
print(num.min())  &amp;rarr; Optional(1)
print(num.max())  &amp;rarr; Optional(20)
print(num.min()!) &amp;rarr; 1
print(num.max()!) &amp;rarr; 20&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;min() max() 활용 예제&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var scores = [85, 92, 78, 96, 61]

let 최고점 = scores.max()!
let 최저점 = scores.min()!
let 범위   = 최고점 - 최저점

print(&quot;최고점: \(최고점)&quot;)   // 최고점: 96
print(&quot;최저점: \(최저점)&quot;)   // 최저점: 61
print(&quot;점수범위: \(범위)&quot;)   // 점수범위: 35&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;div&gt;메서드반환 타입빈 배열이면사용 예
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;min()&lt;/td&gt;
&lt;td&gt;Optional(T)&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;td&gt;가장 작은 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max()&lt;/td&gt;
&lt;td&gt;Optional(T)&lt;/td&gt;
&lt;td&gt;nil&lt;/td&gt;
&lt;td&gt;가장 큰 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min()!&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;  크래시&lt;/td&gt;
&lt;td&gt;확실히 값 있을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max()!&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;  크래시&lt;/td&gt;
&lt;td&gt;확실히 값 있을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min() ?? 0&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;0 반환&lt;/td&gt;
&lt;td&gt;안전한 방법 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max() ?? 0&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;0 반환&lt;/td&gt;
&lt;td&gt;안전한 방법 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;핵심 정리:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;min(), max() 는 항상 &lt;b&gt;Optional&lt;/b&gt; 반환&lt;/li&gt;
&lt;li&gt;빈 배열일 가능성이 있으면 ?? 또는 if let 사용&lt;/li&gt;
&lt;li&gt;값이 반드시 있다고 확신할 때만 ! 사용  ️&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bnYK24/dJMcagFamqi/1Km3khtfWPhNx5lRiWOjD1/tableview.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;tableview.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.04MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/70</guid>
      <comments>https://jong133.tistory.com/70#entry70comment</comments>
      <pubDate>Mon, 13 Apr 2026 16:41:53 +0900</pubDate>
    </item>
    <item>
      <title>iOS프로그래밍실무 202208026이종윤 5주차과제</title>
      <link>https://jong133.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;protocol vs delegate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;portocol:알바 공고문,해야 할 일의 목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delegate:대표자(명사),위임하다(동사),공고문을 보고 채용된 알바생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEZb1m/dJMcagdZRFa/YX4Kjh07lXkGRZUkXQaHHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEZb1m/dJMcagdZRFa/YX4Kjh07lXkGRZUkXQaHHk/img.png&quot; data-alt=&quot;delegate는다 필요하고 datasource는 다 필요할 필요가 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEZb1m/dJMcagdZRFa/YX4Kjh07lXkGRZUkXQaHHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEZb1m%2FdJMcagdZRFa%2FYX4Kjh07lXkGRZUkXQaHHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;656&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;delegate는다 필요하고 datasource는 다 필요할 필요가 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg55OP/dJMcadnZxiD/8BpWr36laGLPWpkMZbB5N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg55OP/dJMcadnZxiD/8BpWr36laGLPWpkMZbB5N1/img.png&quot; data-alt=&quot;프로토콜은 상속받는게아니고 채택한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg55OP/dJMcadnZxiD/8BpWr36laGLPWpkMZbB5N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg55OP%2FdJMcadnZxiD%2F8BpWr36laGLPWpkMZbB5N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;681&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로토콜은 상속받는게아니고 채택한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/66YzO/dJMcafF9Apc/yE8S5gECJ2jHE1Fr8fBZlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/66YzO/dJMcafF9Apc/yE8S5gECJ2jHE1Fr8fBZlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/66YzO/dJMcafF9Apc/yE8S5gECJ2jHE1Fr8fBZlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F66YzO%2FdJMcafF9Apc%2FyE8S5gECJ2jHE1Fr8fBZlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;158&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vcloK/dJMcaiW7WKN/JNtHqwDWGFYfEkJ2czyrHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vcloK/dJMcaiW7WKN/JNtHqwDWGFYfEkJ2czyrHk/img.png&quot; data-alt=&quot;비싼 월급을 주고 알바생을 구해왔는데 일을 안하고있는 것이다. 함수는 기능을 넣어주면 된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vcloK/dJMcaiW7WKN/JNtHqwDWGFYfEkJ2czyrHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvcloK%2FdJMcaiW7WKN%2FJNtHqwDWGFYfEkJ2czyrHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;278&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비싼 월급을 주고 알바생을 구해왔는데 일을 안하고있는 것이다. 함수는 기능을 넣어주면 된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwgkut/dJMcabDKFiR/LYaczkRnqDRkk9oSiaahU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwgkut/dJMcabDKFiR/LYaczkRnqDRkk9oSiaahU1/img.png&quot; data-alt=&quot;run이라는 함수에 기능을 제대로 달아야 잘 작동한다. 이렇게 된것을 준수한다 컴펀한다라고한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwgkut/dJMcabDKFiR/LYaczkRnqDRkk9oSiaahU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwgkut%2FdJMcabDKFiR%2FLYaczkRnqDRkk9oSiaahU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;526&quot; height=&quot;530&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;run이라는 함수에 기능을 제대로 달아야 잘 작동한다. 이렇게 된것을 준수한다 컴펀한다라고한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.06.09.png&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBV0X/dJMcaax5dwb/cLzs12Ley0eCjXh0NWmBRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBV0X/dJMcaax5dwb/cLzs12Ley0eCjXh0NWmBRK/img.png&quot; data-alt=&quot;4개의 컨스트레이션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBV0X/dJMcaax5dwb/cLzs12Ley0eCjXh0NWmBRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBV0X%2FdJMcaax5dwb%2FcLzs12Ley0eCjXh0NWmBRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;817&quot; height=&quot;701&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.06.09.png&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4개의 컨스트레이션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.11.12.png&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkJLK0/dJMcacQbJPU/BTQIom3nd8amK1242X5u2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkJLK0/dJMcacQbJPU/BTQIom3nd8amK1242X5u2K/img.png&quot; data-alt=&quot;채택한다음에는 구현을 반드시해야된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkJLK0/dJMcacQbJPU/BTQIom3nd8amK1242X5u2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkJLK0%2FdJMcacQbJPU%2FBTQIom3nd8amK1242X5u2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1139&quot; height=&quot;470&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.11.12.png&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;채택한다음에는 구현을 반드시해야된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.41.36.png&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQJeNf/dJMcaco7Gn1/DWXPdwLQpF7vXQ33Gc6rf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQJeNf/dJMcaco7Gn1/DWXPdwLQpF7vXQ33Gc6rf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQJeNf/dJMcaco7Gn1/DWXPdwLQpF7vXQ33Gc6rf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQJeNf%2FdJMcaco7Gn1%2FDWXPdwLQpF7vXQ33Gc6rf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1406&quot; height=&quot;851&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.41.36.png&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;851&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;UITableView 소스 상세 설명&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전체 구조&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;class ViewController: UIViewController,    // 화면 기본 기능
                      UITableViewDelegate, // 테이블 동작 (선택 등)
                      UITableViewDataSource // 테이블 데이터 제공&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3가지를 동시에 채택 UITableViewDelegate + UITableViewDataSource 는 &lt;b&gt;테이블뷰를 사용하기 위한 필수 프로토콜&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;IBOutlet - 테이블뷰 연결&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;@IBOutlet weak var table: UITableView!
//                  ^^^^^
//                  스토리보드의 TableView와 연결된 변수&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;키워드의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@IBOutlet&lt;/td&gt;
&lt;td&gt;스토리보드 UI와 코드를 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;weak&lt;/td&gt;
&lt;td&gt;메모리 순환 참조 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UITableView!&lt;/td&gt;
&lt;td&gt;강제 언래핑 (스토리보드에서 반드시 연결)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;viewDidLoad - 초기 설정&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;override func viewDidLoad() {
    super.viewDidLoad()
    table.delegate = self    // 델리게이트를 이 ViewController로 지정
    table.dataSource = self  // 데이터소스를 이 ViewController로 지정
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;gams&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;table.delegate = self
      &amp;darr;
테이블뷰의 동작(셀 선택 등)을
이 ViewController가 처리하겠다!

table.dataSource = self
      &amp;darr;
테이블뷰에 보여줄 데이터를
이 ViewController가 제공하겠다!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;필수 메서드 3가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 섹션 개수&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func numberOfSections(in tableView: UITableView) -&amp;gt; Int {
    return 3   // 섹션 3개
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;┌─────────────┐
│   섹션 0    │
├─────────────┤
│   섹션 1    │
├─────────────┤
│   섹션 2    │
└─────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생략하면 기본값 &lt;b&gt;1&lt;/b&gt; 로 설정됨&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 섹션당 행 개수&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func tableView(_ tableView: UITableView,
               numberOfRowsInSection section: Int) -&amp;gt; Int {
    return 5   // 각 섹션마다 5개의 행
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;┌─────────────┐
│  섹션 0     │
│  - 행 0     │
│  - 행 1     │
│  - 행 2     │
│  - 행 3     │
│  - 행 4     │
├─────────────┤
│  섹션 1     │
│  - 행 0     │
│    ...      │  총 3섹션 x 5행 = 15개 셀&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 셀 구성 (핵심!)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;func tableView(_ tableView: UITableView,
               cellForRowAt indexPath: IndexPath) -&amp;gt; UITableViewCell {

    // 셀 생성
    let cell = UITableViewCell(style: .subtitle,
                               reuseIdentifier: &quot;myCell&quot;)

    cell.textLabel?.text = &quot;\(indexPath.row)&quot;
    cell.detailTextLabel?.text = indexPath.description
    cell.imageView?.image = UIImage(named: &quot;smile.png&quot;)

    return cell
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;indexPath 란?&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;indexPath.section  // 몇 번째 섹션인지
indexPath.row      // 몇 번째 행인지

// 예시
// 섹션1, 행2 &amp;rarr; indexPath.section = 1, indexPath.row = 2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;셀 스타일 .subtitle&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;┌────────────────────────┐
│    textLabel          │  &amp;larr; cell.textLabel?.text
│     detailTextLabel    │  &amp;larr; cell.detailTextLabel?.text
└────────────────────────┘
  &amp;uarr;
imageView&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;셀 스타일 종류&lt;/h4&gt;
&lt;div&gt;스타일구성
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.default&lt;/td&gt;
&lt;td&gt;이미지 + 메인텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.subtitle&lt;/td&gt;
&lt;td&gt;이미지 + 메인텍스트 + 서브텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.value1&lt;/td&gt;
&lt;td&gt;메인텍스트 + 우측 서브텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.value2&lt;/td&gt;
&lt;td&gt;메인텍스트(파란색) + 서브텍스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;reuseIdentifier 란?&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang-repl&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;셀을 매번 새로 만들면 메모리 낭비!
          &amp;darr;
화면 밖으로 나간 셀을 재사용
          &amp;darr;
&quot;myCell&quot; 이라는 이름표를 붙여서
같은 종류의 셀끼리 재활용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 화면 결과&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;┌─────────────────────┐
│    0               │  섹션0, 행0
│     [0, 0]          │
├─────────────────────┤
│    1               │  섹션0, 행1
│     [0, 1]          │
├─────────────────────┤
│    2               │  섹션0, 행2
│     [0, 2]          │
├─────────────────────┤
│    3               │  섹션0, 행3
│     [0, 3]          │
├─────────────────────┤
│    4               │  섹션0, 행4
│     [0, 4]          │
├─────────────────────┤  &amp;larr; 섹션1 시작
│    0               │
│     [1, 0]          │
   ...총 15개 셀...
└─────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전체 동작 흐름&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;lsl&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;1. viewDidLoad
   &amp;rarr; delegate = self, dataSource = self 설정

2. numberOfSections
   &amp;rarr; &quot;섹션 3개 만들어줘&quot; 반환

3. numberOfRowsInSection
   &amp;rarr; &quot;각 섹션마다 5행 만들어줘&quot; 반환

4. cellForRowAt
   &amp;rarr; 각 셀마다 호출되어 셀 구성 후 반환
   &amp;rarr; indexPath로 몇번째 섹션/행인지 구분

5. 화면에 테이블뷰 표시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블뷰는 &lt;b&gt;delegate + dataSource 패턴&lt;/b&gt;으로 데이터와 UI를 분리해서 관리하는 것이 핵심입니다!  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fast-food&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.50.18.png&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsXP5W/dJMcacvUqfq/HxJTZcKEAcV4hNB77Ux3G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsXP5W/dJMcacvUqfq/HxJTZcKEAcV4hNB77Ux3G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsXP5W/dJMcacvUqfq/HxJTZcKEAcV4hNB77Ux3G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsXP5W%2FdJMcacvUqfq%2FHxJTZcKEAcV4hNB77Ux3G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1365&quot; height=&quot;866&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.50.18.png&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;학식&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;민들레초밥&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;스벅&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;짜장면집&quot;&lt;/b&gt;&lt;span&gt;&lt;b&gt;,&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&quot;분식집&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.52.12.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czmA0g/dJMcajaFAmy/xd3kdHsEBMOkbekksmC6Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czmA0g/dJMcajaFAmy/xd3kdHsEBMOkbekksmC6Yk/img.png&quot; data-alt=&quot;테이블뷰를 두개로 해서 안에다가 각각 네임드를 지정할수있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czmA0g/dJMcajaFAmy/xd3kdHsEBMOkbekksmC6Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczmA0g%2FdJMcajaFAmy%2Fxd3kdHsEBMOkbekksmC6Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1385&quot; height=&quot;887&quot; data-filename=&quot;스크린샷 2026-04-06 오후 3.52.12.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테이블뷰를 두개로 해서 안에다가 각각 네임드를 지정할수있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 4.18.40.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLA6Rk/dJMcaa5URqW/SkJkpoSsCGNdFikPepfKPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLA6Rk/dJMcaa5URqW/SkJkpoSsCGNdFikPepfKPK/img.png&quot; data-alt=&quot;constraints이 계속 늘어난다. 크기를 직접 지정하는 것이 아니고 맞춰서 하기때문이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLA6Rk/dJMcaa5URqW/SkJkpoSsCGNdFikPepfKPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLA6Rk%2FdJMcaa5URqW%2FSkJkpoSsCGNdFikPepfKPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;618&quot; data-filename=&quot;스크린샷 2026-04-06 오후 4.18.40.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;constraints이 계속 늘어난다. 크기를 직접 지정하는 것이 아니고 맞춰서 하기때문이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 4.33.21.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sV4zR/dJMcafe7jNn/iMNZmSlW72ujKYFjwzsLK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sV4zR/dJMcafe7jNn/iMNZmSlW72ujKYFjwzsLK0/img.png&quot; data-alt=&quot;as! MyTableViewCell을 부모클래스에서 자식클래스로 다운그레이드를 해서 오류를 해결할수있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sV4zR/dJMcafe7jNn/iMNZmSlW72ujKYFjwzsLK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsV4zR%2FdJMcafe7jNn%2FiMNZmSlW72ujKYFjwzsLK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;565&quot; data-filename=&quot;스크린샷 2026-04-06 오후 4.33.21.png&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;as! MyTableViewCell을 부모클래스에서 자식클래스로 다운그레이드를 해서 오류를 해결할수있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Food 앱 소스 설명&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전역 데이터&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;var name  = [&quot;학식&quot;,&quot;민들레초밥&quot;,&quot;스벅&quot;,&quot;짜장면집&quot;,&quot;분식집&quot;]
var food  = [&quot;돈까스&quot;,&quot;초밥&quot;,&quot;카페&quot;,&quot;피자집&quot;,&quot;한식집&quot;]
var image = [&quot;smile2.png&quot;,&quot;fast-food1.png&quot;,&quot;fast-food.png&quot;,&quot;dish.png&quot;,&quot;cutlery.png&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 밖에 선언 &amp;rarr; &lt;b&gt;어디서든 접근 가능한 전역변수&lt;/b&gt; 인덱스 0~4 로 name, food, image 가 서로 대응&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 변경점 - 커스텀 셀 사용&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;// ❌ 기본 셀 (주석처리됨)
// let cell = UITableViewCell(style: .subtitle, reuseIdentifier: &quot;myCell&quot;)
// cell.textLabel?.text = name[indexPath.row]
// cell.detailTextLabel?.text = food[indexPath.row]
// cell.imageView?.image = UIImage(named: image[indexPath.row])

// ✅ 커스텀 셀 사용
let cell = tableView.dequeueReusableCell(
               withIdentifier: &quot;myCell&quot;,
               for: indexPath) as! MyTableViewCell
cell.myLabel.text = name[indexPath.row]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;항목기본 셀커스텀 셀
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;클래스&lt;/td&gt;
&lt;td&gt;UITableViewCell&lt;/td&gt;
&lt;td&gt;MyTableViewCell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;생성 방법&lt;/td&gt;
&lt;td&gt;UITableViewCell(style:)&lt;/td&gt;
&lt;td&gt;dequeueReusableCell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;레이블&lt;/td&gt;
&lt;td&gt;cell.textLabel&lt;/td&gt;
&lt;td&gt;cell.myLabel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;dequeueReusableCell 이란?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang-repl&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;스크롤할 때 화면 밖으로 나간 셀을
새로 만들지 않고 재사용!
          &amp;darr;
메모리 절약 + 성능 향상&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;swift&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;actionscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;as! MyTableViewCell
// UITableViewCell &amp;rarr; MyTableViewCell 로 다운캐스팅
// 스토리보드에서 만든 커스텀 셀 클래스&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;화면 결과&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;┌─────────────────────┐
│      학식           │  &amp;larr; name[0]
├─────────────────────┤
│    민들레초밥        │  &amp;larr; name[1]
├─────────────────────┤
│      스벅           │  &amp;larr; name[2]
├─────────────────────┤
│     짜장면집         │  &amp;larr; name[3]
├─────────────────────┤
│      분식집          │  &amp;larr; name[4]
└─────────────────────┘
  섹션 3개 x 행 5개 = 총 15셀
  (name 배열은 5개라 섹션2,3은 반복)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한줄 요약&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 셀 &amp;rarr; &lt;b&gt;커스텀 셀(MyTableViewCell)&lt;/b&gt; 로 업그레이드해서 스토리보드에서 직접 디자인한 레이아웃으로 테이블뷰를 구성!  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-06 오후 4.40.19.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbjhsL/dJMcaf7ctuZ/q5zAgfoE4Y3roKWiuoQCR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbjhsL/dJMcaf7ctuZ/q5zAgfoE4Y3roKWiuoQCR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbjhsL/dJMcaf7ctuZ/q5zAgfoE4Y3roKWiuoQCR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbjhsL%2FdJMcaf7ctuZ%2Fq5zAgfoE4Y3roKWiuoQCR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;778&quot; data-filename=&quot;스크린샷 2026-04-06 오후 4.40.19.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>jong133</author>
      <guid isPermaLink="true">https://jong133.tistory.com/68</guid>
      <comments>https://jong133.tistory.com/68#entry68comment</comments>
      <pubDate>Mon, 6 Apr 2026 16:42:22 +0900</pubDate>
    </item>
  </channel>
</rss>