<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>욤찌의 개발 일기</title>
    <link>https://yyomzzi.tistory.com/</link>
    <description>어제보다 성장한 오늘을 기록합니다✨</description>
    <language>ko</language>
    <pubDate>Tue, 4 Aug 2026 01:43:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yyomzzi</managingEditor>
    <image>
      <title>욤찌의 개발 일기</title>
      <url>https://tistory1.daumcdn.net/tistory/6240160/attach/e15380dd031b4722821efa72cf279a5b</url>
      <link>https://yyomzzi.tistory.com</link>
    </image>
    <item>
      <title>[자료구조] 2. Queue(큐)랑 친해지고 구현하기</title>
      <link>https://yyomzzi.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;자료구조 두 번째 시간을 맞이하다니,, &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오늘은 Queue랑 친해져 보고 구현해 보는 시간 가져보겠습니닷&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Queue&lt;/span&gt;&lt;span&gt; ⛓️&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Queue&lt;/b&gt;&lt;/span&gt;는 사실 굉장히 많이 들어봤눈데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;Swift에서는 동시성에서 다루는 &lt;b&gt;DispatchQueue&lt;/b&gt; 가 있져&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;바로 이 DispatchQueue의 Queue가 오늘 배울 자료구조 Queue라고 함&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;근데 Queue도 많이 사용하기는 했지만 뜻을 정확히 몰라서 찾아보니까&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;순서대로 줄을 서는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;대기열&lt;/b&gt;&lt;/span&gt;이라고 함!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;티켓 같은 거 살 때 줄 서 있는 것을 상상해 보면 가장 먼저 줄 선사람이 가장 먼저 티켓을 사서 줄에서 빠져나가죠잉&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;그것이 바로 Queue의 특성입니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;FIFO(First In, First Out)&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;선입선출&lt;/b&gt;&lt;/span&gt; 구조‼️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2024-04-03 오전 12.13.17.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t5Zim/btsGjOYVZAp/imsRgq0vN41xiYEkJQ8Bz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t5Zim/btsGjOYVZAp/imsRgq0vN41xiYEkJQ8Bz0/img.png&quot; data-alt=&quot;FIFO, 선입선출 구조! 가장 먼저 들어온것부터 제거된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t5Zim/btsGjOYVZAp/imsRgq0vN41xiYEkJQ8Bz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft5Zim%2FbtsGjOYVZAp%2FimsRgq0vN41xiYEkJQ8Bz0%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;198&quot; data-filename=&quot;스크린샷 2024-04-03 오전 12.13.17.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FIFO, 선입선출 구조! 가장 먼저 들어온것부터 제거된다&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;size18&quot;&gt;Stack에 push와 pop이 있다면, Queue에는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Enqueue&lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Dequeue&lt;/b&gt;&lt;/span&gt;가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Enqueue는 큐에 데이터가 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추가&lt;/b&gt;&lt;/span&gt;되는 것이고 Dequeue는 큐에서 데이터가 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;제거&lt;/b&gt;&lt;/span&gt;되는 것을 말함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 Stack에서와 다른 점은 스택은 가장 마지막에 추가된 데이터가 가장 중요하지만 큐에서는 큐의 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;맨 앞&lt;/b&gt;&lt;/span&gt;과 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;맨 끝&lt;/b&gt;&lt;/span&gt; 이 두 지점이 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 큐의 가장 앞 인덱스를 &lt;b&gt;front&lt;/b&gt;, &lt;b&gt;Head라고&lt;/b&gt; 말하고 가장 뒤를 &lt;b&gt;back&lt;/b&gt;, &lt;b&gt;tail이라고&lt;/b&gt; 말한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 &lt;u&gt;Dequeue가 되는 부분은 head, Enqueue가 되는 부분은 tail&lt;/u&gt; 부분임!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Let's implement a stack ‼️&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Queue도 스택처럼 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;배열&lt;/b&gt;&lt;/span&gt;로 구현해 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712071766098&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Queue&amp;lt;Element&amp;gt; {
    var queue: [Element] = []
    
    var count: Int {
        return queue.count
    }
    
    var isEmpty: Bool {
        return queue.isEmpty
    }
    
    mutating func enqueue(_ element: Element) {
        queue.append(element)
    }
    
    mutating func dequeue() -&amp;gt; Element? {
        return isEmpty ? nil : queue.removeFirst()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  Queue라는 구조체에 &lt;b&gt;Generic&lt;/b&gt; 데이터를 담을 수 있는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;queue&lt;/b&gt;&lt;/span&gt;라는 배열을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  스택과 똑같이 큐에 데이터가 몇 개 있는지 알 수 있는 &lt;b&gt;count&lt;/b&gt;와 큐에 데이터가 있는지 없는지 확인하는 &lt;b&gt;isEmpty&lt;/b&gt; 속성을 각각 배열의 계산 속성으로 구현해주었댜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;func enqueue(_ element: Element)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는&lt;/span&gt; 큐에 데이터를 추가하는 함수이다. 파라미터로 받는 element를 queue 배열에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;append&lt;/b&gt;&lt;/span&gt; 해주었다. 배열 끝에 append 하기 때문에 시간복잡도는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;O(1)이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #000000;&quot;&gt;func dequeue()&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는&lt;/span&gt; 큐에서 데이터를 제거하는 함수이다. queue 배열에 요소가 없을 수 있기 때문에 옵셔널로 리턴한다. 만약 큐가 비어있으면 nil을 리턴하고 큐에 데이터가 있으면 가장 첫 번째 요소를 제거하기 위해 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;removeFirst()&lt;/span&gt;&lt;/b&gt; 함수를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;removaFirst()&lt;/b&gt;&lt;/span&gt;는 스택과는 다르게 가장 마지막 데이터를 제거하는 것이 아니라 가장 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;첫번째 요소를 제거&lt;/b&gt;&lt;/span&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇게 되면 큐의 데이터들이 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;앞으로 하나씩 옮겨지는 과정&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;스크린샷 2024-04-03 오전 12.40.48.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/omc0Q/btsGjMGTbQk/o41f6ncUKlSkN1qraATPAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/omc0Q/btsGjMGTbQk/o41f6ncUKlSkN1qraATPAK/img.png&quot; data-alt=&quot;1번 데이터가 디큐되니까 앞으로 하나씩 옮겨지는 과정 발생!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/omc0Q/btsGjMGTbQk/o41f6ncUKlSkN1qraATPAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fomc0Q%2FbtsGjMGTbQk%2Fo41f6ncUKlSkN1qraATPAK%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;427&quot; data-filename=&quot;스크린샷 2024-04-03 오전 12.40.48.png&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;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;size18&quot;&gt;그렇기 때문에 removeFirst 메서드로 dequeue를 하게 되면 시간복잡도가 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;O(n)&lt;/b&gt;&lt;/span&gt;이 되어버려여려려~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;‼️그래서 시간 복잡도를 줄인 더 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;효율적인 Dequeue 방법&lt;/b&gt;&lt;/span&gt;을 구현할 수 있음‼️&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;removeFirst()로 맨 앞의 데이터를 제거하는 대신에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;맨 앞 데이터를 &lt;span style=&quot;color: #ee2323;&quot;&gt;nil&lt;span style=&quot;color: #000000;&quot;&gt;로&lt;/span&gt;&lt;/span&gt; 변경하는 거임!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;head&lt;/b&gt;를&lt;/span&gt; 추가해 준다!! head는 큐의 가장 앞부분을 가리키게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 dequeue를 하면 데이터가 제거되는 것이 아니라 이 추가된 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;head가 그다음 인덱스로 옮겨&lt;/span&gt;&lt;/b&gt;지게 되면서 head가 가리키는 지점의 데이터가 dequeue(데이터가 nil로 변경) 되는 방법이다.&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;스크린샷 2024-04-03 오전 1.18.55.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccb5Ea/btsGksujREi/lDcUkeh8d0HO5M2hK8N0R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccb5Ea/btsGksujREi/lDcUkeh8d0HO5M2hK8N0R0/img.png&quot; data-alt=&quot;dequeue되면서 데이터는 nil로 변경되고 head가 다음 인덱스로 옮겨진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccb5Ea/btsGksujREi/lDcUkeh8d0HO5M2hK8N0R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccb5Ea%2FbtsGksujREi%2FlDcUkeh8d0HO5M2hK8N0R0%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;500&quot; height=&quot;522&quot; data-filename=&quot;스크린샷 2024-04-03 오전 1.18.55.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dequeue되면서 데이터는 nil로 변경되고 head가 다음 인덱스로 옮겨진다.&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;size18&quot;&gt;코드로 구현해 보면&lt;/p&gt;
&lt;pre id=&quot;code_1712074904430&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Queue2&amp;lt;Element&amp;gt; {
    var queue: [Element?] = []
    var head: Int = 0 // ⭐️추가⭐️
    
    var count: Int {
        return queue.count
    }
    
    var isEmpty: Bool {
        return queue.isEmpty
    }
    
    mutating func enqueue(_ element: Element) {
        queue.append(element)
    }
    
    mutating func dequeue() -&amp;gt; Element? {
        guard head &amp;lt;= count, let element = queue[head] else { return nil }
        queue[head] = nil
        head += 1
        return element
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 queue에는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;nil&lt;/b&gt;&lt;/span&gt;값도 들어가게 되기 때문에 queue의 타입을&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[Element?]&lt;/b&gt;&lt;/span&gt; 옵셔널 배열로 변경해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 Int 타입의 head를 추가해 준다. 이제 dequeue 될 때마다 이 head의 값을 1씩 올려줄 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 다른 것은 똑같고 우리는 dequeue 함수에 주목하면 된닷!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  함수를 보자면, 일단 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;guard&lt;/b&gt;&lt;/span&gt; 문을 사용해서 head가 count보다 작은지 즉, &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;head가 현재 유효한 인덱스&lt;/b&gt;&lt;/span&gt;인지를 확인한다. 그리고 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;queue[head]가 nil이 아닌 실제 값&lt;/b&gt;&lt;/span&gt;이 있는 요소인지 확인해서 element에 할당한다. 만약 head가 큐의 데이터 개수보다 더 높은 인덱스를 가지고 queue [head]에 값이 nil이라면 바로 nil을 리턴하고 함수가 종료된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  만약 head도 유효한 인덱스이고 element도 유효한 값이라면 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;queue[head]를 nil로 변경&lt;/b&gt;&lt;/span&gt;한다. 위의 이미지를 예로 들자면, 현재 head가 0(index 값)이고 queue[0] 이 nil이 아닌 &quot;1&quot; 이니까 queue[0] 에 &quot;1&quot; 을 nil로 할당해 주는 것이다. 그렇게 해서 큐의 가장 맨 앞의 데이터를 제거하지 않고 nil로 만들어 준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  그 후에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;head의 값을 1 증가시켜 준다.&lt;/b&gt;&lt;/span&gt; 그래서 head가 가리키는 index의 값은 1이 되는 것이다. 이 상태에서 dequeue를 하게 되면 &quot;2&quot;가 nil이 되고 head는 index 2를 가리켜서 &quot;3&quot; 위치에 갈 것이다. 그리고 nil로 변경된 값을 리턴해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;소들님 블로그&lt;/a&gt;를 참고해 보면 head += 1 작업 후에 nil로 바뀐 dequeue 된 데이터들을 계속 가지고 있을 수가 없으니 설정한 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;임계점에 도달하면 이 nil 값들을 다 제거&lt;/b&gt;&lt;/span&gt;하는 코드도 추가되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1712075561410&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; mutating func dequeue() -&amp;gt; Element? {
        guard head &amp;lt; count, let element = queue[head] else { return nil }
        queue[head] = nil
        head += 1
        
        // 이부분!
        if head &amp;gt; 10 {
            queue.removeFirst(head)
            head = 0
        }
        return element
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나는 일단 10으로 설정했는데 이건 설정하기 나름인 듯!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 head가 10을 초과하면, 아마 11부터가 되겠죠잉 head가 11이 되면 &lt;span style=&quot;text-align: left;&quot; data-v-16d388ce=&quot;&quot; data-v-b03d0ea4=&quot;&quot; data-v-cb125254=&quot;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;removeFirst(_ k: Int)&lt;/b&gt;&lt;/span&gt; 함수를 이용해서 맨 앞에서부터 head 개를 지울 수가 있다. &amp;nbsp;그리고 head를 다시 0으로 돌려놓는닷!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;결론적으로!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이 방법을 사용하면 맨 앞 데이터가 삭제되지 않아서 앞으로 하나씩 옮겨지는 과정이 필요하지 않으니까&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시간복잡도는 O(1)&lt;/b&gt;&lt;/span&gt;이 됩니닷&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;큐,, 스택보다 어렵지만 재밌군여 ,,!!!! 큐큐,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;언능 큐 관련된 코테 문제도 풀어보아서 감을 익혀야겠어요 홍홍&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음에는 어떤 자료구조로 돌아올지,, 일단 돌아오는 것이 목표  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://jeong9216.tistory.com/350&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jeong9216.tistory.com/350&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712076656709&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[자료구조] Queue(큐) with Swift&quot; data-og-description=&quot;안녕하세요. 개발하는 정주입니다. 오늘은 &amp;quot;Queue&amp;quot;를 정리하였습니다. 포스팅 하단에 Swift로 Queue를 구현하고 dequeue의 시간복잡도 개선, 테스트도 함께 진행했습니다. Queue란? Queue는 Stack과 함께 기&quot; data-og-host=&quot;jeong9216.tistory.com&quot; data-og-source-url=&quot;https://jeong9216.tistory.com/350&quot; data-og-url=&quot;https://jeong9216.tistory.com/350&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGzwIA/hyVGMFGUwu/zqfchkdQxfIkBxUMz1Rmgk/img.png?width=800&amp;amp;height=598&amp;amp;face=0_0_800_598,https://scrap.kakaocdn.net/dn/b46jpJ/hyVGLUjXAs/Ax616Nl3eZ2YbNYJZUnOgK/img.png?width=800&amp;amp;height=598&amp;amp;face=0_0_800_598,https://scrap.kakaocdn.net/dn/otEnT/hyVGOXPb7h/3XgdWucikoerEZqdqBxc1k/img.jpg?width=1169&amp;amp;height=1169&amp;amp;face=368_454_680_795&quot;&gt;&lt;a href=&quot;https://jeong9216.tistory.com/350&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jeong9216.tistory.com/350&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGzwIA/hyVGMFGUwu/zqfchkdQxfIkBxUMz1Rmgk/img.png?width=800&amp;amp;height=598&amp;amp;face=0_0_800_598,https://scrap.kakaocdn.net/dn/b46jpJ/hyVGLUjXAs/Ax616Nl3eZ2YbNYJZUnOgK/img.png?width=800&amp;amp;height=598&amp;amp;face=0_0_800_598,https://scrap.kakaocdn.net/dn/otEnT/hyVGOXPb7h/3XgdWucikoerEZqdqBxc1k/img.jpg?width=1169&amp;amp;height=1169&amp;amp;face=368_454_680_795');&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;[자료구조] Queue(큐) with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 개발하는 정주입니다. 오늘은 &quot;Queue&quot;를 정리하였습니다. 포스팅 하단에 Swift로 Queue를 구현하고 dequeue의 시간복잡도 개선, 테스트도 함께 진행했습니다. Queue란? Queue는 Stack과 함께 기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jeong9216.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://babbab2.tistory.com/84&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712076663966&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift) 큐(Queue) 구현 해보기&quot; data-og-description=&quot;안녕하세요? 소들입니다 :) 훔... 제가 자료구조나 알고리즘 바보인ㄷ..   뿌에엥 오늘부터 한번 공부를 해보려고..!!!!!1 마음을 먹었습니다..!!!!!!11 (시작하는 마음에서 이전 제로 베이스에서 짠&quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/84&quot; data-og-url=&quot;https://babbab2.tistory.com/84&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZ8XBE/hyVJ3MzzyJ/nIHqoHFWYSyz9Z3KJReiIK/img.gif?width=600&amp;amp;height=336&amp;amp;face=0_0_600_336,https://scrap.kakaocdn.net/dn/zbmb8/hyVGQ2pBuD/4hXVK3S15X4kl4h9ydO8C0/img.gif?width=600&amp;amp;height=336&amp;amp;face=0_0_600_336,https://scrap.kakaocdn.net/dn/1d7Fn/hyVJ1utgiV/rO3eWFJaPo5PBa0vzvAkp0/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZ8XBE/hyVJ3MzzyJ/nIHqoHFWYSyz9Z3KJReiIK/img.gif?width=600&amp;amp;height=336&amp;amp;face=0_0_600_336,https://scrap.kakaocdn.net/dn/zbmb8/hyVGQ2pBuD/4hXVK3S15X4kl4h9ydO8C0/img.gif?width=600&amp;amp;height=336&amp;amp;face=0_0_600_336,https://scrap.kakaocdn.net/dn/1d7Fn/hyVJ1utgiV/rO3eWFJaPo5PBa0vzvAkp0/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&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;Swift) 큐(Queue) 구현 해보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요? 소들입니다 :) 훔... 제가 자료구조나 알고리즘 바보인ㄷ..   뿌에엥 오늘부터 한번 공부를 해보려고..!!!!!1 마음을 먹었습니다..!!!!!!11 (시작하는 마음에서 이전 제로 베이스에서 짠&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/28</guid>
      <comments>https://yyomzzi.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 26 Mar 2024 22:45:25 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 1. Stack(스택)이랑 친해지고 구현하기</title>
      <link>https://yyomzzi.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;비전공자인 나,,^^ 그래서 자료구조나 알고리즘,, 같은 CS 공부에 너무나도 목말라 있는 중,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;특히 코테를 준비하다 보니까 더더욱 이런 지식들이 필요하다는 것을 느끼는 즁,,!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;자료구조&lt;/b&gt;&lt;/span&gt;를 열심히 파보기로 합미다✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오늘은 먼저 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스택 &lt;/b&gt;&lt;/span&gt;을 파보자고〰️ 가보자고〰️&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Stack&lt;/span&gt;  &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사실 Stack은 이전부터 많이 들었는데 생각해 보니까 무슨 뜻인지 잘 모르고 용어를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 뜻을 검색해 봤더니 &lt;b&gt;무더기, 채우다, 쌓이다&lt;/b&gt; 등의 의미를 지닌 단어라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;말 그대로 어떤 물체나 작업들이 쌓여있는 것을 의미한다. 근데 막 쌓여있는 느낌보다는 정돈되어 쌓여 있는 느낌!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;stack_noun_002_35499.jpg&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLewhq/btsGeLihFkL/J1NcEr77ConGkacKAjOv6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLewhq/btsGeLihFkL/J1NcEr77ConGkacKAjOv6K/img.jpg&quot; data-alt=&quot;요런 너낌,,!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLewhq/btsGeLihFkL/J1NcEr77ConGkacKAjOv6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLewhq%2FbtsGeLihFkL%2FJ1NcEr77ConGkacKAjOv6K%2Fimg.jpg&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;133&quot; height=&quot;200&quot; data-filename=&quot;stack_noun_002_35499.jpg&quot; data-origin-width=&quot;133&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요런 너낌,,!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 Stack은 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;데이터를 쌓아놓은 자료구조&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터가 &quot;쌓이기&quot; 때문에 어떤 항목을 스택에 넣으면 가장 위에&amp;nbsp;쌓이게 되고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;제거할 때도 가장 위에 있는 것부터 제거가 된다. 그래서 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;LIFO(Last In, First Out)&lt;/b&gt;&lt;/span&gt; 특성을 갖게 됩니댜&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-04-01 오후 4.57.01.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtGGTY/btsGgDwS7vu/IFb7qdb8ep1tcqNUYHb1DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtGGTY/btsGgDwS7vu/IFb7qdb8ep1tcqNUYHb1DK/img.png&quot; data-alt=&quot;LIFO, 후입선출 구조! 가장 마지막에 들어간게 가장 먼저 제거된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtGGTY/btsGgDwS7vu/IFb7qdb8ep1tcqNUYHb1DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtGGTY%2FbtsGgDwS7vu%2FIFb7qdb8ep1tcqNUYHb1DK%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;600&quot; height=&quot;685&quot; data-filename=&quot;스크린샷 2024-04-01 오후 4.57.01.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LIFO, 후입선출 구조! 가장 마지막에 들어간게 가장 먼저 제거된다.&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;size18&quot;&gt;Stack에는 필수적인 작업이 두 개가 있는데 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Push&lt;/b&gt;와&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pop&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다.&lt;/span&gt; Stack에 데이터를 넣는 작업을 Push, 제거하는 작업을 Pop이라고 한다. Stack은 후입선출 구조이기 때문에 데이터가 한 방향에서만 추가하고 제거될 수가 있다. 그래서 가장 마지막에 push된 요소가 가장 먼저 pop 되면서 제거된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Swift에서는 Stack을 구현하는 가장 일반적인 방법이 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;배열을 사용&lt;/b&gt;&lt;/span&gt;하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;배열 자체에 Stack에서 구현하는 append와 removeLast, popLast 메서드를 가지고 있기 때문에 배열을 이용해서 Stack 연산을 쉽게 구현할 수 있다. 배열을 사용해서 Stack을 구현하면 배열의 마지막 요소를 추가하거나 제거하는 작업만 수행하기 때문에 시간복잡도가 O(1)을 유지한다. (그래서 굳이 Stack을 만들지 않고 배열을 사용해도 된다고 함..!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Let's implement a stack ‼️&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0d0d0d;&quot;&gt;&lt;span style=&quot;caret-color: #0d0d0d; background-color: #ffffff;&quot;&gt;구조체를 이용해서 Stack을 정의해 보자&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711980739756&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Stack&amp;lt;Element&amp;gt; {
    var elements: [Element] = []
    
    var count: Int {
        return elements.count
    }
    
    var isEmpty: Bool {
        return elements.isEmpty
    }
    
    func top() -&amp;gt; Element? {
        return elements.last
    }
    
    mutating func push(_ element: Element) {
        elements.append(element)
    }
    
    mutating func pop() -&amp;gt; Element? {
        return elements.popLast()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  Stack 구조체에 &lt;b&gt;Generic의 데이터&lt;/b&gt;를 담을 수 있는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;elements&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;배열&lt;/b&gt;&lt;/span&gt;을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  그리고 스택에 데이터가 몇 개 있는지 알기 위한 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;count&lt;/span&gt;&lt;/b&gt; 프로퍼티를 생성한다. 배열의 count 계산 속성을 사용했다. 마찬가지로 스택에 데이터가 존재하는지 확인하는 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;isEmpty&lt;/span&gt;&lt;/b&gt; 프로퍼티도 생성했고 이 또한 배열의 isEmpty 계산 속성으로 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;func top()&lt;/b&gt;&lt;/span&gt; 은 현재 스택의 가장 마지막에 있는 데이터가 무엇인지 확인하는 함수이다. 배열의 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;last 속성&lt;/b&gt;&lt;/span&gt;을 사용해서 확인할 수 있다. 값을 확인했을 때, 없을 수도 있기 때문에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;옵셔널&lt;/b&gt;&lt;/span&gt;로 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;func push(_ element: Element)&lt;/b&gt;&lt;/span&gt; 는 스택에 데이터를 추가하는 함수이다. 배열의 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;append 메서드&lt;/span&gt;&lt;/b&gt;를 활용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;func pop()&lt;/b&gt;&lt;/span&gt; 은 스택의 가장 마지막 데이터를 제거하는 함수이다. 이것도 배열의 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;popLast 메서드&lt;/span&gt;&lt;/b&gt;를 활용했다. removeLast도 사용할 수 있지만 값이 없을 경우에 removeLast는 에러를 발생한다. 반면, popLast의 경우에는 nil을 반환할 수 있기 때문에 더 안전하게 popLast를 사용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2024-04-01 오후 11.35.35.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvhzp/btsGe8qNxE5/aKaGWkxCQKWnIdhv1oBuT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvhzp/btsGe8qNxE5/aKaGWkxCQKWnIdhv1oBuT0/img.png&quot; data-alt=&quot;popLast 공식문서. Self.Element? 옵셔널로 리턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvhzp/btsGe8qNxE5/aKaGWkxCQKWnIdhv1oBuT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyvhzp%2FbtsGe8qNxE5%2FaKaGWkxCQKWnIdhv1oBuT0%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;550&quot; height=&quot;195&quot; data-filename=&quot;스크린샷 2024-04-01 오후 11.35.35.png&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;popLast 공식문서. Self.Element? 옵셔널로 리턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2024-04-01 오후 11.35.49.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btjhTK/btsGfKCZJHc/i7WwgmwKYm2HBFuBjf2mw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btjhTK/btsGfKCZJHc/i7WwgmwKYm2HBFuBjf2mw0/img.png&quot; data-alt=&quot;removeLast 공식문서. Self.Element를 리턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btjhTK/btsGfKCZJHc/i7WwgmwKYm2HBFuBjf2mw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtjhTK%2FbtsGfKCZJHc%2Fi7WwgmwKYm2HBFuBjf2mw0%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;550&quot; height=&quot;215&quot; data-filename=&quot;스크린샷 2024-04-01 오후 11.35.49.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;removeLast 공식문서. Self.Element를 리턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  이 3개의 함수들이 처리하는 작업들은 모두 마지막 데이터를 확인하거나 추가/제거하는 작업이기 때문에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;상수 시간 내&lt;/b&gt;&lt;/span&gt;에 수행될 수 있어서 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시간복잡도는 O(1)&lt;/span&gt;&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  push와 pop 함수에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;mutating&lt;/b&gt;&lt;/span&gt; 키워드가 붙어있다. 이 함수들은 Stack 구조체 내부에서 elements 프로퍼티의 값을 변경하려고 하는데 이럴 경우에는 &lt;b&gt;error: cannot use mutating member on immutable value: 'self' is immutable &lt;/b&gt;하는 에러가 뜬다. 구조체와 열거형과 같은 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;값 타입(Value Type)&lt;/b&gt;&lt;/span&gt;은 인스턴스가 생성된 후에 그 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;인스턴스의 속성이 변경되지 않도록&lt;/b&gt;&lt;/span&gt; 구현했다. 그래서 인스턴스 내부의 값을 변경하려면 메서드에 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mutating 키워드를 붙여서&lt;/span&gt;&lt;/b&gt; 값을 변경하겠다는 표시를 해주어야 한다.&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&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;size18&quot;&gt;이렇게 구현해서 실행해 보면&lt;/p&gt;
&lt;pre id=&quot;code_1711982299062&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var myStack = Stack&amp;lt;Int&amp;gt;()
myStack.push(1)
myStack.push(2)
myStack.push(3)
print(myStack.elements) // [1, 2, 3]
print(myStack.top()) // Optional(3)
myStack.pop()
print(myStack.elements) // [1, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이런 결과를 확인할 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내친김에 ㅎ 스택으로 풀 수 있는 코테 문제도 한 번 풀어봤따,,!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로그래머스 알고리즘 고득점 Kit에 보면 스택/큐 문제 모아놓은 카테고리가 있댜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12909&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711984958936&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rX3Rl/hyVJTXgVQD/Jku4AMF9yQ5IZyHYKDQr20/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b7O8bA/hyVJ0PC35O/QPKGkjJeo37r7x5TlIeWf0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12909&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rX3Rl/hyVJTXgVQD/Jku4AMF9yQ5IZyHYKDQr20/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b7O8bA/hyVJ0PC35O/QPKGkjJeo37r7x5TlIeWf0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;b&gt;내 답안&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1711985009747&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func solution(_ s: String) -&amp;gt; Bool {
    
    var elements: [Character] = []
    
    guard let first = s.first else { return false }
    if first == &quot;)&quot; {
        return false
    }
    
    for char in s {
        if char == &quot;(&quot; {
            elements.append(char)
        } else {
            if elements.isEmpty {
                return false
            } else {
                elements.popLast()
            }
        }
    }
    return elements.isEmpty
}&lt;/code&gt;&lt;/pre&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. elements 배열을 생성함. 이 배열을 이제 Stack으로 사용할고임&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 처음에 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&quot;&lt;span style=&quot;color: #000000;&quot;&gt;(&quot;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;로 무조건 시작해야 하기 때문에 &lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;&quot;)&quot;&lt;/b&gt;&lt;/span&gt; 로 시작하는건 먼저 리턴해줬음. 생각해 보니까 굳이 언래핑 안 해줘도 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;for-in&lt;/b&gt;&lt;/span&gt; 구문을 통해 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;s&lt;/b&gt;&lt;/span&gt; 에서 아이템을 하나씩 꺼내서 확인하는 작업을 함.&amp;nbsp;만약, &lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&quot;(&quot;&lt;/b&gt;&lt;/span&gt; 라면 배열에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추가&lt;/b&gt;&lt;/span&gt;를 해줌. 그리고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;)&quot;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; 일 때, 배열이 비어있으면 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;false로 리턴&lt;/b&gt;&lt;/span&gt;함. 배열에 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&quot;(&quot;&lt;/b&gt;&lt;/span&gt;가 없이 비어있다면 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;짝을 이룰 수 없기&lt;/span&gt;&lt;/b&gt; 때문! 비어있지 않다면 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&quot;(&quot;&lt;/b&gt;&lt;/span&gt;가 있을거기 때문에 짝을 이룰 수 있음! 그래서 배열에 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;popLast()&lt;/span&gt;&lt;/b&gt; 를 해서 짝이 맞으면 배열에 요소를 제거할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 그래서 만약 배열의 요소가 다 제거되었다면 즉, 스택에 데이터가 남아있지 않다면 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;elements.isEmpty&lt;/b&gt;&lt;/span&gt;를 통해 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;를 리턴하고, 만약 스택에 데이터가 남아있으면 짝을 다 이루지 못한거니까 &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;false&lt;/span&gt;&lt;/b&gt;를 리턴하도록 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;드디어 자료구조 공부를 시작했드아..!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;매번 해야지 해야지 생각만 하다가 ,, ㅠ 근데 하니까 재밌네,,~ 아무래도 제일 쉬운 스택을 해서 그럴 수도,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지금까지 스택이 대충 어떤 건지는 알았는데 구현은 처음 해보기도 하고, 코테에 적용도 해보니까 넘넘 재밌댜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;열심히 자료구조 공부해서 여러모로 도움 되었으면 좋겠댜~~!~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&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;a href=&quot;https://jeonyeohun.tistory.com/319&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jeonyeohun.tistory.com/319&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711986093209&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;스위프트로 구현하는 자료구조 1: 스택(Stack)&quot; data-og-description=&quot;스택 (Stack) 스택은 LIFO(Last In First Out)의 특징을 가지는 자료구조입니다. 스택은 자료를 저장할 때, 먼저 넣은 데이터를 가장 마지막에 꺼내게 됩니다. 스위프트의 배열은 스택과 동일한 append, remo&quot; data-og-host=&quot;jeonyeohun.tistory.com&quot; data-og-source-url=&quot;https://jeonyeohun.tistory.com/319&quot; data-og-url=&quot;https://jeonyeohun.tistory.com/319&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgUXdF/hyVJZiTj5n/Pys6WLbSiqWNq3a074dwk1/img.png?width=742&amp;amp;height=499&amp;amp;face=0_0_742_499,https://scrap.kakaocdn.net/dn/byUGLH/hyVGIC6IxV/dQ0RMiceVMhPivquOEy2X0/img.png?width=742&amp;amp;height=499&amp;amp;face=0_0_742_499,https://scrap.kakaocdn.net/dn/bUWxpE/hyVGJPxymG/6DbhYTk7unF2G2e76aLY21/img.png?width=742&amp;amp;height=499&amp;amp;face=0_0_742_499&quot;&gt;&lt;a href=&quot;https://jeonyeohun.tistory.com/319&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jeonyeohun.tistory.com/319&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgUXdF/hyVJZiTj5n/Pys6WLbSiqWNq3a074dwk1/img.png?width=742&amp;amp;height=499&amp;amp;face=0_0_742_499,https://scrap.kakaocdn.net/dn/byUGLH/hyVGIC6IxV/dQ0RMiceVMhPivquOEy2X0/img.png?width=742&amp;amp;height=499&amp;amp;face=0_0_742_499,https://scrap.kakaocdn.net/dn/bUWxpE/hyVGJPxymG/6DbhYTk7unF2G2e76aLY21/img.png?width=742&amp;amp;height=499&amp;amp;face=0_0_742_499');&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;스위프트로 구현하는 자료구조 1: 스택(Stack)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스택 (Stack) 스택은 LIFO(Last In First Out)의 특징을 가지는 자료구조입니다. 스택은 자료를 저장할 때, 먼저 넣은 데이터를 가장 마지막에 꺼내게 됩니다. 스위프트의 배열은 스택과 동일한 append, remo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jeonyeohun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kimdee.tistory.com/entry/Swift번역-스위프트의-자료구조와-알고리즘-섹션-2-기초-자료구조-챕터45-스택-스택-도전과제?category=937199&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kimdee.tistory.com/entry/Swift번역-스위프트의-자료구조와-알고리즘-섹션-2-기초-자료구조-챕터45-스택-스택-도전과제?category=937199&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711986125083&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Swift][번역] 스위프트의 자료구조와 알고리즘 - 섹션 2. 기초 자료구조 - 챕터4~5. 스택, 스택 도전&quot; data-og-description=&quot;[Swift][번역] 스위프트의 자료구조와 알고리즘 - 섹션 2. 기초 자료구조 - 챕터4~5. 스택, 스택 도전과제 Raywenderlich.com 에서 나온 Data Structures &amp;amp; Algorithms in Swift 책의 데모 공개본을 번역하였습니다. &quot; data-og-host=&quot;kimdee.tistory.com&quot; data-og-source-url=&quot;https://kimdee.tistory.com/entry/Swift번역-스위프트의-자료구조와-알고리즘-섹션-2-기초-자료구조-챕터45-스택-스택-도전과제?category=937199&quot; data-og-url=&quot;https://kimdee.tistory.com/entry/Swift%EB%B2%88%EC%97%AD-%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8%EC%9D%98-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%84%B9%EC%85%98-2-%EA%B8%B0%EC%B4%88-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%B1%95%ED%84%B045-%EC%8A%A4%ED%83%9D-%EC%8A%A4%ED%83%9D-%EB%8F%84%EC%A0%84%EA%B3%BC%EC%A0%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcRblD/hyVGFM7HRC/QKSdmSRzKIiPap5ht4rL3K/img.png?width=594&amp;amp;height=768&amp;amp;face=0_0_594_768,https://scrap.kakaocdn.net/dn/enctHz/hyVJ0ISl31/ukIIkV1Z5TtYGiszBwddsK/img.png?width=594&amp;amp;height=768&amp;amp;face=0_0_594_768,https://scrap.kakaocdn.net/dn/9zTMe/hyVJ6beye2/w54XeP5wdCUhBuYniR2P60/img.png?width=2316&amp;amp;height=1156&amp;amp;face=0_0_2316_1156&quot;&gt;&lt;a href=&quot;https://kimdee.tistory.com/entry/Swift번역-스위프트의-자료구조와-알고리즘-섹션-2-기초-자료구조-챕터45-스택-스택-도전과제?category=937199&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kimdee.tistory.com/entry/Swift번역-스위프트의-자료구조와-알고리즘-섹션-2-기초-자료구조-챕터45-스택-스택-도전과제?category=937199&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcRblD/hyVGFM7HRC/QKSdmSRzKIiPap5ht4rL3K/img.png?width=594&amp;amp;height=768&amp;amp;face=0_0_594_768,https://scrap.kakaocdn.net/dn/enctHz/hyVJ0ISl31/ukIIkV1Z5TtYGiszBwddsK/img.png?width=594&amp;amp;height=768&amp;amp;face=0_0_594_768,https://scrap.kakaocdn.net/dn/9zTMe/hyVJ6beye2/w54XeP5wdCUhBuYniR2P60/img.png?width=2316&amp;amp;height=1156&amp;amp;face=0_0_2316_1156');&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;[Swift][번역] 스위프트의 자료구조와 알고리즘 - 섹션 2. 기초 자료구조 - 챕터4~5. 스택, 스택 도전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[Swift][번역] 스위프트의 자료구조와 알고리즘 - 섹션 2. 기초 자료구조 - 챕터4~5. 스택, 스택 도전과제 Raywenderlich.com 에서 나온 Data Structures &amp;amp; Algorithms in Swift 책의 데모 공개본을 번역하였습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kimdee.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/24</guid>
      <comments>https://yyomzzi.tistory.com/24#entry24comment</comments>
      <pubDate>Thu, 21 Mar 2024 23:27:34 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers/Lv.1] 자릿수 더하기</title>
      <link>https://yyomzzi.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Lv.1 연습문제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12931&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12931&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710948227771&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12931&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d8c7HA/hyVAAysMuU/3lSAP8f54WYoQ7cA41yPYk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mf5vx/hyVDwHW7jT/02PNQ1gNFQyh9plu0YJG1k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12931&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12931&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d8c7HA/hyVAAysMuU/3lSAP8f54WYoQ7cA41yPYk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mf5vx/hyVDwHW7jT/02PNQ1gNFQyh9plu0YJG1k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;자릿수 더하기&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;N의 범위 : 100,000,000 이하의 자연수&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내 답안&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710948292344&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func solution(_ n: Int) -&amp;gt; Int {
    var result = 0
    var str = String(n)
    for i in str {
        result += Int(String(i))!
    }
    return result
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;풀이&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. &amp;nbsp;n&amp;nbsp;의 각 자릿수의 숫자를 가져오기 위해 먼저 String으로 바꿔준다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜냐면 &lt;b&gt;String&lt;/b&gt; 타입은 &lt;b&gt;Character 타입 요소들의 Collection으로 간주&lt;/b&gt;되기 때문에 문자 하나하나를 Character 타입으로 가져올 수 있음!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(String은 Collection 프로토콜을 준수하고 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. &lt;b&gt;String(n)&lt;/b&gt;의 값을 가진 변수 &lt;b&gt;str &lt;/b&gt;을 &lt;b&gt;for-in 반복문&lt;/b&gt;으로 Character 하나씩 꺼내서 다시 Int 형으로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 루프 상수 &amp;nbsp;i 는 타입이 &lt;b&gt;Character&lt;/b&gt;이기 때문에 먼저 &lt;b&gt;String으로 변환한 후에 Int로 변환 가능&lt;/b&gt;함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;String에서 Int로 형변환 할때는 옵셔널 타입이기 때문에 언래핑 해줘야함. 근데 여기서는 무조건 Int로 변환 될 것이라고 예상하기 때문에 강제언래핑 해줌 (반대로 Int에서 String으로 형변환할때는 옵셔널 아님. 무조건 변환 가능하기 땜시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. Int로 변환한 값을 result 변수에 더해서 다시 값을 할당한다.&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 답안&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1710949574218&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func solution(_ n: Int) -&amp;gt; Int {
    return String(n).map { Int(String($0))! }.reduce(0) { $0 + $1 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 예전에 Lv.0 에서 같은 문제를 풀었었고 이전에 통과 했던 답변 ,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;n을 String으로 형변환해서 Collection 으로 만들고 &lt;b&gt;map 고차함수&lt;/b&gt;를 이용해서 클로져에 넘겨받는 Character 요소들을 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String -&amp;gt; Int 형변환하고 강제언래핑 해준다. 그리고 &lt;b&gt;reduce 고차함수&lt;/b&gt;로 0부터 요소 하나씩 더해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;고차함수를 꼭 사용할 필요는 없겠지만,, 이용하면 아주쥬주주 간단해질 수 있는 부분..!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예전에 풀었던 문제인데 ,, 너무 오랜만에 코테 공부를 했더니 고새 다 까먹어버린 ,,^^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;넘 충격적이여서 블로깅 해본다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 이전에 Lv.0 에서 풀었을 때는 그냥 다른 사람들이 Int타입에서 자릿수마다의 요소 하나씩 가져올 때 String으로 변환해서 사용하길래&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아무 생각없이 그냥 따라 사용해서 기억에 안남았던듯 함..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜 이렇게 사용하는가 정확히 알고싶어서 문자와 문자열에 대해 찾아봤고, Int 를 String으로 형변환하는 이유가 &lt;span style=&quot;color: #ee2323;&quot;&gt;String이 Character 타입 요소들의 Collection&lt;/span&gt; 이라는 것을 알게 되었음! 그래서 마치 배열처럼 사용할 수 있던거였움!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아주 예전에 알고있었던 것 같은데 완전히 잊어버리고 있다가 이번에 다시 공부하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 조만간 문자와 문자열 공식문서도 한 번 파볼 예정 ,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding Test</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/23</guid>
      <comments>https://yyomzzi.tistory.com/23#entry23comment</comments>
      <pubDate>Thu, 21 Mar 2024 00:59:08 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] Custom Calendar을 만들어보자</title>
      <link>https://yyomzzi.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;드디어&lt;/span&gt; 모공모공 의 첫 출시 앱  &lt;b&gt;&lt;span style=&quot;color: #ff7e7e;&quot;&gt;SYM-Speak Your Mind&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;의 개발이 거의 끝났댜 ㅎㅅㅎ!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에 감정일기 앱 프로젝트를 하면서 아무래도 일기인만큼 캘린더 기능이 필수적이라고 생각했고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;거기에 우리는 외부 라이브러리 없이 &lt;b&gt;Custom&lt;/b&gt;으로 캘린더를 만들어보는게 목표였움&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사실 내가 핸드폰에서 제일 많이 쓰는 기능이 캘린더 이기도 하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이전부터 캘린더는 한 번 만들어보고 싶어서 ,, 캘린더UI 구현해보겠다고 자원하긴 했눈데,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;생각보다 어렵고 까다로운 ,,,ㅜ 그리고 참고할만한 자료가 많이 없기도 했었다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다행히 좋은 레퍼런스들을 찾아서  어찌저찌 완성한 캘린더✨✨✨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;어떻게 구현했는지 보면서 핵심들을 한 번 쇽쇽 뽑아봅시당 &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;일단 캘린더가 우째 생겼는지 먼저 보시죠잉&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vllo.GIF&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6Df5/btsF9buaA0J/GxQAnA9jbO4GVyo004kUTk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6Df5/btsF9buaA0J/GxQAnA9jbO4GVyo004kUTk/img.gif&quot; data-alt=&quot;출시 후 실제 앱 사용시 이미지로 바꿈!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6Df5/btsF9buaA0J/GxQAnA9jbO4GVyo004kUTk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/l6Df5/btsF9buaA0J/GxQAnA9jbO4GVyo004kUTk/img.gif&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;300&quot; height=&quot;1280&quot; data-filename=&quot;vllo.GIF&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;1280&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;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;일단 캘린더의 구조를 보자면 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1️⃣ 현재 보여지는 캘린더의 연도(year)와 월(month)가 상단에 위치함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 연도와 월 레이블 옆에 아래로 향하는 화살표 버튼을 탭하면 Picker가 나타나서 다른 연도와 월로 이동할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2️⃣ 요일(weekday) 레이블이 위치함. 일요일일 경우에는 foregroundColor를 빨간색으로 설정함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3️⃣ 해당 연도의 월에 맞는 날짜가 캘린더 모습으로 나타남.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4️⃣ 우리는 일기를 작성하고 캘린더에서 확인할 수 있는 앱이라서 일기를 작성한 날과 아닌 날짜의 글자색을 다르게 설정함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;⭕️ 해당 날짜에 일기가 있는 경우 : 글자색을 진하게 표시하게 날짜 아래 red dot이 나타남&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;❌ 해당 날짜에 일기가 없는 경우 : 글자색을 연하게 표시하고 dot 나타나지 않음(white로 표시)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5️⃣ 오늘 날짜일 경우에는 날짜 위에 &quot;오늘&quot; 레이블 표시함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6️⃣ 날짜를 선택하면 선택된 날짜 배경에 pink circle 표시됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7️⃣ 캘린더 Drag Gesture로 양 옆으로 넘어감&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;이렇게 정리해볼 수 있겠음!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 글에서는 캘린더의 큰 뼈대가 되는 부분들만 한 번 훑어볼게용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 연도 &amp;amp; 월 헤더뷰&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-28 오후 3.26.05.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uIVqe/btsGbCw5FzM/LvarMkOTNOktsBIyykTwdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uIVqe/btsGbCw5FzM/LvarMkOTNOktsBIyykTwdk/img.png&quot; data-alt=&quot;YearMonthHeaderView&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uIVqe/btsGbCw5FzM/LvarMkOTNOktsBIyykTwdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuIVqe%2FbtsGbCw5FzM%2FLvarMkOTNOktsBIyykTwdk%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;350&quot; height=&quot;498&quot; data-filename=&quot;스크린샷 2024-03-28 오후 3.26.05.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;637&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;YearMonthHeaderView&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;size18&quot;&gt;먼저, 사용자가 캘린더의 날짜를 변경하기 전 가장 먼저 보이는 캘린더는 현재 날짜의 캘린더가 보여야겠죠잉&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 현재 날짜의 &lt;b&gt;Year와 Month&lt;/b&gt;를 한 번 뽑아봅시댜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저희는 MVVM으로 구현했기 때문에 View와 ViewModel이 분리되어있어서 좀 코드가 복잡시럽지만 나눠서 써봅니댜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ViewModel&lt;/b&gt; 먼저 보자면,&lt;/p&gt;
&lt;pre id=&quot;code_1711607620731&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Published var currentDate: Date = Date()

/// 현재 연도, 월 String으로 변경하는 formatter로 배열 구하는 함수
func getYearAndMonthString(currentDate: Date) -&amp;gt; [String] {
    let formatter = DateFormatter()
    formatter.dateFormat = &quot;YYYY MMMM&quot;
    formatter.locale = Locale(identifier: &quot;ko_kr&quot;)
        
    let date = formatter.string(from: currentDate)
    return date.components(separatedBy: &quot; &quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #fff0f0;&quot;&gt;&lt;b&gt;  func getYearAndMonthString&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 함수는 Date를 파라미터로 받아서 [String]을 리턴하는 함수죠잉&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파라미터로 받는 currentDate를 viewModel에 프로퍼티로 생성하고 Date()로 해서 현재 날짜로 초기화함다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DateFormatter&lt;/b&gt;를 이용해서 dateFormat과 locale을 설정해준 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;currentDate를 설정해준 formatter를 이용해서 string으로 변환하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;components&lt;/b&gt; 함수를 이용해서 연도와 월을 나눠 각각 배열의 아이템으로 만들어줍니닷&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수를 이용해서 Date()의 연도와 월을 알아내면 이런 결과가 나타납니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(locale을 설정하지 않으면 3월이 March로 나온답니당)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-28 오후 4.14.10.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sbeHo/btsF8wyBxPT/T8Zhwy1lO1xR3VdXT02LzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sbeHo/btsF8wyBxPT/T8Zhwy1lO1xR3VdXT02LzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sbeHo/btsF8wyBxPT/T8Zhwy1lO1xR3VdXT02LzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsbeHo%2FbtsF8wyBxPT%2FT8Zhwy1lO1xR3VdXT02LzK%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;500&quot; height=&quot;413&quot; data-filename=&quot;스크린샷 2024-03-28 오후 4.14.10.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;413&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;size18&quot;&gt;그리고 View에서&lt;/p&gt;
&lt;pre id=&quot;code_1711609743862&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Text(&quot;\(calendarViewModel.getYearAndMonthString(currentDate: calendarViewModel.currentDate)[0])년 
\(calendarViewModel.getYearAndMonthString(currentDate: calendarViewModel.currentDate)[1])&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 만든 함수를 뷰모델에서 가져옵니다. 파라미터 역시 뷰모델에서 생성해준 currentDate 프로퍼티를 넣어줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 연도와 월의 헤더뷰는 완성!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(Picker 부분은 좀 ,, 많이 복잡시러워서 나중에 추가로 적어놓을게요!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Weekday 헤더뷰&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-28 오후 3.26.22.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r1ea8/btsGbROnIpY/7434f0SevKu76xeYkmyYkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r1ea8/btsGbROnIpY/7434f0SevKu76xeYkmyYkK/img.png&quot; data-alt=&quot;WeekdayHeaderView&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r1ea8/btsGbROnIpY/7434f0SevKu76xeYkmyYkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr1ea8%2FbtsGbROnIpY%2F7434f0SevKu76xeYkmyYkK%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;350&quot; height=&quot;502&quot; data-filename=&quot;스크린샷 2024-03-28 오후 3.26.22.png&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WeekdayHeaderView&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;size18&quot;&gt;weekday 헤더뷰는 참 쉬어가는 타임입니당ㅎ&lt;/p&gt;
&lt;pre id=&quot;code_1711610495036&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct WeekdayHeaderView: View {

    private let weekday: [String] = [&quot;일&quot;, &quot;월&quot;, &quot;화&quot;, &quot;수&quot;, &quot;목&quot;, &quot;금&quot;, &quot;토&quot;]
    
    var body: some View {
        HStack {
            ForEach(weekday, id: \.self) { day in
                Text(day)
                    .font(.callout)
                    .fontWeight(.semibold)
                    .frame(maxWidth: .infinity)
                // 만약 일요일이라면 글씨색 red
                    .foregroundStyle(day == &quot;일&quot; ? Color.errorRed : Color.symBlack)
            }
        }
        .padding(.bottom, 5)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;weekday 라는 문자열 배열을 만들어 요일을 담아줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 &lt;b&gt;ForEach&lt;/b&gt;로 weekday를 하나씩 꺼내서 Text에 담아주고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&quot;일&quot;요일 일때만 foregroundStyle을 바꿔주면 됩니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Date(날짜) View&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-28 오후 3.26.39.png&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qccuj/btsF92i4j6b/3fmPD0DRvdM1hYqKspQhI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qccuj/btsF92i4j6b/3fmPD0DRvdM1hYqKspQhI1/img.png&quot; data-alt=&quot;DatesGridView &amp;amp;amp; DateButton&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qccuj/btsF92i4j6b/3fmPD0DRvdM1hYqKspQhI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQccuj%2FbtsF92i4j6b%2F3fmPD0DRvdM1hYqKspQhI1%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;350&quot; height=&quot;503&quot; data-filename=&quot;스크린샷 2024-03-28 오후 3.26.39.png&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DatesGridView &amp;amp; DateButton&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하핫 여기서부터 조금 ,, 많이 ,,, 까다롭쥬 ,,~?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일단 코드부터 봅시다잉&lt;/p&gt;
&lt;pre id=&quot;code_1711611075133&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; 
struct DateValue: Identifiable {
    var id: String = UUID().uuidString
    var day: Int
    var date: Date
}


 
final class CalendarViewModel {

    ...
    
    @Published var currentDate: Date = Date()
    @Published var currentMonth: Int = 0
    
    ...
    
    /// 현재 캘린더에 보이는 month 구하는 함수
    func getCurrentMonth(addingMonth: Int) -&amp;gt; Date {
        // 현재 날짜의 캘린더
        let calendar = Calendar.current
        
        // 현재 날짜의 month에 addingMonth의 month를 더해서 새로운 month를 만들어
        // 만약 오늘이 1월 27일이고 addingMonth에 2를 넣으면 3월 27일이됨
        guard let currentMonth = calendar.date(
      	 	 byAdding: .month, 
      	 	 value: addingMonth, 
      		 to: Date()
        ) else { return Date() }
        
        return currentMonth
    }
    
    /// 해당 월의 모든 날짜들을 DateValue 배열로 만들어주는 함수, 모든 날짜를 배열로 만들어야 Grid에서 보여주기 가능
    func extractDate(currentMonth: Int) -&amp;gt; [DateValue] {
        let calendar = Calendar.current
        
        // getCurrentMonth가 리턴한 month 구해서 currentMonth로
        let currentMonth = getCurrentMonth(addingMonth: currentMonth)
        
        // currentMonth가 리턴한 month의 모든 날짜 구하기
        var days = currentMonth.getAllDates().compactMap { date -&amp;gt; DateValue in
            // 여기서 date = 2023-12-31 15:00:00 +0000
            let day = calendar.component(.day, from: date)
            
            // 여기서 DateValue = DateValue(id: &quot;6D2CCF74-1217-4370-B3AC-1C2E2D9566C9&quot;, day: 1, date: 2023-12-31 15:00:00 +0000)
            return DateValue(day: day, date: date)
        }
        
        // days로 구한 month의 가장 첫날이 시작되는 요일구하기
        // Int값으로 나옴. 일요일 1 ~ 토요일 7
        let firstWeekday = calendar.component(.weekday, from: days.first?.date ?? Date())
        
        // month의 가장 첫날이 시작되는 요일 이전을 채워주는 과정
        // 만약 1월 1일이 수요일에 시작된다면 일~화요일까지 공백이니까 이 자리를 채워주어야 수요일부터 시작되는 캘린더 모양이 생성됨
        // 그래서 만약 수요일(4)이 시작이라고 하면 일(1)~화(3) 까지 for-in문 돌려서 공백 추가
        // 캘린더 뷰에서 월의 첫 주를 올바르게 표시하기 위한 코드
        for _ in 0 ..&amp;lt; firstWeekday - 1 {
            // 여기서 &quot;day: -1&quot;은 실제 날짜가 아니라 공백을 표시한 개념, &quot;date: Date()&quot;도 임시
            days.insert(DateValue(day: -1, date: Date()), at: 0)
        }
        
        return days
    }
    
    ...
    
 }
 
  
 extension Date {
      
    // 현재 월의 날짜를 Date 배열로 만들어주는 함수
    func getAllDates() -&amp;gt; [Date] {
        // 현재날짜 캘린더 가져오는거
        let calendar = Calendar.current
        // 현재 월의 첫 날(startDate) 구하기 -&amp;gt; 일자를 지정하지 않고 year와 month만 구하기 때문에 그 해, 그 달의 첫날을 이렇게 구할 수 있음
        let startDate = calendar.date(from: Calendar.current.dateComponents([.year, .month], from: self))!
        // 현재 월(해당 월)의 일자 범위(날짜 수 가져오는거)
        let range = calendar.range(of: .day, in: .month, for: startDate)!
        // range의 각각의 날짜(day)를 Date로 맵핑해서 배열로!!
        return range.compactMap { day -&amp;gt; Date in
            // to: (현재 날짜, 일자)에 day를 더해서 새로운 날짜를 만듦
            calendar.date(byAdding: .day, value: day - 1, to: startDate) ?? Date()
        }
    }
}&lt;/code&gt;&lt;/pre&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;size18&quot;&gt;하핫 저도 이해하기가 너무 어려워서,, 주석을 조금 많이 남겼답니다 ^,^ 하핫&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사실 주석만 보셔도 어느정도 이해할 수 있지만 좀 더 자세히 써보겠숨다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일단, 참고한 영상에서는 &lt;b&gt;DateValue&lt;/b&gt;라는 구조체를 만들어서 날짜 하나하나를 DateValue로 만들더라구용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 &lt;b&gt;날짜 하나하나의 실제 Date와 day(날짜만 의미)를 DateValue&lt;/b&gt;로 담게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #fff0f0; color: #000000;&quot;&gt;&lt;b&gt;  func &lt;span style=&quot;text-align: start;&quot;&gt;getCurrentMonth(addingMonth: Int) -&amp;gt; Date&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Calendar.current&lt;/b&gt; 를 통해 현재 날짜의 캘린더 구조체를 가져와서 현재 month 를 얻을 수 있습니당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기서는 &lt;b&gt;addingMonth&lt;/b&gt;를 파라미터로 갖게 되는데, 이는 현재 month에서 얼마나 add 되는 month를 구할것인지를 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예를 들어, 현재가 3월 11일이라고 가정한다면 Calendar.current를 통해 현재 날짜를 가져오고&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711617145154&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;date(byAdding component: Calendar.Component, value: Int, to date: Date) -&amp;gt; Date?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;함수를 통해서 month에 addingMonth를 더해줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;만약 addingMonth를 2로 준다면 3월에 2가 더해져서 5월을 얻게 되어 5월 11일을 리턴할거에옹&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저희 앱에서는 &lt;b&gt;drag gesture&lt;/b&gt;로 오른쪽으로 넘기면 이전 month로, 왼쪽으로 넘기면 다음 month로 넘어가게 구현했어용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(참고한 영상에서는 버튼으로 넘기더라구용!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 함수는 바로 밑의 extractDate 함수에서 사용됩니당.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #fff0f0; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;  func extractDate(currentMonth: Int) -&amp;gt; [DateValue]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 함수가 핵심이라고 생각하는데용! 이 함수로 month 의 실제 날짜들을 가져올 수 있슴다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기는 좀,, 뭔가 많아서 나눠서 설명을 해볼게용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서도 먼저 Calendar.current로 현재 날짜의 캘린더를 가져온 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파라미터로 받는 currentMonth를 이용해서 위에서 만든 getCurrentMonth 함수로 현재 캘린더에서 보여지는 month를 구합니다&lt;/p&gt;
&lt;pre id=&quot;code_1711614762068&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let currentMonth = getCurrentMonth(addingMonth: currentMonth)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(생각해보니까 파라미터명이랑 함수 내부에서 사용되는 currentMonth 상수랑 이름이 같네요ㅠ 고쳐야겠어요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런 후에, month가 정해지면 그 month의 days들을 불러올거에용!&lt;/p&gt;
&lt;pre id=&quot;code_1711614799152&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// currentMonth가 리턴한 month의 모든 날짜 구하기
var days = currentMonth.getAllDates().compactMap { date -&amp;gt; DateValue in

    // 여기서 date = 2023-12-31 15:00:00 +0000
    let day = calendar.component(.day, from: date)
            
    // 여기서 DateValue = DateValue(id: &quot;6D2CCF74-1217-4370-B3AC-1C2E2D9566C9&quot;, day: 1, date: 2023-12-31 15:00:00 +0000)
    return DateValue(day: day, date: date)
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 사용되는데 가장 아래에 있는 Date extension으로 만들어준 &lt;b&gt;getAllDates()&lt;/b&gt; 입니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 날짜가 속한 month의 모든 날을 Date 형식의 배열로 만들어서 가져오는 것이죵&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를 들어, 3월이면 1일부터 31일까지의 날짜를 [Date]에 담아서 리턴합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이걸 이용해서 우리가 구한 currentMonth의 날짜들을 다 가져올거에옹&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;currentMonth.getAllDates()를 &lt;b&gt;compactMap&lt;/b&gt;으로 &lt;b&gt;Date를 DateValue로 맵핑&lt;/b&gt;해줄거에여&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 calendar.component를 이용해서 date의 .day만 가져와서 day로 만들어&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DateValue의 day로 받습니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이게 뭔 ,,,, 소리쥬,,,? 하시쥬? 저만 이해하기 어렵나유?ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를 들어, 3월의 모든 날을 가져온다고 하면 1일부터 31일까지의 날들을 compactMap으로 맵핑해줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 3월 1일을 가져와서 &quot;1일&quot;만 빼서 day에 넣고 DateValue로 맵핑을 하면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711614847103&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DateValue(id: &quot;여기는UUID자리&quot;, day: 1, date: 2023-12-31 15:00:00 +0000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요로케 바뀝니다. 그렇게 2일도,,3일도,,, 쭈욱 ,,, 31일까지 다 맵핑이 되어 DateValue의 배열로 생성되는 것이지용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;근데 왜 DateValue(&lt;u&gt;&lt;b&gt;day&lt;/b&gt;&lt;/u&gt;: 1, &lt;u&gt;&lt;b&gt;date&lt;/b&gt;&lt;/u&gt;: 2024-02-29 15:00:00 +0000) day랑 date가 다를까용?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;day는 절대적 날짜인 3월 1일에서 &quot;1&quot;만 가져온 것이지만, date는 UTC를 기준으로 하기 때문에 다릅니당~~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 locale과 TimeZone 설정만 잘해주면 되겠죠잉&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇다면 이제 날짜를 구했으니!! 각 날짜마다의 요일을 정해줍시당&lt;/p&gt;
&lt;pre id=&quot;code_1711614947121&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let firstWeekday = calendar.component(.weekday, from: days.first?.date ?? Date())

for _ in 0 ..&amp;lt; firstWeekday - 1 {
       days.insert(DateValue(day: -1, date: Date()), at: 0)
   }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서도 역시 &lt;b&gt;calendar.component&lt;/b&gt;를 통해 위에서 구한 days의 첫번째의 date에서 요일만 쏙 뽑아옵니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;days의 &lt;b&gt;first&lt;/b&gt;니까 &lt;b&gt;1일&lt;/b&gt;을 뜻하겠죠잉&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그니까 결국 각 month들의 1일의 요일을 가져오는것입니당&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 &lt;b&gt;firstWeekday&lt;/b&gt;는 &lt;b&gt;Int&lt;/b&gt; 타입을 가질거에요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;왜냐면 component의 .weekday는 일요일부터 시작해서 토요일까지 &lt;b&gt;1~7 숫자&lt;/b&gt;로 표현되기 때문이에용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(일요일 = 1, 월요일 = 2, 화요일 = 3, ... , 토요일 = 7)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;근데 .. 밑에 for-in 구문은 무엇이쥬? 이것은 바로 month의 가장 &lt;b&gt;첫날의 요일 이전을 채워주는 과정&lt;/b&gt;입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이게 무슨 소리냐하면!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-28 오후 5.39.34.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUpVse/btsF94g05Cg/n6lknLgHsr7eg5IKQHT0qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUpVse/btsF94g05Cg/n6lknLgHsr7eg5IKQHT0qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUpVse/btsF94g05Cg/n6lknLgHsr7eg5IKQHT0qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUpVse%2FbtsF94g05Cg%2Fn6lknLgHsr7eg5IKQHT0qK%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;500&quot; height=&quot;366&quot; data-filename=&quot;스크린샷 2024-03-28 오후 5.39.34.png&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;469&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;size18&quot;&gt;이렇게 2월을 예시로 들자면, 2월 1일이 목요일부터 시작하니까 캘린더에서 앞에 일요일부터 수요일까지가 비어있어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비어있는 이 부분을 채워줘야 우리가 원하는 &lt;b&gt;목요일에 1일이 시작되는 캘린더 모양&lt;/b&gt;을 가질 수가 있어용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비어있는 부분은 0으로 나타나게 되고 1일이 시작되어야 1, 2, 3 .. 이렇게 날짜로 표시됩니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 &lt;b&gt;for-in 문&lt;/b&gt;으로 요일들을 반복해서 해당 요일들에 비어있는 0 부분이 있다면 -1 로 채우겠다~는 뜻이에용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(여기서 -1은 아무의미 없고 그냥 공백을 표시한 개념이라고 생각해주시면 되공 date: Date()도 큰 의미 없어용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇게 해서 days를 return 해주면!&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;드 ⭐️ 디 &amp;nbsp;⭐️ 어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;캘린더 모양에 쇽쇽 넣어줄 준비가 완료됩니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇다면 캘린더에 넣어줍시당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1711615867634&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct DatesGridView: View {
    @ObservedObject var calendarViewModel: CalendarViewModel
    
    private let columns = Array(repeating: GridItem(.flexible()), count: 7)
    
    var body: some View {
        // 달력 그리드
        LazyVGrid(columns: columns, spacing: 10) {
            ForEach(calendarViewModel.extractDate(currentMonth: calendarViewModel.currentMonth)) { value in
                if value.day != -1 {
                    DateButton(value: value, 
                               calendarViewModel: calendarViewModel,
                               selectDate: $calendarViewModel.selectDate)
                        .onTapGesture {
                            calendarViewModel.checkingDate = value.date
                            calendarViewModel.popupDate = true
                            calendarViewModel.checkingDateFuture()
                        }
                } else {
                    // 날짜 공백때문에 -1이 있을경우 숨긴다
                    Text(&quot;\(value.day)&quot;).hidden()
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;어떻게 넣어주었냐아!!!!!하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;바로 &lt;b&gt;LazyVGrid&lt;/b&gt;를 사용해서 넣어주었습니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;columns&lt;/b&gt; 상수를 만들어서 &lt;b&gt;GridItem&lt;/b&gt;을 7개씩 넣어주겠다고 선언해서 사용했습니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 위에서 우리가 열심히 만든 extractDate를 ForEach로 돌려서 value 값을 사용하는 것이죵&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 &lt;b&gt;value는 DateValue니까 DateValue 구조체의 day와 date&lt;/b&gt;를 야무지게 사용할 수 있습니당.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;&lt;b&gt;if value.day != -1&lt;/b&gt;&lt;/u&gt; 을 보면 이것이 바러바러 빈공간 채워주기 했던!! 그것이에용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 -1이라면 (== 빈공간이라면, 1일 이전이라면!!) hidden 처리해서 아예 안보이게 했어용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저는 날짜 하나하나를 button으로 만들어서 사용해서 DateButton으로 해놓았어용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요기는 이제 커스텀하기 나름이겠죠잉!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 LazyVGrid로 아이템을 7개씩 넣어주어서 요일에 맞게 날짜를 넣어줄수가 있어용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 하면 핵심적인 캘린더 만들기는 오나료입니당‼️‼️&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사실 한 번 정리해보는게 목적이었는데 ,, 혹시라도 누가 참고하실 수도 있다는 생각에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아주 구구절절쓰 설명이 길어졌네유,,~&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;혹시라도 참고하시는 분이 계시다면 ,,, 이해 안가는 부분이 있으시다면 ,,!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;댓글 남겨주시면 아는 선에서 저도 답글 남기겠습니다 &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래 레퍼런스를 남기겠지만 좋은 영상과 블로그를 찾아서 많이 도움받고 참고했습니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;원글과 영상 원본을 참고하시면 더 명확히 도움 받으실거에옹ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;자세한 코드는 저희&lt;a href=&quot;https://github.com/Good-MoGong/SYM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 모공모공 깃허브&lt;/a&gt; 놀러와서 봐주시면 됩니댜 &amp;gt;,&amp;lt;!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(그리고 이참에 우리  SYM  앱 한 번 다운로드 받으셔서 사용해주시는 것도 ,,ㅎㅎ )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://green1229.tistory.com/362&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://green1229.tistory.com/362&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711616809011&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;SwiftUI로 캘린더 직접 구현하기&quot; data-og-description=&quot;안녕하세요. 그린입니다  이번 포스팅에서는 오랜만에 SwiftUI로 뚝닥뚝닥 해보는 시간입니다  뭘 뚝닥뚝닥 해볼지 고민하다가 그냥 밑도 끝도 없이 캘린더를 간단하게 직접 만들어보고 &quot; data-og-host=&quot;green1229.tistory.com&quot; data-og-source-url=&quot;https://green1229.tistory.com/362&quot; data-og-url=&quot;https://green1229.tistory.com/362&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6PrcB/hyVDFGJ6RR/ikpaT3NgO88toX1K2ExNnK/img.png?width=399&amp;amp;height=338&amp;amp;face=0_0_399_338,https://scrap.kakaocdn.net/dn/UpPT0/hyVGTwzZTy/fDakPBrnf62M7C9BZJJsAK/img.png?width=399&amp;amp;height=338&amp;amp;face=0_0_399_338,https://scrap.kakaocdn.net/dn/cjLwvW/hyVDuysjYW/QedLASBZUPStGl5R3S42Gk/img.png?width=399&amp;amp;height=338&amp;amp;face=0_0_399_338&quot;&gt;&lt;a href=&quot;https://green1229.tistory.com/362&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://green1229.tistory.com/362&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6PrcB/hyVDFGJ6RR/ikpaT3NgO88toX1K2ExNnK/img.png?width=399&amp;amp;height=338&amp;amp;face=0_0_399_338,https://scrap.kakaocdn.net/dn/UpPT0/hyVGTwzZTy/fDakPBrnf62M7C9BZJJsAK/img.png?width=399&amp;amp;height=338&amp;amp;face=0_0_399_338,https://scrap.kakaocdn.net/dn/cjLwvW/hyVDuysjYW/QedLASBZUPStGl5R3S42Gk/img.png?width=399&amp;amp;height=338&amp;amp;face=0_0_399_338');&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;SwiftUI로 캘린더 직접 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 그린입니다  이번 포스팅에서는 오랜만에 SwiftUI로 뚝닥뚝닥 해보는 시간입니다  뭘 뚝닥뚝닥 해볼지 고민하다가 그냥 밑도 끝도 없이 캘린더를 간단하게 직접 만들어보고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;green1229.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/UZI2dvLoPr8?si=Bjw7mq8FK7HnExh4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/UZI2dvLoPr8?si=Bjw7mq8FK7HnExh4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=UZI2dvLoPr8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/vBxK4/hyVDCXyDVj/s5MfVSCORmd9K8saCCY5M0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/UZI2dvLoPr8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SwiftUI</category>
      <category>Calendar</category>
      <category>custom calendar</category>
      <category>SwiftUI Calendar</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/20</guid>
      <comments>https://yyomzzi.tistory.com/20#entry20comment</comments>
      <pubDate>Mon, 11 Mar 2024 22:31:38 +0900</pubDate>
    </item>
    <item>
      <title>[HIG] Human Interface Guidelines(1) - Designing for iOS</title>
      <link>https://yyomzzi.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처음으로 기획자, 디자이너님과 함께 하는 프로젝트를 진행하고 있숨다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;물론 기획자님과 디자이너님이 좋은 아이디어를 매주 뿜뿜 해주시지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;개발자로 UI/UX 관점에서 의견을 제시할 때 더 효과적으로 소통할 수 있는 방법이 뭘까 생각하다 보니!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;앱스쿨에서 살짝 찍먹 했던 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;HIG&lt;/b&gt;&lt;/span&gt; 가 생각이 났댜 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 겸사겸사 공부해 보는 HIG 공식문서 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오늘은 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;iOS 전체적인 설계&lt;/b&gt;&lt;/span&gt;에 대해서 본 후에 세부적인 내용들도 슬쩍 보려고 한닷&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;HIG (Human Interface Guidelines)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;모든 Apple 플랫폼에서 탁월한 사용자 경험을 제공하기를 원하는 개발자와 디자이너를 위한 종합 Resources.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Apple이 Apple다운 앱을 만들 수 있는 기술과 디자인을 다룬 문서라고 생각하면 될 듯!&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Designing&amp;nbsp;for&amp;nbsp;iOS&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW0UfZ/btsGcPZcQ9R/uykz81LcZilrss4a2lMTZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW0UfZ/btsGcPZcQ9R/uykz81LcZilrss4a2lMTZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW0UfZ/btsGcPZcQ9R/uykz81LcZilrss4a2lMTZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW0UfZ%2FbtsGcPZcQ9R%2Fuykz81LcZilrss4a2lMTZK%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;1157&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사람들은 어디에서나, 그리고 이동하는 중에도 연결 상태를 유지하고, 게임을 하고, 미디어를 시청하고, 작업을 수행하고, 개인 데이터를 추적하기 위해 iPhone에 의존한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;iOS용 앱이나 게임을 설계하기 시작할 때, iOS 경험을 구분하는 기본적인 장치 특성과 패턴을 이해하는 것부터 시작하자.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;당신의 디자인 결정에 대해 알릴 때 이러한 특성과 패턴을 사용하는 것은 iPhone 사용자가 좋아하는 앱이나 게임을 제공하는데 도움이 될 수 있다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아이폰을 사용하는 대부분의 사람들은 정말 모든 시간에 어떤 작업을 수행하든 아이폰에 의존할 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 아이폰에서 구동되는 앱이나 게임을 설계할 때, 아이폰 기기의 특성과 패턴을 이해한다면 사용자에게 더 나은 앱이나 게임과 같은 서비스를 제공할 수 있다는 뜻!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇다면 iOS 경험을 구분 짓는 기본적인 장치 특성과 패턴을 알아보쟈쟛&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Display (디스플레이)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ &lt;span style=&quot;color: #000000;&quot;&gt;iPhone은 중간 사이즈와 고해상도 디스플레이를 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Ergonomics (인체공학)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ &lt;span style=&quot;color: #000000;&quot;&gt;사용자들은 일반적으로 iPhone을 한 손 혹은 양손으로 들고 상호작용하며, 필요에 따라 가로 방향과 세로 방향으로 전환한다. 사람들이 디바이스(iPhone)와 상호작용하는 동안, 그들의 시야 거리는 한 두 피트를 넘지 않는다. (1 피트: 30.48 cm)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Inputs (입력)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ &lt;span style=&quot;color: #000000;&quot;&gt;멀티터치 제스처, 화면 키보드, 음성제어는 사람들이 이동하는 중에도 그들이 행동을 수행하고 의미 있는 작업을 완료할 수 있도록 한다. 게다가 사람들은 종종 앱이 그들의 개인 데이터나 기기의 자이로스코프 및 가속도계로부터 입력을 사용하기를 원하며, 공간적 상호작용에 참여하기를 원하기도 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;u&gt;자이로스코프 및 가속도계&lt;/u&gt;: 앱이나 게임에서 사용자의 실시간 움직임에 기반한 경험을 제공할 수 있도록 하는 데이터라고 합미다. Core Motion이 예시라고 하네용!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;u&gt;공간적 상호작용&lt;/u&gt;: 근접 상호작용. 예를 들어, 에어팟이 iPhone이나 맥북에 가까이 있을 때 에어팟을 인식해서 연결되는 것 같은 것을 말합니당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;App interactions(앱 상호작용)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️ &lt;span style=&quot;color: #000000;&quot;&gt;때때로 사람들은 이벤트나 소셜 미디어 업데이트를 확인하거나 데이터를 추적하고 메시지를 보내는데 단 1-2분만 사용한다. 반면에 웹을 탐색하거나 게임을 하거나 혹은 미디어를 즐기는 데에는 한 시간 이상 사용하기도 한다. 사람들은 일반적으로 동시에 여러 개의 앱을 사용하고, 여러 앱들끼리 자주 전환하기도 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;System features(시스템 기능)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✔️&lt;span style=&quot;color: #000000;&quot;&gt; iOS는 사람들이 시스템과 그들의 앱을 친숙하고 일관된 방식으로 상호작용 할 수 있도록 돕는 몇 가지 방식을 제공한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;▪️ &lt;span style=&quot;color: #000000;&quot;&gt;Widgets (위젯)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▪️ Home Screen quick actions&lt;/span&gt; : 홈 배경에서 앱 아이콘 길게 탭 하면 나오는 동작 메뉴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vllo 2.GIF&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JwTtM/btsGeuGpoPY/KCerD737zcCrq9OL3CzT11/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JwTtM/btsGeuGpoPY/KCerD737zcCrq9OL3CzT11/img.gif&quot; data-alt=&quot;Home Screen quick actions&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JwTtM/btsGeuGpoPY/KCerD737zcCrq9OL3CzT11/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/JwTtM/btsGeuGpoPY/KCerD737zcCrq9OL3CzT11/img.gif&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;250&quot; height=&quot;541&quot; data-filename=&quot;vllo 2.GIF&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Home Screen quick actions&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;size18&quot;&gt;▪️&lt;span style=&quot;color: #000000;&quot;&gt;Spotlights&lt;/span&gt; : 홈 화면에서 검색하고 앱을 빠르게 찾을 수 있도록 하는 기능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-31 오전 1.05.21.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAULxN/btsGe6548UH/lAkCeAC699A4ORU5ujgkT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAULxN/btsGe6548UH/lAkCeAC699A4ORU5ujgkT0/img.png&quot; data-alt=&quot;Spotlights (아래 저거래여,,! 몰랐던,,ㅎ)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAULxN/btsGe6548UH/lAkCeAC699A4ORU5ujgkT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAULxN%2FbtsGe6548UH%2FlAkCeAC699A4ORU5ujgkT0%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;550&quot; height=&quot;564&quot; data-filename=&quot;스크린샷 2024-03-31 오전 1.05.21.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Spotlights (아래 저거래여,,! 몰랐던,,ㅎ)&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;size18&quot;&gt;▪️&lt;span style=&quot;color: #000000;&quot;&gt;Shortcuts&lt;/span&gt; (단축어)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;▪️&lt;span style=&quot;color: #000000;&quot;&gt;Activity views&lt;/span&gt; (공유시트라고 알려진 이 view라고 하네용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-31 오전 1.12.34.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGGDoz/btsGfiegInW/oxqaS8NNJPv9Bma2W88CI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGGDoz/btsGfiegInW/oxqaS8NNJPv9Bma2W88CI0/img.png&quot; data-alt=&quot;Activity views&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGGDoz/btsGfiegInW/oxqaS8NNJPv9Bma2W88CI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGGDoz%2FbtsGfiegInW%2FoxqaS8NNJPv9Bma2W88CI0%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;280&quot; height=&quot;572&quot; data-filename=&quot;스크린샷 2024-03-31 오전 1.12.34.png&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Activity views&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Best Practices&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;훌륭한 iPhone 경험은 사람들이 가장 중요하게 여기는 플랫폼과 장치 기능들을 통합한다. iOS에서 당신의 디자인이 자연스럽게 느껴지도록 하기 위해서, 이러한 기능들과 특징들을 통합하는 방법을 우선시해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;사람들이 주요한 작업과 콘텐츠에 집중할 수 있도록 화면의 컨트롤 수를 제한하고, 최소한의 상호작용으로 이차적인 세부사항과 작업을 발견할 수 있도록 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;사람들이 가장 중요한 작업과 내용에 집중할 수 있도록 &lt;b&gt;화면에 불필요한 기능&lt;/b&gt;(예를 들면 버튼과 같은)&lt;b&gt;들을 제한&lt;/b&gt;하고, &lt;b&gt;보조적인 정보들&lt;/b&gt;은 화면에 주요한 작업과 함께 노출시키기보다 필요할 때 &lt;b&gt;쉽게 찾을 수 있는 방법으로 설계&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;기기 방향, 다크 모드, 동적 타입과 같은 외관 변화에 매끄럽게 적용해서 사람들이 자신에게 가장 잘 맞는 구성(UI)을 선택할 수 있도록 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;동적 타입 : 시스템 설정을 통해 텍스트 크기를 조절할 수 있게 해주는 기능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;사람들이 보통 기기(iPhone)를 들고 있는 방식을 수용하는 상호작용을 지원하도록 하자. 예를 들어, 사람들은 컨트롤이 화면의&lt;b&gt; 중간이나 하단 영역&lt;/b&gt;에 위치할 때 도달하기가 더 쉽고 편안하다고 생각하기 때문에 사람들이 스와이프 해서 뒤로 넘기거나 목록행에서 작업을 시작할 수 있도록 하는 것은 특히 중요하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;보통 사람들이 아이폰을 잡을 때 엄지손가락이 &lt;b&gt;편하게 터치&lt;/b&gt;할 수 있는 부분이 화면의 중앙이나 하단 영역이기 때문에, 스와이프를 하는 동작이나 목록에서 작업을 시작하는 작업을 할 때 이런 부분을 고려하면 좋다는 의미!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;사람들의 허가를 받아서, 사람들이 데이터를 입력하지 않는 경험을 향상시킬 수 있는 방식으로 플랫폼 기능을 통해 사용할 수 있는 정보를 통합해라. 예를 들어, 결제를 수락하거나 생체 인증을 통해 보안을 제공하고, 기기의 위치를 사용하는 기능을 제공할 수 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;결제를 하거나 생체 인증이 필요한 상황과 같이 사용자의 데이터가 필요할 때, 이미 아이폰에 &lt;b&gt;입력된 정보를 활용하여 사용자의 입력을 최소화할&lt;/b&gt; 수 있도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Why should we know about the HIG?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HIG 공식문서와 여러 블로그를 찾아보면서 느낀 것들은&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000;&quot;&gt;HIG를 통해 기획자/개발자/디자이너는 iOS 환경과 통합되는 Apple만의 앱을 만들 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #333333;&quot;&gt;모든 Apple의 플랫폼에서 사용자가 익숙한 방식으로 앱을 사용할 수 있고, 이를 통해 사용자에게 안정적이고 일관된 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 사용자 경험을 제공할 수 있다. 한마디로 사용자가 &quot;Apple 스러운&quot; 서비스를 경험할 수 있다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;  &lt;span style=&quot;color: #000000;&quot;&gt;그래서 HIG를 기반으로 한다면, 여러 직군이 협업할 때 함께 참고할 수 있는 좋은 Resource이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;Apple Developer &amp;nbsp;웹 사이트 디자인 카테고리 첫 화면에는 이런 문장이 있다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Learn how to design great apps and games that integrate seamlessly with Apple platforms.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;✨ Apple 플랫폼과 완벽하게 통합되는 훌륭한 앱과 게임을 설계하는 방법을 배워보자! &lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;✨&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 문장이 굉장히 흥미로웠다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그저 앱이나 게임과 같은 기능적인 서비스를 잘 만드는 방법을 넘어서서&amp;nbsp;Apple의 &quot;플랫폼(아이폰, 아이패드 등)&quot;과 잘 맞는 앱을 만드는 설계 방법이라니,,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;사용자가 플랫폼을 손으로 만지는 순간부터 앱 서비스를 이용하는 그 모든 과정에서 Apple의 정체성을 느낄 수 있도록 세심하게 설계한 것 같다는 생각이 들었다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;사실 개발자로 전향하기 전 간호사로 일했을 때도 환자 경험이 정말 중요했다. 진짜 환자가 된 것처럼 병원복도 입고 병상에 누워서 실제 간호서비스를 받아보는 교육도 받았었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그런 경험이 있어서 그런 건지,, 사용자 경험을 중요시하는 이런 애플의 철학이 신기하고 정말 흥미롭다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그리고 Apple만의 정체성을 가지고 일관되고 통일된 UX를 주겠다는 것도,,!!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그래서 HIG 문서를 읽는 게 너무 재밌고,, 뭐랄까,, 모든 영역에서 사용자 경험을 중심으로 문서화해놓은 애플,, 멋져,,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;뭔가 iOS를 선택한 게 정말 잘한 일인 것 같은 기분도 든다 허허,, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;HIG 블로깅은 정말 재미있게 할 수 있을 것만 같은 너낌~.~ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developer.apple.com/design/human-interface-guidelines/designing-for-ios&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/design/human-interface-guidelines/designing-for-ios&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1711817694672&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;Designing for iOS | Apple Developer Documentation&quot; data-og-description=&quot;People depend on their iPhone to help them stay connected, play games, view media, accomplish tasks, and track personal data in any location and while on the go.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/design/human-interface-guidelines/designing-for-ios&quot; data-og-url=&quot;https://docs.developer.apple.com/design/human-interface-guidelines/designing-for-ios&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UhmYf/hyVGQN79fn/uVYjppQU524Jv6HNrKkCD1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/zxrNP/hyVGICzPUP/5H3lQmsZz5YXXa6h4PUJB1/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/design/human-interface-guidelines/designing-for-ios&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/design/human-interface-guidelines/designing-for-ios&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UhmYf/hyVGQN79fn/uVYjppQU524Jv6HNrKkCD1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/zxrNP/hyVGICzPUP/5H3lQmsZz5YXXa6h4PUJB1/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Designing for iOS | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;People depend on their iPhone to help them stay connected, play games, view media, accomplish tasks, and track personal data in any location and while on the go.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>HIG</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/18</guid>
      <comments>https://yyomzzi.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 24 Jan 2024 23:59:24 +0900</pubDate>
    </item>
    <item>
      <title>[Combine] 이제는 더 이상 물러날 곳이 없는 Combine 공부2 - Publisher</title>
      <link>https://yyomzzi.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;매일 조금씩이라도 블로그에 기록하자는 것이 목표,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 오늘은 Combine의 Key Concepts 중 하나인 Publisher를 알아보겠다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt; Publisher&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Declares that a type can transmit a sequence of values over time.&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rArr; 시간이 흐름에 따라 값의 연속성을 보낼 수 있는 타입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;말 그대로 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;시간이 흐름에 따라 값이 바뀌면 Subscriber의 요청에 따라 바뀐 값을 발행해 주는 역할&lt;/b&gt;&lt;/span&gt;!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이전 글에서도 언급했던 것 처럼 시간에 따라 값의 연속성을 보낸다는 것이&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;동작에 따라 값을 한 번에 보내는 것이 아니라 시간의 흐름에 따라 Publisher가 값을 방출한다고 함.&amp;nbsp;&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;스크린샷 2023-12-19 오후 11.07.42.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LREJf/btsCj3Z0Nj5/p76aQa1U3YCi3CqPn2b3Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LREJf/btsCj3Z0Nj5/p76aQa1U3YCi3CqPn2b3Hk/img.png&quot; data-alt=&quot;시간이 흐름에 따라 방출된 값이 Subscriber로 전달됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LREJf/btsCj3Z0Nj5/p76aQa1U3YCi3CqPn2b3Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLREJf%2FbtsCj3Z0Nj5%2Fp76aQa1U3YCi3CqPn2b3Hk%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;801&quot; height=&quot;234&quot; data-filename=&quot;스크린샷 2023-12-19 오후 11.07.42.png&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시간이 흐름에 따라 방출된 값이 Subscriber로 전달됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;A publisher delivers elements to one or more&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/combine/subscriber&quot;&gt;Subscriber&lt;/a&gt;&amp;nbsp;instances. The subscriber&amp;rsquo;s&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/combine/subscriber/input&quot;&gt;Input&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/combine/subscriber/failure&quot;&gt;Failure&lt;/a&gt;&amp;nbsp;associated types must match the&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/output&quot;&gt;Output&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/failure&quot;&gt;Failure&lt;/a&gt;&amp;nbsp;types declared by the publisher. The publisher implements the&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/receive(subscriber:)&quot;&gt;receive(subscriber:) method&lt;/a&gt; to accept a subscriber.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rArr; 하나 이상의 Subscriber 인스턴스에게 요소를 전달함. subscriber의 Input과 Failure 연관값은 publisher의 Output과 Failure 타입과 일치해야 함. publisher는 subscriber를 받기 위해 receive(subscriber:) 함수를 구현함.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 &lt;b&gt;associated types, 연관값&lt;/b&gt;이라고 언급했는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바로 Publisher가 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;프로토콜&lt;/b&gt;&lt;/span&gt;로 정의되어 있기 때문에 Generic을 사용할 수가 없어서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로토콜에서 Generic과 같은 역할을 하는 associatedtype으로 타입을 지정해줌!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 Publisher의 선언은 다음과 같다&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;스크린샷 2023-12-19 오후 8.37.48.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPWRUz/btsCkrfbrDj/dKbjAKmCAFTxLZKh5tD8G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPWRUz/btsCkrfbrDj/dKbjAKmCAFTxLZKh5tD8G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPWRUz/btsCkrfbrDj/dKbjAKmCAFTxLZKh5tD8G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPWRUz%2FbtsCkrfbrDj%2FdKbjAKmCAFTxLZKh5tD8G1%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;1238&quot; height=&quot;468&quot; data-filename=&quot;스크린샷 2023-12-19 오후 8.37.48.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;468&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;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Publisher는 2개의 연관값과 한 개의 함수로 구현되어 있고 extension으로 코드가 확장되어 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1. &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Output&lt;/b&gt;&lt;/span&gt; : Publisher가 방출하는 값.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2. &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Failure&lt;/b&gt;&lt;/span&gt; : Publisher가 방출하는 에러값. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; 만약 publisher가 에러를 방출하지 않는다면 (에러가 발생하지 않는다면!) Never 타입을 사용하면 됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3. &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;receive(subscriber: )&lt;/b&gt;&lt;/span&gt; : Publisher와 Subscriber를 연결해 주는 함수. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;함수 파라미터 subscriber에 해당 publisher를 구독해서 값을 받아올 subscriber를 넣어주면 됨. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;함수 정의에서도 알 수 있듯이 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;publisher의 Output과 subscriber의 Input 타입이 같아야 하고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;서로의 Failure 타입도 같아야 한다.&lt;span&gt; 역시 강타입언어,,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;근데 공식문서에 publisher 함수가 receive 말고도 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;subscribe(_:)&lt;/b&gt;&lt;/span&gt; 함수도 있음. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;subscribe함수는 receive 함수와 하는 일은 유사해 보이는데 공식문서에서는 이렇게 말한다.&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;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Always call this function instead of&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #ee2323; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/receive(subscriber:)&quot;&gt;receive(subscriber:)&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;. Adopters of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #000000; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher&quot;&gt;Publisher&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;must implement&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #000000; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/receive(subscriber:)&quot;&gt;receive(subscriber:)&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;. The implementation of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #000000; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/subscribe(_:)-4u8kn&quot;&gt;subscribe(_:)&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;provided by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #000000; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher&quot;&gt;Publisher&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;calls through to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;color: #000000; text-align: left;&quot; href=&quot;https://developer.apple.com/documentation/combine/publisher/receive(subscriber:)&quot;&gt;receive(subscriber:)&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;receive 함수 대신에 subscribe 함수를 호출하라고 함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;subscribe 내부에 필수 구현자인 receive 함수가 구현되어 있다고 함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그래서 subscribe를 권장하니까 이거 쓰면 될 듯!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; Creating Your Own Publishers&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Publisher는 프로토콜로 되어있기 때문에 개발자가 직접 구현할 수 있기는 하지만 애플에서 권장하지는 않는다고 함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그래서 애플에서 권장하는 방법은 직접 구현보다는 Combine Framework가 제공하는 여러 타입들을 사용해서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;자체적은 Publisher를 생성하는 것이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그 방법은 3가지로 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1. &lt;span style=&quot;text-align: left;&quot;&gt;PassthroughSubject 같이 Subject의 서브클래스를 사용해서 send(_:) 메서드 호출로 요청된 값 발행하기&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;2. CurrentValueSubject를 이용해서 subject의 값이 변경될 때마다 값을 방출&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;3. @Published 어노테이션 사용하기&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #374151;&quot;&gt;&lt;span style=&quot;caret-color: #374151;&quot;&gt;이건 나중에 Subject를 보면서 다시 보도록 하겠숨.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; Convenience Publishers&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;애플에서 Publisher를 직접 구현하는 것을 권장하지 않는다면 역싀나 미리 만들어놨겠쥬?&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;애플에서 미리 만들어놓은 Publisher들을 알아보자!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;1. Just&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;A publisher that emits an output to each subscriber just once, and then finishes.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Subscriber에게 한 번만 값을 내보낸 후에 종료하는 가장 간단한 Publisher. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Just는 Failure 타입이 Never이기 때문에 에러를 방출하지 않는다. 항상 값을 생성한다고 보면 됨.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&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;스크린샷 2023-12-19 오후 11.45.33.png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ufA5l/btsCjWs2LTW/lKJeQyBSAr7OkXZP08vp2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ufA5l/btsCjWs2LTW/lKJeQyBSAr7OkXZP08vp2K/img.png&quot; data-alt=&quot;Failure가 Never 타입으로 정의되어있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ufA5l/btsCjWs2LTW/lKJeQyBSAr7OkXZP08vp2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FufA5l%2FbtsCjWs2LTW%2FlKJeQyBSAr7OkXZP08vp2K%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;605&quot; data-filename=&quot;스크린샷 2023-12-19 오후 11.45.33.png&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Failure가 Never 타입으로 정의되어있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1702997273439&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let justPublisher = Just(5)

justPublisher.sink { completion in
    print(&quot;Completion: \(completion)&quot;)
} receiveValue: { value in
    print(&quot;Value: \(value)&quot;)
}

// Value: 5
// Completion: finished&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5라는 값을 방출하는 Just로 Publisher를 정의한 후에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;sink로 publisher가 보내주는 값을 받아서 처리함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(여기서 sink는 Subscriber의 한 종류로 subscriber 공부할 때 보겠음!!)&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;i&gt;&lt;b&gt;2. Future &lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;A publisher that eventually produces a single value and then finishes or fails.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하나의 값을 생성한 다음 완료하거나 실패하는 publisher. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Future의 클로저는 (Result &amp;lt;Output, Failure&amp;gt;) &amp;rarr; Void 타입의 클로저인 Future.Promise를 매개변수로 받음. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;다른 Publisher들은 모두 struct인데 Future만 Class로 구현되어 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;(이렇다 할 이유는 찾지 못했는데 ,, 아무래도 뭔가 참조타입으로 사용해야 할 목적이 있나 봄,,)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702997563871&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func generateAsyncRandomNumberFromFuture() -&amp;gt; Future &amp;lt;Int, Never&amp;gt; {
    return Future() { promise in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            let number = Int.random(in: 1...10)
            promise(Result.success(number))
        }
    }
}


let cancellable = generateAsyncRandomNumberFromFuture()
    .sink { number in print(&quot;Got random number \(number).&quot;) }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Future는 특히 비동기 작업을 수행할 때 쓰인다고 함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공식문서에 있는 예시를 가져와봤음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Int값을 Output으로 같고 에러는 발생시키지 않는 Future publisher를 리턴하는 함수를 정의함.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Future 클로저의 Promise의 Output으로 1~10까지의 숫자 중 랜덤으로 값을 하나 방출하게 되고 클로저가 실행되고 2초 뒤에 값을 받을 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 sink로 값을 받게 되면 2초뒤에 랜덤 숫자가 프린트되는 것을 볼 수 있음!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;3. &lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;i&gt;&lt;b&gt;Deferred&lt;/b&gt;&lt;/i&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;A publisher that awaits subscription before running the supplied closure to create a publisher for the new subscriber.&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;신규 subscriber를 위한 publisher를 생성하기 위해 제공하는 클로저를 실행하기 전에 subscription을 기다리는 publisher. Deferred 자체가 &amp;ldquo;지연된&amp;rdquo; 뜻이기 때문에 찾아보니까 lazy랑 비슷한 개념이라는 글도 봤었음.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;lazy와 비슷하게 Publisher가 실제로 사용될 때 publisher를 생성하기 때문에 메모리를 더 효율적으로 쓸 수 있다고 함.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;4. Empty&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;: &lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;A publisher that never publishes any values, and optionally finishes immediately.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;어떠한 값도 방출하지 않고 바로 completion 이벤트를 방출할지 선택할 수 있는 publisher. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;아무 값도 내보내지 않아서 Empty라는 이름으로 쓰이는 ,,것 같음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;5. Fail&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;A publisher that immediately terminates with the specified error.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;즉시 에러를 방출하면서 종료시키는 publisher.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;6. Record&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;: &lt;span style=&quot;background-color: #ffffff; color: #1d1d1f; text-align: left;&quot;&gt;A publisher that allows for recording a series of inputs and a completion, for later playback to each subscriber.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;나중에 subscriber에게 전달하기 위해 input과 completion을 미리 record 해두는 publisher.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;각 Publisher의 예시와 특이점은 좀 더 공부해 본 후에 추가하도록 하겠당&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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 style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/combine/publisher&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/combine/publisher&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702998990368&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;Publisher | Apple Developer Documentation&quot; data-og-description=&quot;Declares that a type can transmit a sequence of values over time.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/combine/publisher&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/combine/publisher&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cNV8N0/hyUPMrxx9C/50twCdxurthebKUqskFWt0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bnlAHL/hyUL5sLLgr/dyYStek7XyHxTWqYVwG6i0/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/combine/publisher&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/combine/publisher&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cNV8N0/hyUPMrxx9C/50twCdxurthebKUqskFWt0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bnlAHL/hyUL5sLLgr/dyYStek7XyHxTWqYVwG6i0/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Publisher | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Declares that a type can transmit a sequence of values over time.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://icksw.tistory.com/273&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://icksw.tistory.com/273&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702998993955&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Combine] 미리 정의된 Publisher들 - Combine 공부 3&quot; data-og-description=&quot;안녕하세요 Pingu입니다.  지난 글에서는 Publisher, Subscriber 프로토콜 그 자체에 대해 알아봤었는데요, 이번 글에서는 Publisher 프로토콜로 Apple에서 미리 구현한 Publisher들을 알아보려고 합니다. 간&quot; data-og-host=&quot;icksw.tistory.com&quot; data-og-source-url=&quot;https://icksw.tistory.com/273&quot; data-og-url=&quot;https://icksw.tistory.com/273&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KFISK/hyUPIQecrC/Q4S933pZZpGMkwQM5zxcUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bRJzyg/hyULVwVm7E/vpdD3BD9sNdMcI1svHbQ0k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/IeOLb/hyUPGLCRyY/5INsyOVIcyCw0ZYCbfAqX1/img.png?width=958&amp;amp;height=450&amp;amp;face=0_0_958_450&quot;&gt;&lt;a href=&quot;https://icksw.tistory.com/273&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://icksw.tistory.com/273&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KFISK/hyUPIQecrC/Q4S933pZZpGMkwQM5zxcUK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bRJzyg/hyULVwVm7E/vpdD3BD9sNdMcI1svHbQ0k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/IeOLb/hyUPGLCRyY/5INsyOVIcyCw0ZYCbfAqX1/img.png?width=958&amp;amp;height=450&amp;amp;face=0_0_958_450');&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;[Combine] 미리 정의된 Publisher들 - Combine 공부 3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 Pingu입니다.  지난 글에서는 Publisher, Subscriber 프로토콜 그 자체에 대해 알아봤었는데요, 이번 글에서는 Publisher 프로토콜로 Apple에서 미리 구현한 Publisher들을 알아보려고 합니다. 간&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;icksw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sujinnaljin.medium.com/combine-publisher-5add887b97f3&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sujinnaljin.medium.com/combine-publisher-5add887b97f3&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702999006695&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Combine] Publisher&quot; data-og-description=&quot;발행 &quot; data-og-host=&quot;sujinnaljin.medium.com&quot; data-og-source-url=&quot;https://sujinnaljin.medium.com/combine-publisher-5add887b97f3&quot; data-og-url=&quot;https://sujinnaljin.medium.com/combine-publisher-5add887b97f3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eCmZEL/hyULZF5sxm/KN2nXPcNaBOrkZ4usKzack/img.png?width=1200&amp;amp;height=291&amp;amp;face=0_0_1200_291,https://scrap.kakaocdn.net/dn/Kzaun/hyUL1DTotH/kAYKzQfqNN174x2sFCcJQk/img.png?width=606&amp;amp;height=536&amp;amp;face=0_0_606_536&quot;&gt;&lt;a href=&quot;https://sujinnaljin.medium.com/combine-publisher-5add887b97f3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sujinnaljin.medium.com/combine-publisher-5add887b97f3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eCmZEL/hyULZF5sxm/KN2nXPcNaBOrkZ4usKzack/img.png?width=1200&amp;amp;height=291&amp;amp;face=0_0_1200_291,https://scrap.kakaocdn.net/dn/Kzaun/hyUL1DTotH/kAYKzQfqNN174x2sFCcJQk/img.png?width=606&amp;amp;height=536&amp;amp;face=0_0_606_536');&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;[Combine] Publisher&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;발행 &lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sujinnaljin.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dongminyoon.tistory.com/79&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dongminyoon.tistory.com/79&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702999014129&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Combine] Publisher&quot; data-og-description=&quot;이전에는 Combine이 무엇인지 어떤 목적을 위해 만들어졋는지에 대해 간단히 알아보았습니다. 이번에는 그 중에서 Publisher라는 것에 대해서 알아보려고 합니다   Publisher란? 이전 맛보기 글에서&quot; data-og-host=&quot;dongminyoon.tistory.com&quot; data-og-source-url=&quot;https://dongminyoon.tistory.com/79&quot; data-og-url=&quot;https://dongminyoon.tistory.com/79&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Rk42i/hyULXBsDox/X62ct3Meo77Tq1FMtJnYmK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/hYOo6/hyUPAkk3cS/i20dD1lAY10LUbZXBT9Rrk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449&quot;&gt;&lt;a href=&quot;https://dongminyoon.tistory.com/79&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dongminyoon.tistory.com/79&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Rk42i/hyULXBsDox/X62ct3Meo77Tq1FMtJnYmK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/hYOo6/hyUPAkk3cS/i20dD1lAY10LUbZXBT9Rrk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449');&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;[Combine] Publisher&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이전에는 Combine이 무엇인지 어떤 목적을 위해 만들어졋는지에 대해 간단히 알아보았습니다. 이번에는 그 중에서 Publisher라는 것에 대해서 알아보려고 합니다   Publisher란? 이전 맛보기 글에서&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dongminyoon.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/17</guid>
      <comments>https://yyomzzi.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 20 Dec 2023 00:17:09 +0900</pubDate>
    </item>
    <item>
      <title>[Combine] 이제는 더 이상 물러날 곳이 없는 Combine 공부1</title>
      <link>https://yyomzzi.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;미루고 미루다 드디어 시작해보는 Combine 공부,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우주의 모든 기운을 모아 Combine과 친해질 수 있기를,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;combine과 초면인지라 일단 정리하면서 공부해봅니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잘못된 정보가 있을시 마구 지적 plz~~~&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt; Combine?&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;i&gt; Customize handling of asynchronous events by combining event-processing operators.&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot; data-token-index=&quot;0&quot;&gt;비동기적인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&amp;nbsp;이벤트&lt;/b&gt;&lt;/span&gt;를 다루기 위해 이벤트 처리 연산자를 조합하여&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot; data-token-index=&quot;2&quot;&gt;사용자 정의로 처리&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;&lt;i&gt; &lt;/i&gt;&lt;/b&gt;The Combine framework provides a declarative Swift API for processing values over time. These values can represent many kinds of asynchronous events. Combine declares&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot; data-token-index=&quot;1&quot;&gt;publishers&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;to expose values that can change over time, and&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot; data-token-index=&quot;3&quot;&gt;subscribers&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;to receive those values from the publishers.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;시간에 따라 값들을 처리하기 위한 선언적 Swift API를 제공한다. 시간이 흐름에 따라 값이 바뀔 수 있는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot; data-token-index=&quot;1&quot;&gt;publisher&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;와 이러한 값을 publisher로부터 받아오는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot; data-token-index=&quot;3&quot;&gt;subscriber&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;가 있음.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;결국 &lt;span style=&quot;color: #ee2323;&quot;&gt;시간의 흐름에 따라 발생하는 비동기적인 이벤트를 잘 처리할 수 있게 하는 것&lt;/span&gt;이 Combine 프레임워크이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;시간이 흐르면서 값이 변경되는 이벤트들이 있고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그 변경된 값을 받아서 개발자가 정의한대로 처리하는 것이라고 일단 이해해봄&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그런데 사실상 Swift에는 비동기 처리를 담당하는 API가 많이 있었음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-18 오전 10.21.26.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0m9yK/btsB5VB789c/QkkXeC4vxiT1hBaKXym6N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0m9yK/btsB5VB789c/QkkXeC4vxiT1hBaKXym6N1/img.png&quot; data-alt=&quot;WWDC19 Introducing Combine 발표자료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0m9yK/btsB5VB789c/QkkXeC4vxiT1hBaKXym6N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0m9yK%2FbtsB5VB789c%2FQkkXeC4vxiT1hBaKXym6N1%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;510&quot; height=&quot;433&quot; data-filename=&quot;스크린샷 2023-12-18 오전 10.21.26.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WWDC19 Introducing Combine 발표자료&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존의 비동기 API들도 다 중요하지만 이 개별적인 API들을 같이 구성해야 할 경우에 어려움이 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 애플은 Combine을 통해 이 비동기 API들 사이의 &lt;b&gt;공통점&lt;/b&gt;들을 찾으려고 노력했다고 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결국 기존의 비동기 인터페이스를 Combine이 모두 대체했다~ 가 아니라!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 &lt;b&gt;인터페이스들의 공통점을 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;통합&lt;/span&gt;해서 동일한 형태의 인터페이스로 사용할 수 있게 만들어 주기 위해 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Combine이 탄생했다고 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 애플의 Combine 한 줄 요약은&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;A unified, declarative API for processing values over time&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;시간이 흐름에 따른 값을 처리하기 위한 통합적이고 선언적인 API&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;근데 공부를 하다보니까 시간이 흐름에 따라 값이 변경된다는 것이 계속 나오는데 이게 무슨 뜻인지 잘 와닿지가 않았음.&lt;br /&gt;그래서 이것저것 찾아보고 GPT 선생님(^^)에게도 물어보면서 알게된 의미가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;결국 일종의 스트림(stream: 연속성을 갖는 데이터의 흐름)으로 시간에 따라 값이 발생하거나 변경되는 거라고 함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;동작에 따라 값을 한꺼번에 받는게 아니라 시간 간격에 따라서 비동기적으로 값을 받는 것!&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; Combine Features&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-18 오전 10.52.11.png&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3sTYS/btsB7c36oG8/KFhFQozIkg3bUFDZqxueg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3sTYS/btsB7c36oG8/KFhFQozIkg3bUFDZqxueg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3sTYS/btsB7c36oG8/KFhFQozIkg3bUFDZqxueg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3sTYS%2FbtsB7c36oG8%2FKFhFQozIkg3bUFDZqxueg0%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;510&quot; height=&quot;477&quot; data-filename=&quot;스크린샷 2023-12-18 오전 10.52.11.png&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;704&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;size18&quot;&gt;1. &lt;b&gt;Generic&lt;/b&gt; : 결국 combine은 Swift로 작성되었고 Swift를 위해 만들어졌다고 함. 그래서 &lt;b&gt;Generic처럼 Swift의 기본 기능을 활용할 수 있다는 것&lt;/b&gt;을 의미함. 제네릭을 통해서 반복적인 코드 작성을 줄이고 일반적인 비동기 알고리즘을 한 번 작성하면 다른 비동기 인터페이스에도 적용할 수 있어서 활용도가 높아짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. &lt;b&gt;Type safe&lt;/b&gt; : Combine은 타입 안정성을 가지기 때문에 &lt;b&gt;컴파일 시간&lt;/b&gt;에 에러를 잡을 수 있는 장점이 있음.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. &lt;b&gt;Composition first&lt;/b&gt; : Combine의 주요 설계 포인트 중의 하나가 구성을 우선한다는 것이었다고 함. (이건 아직 무슨 소리인지 이해가 잘 안감,,) 아무튼 핵심 개념을 간단하고 이해하기 쉽게 설계했지만 이 개념들을 함께 사용하면 각각의 부분들 그 이상의 &lt;b&gt;더 복잡하고 강력한 기능을 만들 수 있다&lt;/b&gt;는 의미로 이해함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. &lt;b&gt;Request driven&lt;/b&gt; : Combine은 요청에 의해서 동작하기 때문에 &lt;b&gt;앱의 메모리 사용량과 성능을 더욱 신중하게 관리&lt;/b&gt;할 수 있는 장점이 있음. 요청이 없다면 값을 방출하지도 않으니까 불필요한 메모리 사용을 막을 수 있고, 필요한 값들만 전달하기 때문에 효율적인 리소스 사용이 가능하다고 함.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; Key Concepts in Combine&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-18 오전 11.13.37.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfcG1A/btsB6N4GY7c/a5NCkTC4TLlZvBo5RXfzT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfcG1A/btsB6N4GY7c/a5NCkTC4TLlZvBo5RXfzT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfcG1A/btsB6N4GY7c/a5NCkTC4TLlZvBo5RXfzT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfcG1A%2FbtsB6N4GY7c%2Fa5NCkTC4TLlZvBo5RXfzT0%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;437&quot; data-filename=&quot;스크린샷 2023-12-18 오전 11.13.37.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Combine의 주요 키워드로 Publisher, Subscriber, Operator가 있다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;1. &lt;b&gt;Publisher&lt;/b&gt; : 단어 뜻 그대로 발행하는 무언가,, publisher가 바로 위에서부터 계속 나왔던 값을 보내주는 기능을 담당함.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;2. &lt;b&gt;Subscriber&lt;/b&gt; : publisher가 보내는 값을 받는 것이 바로 이 구독자친구임. 값을 받아서 처리하는 것을 담당함.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;3. &lt;b&gt;Operator&lt;/b&gt; : 단어 뜻 그대로 연산해주는 친구,, publisher가 보낸 값을 연산해서 어찌저찌 연산해서 subscriber에게 잘 전달해주는 일을 담당한다고 일단은 이해함. publisher와 subscriber 사이에서 둘을 연결해준다고 보면 될듯!&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아니,, 분명 여기까지 이해하는데도 진짜 시간 많이 걸렸는데&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;왜 때문에 정리하고 보니까 이렇게나 ,,, 공부한게 없는 느낌이지?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㅠㅠ&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결국 Combine은 RxSwift의 애플버전이라고 생각하면 될듯 (다른거 쓰지말고 우리꺼 써~ 느낌,,)&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 combine도 선언적 API이기 때문에 그래서 더더욱 SwiftUI랑 더 잘맞지 않을까? 그냥 한 번 생각해봄 ,,&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공부하면서 무슨 의미인지도 대충 이해는 하겠고 ,, 어느정도 이론은 알겠는데 그래서 이걸 어떻게 써볼 수 있을까~ 약간 막막하지만&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 combine 자체는 재밌움 !!!!!&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하루에 하나씩 블로그에 정리해보려고 하는데 가능할까 ,,,,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;근데 걍 이런 고민할 시간에 하나씩 이해한 만큼만이라도 올려봐야겠움&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;꾸준히 하면 뭐라도 되겠지,,~&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/combine&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/combine&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702867028804&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;Combine | Apple Developer Documentation&quot; data-og-description=&quot;Customize handling of asynchronous events by combining event-processing operators.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/combine&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/combine&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/N4HFh/hyUPAxzSeR/izlmB5ZLY5oaSk4nLXSIR0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/vUhCw/hyULQ3dW9A/oQ5uOjreIwBq6yxfIPkCik/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/combine&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/combine&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/N4HFh/hyUPAxzSeR/izlmB5ZLY5oaSk4nLXSIR0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/vUhCw/hyULQ3dW9A/oQ5uOjreIwBq6yxfIPkCik/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;Combine | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Customize handling of asynchronous events by combining event-processing operators.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/wwdc19/722&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/wwdc19/722&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702867042317&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;Introducing Combine - WWDC19 - Videos - Apple Developer&quot; data-og-description=&quot;Combine is a unified declarative framework for processing values over time. Learn how it can simplify asynchronous code like networking,...&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/wwdc19/722&quot; data-og-url=&quot;https://developer.apple.com/videos/play/wwdc2019/722/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/brWwot/hyUPJgZAqf/r4oBfstrXVopVLgoXUD2Ak/img.jpg?width=500&amp;amp;height=282&amp;amp;face=0_0_500_282&quot;&gt;&lt;a href=&quot;https://developer.apple.com/wwdc19/722&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/wwdc19/722&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/brWwot/hyUPJgZAqf/r4oBfstrXVopVLgoXUD2Ak/img.jpg?width=500&amp;amp;height=282&amp;amp;face=0_0_500_282');&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;Introducing Combine - WWDC19 - Videos - Apple Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Combine is a unified declarative framework for processing values over time. Learn how it can simplify asynchronous code like networking,...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jcsoohwancho.github.io/2020-01-18-Combine-시작하기(1)-Overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jcsoohwancho.github.io/2020-01-18-Combine-시작하기(1)-Overview/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702867078012&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;Combine 시작하기(1)-Overview&quot; data-og-description=&quot;애플은 WWDC 2019에서 Combine이라는 새로운 API를 발표했습니다. 이는 기존에 많이 쓰이고 있던 Rx와 같은 포지션에 있었기 때문에 더욱 더 많은 관심을 끌었습니다. 비록 최소 버전이 iOS 13 이기 때문&quot; data-og-host=&quot;jcsoohwancho.github.io&quot; data-og-source-url=&quot;https://jcsoohwancho.github.io/2020-01-18-Combine-시작하기(1)-Overview/&quot; data-og-url=&quot;https://jcsoohwancho.github.io/2020-01-18-Combine-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0(1)-Overview/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cIcxX6/hyUPEmr5Yg/XKd0aSEhDUqKU9KeKtXDC1/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/dWBjHK/hyUPFyS2oA/7KkmTRk8LILPccO8BxKlMk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/bV62yk/hyUL2Cw1HV/Xn1MtwsjMTrKkkMeHODmcK/img.png?width=377&amp;amp;height=423&amp;amp;face=0_0_377_423&quot;&gt;&lt;a href=&quot;https://jcsoohwancho.github.io/2020-01-18-Combine-시작하기(1)-Overview/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jcsoohwancho.github.io/2020-01-18-Combine-시작하기(1)-Overview/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cIcxX6/hyUPEmr5Yg/XKd0aSEhDUqKU9KeKtXDC1/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/dWBjHK/hyUPFyS2oA/7KkmTRk8LILPccO8BxKlMk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500,https://scrap.kakaocdn.net/dn/bV62yk/hyUL2Cw1HV/Xn1MtwsjMTrKkkMeHODmcK/img.png?width=377&amp;amp;height=423&amp;amp;face=0_0_377_423');&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;Combine 시작하기(1)-Overview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;애플은 WWDC 2019에서 Combine이라는 새로운 API를 발표했습니다. 이는 기존에 많이 쓰이고 있던 Rx와 같은 포지션에 있었기 때문에 더욱 더 많은 관심을 끌었습니다. 비록 최소 버전이 iOS 13 이기 때문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jcsoohwancho.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sujinnaljin.medium.com/combine-combine-시작하기-ac726ac40b07&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sujinnaljin.medium.com/combine-combine-시작하기-ac726ac40b07&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702867087662&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Combine] Combine 시작하기&quot; data-og-description=&quot;Combine.. 그게 뭔데.. 그거 어떻게 하는건데..!&quot; data-og-host=&quot;sujinnaljin.medium.com&quot; data-og-source-url=&quot;https://sujinnaljin.medium.com/combine-combine-시작하기-ac726ac40b07&quot; data-og-url=&quot;https://sujinnaljin.medium.com/combine-combine-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-ac726ac40b07&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3UtDb/hyULR14gz2/ikLZ5f7K6XCUidHSxbGmLk/img.jpg?width=480&amp;amp;height=569&amp;amp;face=0_0_480_569,https://scrap.kakaocdn.net/dn/j4vs6/hyUPAdhWz0/zLgkbaYPKgjuK1Y07GRdM1/img.png?width=1358&amp;amp;height=990&amp;amp;face=789_683_869_769,https://scrap.kakaocdn.net/dn/Q6aKT/hyUPG5EjTq/ElMdTWaPy4EWTqODpKv9hk/img.png?width=606&amp;amp;height=536&amp;amp;face=0_0_606_536&quot;&gt;&lt;a href=&quot;https://sujinnaljin.medium.com/combine-combine-시작하기-ac726ac40b07&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sujinnaljin.medium.com/combine-combine-시작하기-ac726ac40b07&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3UtDb/hyULR14gz2/ikLZ5f7K6XCUidHSxbGmLk/img.jpg?width=480&amp;amp;height=569&amp;amp;face=0_0_480_569,https://scrap.kakaocdn.net/dn/j4vs6/hyUPAdhWz0/zLgkbaYPKgjuK1Y07GRdM1/img.png?width=1358&amp;amp;height=990&amp;amp;face=789_683_869_769,https://scrap.kakaocdn.net/dn/Q6aKT/hyUPG5EjTq/ElMdTWaPy4EWTqODpKv9hk/img.png?width=606&amp;amp;height=536&amp;amp;face=0_0_606_536');&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;[Combine] Combine 시작하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Combine.. 그게 뭔데.. 그거 어떻게 하는건데..!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sujinnaljin.medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://icksw.tistory.com/268&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://icksw.tistory.com/268&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702867095466&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[WWDC 2019] Introducing Combine&quot; data-og-description=&quot;안녕하세요 Pingu입니다.  오늘은 WWDC 2019의 &amp;quot;Introducing Combine&amp;quot;이라는 영상을 보고 정리한 글을 써보려고 합니다. 이번 영상은 2019년에 처음 공개된 Combine이라는 프레임워크를 소개하는 영상이었&quot; data-og-host=&quot;icksw.tistory.com&quot; data-og-source-url=&quot;https://icksw.tistory.com/268&quot; data-og-url=&quot;https://icksw.tistory.com/268&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e073I/hyULX2gKfu/kezO2JpU75N4s9lSK2x0H1/img.png?width=800&amp;amp;height=493&amp;amp;face=11_16_723_459,https://scrap.kakaocdn.net/dn/i5655/hyULVpRDLl/6XSHh9ajUynRAAUptCvK80/img.png?width=800&amp;amp;height=493&amp;amp;face=11_16_723_459,https://scrap.kakaocdn.net/dn/Go733/hyUPNReUQh/NPpR5tqDG2ermHJfr8v3wk/img.png?width=888&amp;amp;height=498&amp;amp;face=0_0_888_498&quot;&gt;&lt;a href=&quot;https://icksw.tistory.com/268&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://icksw.tistory.com/268&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e073I/hyULX2gKfu/kezO2JpU75N4s9lSK2x0H1/img.png?width=800&amp;amp;height=493&amp;amp;face=11_16_723_459,https://scrap.kakaocdn.net/dn/i5655/hyULVpRDLl/6XSHh9ajUynRAAUptCvK80/img.png?width=800&amp;amp;height=493&amp;amp;face=11_16_723_459,https://scrap.kakaocdn.net/dn/Go733/hyUPNReUQh/NPpR5tqDG2ermHJfr8v3wk/img.png?width=888&amp;amp;height=498&amp;amp;face=0_0_888_498');&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;[WWDC 2019] Introducing Combine&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 Pingu입니다.  오늘은 WWDC 2019의 &quot;Introducing Combine&quot;이라는 영상을 보고 정리한 글을 써보려고 합니다. 이번 영상은 2019년에 처음 공개된 Combine이라는 프레임워크를 소개하는 영상이었&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;icksw.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIL</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/16</guid>
      <comments>https://yyomzzi.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 18 Dec 2023 11:38:27 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 내가 알던 Subscripts가 아녀</title>
      <link>https://yyomzzi.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;않이 서브스크립트 뭐여 ..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그냥 컬렉션에서만 쓰이는 줄 알았는데 ,,, 생각보다 하는 일이 많은 아이였네 ,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;몰라봐서 미안허다 ,,,&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Subscripts에 대해 설명하시오.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;i&gt;&lt;b&gt;1) 내가 알던 Subscripts&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Accesses the contiguous subrange of the collection&amp;rsquo;s elements specified by a range expression.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내가 아는 Subscripts는 이것밖에 없었다 ,,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;컬렉션이나 시퀀스 내부의 특정 범위 요소에 접근할 수 있게&lt;/b&gt;&lt;/span&gt; 해주는 친구&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699097885280&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let myArray = [&quot;안녕&quot;, &quot;나는&quot;, &quot;배열이야&quot;, &quot;만나서&quot;, &quot;반가왕&quot;]

let str = myArray[2]
print(str)

// Prints &quot;배열이야&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;[대괄호]&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로 배열이나 딕셔너리에서 내부에 속한 친구들에게 접근할 수 있게 해주는 고마운 친구 !!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인줄로만 알았다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데&lt;/span&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;&lt;i&gt;&lt;b&gt;2) 이제 알게된 Subscripts&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Classes, structures, and enumerations can &lt;b&gt;define&lt;/b&gt;&amp;nbsp;subscripts&amp;nbsp;, which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for setting and retrieval.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뭐여 뭐야 뭐여&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;클래스, 구조체, 열거형에는 서브스크립트를 정의해서 사용할 수 있다&lt;/span&gt;&lt;/b&gt; (???)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뭐지 왜 나만 이제 알았나 ????  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;째뜬 알고보니 좀 기능이 많은 아이였움 대박적 .. !!!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컬렉션에서 요소들에 접근하기 위해서 별도의 메서드 없이 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[대괄호]를 가지고 index값으로 요소를 설정하거나 조회하기 위해 서브스크립트를 사용함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[대괄호] 자체가 특이한 메서드라고 생각하면 될듯!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래 그러면 정의할 수 있따며 !!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정의해보자 !!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;i&gt;&lt;b&gt;3) Subscripts 정의 구문&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Subscripts enable you to query instances of a type &lt;b&gt;by writing one or more values in square brackets after the instance name&lt;/b&gt;. Their syntax is &lt;b&gt;similar to both instance method syntax and computed property syntax&lt;/b&gt;. You &lt;b&gt;write subscript definitions&lt;/b&gt; with the&amp;nbsp;&lt;/span&gt;subscript&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;nbsp;keyword, and specify one or more input parameters and a return type, in the same way as instance methods. Unlike instance methods, &lt;b&gt;subscripts can be read-write or read-only&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1699098256667&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;subscript(index: Int) -&amp;gt; Int {
    get {
        // Return an appropriate subscript value here.
    }
    set(newValue) {
        // Perform a suitable setting action here.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스, 구조체, 열거형 내부에서 &lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt; 를 정의하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;인스턴스를 생성해서 인스턴스 이름 뒤에 [대괄호]로 index에 접근&lt;/b&gt;하면 되나봄! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 진짜 연산프로퍼티랑 똑같이 생김! 구냥 이름만 다른듯!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러면 제가 한번 정의해보겠읍니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699099138246&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Movie {
    var names = [&quot;친절한 금자씨&quot;, &quot;헤어질 결심&quot;, &quot;아메리칸 셰프&quot;, &quot;라따뚜이&quot;]
    
    subscript(index: Int) -&amp;gt; String {
        get {
            return names[index]
        }
        set {
            return names[index] = newValue
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또 나온 Movie 클래스 ㅋㅋㅋㅋㅋㅋㅋ ㅜ 또비 ,,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Movie 클래스 내부에 names 라는 [String] 배열을 생성하고 &lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt;&amp;nbsp;구문도 함께 정의해보았다 !!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt;는 뒤에 꼭 파라미터를 받아서 사용해야 함. 생각해보면 넘나 당연함 ,,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인덱스 파라미터 안받고 어케 접근한담? 텔레파시 아닌이상 불가.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 함수처럼 리턴값을 설정해줘서 어떤 값으로 리턴한다는 것을 명시해줘야함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;get only 도 가능하고 getter setter 둘 다 정의 가능!&lt;/b&gt; setter 만 정의는 불가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 나는 &lt;b&gt;index 값을 넣으면 해당 요소를 get&lt;/b&gt; 하고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;newValue를 넣으면 해당 index 번호에 새로운 값을 set&lt;/b&gt; 하도록 구현함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(index 파라미터명 바꾸기 가능! set 파라미터명 newValue 말고도 마음대로 바꾸기 가능!)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699099449285&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var movie1 = Movie()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 언제나처럼 movie1 변수에 Movie 인스턴스를 생성해서 담아줍니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 신나게 돌을 던져봅니다&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-04 오후 9.07.03.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gw2cC/btszKGT8t4Q/hO9v5ADnpEtXqdaT2elVWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gw2cC/btszKGT8t4Q/hO9v5ADnpEtXqdaT2elVWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gw2cC/btszKGT8t4Q/hO9v5ADnpEtXqdaT2elVWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGw2cC%2FbtszKGT8t4Q%2FhO9v5ADnpEtXqdaT2elVWk%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;750&quot; height=&quot;345&quot; data-filename=&quot;스크린샷 2023-11-04 오후 9.07.03.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오~~!~!~! Movie의 names 배열에 접근한 것도 아니고 &lt;b&gt;인스턴스 뒤에 그냥 [대괄호]&lt;/b&gt; 붙여서 했더니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서브스크립트 정의한대로 ~~ 프린트가 잘 되는 것을 볼 수가 있음~~ 재밌다 ~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럼 get은 잘되니까 이제 set 을 해보자&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-04 오후 9.08.13.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3XXdk/btszM2WeMMo/70eBNVFWd7c1qbGAO3CDYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3XXdk/btszM2WeMMo/70eBNVFWd7c1qbGAO3CDYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3XXdk/btszM2WeMMo/70eBNVFWd7c1qbGAO3CDYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3XXdk%2FbtszM2WeMMo%2F70eBNVFWd7c1qbGAO3CDYk%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;662&quot; height=&quot;320&quot; data-filename=&quot;스크린샷 2023-11-04 오후 9.08.13.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오호~~!~! movie1[2] 에 값을 set 했더니 아주주 잘 바뀌는구먼 ~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 &lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt;를 정의해보고 적용도 해보았슴다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 &lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt;에서 index를 받는 &lt;b&gt;파라미터는 여러개가 될 수도 있고 타입도 꼭 Int가 아니어도 된다고 함&lt;/b&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이것도 어떻게 한번 예제를 만들어 보려고 했는데 넘 어려워서,,^^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서꺼 참고 하께오,,~^^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699100641510&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(repeating: 0.0, count: rows * columns)
    }
    func indexIsValid(row: Int, column: Int) -&amp;gt; Bool {
        return row &amp;gt;= 0 &amp;amp;&amp;amp; row &amp;lt; rows &amp;amp;&amp;amp; column &amp;gt;= 0 &amp;amp;&amp;amp; column &amp;lt; columns
    }
    subscript(row: Int, column: Int) -&amp;gt; Double {
        get {
            assert(indexIsValid(row: row, column: column), &quot;Index out of range&quot;)
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), &quot;Index out of range&quot;)
            grid[(row * columns) + column] = newValue
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이건 행렬 만드는 구조체인것 같은데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;째뜬 여기서 보고싶었던 것을 바로 &lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt;&amp;nbsp;부분임 !!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699100683427&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;subscript(row: Int, column: Int) -&amp;gt; Double&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 여러개의 파라미터를 입력받을 수 있다고 하니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나중에 호옥시 활용할 일이 있을 때 ,, 이것이 기억나면 좋겠다,,^^!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+) 오 근데 이건 공부하다가 알게된건데 (소들이님 블로그)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;생각해보니까 &lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt;&amp;nbsp;파라미터명을 index라고 지정해줬는데 우리는 [대괄호] 안에서&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699100101948&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;movie1[index: 2] ❌&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 안쓰고 그냥&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699100135496&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;movie1[2] ⭕️&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 쓰잖음 ????!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;i&gt;subscript&lt;/i&gt;의 파라미터명은 아규먼트 레이블로 쓰이지 않는다고 함!!!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그냥 파라미터명을 뜻하는거라서 정의할 때 내부에서만 사용하고 굳이 [대괄호] 안에서는 안써줌 !!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와일드카드 패턴으로도 안써줘도 되는거임 ~~!~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(감사합니다 소들님 ,,  )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;4) Type Subscripts (타입 서브스크립트 )&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;/i&gt;정말 타입 서브스크립트야 말로 진짜 처음 들어보는 개념이었움&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지금까지는 인스턴스에 대한 서브스크립트였다면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;pre id=&quot;code_1699101421450&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Weekday {
    static var weekday = [&quot;Sun&quot;, &quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;, &quot;Sat&quot;]
    
    static subscript(i: Int) -&amp;gt; String {
        get {
            weekday[i]
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;subscript&lt;/b&gt;&lt;/i&gt; 앞에 타입 메서드, 타입 프로퍼티처럼 static을 붙여주면 됨! 클래스에서는 class를 붙이면 상속도 가능함!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 처음에는 weekday 프로퍼티를 그냥 인스턴스 프로퍼티로 선언했더니&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;static subscript에서 접근이 안됐음 .. !&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-04 오후 9.40.07.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFkNhr/btszHHl60cp/FDxp8daCZ2gg8fZkK9I1pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFkNhr/btszHHl60cp/FDxp8daCZ2gg8fZkK9I1pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFkNhr/btszHHl60cp/FDxp8daCZ2gg8fZkK9I1pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFkNhr%2FbtszHHl60cp%2FFDxp8daCZ2gg8fZkK9I1pk%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;462&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2023-11-04 오후 9.40.07.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;204&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 타입에다가 바로 [대괄호]를 붙여서 접근하니까 값이 잘 나오는걸 볼 수 있습니다~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서브스크립트 아는건줄 알았는데 잘 몰랐던거였음 ,, 오 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;친해지자 서브스크립트!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;근데 서브스크립트가 String에서는 적용이 안된다는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내일은 이걸 공부해봐야겠음 !!!!!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&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;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699101753229&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;Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.swift.org&quot; data-og-source-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/&quot; data-og-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.swift.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/foundation/data/3017410-subscript&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/foundation/data/3017410-subscript&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699101765290&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;subscript(_:) | Apple Developer Documentation&quot; data-og-description=&quot;Accesses the contiguous subrange of the collection&amp;rsquo;s elements specified by a range expression.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/foundation/data/3017410-subscript&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/foundation/data/3017410-subscript&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UgD2r/hyUnNZ5jkZ/K5CM0BKsYzBAlKWDlbZXck/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sZCd8/hyUnSf1bFg/WakY48S2FDxWh7XRxO1O21/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/foundation/data/3017410-subscript&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/foundation/data/3017410-subscript&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UgD2r/hyUnNZ5jkZ/K5CM0BKsYzBAlKWDlbZXck/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sZCd8/hyUnSf1bFg/WakY48S2FDxWh7XRxO1O21/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;subscript(_:) | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Accesses the contiguous subrange of the collection&amp;rsquo;s elements specified by a range expression.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/123&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://babbab2.tistory.com/123&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699101771916&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift) 서브스크립트(Subscript) 정복하기&quot; data-og-description=&quot;안녕하세요!?! 소들입니다!!!!!!!!! :D 오늘은 서브스크립트(Subscript)에 대해 알아볼 거예요!!! 이렇게 하나하나 Swift를 정복하다보면.. 언젠가 Swift 왕이 되어 있기를 간절히 바라며.....  이번에도 &quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/123&quot; data-og-url=&quot;https://babbab2.tistory.com/123&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6zTeC/hyUnNZ5jDm/Kkqrc07fQEVmGXzvPuOTck/img.png?width=800&amp;amp;height=42&amp;amp;face=0_0_800_42,https://scrap.kakaocdn.net/dn/EUJXx/hyUnU5WCYe/CD4IukGTfkixa3OKAkkwPk/img.png?width=800&amp;amp;height=42&amp;amp;face=0_0_800_42,https://scrap.kakaocdn.net/dn/dhbt5g/hyUnNse1sO/68jW22bmMq3uPrx2bkNGc1/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/123&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/123&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6zTeC/hyUnNZ5jDm/Kkqrc07fQEVmGXzvPuOTck/img.png?width=800&amp;amp;height=42&amp;amp;face=0_0_800_42,https://scrap.kakaocdn.net/dn/EUJXx/hyUnU5WCYe/CD4IukGTfkixa3OKAkkwPk/img.png?width=800&amp;amp;height=42&amp;amp;face=0_0_800_42,https://scrap.kakaocdn.net/dn/dhbt5g/hyUnNse1sO/68jW22bmMq3uPrx2bkNGc1/img.png?width=264&amp;amp;height=200&amp;amp;face=0_0_264_200');&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;Swift) 서브스크립트(Subscript) 정복하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요!?! 소들입니다!!!!!!!!! :D 오늘은 서브스크립트(Subscript)에 대해 알아볼 거예요!!! 이렇게 하나하나 Swift를 정복하다보면.. 언젠가 Swift 왕이 되어 있기를 간절히 바라며.....  이번에도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://green1229.tistory.com/286&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://green1229.tistory.com/286&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699101779049&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Subscript에 대해 알아보기 (feat.String)&quot; data-og-description=&quot;안녕하세요. 그린입니다  오늘 포스팅은 Subscript에 대해 알아보며 Swift 언어에서만 왜 String을 다룰때 Subscript가 어떻게 다른지 알아보겠습니다  우선 Subscript라는것 많이 들어보셨을것 같아요&quot; data-og-host=&quot;green1229.tistory.com&quot; data-og-source-url=&quot;https://green1229.tistory.com/286&quot; data-og-url=&quot;https://green1229.tistory.com/286&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blkrKi/hyUnM1a7E1/6qHVJxduodlG2yBG6E3oQK/img.png?width=403&amp;amp;height=43&amp;amp;face=0_0_403_43,https://scrap.kakaocdn.net/dn/ntPdW/hyUrzly3bR/qRPWzI1AuIC5nnnOxIv0Ck/img.png?width=403&amp;amp;height=43&amp;amp;face=0_0_403_43,https://scrap.kakaocdn.net/dn/ARW5j/hyUruYQkXB/13Wrck02Z3A5UwIHCg7dMk/img.png?width=767&amp;amp;height=702&amp;amp;face=0_0_767_702&quot;&gt;&lt;a href=&quot;https://green1229.tistory.com/286&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://green1229.tistory.com/286&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blkrKi/hyUnM1a7E1/6qHVJxduodlG2yBG6E3oQK/img.png?width=403&amp;amp;height=43&amp;amp;face=0_0_403_43,https://scrap.kakaocdn.net/dn/ntPdW/hyUrzly3bR/qRPWzI1AuIC5nnnOxIv0Ck/img.png?width=403&amp;amp;height=43&amp;amp;face=0_0_403_43,https://scrap.kakaocdn.net/dn/ARW5j/hyUruYQkXB/13Wrck02Z3A5UwIHCg7dMk/img.png?width=767&amp;amp;height=702&amp;amp;face=0_0_767_702');&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;Subscript에 대해 알아보기 (feat.String)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 그린입니다  오늘 포스팅은 Subscript에 대해 알아보며 Swift 언어에서만 왜 String을 다룰때 Subscript가 어떻게 다른지 알아보겠습니다  우선 Subscript라는것 많이 들어보셨을것 같아요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;green1229.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/15</guid>
      <comments>https://yyomzzi.tistory.com/15#entry15comment</comments>
      <pubDate>Sat, 4 Nov 2023 21:49:11 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Any랑 AnyObject 공부했다. 근데 TypeCasting을 곁들인,,(2)</title>
      <link>https://yyomzzi.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Any와 AnyObject를 공부하려다가 타입캐스팅 글로 끝나버린 지난 글,,(머쓱)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 이제 진 짜 공부하려던 Any랑 AnyObject에 대해 쭈절대본다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 친구들을 알기 위해서는 왜 타입캐스팅을 공부했어야만 했는지가 오늘의 관전포인트&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #000000;&quot;&gt;Any와&amp;nbsp;AnyObject에 대해 설명하시오.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;1) Any는 무엇인가&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/i&gt;&amp;nbsp;can represent an instance of any type at all, including function types.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/i&gt;는 함수타입을 포함하여 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;모든 타입의 인스턴스를 나타낼 수 있다&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 타입에는 위에서 언급한 함수타입을 포함해서 구조체, 클래스, 열거형, 옵셔널 등 모~든 타입을 다 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;진짜 모든 타입을 다 포함할 수 있다고?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;옼케이. 그럼 진짜 다 넣어봄&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699018591880&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var things: [Any] = []&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서의 예제를 가져와봤움&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;things 라는 변수가 있는데 타입은 &lt;i&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/i&gt;의 배열임.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 온갖 타입을 한 번 다 넣어보겠음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699018653078&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;things.append(0)  // 1번 Int
things.append(0.0) // 2번 Double
things.append(42) // 3번 Int
things.append(3.14159) // 4번 Double
things.append(&quot;hello&quot;) // 5번 String
things.append((3.0, 5.0)) // 6번 (Double, Double)
things.append(Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;)) // 7번 class
things.append({ (name: String) -&amp;gt; String in &quot;Hello, \(name)&quot; }) // 8번 함수타입&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Int, Double, String(구조체), 튜플, class, 함수타입을 다 넣었더니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에러가 날까여 ?????&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ㄷㄱㄷㄱㄷㄱㄷㄱ&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 10.35.55.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCeFyM/btszL0cZC5K/KXWGHKMxoVdW2L8QRPEgiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCeFyM/btszL0cZC5K/KXWGHKMxoVdW2L8QRPEgiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCeFyM/btszL0cZC5K/KXWGHKMxoVdW2L8QRPEgiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCeFyM%2FbtszL0cZC5K%2FKXWGHKMxoVdW2L8QRPEgiK%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;1182&quot; height=&quot;295&quot; data-filename=&quot;스크린샷 2023-11-03 오후 10.35.55.png&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;295&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아~주 잘 담겨버렸습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오 뭐여뭐여!!!! 스위프트 강타입 언어라더니~~ 이러면 타입 걍 죄~~다 &lt;i&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/i&gt;&amp;nbsp;쓰면 되겠구먼~!~!~!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이라고 생각하는 사람이 있겠쥬?(나)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;너무 당연스럽게도 남발하면 절대 안 됨 ^^ ㅋ&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 이게 된다면 타입을 왜만들었겠음? 왜 스입푸드가 강타입언어겠음??!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안되는 이유는 일단 &lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;도 보고 난 후에 알아봅시당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;2) AnyObject는 무엇인가&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;&amp;nbsp;can represent an instance of any class type.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;Any&lt;/b&gt;&lt;/i&gt;는 아까 모든 타입을 다 넣을 수 있다고 했자나유?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 &lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;는 그 중에서도 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;class의 인스턴스만 나타낼 수 있음!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오호? 그렇다면 다시 확인 ㄱㄱㄱ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699019188933&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}


class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}


let mediaItem1: MediaItem = MediaItem(name: &quot;영화&quot;)
let movie1: Movie = Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;)

var anyObjectArray: [AnyObject] = [movie1, mediaItem1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이전 글에서 만들었던 MediaItem, Movie 클래스임.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각각의 인스턴스를 만들어서 &lt;b&gt;&lt;i&gt;[AnyObject]&lt;/i&gt;&lt;/b&gt; 타입인 anyObjectArray 변수를 만들어 넣어보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일단 아직까지는 에러가 나지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스 타입의 인스턴스들을 담을 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자, 그렇다면 돌을 던져보겠읍니다&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;스크린샷 2023-11-03 오후 10.48.09.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qVz5b/btszLvc9Qhj/mQf2Nq6KNsCrejSAtHXUfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qVz5b/btszLvc9Qhj/mQf2Nq6KNsCrejSAtHXUfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qVz5b/btszLvc9Qhj/mQf2Nq6KNsCrejSAtHXUfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqVz5b%2FbtszLvc9Qhj%2FmQf2Nq6KNsCrejSAtHXUfk%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;1256&quot; height=&quot;151&quot; data-filename=&quot;스크린샷 2023-11-03 오후 10.48.09.png&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오호! 난다난다 에러가 난다!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;20이라는 Int 타입, 그러니까 &lt;b&gt;구조체의 인스턴스를 넣었더니&amp;nbsp;뭔가 표현식의 타입이 모호하다는 에러&lt;/b&gt;가 났다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 &lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;&amp;nbsp;라는 타입을 공부해 본 기억이 없는 것 같아서,, 공식문서 찾아보니까&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;는 바러바러&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프 로 토 콜&lt;/b&gt;&lt;/span&gt; 이라고 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.03.43.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjB40Z/btszK2bf2P8/suGTooBf5BWzaHiTtYpnOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjB40Z/btszK2bf2P8/suGTooBf5BWzaHiTtYpnOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjB40Z/btszK2bf2P8/suGTooBf5BWzaHiTtYpnOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjB40Z%2FbtszK2bf2P8%2FsuGTooBf5BWzaHiTtYpnOK%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;1134&quot; height=&quot;318&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.03.43.png&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오호 그렇다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜 클래스만 되는가 했더니 !!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;The protocol to which all classes implicitly conform. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;모든 클래스들이 암묵적으로/절대적으로 채택하고 있는 프로토콜&lt;/b&gt;&lt;/span&gt;이라고 함 !!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;근데 왜 클래스 타입이 &lt;b&gt;꼭 채택해야 하는 프로토콜&lt;/b&gt;인거지?&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그것도 써있더라구여 ~ ㅋ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;You use&amp;nbsp;&lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;&amp;nbsp;&amp;nbsp;when you need the flexibility of an untyped object or when you use bridged Objective-C methods and properties that return an untyped result.&amp;nbsp;&lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;&amp;nbsp;&amp;nbsp;can be used as the concrete type for an instance of any class, class type, or class-only protocol.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Objective-C 와의 상호운용성을 강화하기 위해&lt;/b&gt;서 그렇다고 하는군용!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;3) 그래서 Any랑 AnyObject는 어떻게 써야할까&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Any와 AnyObject가 모든 타입을 or 클래스 타입의 인스턴스들을 나타낼 수 있다고는 했지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇다고 이 친구들 타입만 쓸 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699021370390&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var str: Any = &quot;안녕하세요 스트링입니다 믿어주세요&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;str이라는 변수를 하나 만들었는데 거기에는 누가봐도 String 타입인 문자열을 할당했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 일단 타입은 &lt;b&gt;&lt;i&gt;Any&lt;/i&gt;&lt;/b&gt;라고 지정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;근데 어차피 할당된게~ 문자열이니까~ 당연히 문자열처럼 쓸 수 있겠지~~? 생각했지만 ,,  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.23.20.png&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceRALH/btszKyaLprA/8TSxtwGNyD7K7X5XvZRxOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceRALH/btszKyaLprA/8TSxtwGNyD7K7X5XvZRxOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceRALH/btszKyaLprA/8TSxtwGNyD7K7X5XvZRxOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceRALH%2FbtszKyaLprA%2F8TSxtwGNyD7K7X5XvZRxOk%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;544&quot; height=&quot;149&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.23.20.png&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아무리 문자열을 할당해도 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;해당 변수의 타입은 &lt;i&gt;Any&lt;/i&gt;이기 때문에&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;String 타입에 접근해서 사용할 수가 없음.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇기 때문에 &lt;b&gt;&lt;i&gt;Any&lt;/i&gt;&lt;/b&gt;는 모든 타입의 인스턴스를 나타낼 수는 있으나 접근은 불가한거임 ㅜ&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 !!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이럴려고 !!!!! 타입캐스팅 공부함 !!!!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;Any&lt;/i&gt;&amp;nbsp;를 다운캐스팅 해서 해당 타입으로 사용해줘야함&lt;/span&gt;&lt;/b&gt; !!!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.30.58.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buNQ77/btszHsvNrGr/j3C0qqMGEYG8EpDEkzZs0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buNQ77/btszHsvNrGr/j3C0qqMGEYG8EpDEkzZs0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buNQ77/btszHsvNrGr/j3C0qqMGEYG8EpDEkzZs0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuNQ77%2FbtszHsvNrGr%2Fj3C0qqMGEYG8EpDEkzZs0K%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;592&quot; height=&quot;261&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.30.58.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;as? (혹은 as!) 연산자를 이용해서 다운캐스팅 해야만 해당 타입으로 사용&lt;/b&gt;할 수 있음&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 예시에서 str을 String으로 다운캐스팅 해야~ String의 메서드에 접근이 가능합니당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 as 연산자 공부할 때 왜 이걸 몰랐찌??? 했던게 ,,&amp;nbsp;업캐스팅도 가능하지만 &lt;b&gt;패턴 매칭&lt;/b&gt;도 가능하다고 함!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 &lt;b&gt;&lt;i&gt;Any&lt;/i&gt;&lt;/b&gt;&amp;nbsp;타입의 인스턴스들을 &lt;b&gt;switch 문에서 as 연산자&lt;/b&gt; (혹은 is 연산자) 로 &lt;b&gt;타입매칭으로 분기처리도 해줄 수 있음!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공식문서 예제가 좋아서 가져와볼게옹 (귀찮은거 아님)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1699022201946&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for thing in things {
    switch thing {
    case 0 as Int:
        print(&quot;zero as an Int&quot;)
    case 0 as Double:
        print(&quot;zero as a Double&quot;)
    case let someInt as Int:
        print(&quot;an integer value of \(someInt)&quot;)
    case let someDouble as Double where someDouble &amp;gt; 0:
        print(&quot;a positive double value of \(someDouble)&quot;)
    case is Double:
        print(&quot;some other double value that I don't want to print&quot;)
    case let someString as String:
        print(&quot;a string value of \&quot;\(someString)\&quot;&quot;)
    case let (x, y) as (Double, Double):
        print(&quot;an (x, y) point at \(x), \(y)&quot;)
    case let movie as Movie:
        print(&quot;a movie called \(movie.name), dir. \(movie.director)&quot;)
    case let stringConverter as (String) -&amp;gt; String:
        print(stringConverter(&quot;Michael&quot;))
    default:
        print(&quot;something else&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아까 맨~~ 위에서 언급했던 온갖거 다 넣었던 things 배열을 분기처리 했숩니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결과는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.39.23.png&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocfT1/btszL0xiPSd/9O8RqalOFC05ctEVx218A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocfT1/btszL0xiPSd/9O8RqalOFC05ctEVx218A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocfT1/btszL0xiPSd/9O8RqalOFC05ctEVx218A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FocfT1%2FbtszL0xiPSd%2F9O8RqalOFC05ctEVx218A1%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;911&quot; height=&quot;862&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.39.23.png&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;s&gt;(넘 당연)&lt;/s&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;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;+) ‼️아 그리고 참고한 블로그에서 구조체의 인스턴스를 &lt;b&gt;&lt;i&gt;AnyObject&lt;/i&gt;&lt;/b&gt;로 업캐스팅하니까 오류가 없어진 것을 보고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;나도 정수 타입(구조체)인 20을 &lt;b&gt;&lt;i&gt;AnyObject&lt;/i&gt;&lt;/b&gt;로 업캐스팅을 했더니 ..!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.42.12.png&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxld9/btszK99mwqD/iiDZZYZCllQYzm1yNOzUZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxld9/btszK99mwqD/iiDZZYZCllQYzm1yNOzUZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxld9/btszK99mwqD/iiDZZYZCllQYzm1yNOzUZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwxld9%2FbtszK99mwqD%2FiiDZZYZCllQYzm1yNOzUZK%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;624&quot; height=&quot;229&quot; data-filename=&quot;스크린샷 2023-11-03 오후 11.42.12.png&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뭐여 ..? 클래스만 된다며 ..!!! 웅성웅성 뭐야.. 수군수군&amp;hellip; 이게 왜 되지? ㄴㅇㄱ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;넘나 놀라워서 찾아보았더니 ,, 이것 또한 공식문서에 있었따,,~ (머쓱)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;i&gt;&lt;b&gt;AnyObject&lt;/b&gt;&lt;/i&gt;&amp;nbsp;can also be used as the concrete type for an instance of a type that bridges to an Objective-C class. Many value types in Swift bridge to Objective-C counterparts, like&amp;nbsp;String&amp;nbsp;&amp;nbsp;and&amp;nbsp;Int.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이것도 아까 &lt;b&gt;&lt;i&gt;AnyObject&lt;/i&gt;&lt;/b&gt;를 사용하는 이유였던 &lt;b&gt;Objective-C와의 연결성&lt;/b&gt;과 관련이 있는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Swift에서 정수 20은 구조체이지만 Swift 내부적으로 Int와 같은 일부 기본 타입(like String)을 &lt;b&gt;Objective-C의 NSObject 타입을 상속하는 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;NSNumber와 같은 클래스로 취급&lt;/span&gt;&lt;/b&gt;하기도 한다고 함! 옵젝씨와의 연결성 그리고 편의성을 위한 Swift의 기능 중 하나라고 합니댜&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 &lt;b&gt;20을 옵젝씨의 NSNumber로 간주해서 업캐스팅이 되었던 것&lt;/b&gt;이었읍니다 !!! 짱신기 !!!!!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우와 ~~~ 드디어 ~~~~ 타입캐스팅과 Any, AnyObject에 대한 공부 및 정리 끗~~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;진짜 평소에 넘 궁금하기도 했고,, 이렇게 알고나니까 속 시 ~ 원 ~ 개비스콘 ~ 넘 재밌다 !!!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다음에는 또 어떤걸 공부해볼까 ~ 정.말.기.대.된.다..^^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;reference(늘 감사합니당)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;hearts;️&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 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Type-Casting-for-Any-and-AnyObject&quot;&gt;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Type-Casting-for-Any-and-AnyObject&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699023207002&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;Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.swift.org&quot; data-og-source-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Type-Casting-for-Any-and-AnyObject&quot; data-og-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Type-Casting-for-Any-and-AnyObject&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Type-Casting-for-Any-and-AnyObject&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Type-Casting-for-Any-and-AnyObject&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.swift.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/swift/anyobject&quot;&gt;https://developer.apple.com/documentation/swift/anyobject&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699023197391&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;AnyObject | Apple Developer Documentation&quot; data-og-description=&quot;The protocol to which all classes implicitly conform.&quot; data-og-host=&quot;developer.apple.com&quot; data-og-source-url=&quot;https://developer.apple.com/documentation/swift/anyobject&quot; data-og-url=&quot;https://docs.developer.apple.com/documentation/swift/anyobject&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EX0kk/hyUnV4Idro/OelCN49g10OsJt8Wd8Ksa1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Tpc8v/hyUnLOxM2K/R07GY8ngBMSgrVRxp1Z9SK/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/swift/anyobject&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.apple.com/documentation/swift/anyobject&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EX0kk/hyUnV4Idro/OelCN49g10OsJt8Wd8Ksa1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/Tpc8v/hyUnLOxM2K/R07GY8ngBMSgrVRxp1Z9SK/img.jpg?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&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;AnyObject | Apple Developer Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The protocol to which all classes implicitly conform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/128&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://babbab2.tistory.com/128&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699023178477&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift) Any와 AnyObject 알아보기&quot; data-og-description=&quot;안녕하세요 :) 소들입니다! 오늘은 타입 캐스팅의 연장선으로 Any AnyObject 라는 &amp;quot;범용&amp;quot; 타입에 대해 공부해보려고 해요!! 모든 포스팅은 편의 말투로 합니다~!! 1. Any &amp;amp; Any Object 타입 캐스팅을 수행할&quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/128&quot; data-og-url=&quot;https://babbab2.tistory.com/128&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLzPMo/hyUnNS7Tzi/FU1NRh46pKMtjdzhiyebik/img.png?width=800&amp;amp;height=196&amp;amp;face=0_0_800_196,https://scrap.kakaocdn.net/dn/cTDjhp/hyUryteVt5/ZXddHgPHiiKKoFsVYRbVek/img.png?width=800&amp;amp;height=196&amp;amp;face=0_0_800_196,https://scrap.kakaocdn.net/dn/f1QOj/hyUnRBdhGq/PvUxiHgryWAwxBKrrg9esK/img.png?width=930&amp;amp;height=228&amp;amp;face=0_0_930_228&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/128&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLzPMo/hyUnNS7Tzi/FU1NRh46pKMtjdzhiyebik/img.png?width=800&amp;amp;height=196&amp;amp;face=0_0_800_196,https://scrap.kakaocdn.net/dn/cTDjhp/hyUryteVt5/ZXddHgPHiiKKoFsVYRbVek/img.png?width=800&amp;amp;height=196&amp;amp;face=0_0_800_196,https://scrap.kakaocdn.net/dn/f1QOj/hyUnRBdhGq/PvUxiHgryWAwxBKrrg9esK/img.png?width=930&amp;amp;height=228&amp;amp;face=0_0_930_228');&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;Swift) Any와 AnyObject 알아보기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 :) 소들입니다! 오늘은 타입 캐스팅의 연장선으로 Any AnyObject 라는 &quot;범용&quot; 타입에 대해 공부해보려고 해요!! 모든 포스팅은 편의 말투로 합니다~!! 1. Any &amp;amp; Any Object 타입 캐스팅을 수행할&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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 style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;a href=&quot;https://zeddios.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://zeddios.tistory.com/213&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699023123335&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift ) Any와 AnyObject의 차이&quot; data-og-description=&quot;안녕하세요 :) Zedd입니다. 오늘은 Any와 AnyObject의 차이를 알아볼거에요!! 시작할게요!! Any와 AnyObject의 차이 The Swift Programming Language에서, Any와 AnyObject를 이렇게 말합니다. Swift는 특정하지 않은 타&quot; data-og-host=&quot;zeddios.tistory.com&quot; data-og-source-url=&quot;https://zeddios.tistory.com/213&quot; data-og-url=&quot;https://zeddios.tistory.com/213&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wRHAc/hyUnJb7KCs/EhaleskMA6XFOLK9MiJ2HK/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227,https://scrap.kakaocdn.net/dn/HGA89/hyUnNFAkkZ/bAU9x8fhZBvdATfZkbHcV1/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227,https://scrap.kakaocdn.net/dn/dLlaOo/hyUryteUau/JnfzRHyybSj0xVeKrYPkJ1/img.png?width=820&amp;amp;height=525&amp;amp;face=0_0_820_525&quot;&gt;&lt;a href=&quot;https://zeddios.tistory.com/213&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zeddios.tistory.com/213&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wRHAc/hyUnJb7KCs/EhaleskMA6XFOLK9MiJ2HK/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227,https://scrap.kakaocdn.net/dn/HGA89/hyUnNFAkkZ/bAU9x8fhZBvdATfZkbHcV1/img.png?width=800&amp;amp;height=227&amp;amp;face=0_0_800_227,https://scrap.kakaocdn.net/dn/dLlaOo/hyUryteUau/JnfzRHyybSj0xVeKrYPkJ1/img.png?width=820&amp;amp;height=525&amp;amp;face=0_0_820_525');&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;Swift ) Any와 AnyObject의 차이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 :) Zedd입니다. 오늘은 Any와 AnyObject의 차이를 알아볼거에요!! 시작할게요!! Any와 AnyObject의 차이 The Swift Programming Language에서, Any와 AnyObject를 이렇게 말합니다. Swift는 특정하지 않은 타&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zeddios.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/14</guid>
      <comments>https://yyomzzi.tistory.com/14#entry14comment</comments>
      <pubDate>Sat, 4 Nov 2023 00:01:52 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Any랑 AnyObject 공부했다. 근데 TypeCasting을 곁들인,,(1)</title>
      <link>https://yyomzzi.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;오늘은 Any와 AnyObject를 배우다보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;타입캐스팅의 개념을 모르면 Any와 AnyObject 개념도 확실히 알 수가 없더라더라~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;근데 평소에도 프로젝트를 하다보면 은근히 as를 쓰는데가 많았눈데&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;확실히 몰라서 '타입캐스팅 이고이거 꼭 나중에 봐야지!!!' 했는데 그 나중이 오늘이 되어버렸다눈,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Any와 AnyObject 그리고 타입캐스팅까지 뽀샤봅시당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; Any와&amp;nbsp;AnyObject에 대해 설명하시오.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아챠챠챠 그전에!! 타입캐스팅에 대해서 잠깐만 보고 갈께옹~~!~!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;1) 타입 캐스팅이 뭐여뭐여&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Type casting&amp;nbsp;is a way to check the type of an instance, or to treat that instance as a different superclass or subclass from somewhere else in its own class hierarchy.&amp;nbsp;Type casting in Swift is implemented with the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;is&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;as&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;operators. These two operators provide a simple and expressive way to check the type of a value or cast a value to a different type.&amp;nbsp;You can also use type casting to check whether a type conforms to a protocol.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;1) 인스턴스의 &lt;b&gt;타입을 확인&lt;/b&gt;하거나&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;2) 해당 인스턴스가 동일한 클래스 계층구조에 있는&lt;b&gt; 슈퍼클래스나 서브클래스의 클래스 타입을 취급&lt;/b&gt;하는 방법&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;+) 타입 캐스팅을 사용해서 타입이 &lt;b&gt;특정 프로토콜을 준수하는지도 확인&lt;/b&gt; 가능&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;결국 어떤 인스턴스의 타입이 무엇인지 확인하고, 해당 인스턴스의 타입을 자체 클래스의 슈퍼 클래스나 서브클래스의 타입을 가져와서 쓰는것을 뜻하나봄~~!~!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;2) &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;인스턴스의 타입이 무엇인지 확인 =&amp;gt; &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;is 연산자&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;is 연산자는 타입을 체크하는 연산자로 타입에 대한 검사를 수행&lt;/b&gt;한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인스턴스의 타입이 뭔지 확인해보는 연산자임!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확인을하게 되면 당연히 결과를 알려주겠쥬? 그래서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;The type check operator returns&amp;nbsp;&lt;/span&gt;true&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;nbsp;if the instance is of that subclass type and&amp;nbsp;&lt;/span&gt;false&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;nbsp;if it&amp;rsquo;s not.&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 타입이거나 서브클래스일 경우에는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;true&lt;/span&gt;&lt;/b&gt;를, 그게 아닐 경우에는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;false&lt;/span&gt;&lt;/b&gt;를 반환해줌 (Bool 값 리턴)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공식문서에 있는 예제로 이것이 무엇인가 보자면&lt;/p&gt;
&lt;pre id=&quot;code_1698935099835&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}


// MediaItem 상속
class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}

// MediaItem 상속
class Song: MediaItem {
    var artist: String
    init(name: String, artist: String) {
        self.artist = artist
        super.init(name: name)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;이라는 슈퍼클래스가 있고 상속받은 &lt;i&gt;&lt;b&gt;Movie, Song&lt;/b&gt; &lt;/i&gt;이라는 서브클래스가 있움&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;에는 name이라는 저장속성만 있고 상속받은 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;에는 director가 추가되고 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;에는 artist가 추가됨&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;쉽죠잉&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그렇다면 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;의 인스턴스를 하나 만들어서 변수에 담아보께옹&lt;/p&gt;
&lt;pre id=&quot;code_1698966329544&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;let movie1 = Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그리고 is 연산자를 통해서 movie의 타입을 체크해봅시다&lt;/p&gt;
&lt;pre id=&quot;code_1698966712433&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;movie1 is Movie // true&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;is는 이항연산자이기 때문에 위의 코드처럼 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;is&lt;/span&gt;&lt;/b&gt; 앞에는 확인하려는 변수명(표현식)을 위치시키고&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;is 뒤에는 타입명을 써주면 됨. 그러면 이것은 &quot;movie1은 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입입니까?&quot; 가 되는거임&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그렇다면 너무너무 당연스럽게 true가 리턴되겠쥬?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 재밌는 것이 is 연산자는 &lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;returns&lt;/span&gt;true&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;if the instance is of that subclass type &lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;이라고 했음.&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그니까 인스턴스가 is 연산자로 확인할 타입의 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;서브클래스 인스턴스여도 true를 반환&lt;/span&gt;&lt;/b&gt;하는거임!&lt;/p&gt;
&lt;pre id=&quot;code_1698966878212&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;movie1 is MediaItem // true&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;바로 이러케!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;movie1은 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입의 인스턴스이지만, &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;는 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;을 상속받은 서브클래스이기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;movie1은 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;과의 타입 체킹에서도 true인거임~!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그렇다면 이것은?&lt;/p&gt;
&lt;pre id=&quot;code_1698966955638&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;// MediaItem의 상속을 받은 Movie의 상속을 받은 클래스

class AwardWinningMovie: Movie {
    var numberOfAwards: Int = 0
    init(name: String, director: String, numberOfAwards: Int) {
        self.numberOfAwards = numberOfAwards
        super.init(name: name, director: director)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;의 상속을 받은 &lt;i&gt;&lt;b&gt;AwardWinningMovie&lt;/b&gt;&lt;/i&gt;라는 클래스가 있다고 가정해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 movie1은 위의 클래스 타입으로 체킹을 해도 true를 반환할까?&lt;/p&gt;
&lt;pre id=&quot;code_1698967229060&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;movie1 is AwardWinningMovie // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아~~니~~요~~~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;왜냐면 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입은 &lt;i&gt;&lt;b&gt;AwardWinningMovie&lt;/b&gt;&lt;/i&gt; 의 슈퍼클래스이쟈나욧&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 false를 반환함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;AwardWinningMovie&lt;/b&gt;&lt;/i&gt;는 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입이 갖고있지 않은 멤버를 가지고 있음.&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;size18&quot;&gt;밑에 또 재밌는 예시를 가져와보겠음&lt;/p&gt;
&lt;pre id=&quot;code_1698935187439&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let library = [
    Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;),
    Song(name: &quot;고양이&quot;, artist: &quot;선우정아&quot;),
    Movie(name: &quot;기생충&quot;, director: &quot;봉준호&quot;),
    Song(name: &quot;빈집&quot;, artist: &quot;기리보이&quot;),
    Movie(name: &quot;헤어질 결심&quot;, director: &quot;박찬욱&quot;)
]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그리고 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;의 인스턴스들을 생성해서 library라는 배열에 모두모두 모아 담아버렸읍니다,,&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 뒤죽박죽쓰 배열에서 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스와 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스의 인스턴스가 각각 몇개가 있는지 확인해보려고 함.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이럴때 is 연산자를 사용해서 누가 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;출신인지!! &lt;b&gt;&lt;i&gt;Song&lt;/i&gt;&lt;/b&gt; 출신인지!! 알 수 있찌 않겠어유?&lt;/p&gt;
&lt;pre id=&quot;code_1698935229672&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var movieCount = 0
var songCount = 0

⭐️
for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}
⭐️

print(&quot;library 속 영화는 \(movieCount)편, 노래는 \(songCount)곡입니다.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;library 배열을 for-in 구문을 통해 돌려돌려 돌림판을 해서 item들의 타입을 is 연산자를 통해 확인해주는 작업임&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위의 예시에서 보자면 library의 item들 중 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;의 인스턴스라면 movieCount가 +1이 되고&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;&amp;nbsp;의 인스턴스라면 songCount가 +1이 될것이당&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 그 두 변수의 값을 확인하면 우뚜케 되겠움?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 11.34.17.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEmvKz/btszGUqL6fR/Pt0KbhlQqm3AmWnajeDxs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEmvKz/btszGUqL6fR/Pt0KbhlQqm3AmWnajeDxs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEmvKz/btszGUqL6fR/Pt0KbhlQqm3AmWnajeDxs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEmvKz%2FbtszGUqL6fR%2FPt0KbhlQqm3AmWnajeDxs1%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;476&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2023-11-02 오후 11.34.17.png&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;당연하게 영화는 3편, 노래는 2곡이라는 결과가 나올것임! &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt; 인스턴스가 3개이고 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt; 인스턴스가 2개이니까~&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;자 근데 생각해보니까,,,,,,&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;보자보자,,,,,,,&lt;/p&gt;
&lt;pre id=&quot;code_1698935757015&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let library = [
    Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;),
    Song(name: &quot;고양이&quot;, artist: &quot;선우정아&quot;),
    Movie(name: &quot;기생충&quot;, director: &quot;봉준호&quot;),
    Song(name: &quot;빈집&quot;, artist: &quot;기리보이&quot;),
    Movie(name: &quot;헤어질 결심&quot;, director: &quot;박찬욱&quot;)
]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 배열 뭔가 넘 이상하지 않움?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;어떻게 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;랑 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;은 다른 클래스 타입인데 이렇게 한 배열에 같이 있을 수 있는거지?????????&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;자,, 여기서 이제 타입캐스팅의 두번째 의미가 나옵니다&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;3) &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;인스턴스가 자체 클래스 계층구조에 있는 슈퍼클래스나 서브클래스의 타입을 취급하는 방법 &lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;=&amp;gt; 업캐스팅 / 다운캐스팅 (as / as! / as? 연산자)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&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;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;3-1) 업캐스팅(Upcasting)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;이것이 바로 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;업캐스팅&lt;/span&gt;&lt;/b&gt;임. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;와 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;은 다른 클래스이지만 library 배열에 담기는 순간 이 둘의 공통적인 슈퍼클래스인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입으로 업캐스팅해서 배열에 담겼기 때문에 에러가 발생하지 않는거임!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;그래서 library의 타입을 확인하면&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-02 오후 8.58.34.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfOnP/btszCG8xm3x/LolVnWFDP7hgAfwbGyxKu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfOnP/btszCG8xm3x/LolVnWFDP7hgAfwbGyxKu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfOnP/btszCG8xm3x/LolVnWFDP7hgAfwbGyxKu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfOnP%2FbtszCG8xm3x%2FLolVnWFDP7hgAfwbGyxKu0%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;513&quot; height=&quot;156&quot; data-filename=&quot;스크린샷 2023-11-02 오후 8.58.34.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;[MediaItem]&lt;/b&gt;&lt;/i&gt;인것을 확인할 수 있음!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 업캐스팅은 바로 동일한 클래스 계층 내에서 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;서브클래스의 메모리구조를 가진 인스턴스(ex: &lt;i&gt;Movie&lt;/i&gt;&amp;nbsp;인스턴스)가 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;슈퍼클래스 타입(ex: &lt;i&gt;MediaItem&lt;/i&gt;)으로 인식&lt;/b&gt;&lt;/span&gt;되는 것&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;library의 3개의 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;인스턴스들은 정의될 때 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입으로 정의되었기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;힙 영역의 메모리구조는 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스로 저장이 되었을 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;하지만 library 배열에 담기는 순간에 그 슈퍼클래스인 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;으로 업캐스팅되어 인식되었음.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;업캐스팅은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;as 연산자&lt;/span&gt;&lt;/b&gt;를 사용함.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그리고 사실 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;업캐스팅은 항 상 무 조 건 성공&lt;/span&gt;&lt;/b&gt;임.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;서브클래스 안에는 슈퍼클래스를 포함하고 있으니까(상속 관계) 당연히 슈퍼클래스의 속성을 가지고 있기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;슈퍼클래스로 추론이 가능한거임!&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그러면 슈퍼클래스가 서브클래스로도 인식될 수 있음?&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그것이 바로 다운캐스팅임&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;3-2) 다운캐스팅(Downcasting)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다운캐스팅은 업캐스팅과 반대로 &lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;슈퍼클래스 타입의 인스턴스를 서브클래스로 인식&lt;/span&gt;&lt;/b&gt;하는 것을 말함&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;아까 봤던 library 배열을 다시 보자면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698968918877&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;let library: [MediaItem] = [
    Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;),
    Song(name: &quot;고양이&quot;, artist: &quot;선우정아&quot;),
    Movie(name: &quot;기생충&quot;, director: &quot;봉준호&quot;),
    Song(name: &quot;빈집&quot;, artist: &quot;기리보이&quot;),
    Movie(name: &quot;헤어질 결심&quot;, director: &quot;박찬욱&quot;)
]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;업캐스팅으로 인해서 library의 타입은 &lt;b&gt;&lt;i&gt;[MediaItem]&lt;/i&gt;&lt;/b&gt;이 되었다&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 3개의 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;인스턴스와 2개의 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt;&amp;nbsp;인스턴스는 현재 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;&amp;nbsp;타입이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 사실! 이렇게 되면 아무리 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;에 name과 director를 가지고 있어도 director에는 접근이 불가함&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;왜냐구?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;메모리 구조는 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;일지언정,, 현재 이 친구는 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;으로 인식되어있기 때문에!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;의 속성밖에 접근할 수 없는거임 ㅠ&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오전 8.51.56.png&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXmKGL/btszGRgD6VM/P5R7R2ZuQ3VTIcHU5Byb4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXmKGL/btszGRgD6VM/P5R7R2ZuQ3VTIcHU5Byb4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXmKGL/btszGRgD6VM/P5R7R2ZuQ3VTIcHU5Byb4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXmKGL%2FbtszGRgD6VM%2FP5R7R2ZuQ3VTIcHU5Byb4k%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;829&quot; height=&quot;206&quot; data-filename=&quot;스크린샷 2023-11-03 오전 8.51.56.png&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;속성에 접근하려고 해도 name 프로퍼티만 접근할 수 있어유,,&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 그러면 이제 더이상은 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;로 살아갈 수 없는거임 ?ㅠㅠㅠㅠㅠ&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 이럴때 다운캐스팅을 해주면 됨!!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698972050580&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let movie1: MediaItem = Movie(name: &quot;친절한 금자씨&quot;, director: &quot;박찬욱&quot;)

if let movie2 = movie1 as? Movie {
    print(&quot;영화 제목: \(movie2.name), 감독: \(movie2.director)&quot;)
}

// Prints &quot;영화 제목: 친절한 금자씨, 감독: 박찬욱&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;여기서 보면 특이하게 보이는 하나가 있쥬?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;바로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;as?&lt;/b&gt;&lt;/span&gt; 연산자 입니다&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 뒤에 물음표가 붙었네? 그것은 바로 옵셔널로 값이 나올 수 있다! 즉, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;실패가능성이 있다&lt;/span&gt;&lt;/b&gt;는 말임&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;오잉? 왜 실패하쥬?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;과 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스를 예로 들어 메모리 구조를 보자면,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스의 인스턴스를 생성할 때, 메모리에는 당연히 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스의 메모리구조를 가지고 저장할 것이고&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;스택에는 그 힙 영역에 주소를 저장할 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 그 주소를 참조하는 변수(예를들면, 아까 movie1과 같은)를 스택에 저장할텐데,&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그 변수가 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;nbsp;타입으로 업캐스팅 되어서 저장된거임. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;그래서 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스로 메모리구조를 가지고 있어도 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;으로 인식되기 때문에 접근에 제한이 있음.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그럼 반대로 &lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;이 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;로 다운캐스팅 될 때는 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;i&gt;&lt;b&gt;MediaItem&lt;/b&gt;&lt;/i&gt;의 인스턴스가 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;실 제 로 는 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;의 메모리 구조를 가지고 있어야 함! &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래야 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;로 다운캐스팅을 할 때 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;메모리에 모두 접근이 가능할테니까!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 만약 서브클래스의 메모리 구조를 가지고 있지 않은 슈퍼클래스의 인스턴스라면...?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;당연히 다운캐스팅이 실패하겠쥬?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 .. 말이 되나..? 서브클래스의 메모리 구조를 다 가지고 있는 슈퍼클래스의 인스턴스가 어디있땀?&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그래서 여기서 알 수 있 는 다운캐스팅의 전제 조건은 바로 !!!! &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;업캐스팅이 되었던 인스턴스에 가능&lt;/span&gt;&lt;/b&gt;하다는 것!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;서브클래스의 메모리 구조를 가지고 한 번 정의 되었던 인스턴스가 &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;슈퍼클래스로 업캐스팅이 되었을 때만 서브클래스의 메모리 구조&lt;/b&gt;를 가질 수 있겠쥬?&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다운캐스팅은 실패가능성이 있기 때문에 as? 로 선언해서&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다운캐스팅이 성공한다고 해도 무조건 옵셔널 값을 반환함. (실패하면 nil을 반환)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그렇기 때문에 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;옵셔널을 벗겨서 사용해야함.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위의 예시에서도 if let 으로 옵셔널 값을 언래핑해서 사용하는 것을 볼 수 있음.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1698972275623&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;if let movie2 = movie1 as? Movie {
    print(&quot;영화 제목: \(movie2.name), 감독: \(movie2.director)&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 만약? 이건 진짜 확실하게!!! 다운캐스팅이 될 것이라고 내가 확신해 !!!!! 한다면&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;as! 연산자&lt;/span&gt;&lt;/b&gt;&amp;nbsp;로 강제 언래핑해서 사용할 수 있음 (근데 강제 언래핑은 언제나 조심할 것,,,)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오전 9.46.31.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xYO2h/btszFGzWukx/ihbsdEWkA3ryr2jJapDbz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xYO2h/btszFGzWukx/ihbsdEWkA3ryr2jJapDbz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xYO2h/btszFGzWukx/ihbsdEWkA3ryr2jJapDbz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxYO2h%2FbtszFGzWukx%2FihbsdEWkA3ryr2jJapDbz0%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;880&quot; height=&quot;258&quot; data-filename=&quot;스크린샷 2023-11-03 오전 9.46.31.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;자!!!!! 다시!!!!!! library 배열 예시로 보자면&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;3개의 &lt;i&gt;&lt;b&gt;Movie&lt;/b&gt;&lt;/i&gt;&amp;nbsp;클래스 인스턴스와 2개의 &lt;i&gt;&lt;b&gt;Song&lt;/b&gt;&lt;/i&gt; 클래스 인스턴스들은 library 배열에 들어가면서 업캐스팅이 된 상태임&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그러면 이제 다운캐스팅을 해보겠슴다&lt;/p&gt;
&lt;pre id=&quot;code_1698972060381&quot; class=&quot;xquery&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;for item in library {
    if let movie = item as? Movie {
        print(&quot;영화 제목: \(movie.name), 감독: \(movie.director)&quot;)
    } else if let song = item as? Song {
        print(&quot;노래 제목: \(song.name), 가수: \(song.artist)&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;library를 for-in 구문으로 돌려돌려 돌림판을 해서 나온 item들을 다운캐스팅을 하면 결과는 이렇게 나옵니댜&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-03 오전 9.48.05.png&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM3bAO/btszC6spJxy/U423RGheaIaoZhIq9Sx9M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM3bAO/btszC6spJxy/U423RGheaIaoZhIq9Sx9M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM3bAO/btszC6spJxy/U423RGheaIaoZhIq9Sx9M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM3bAO%2FbtszC6spJxy%2FU423RGheaIaoZhIq9Sx9M0%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;863&quot; height=&quot;366&quot; data-filename=&quot;스크린샷 2023-11-03 오전 9.48.05.png&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;근데 업캐스팅하고 다운캐스팅하고 그러면 ,, 클래스라서 참조타입인데 원래 인스턴스가 막 바뀌거나 하는거 아녀?&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;했었눈데 공식문서에서 이렇게 안심시켜줍니다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Casting doesn&amp;rsquo;t actually modify the instance or change its values. The underlying instance remains the same; it&amp;rsquo;s simply treated and accessed as an instance of the type to which it has been cast.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;인스턴스는 동일하게 유지 되지만 캐스팅을 통해 그냥 캐스트된 타입으로 인식해서 접근만 달라지는 것이라고 합니다~&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Any와 AnyObject 공부하려고 했다가 결국 Any는 언급도 못한 블로그 ,,,&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;타입 캐스팅 하다보니까 글 넘 길어져서 다음 글에서 쭈절쭈절하겠슴다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;타입 캐스팅 만만하게 봤는데 한개도 안만만하고 어렵네 ..^^ 그래도 배웠으니 되었다~&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;  reference(늘 감사합니당) &amp;hearts;️&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Checking-Type&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Checking-Type&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698933330869&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;Documentation&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.swift.org&quot; data-og-source-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Checking-Type&quot; data-og-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Checking-Type&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Checking-Type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/typecasting/#Checking-Type&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.swift.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@din0121/Upcasting-Downcasting&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@din0121/Upcasting-Downcasting&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698972771883&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Swift] - Upcasting &amp;amp; Downcasting&quot; data-og-description=&quot;안녕하세요:)오늘은 인스턴스를 동일한 클래스 계층에 존재하는 다른 클래스 형식으로 처리하는 방법에 대해서 알아보도록 하겠습니다.동일한 클래스 계층에서 수행되는 Upcasting은 안전하고 항&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@din0121/Upcasting-Downcasting&quot; data-og-url=&quot;https://velog.io/@din0121/Upcasting-Downcasting&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bVPWdY/hyUrqaKPE7/X1N7M9mwgUBkkFZgNhopp1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/xHSFb/hyUnKop5Ms/68wLhqK0aTlvCRcrKYFDkK/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440&quot;&gt;&lt;a href=&quot;https://velog.io/@din0121/Upcasting-Downcasting&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@din0121/Upcasting-Downcasting&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bVPWdY/hyUrqaKPE7/X1N7M9mwgUBkkFZgNhopp1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/xHSFb/hyUnKop5Ms/68wLhqK0aTlvCRcrKYFDkK/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440');&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;[Swift] - Upcasting &amp;amp; Downcasting&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요:)오늘은 인스턴스를 동일한 클래스 계층에 존재하는 다른 클래스 형식으로 처리하는 방법에 대해서 알아보도록 하겠습니다.동일한 클래스 계층에서 수행되는 Upcasting은 안전하고 항&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/127&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://babbab2.tistory.com/127&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698972782066&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift) is, as - 타입 캐스팅 (Type Casting)&quot; data-og-description=&quot;안녕하세요, 소들입니다!!!! 오늘 포스팅은 is와 as 즉, 타입 캐스팅에 대해 알아보려고 해요 :D 타입 캐스팅,,, 개발 하다보면 가끔 보이는.. is as as? as! 막 ... 이렇게... 단어 하나갖고 장난질이여;;;&quot; data-og-host=&quot;babbab2.tistory.com&quot; data-og-source-url=&quot;https://babbab2.tistory.com/127&quot; data-og-url=&quot;https://babbab2.tistory.com/127&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/V5dZV/hyUrvJTZ1H/ujjIFimwLBIGv3l4sXpuQk/img.png?width=800&amp;amp;height=428&amp;amp;face=0_0_800_428,https://scrap.kakaocdn.net/dn/saMko/hyUry7HaOD/ik7zeWh6BpKwDE1DIm9oSK/img.png?width=800&amp;amp;height=428&amp;amp;face=0_0_800_428,https://scrap.kakaocdn.net/dn/B1pN8/hyUnQ91Hxe/0HLqZxOKmkq0FKDSjfJkRk/img.png?width=1510&amp;amp;height=758&amp;amp;face=0_0_1510_758&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/127&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babbab2.tistory.com/127&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/V5dZV/hyUrvJTZ1H/ujjIFimwLBIGv3l4sXpuQk/img.png?width=800&amp;amp;height=428&amp;amp;face=0_0_800_428,https://scrap.kakaocdn.net/dn/saMko/hyUry7HaOD/ik7zeWh6BpKwDE1DIm9oSK/img.png?width=800&amp;amp;height=428&amp;amp;face=0_0_800_428,https://scrap.kakaocdn.net/dn/B1pN8/hyUnQ91Hxe/0HLqZxOKmkq0FKDSjfJkRk/img.png?width=1510&amp;amp;height=758&amp;amp;face=0_0_1510_758');&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;Swift) is, as - 타입 캐스팅 (Type Casting)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 소들입니다!!!! 오늘 포스팅은 is와 as 즉, 타입 캐스팅에 대해 알아보려고 해요 :D 타입 캐스팅,,, 개발 하다보면 가끔 보이는.. is as as? as! 막 ... 이렇게... 단어 하나갖고 장난질이여;;;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babbab2.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Swift</category>
      <author>yyomzzi</author>
      <guid isPermaLink="true">https://yyomzzi.tistory.com/12</guid>
      <comments>https://yyomzzi.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 3 Nov 2023 10:02:32 +0900</pubDate>
    </item>
  </channel>
</rss>