<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>YEN's CodeWeave</title>
    <link>https://yy-dev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 19:27:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>YEN_</managingEditor>
    <image>
      <title>YEN's CodeWeave</title>
      <url>https://tistory1.daumcdn.net/tistory/4680793/attach/a81f93ca324d4973ab26f17d550528db</url>
      <link>https://yy-dev.tistory.com</link>
    </image>
    <item>
      <title>[Swift] CoW / Copy on Write</title>
      <link>https://yy-dev.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 타입에 대한 글을 읽다가 CoW에 대해 언급하는 걸 봤어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이전에도 종종 들었는데 흠 이런게 있군... 하고 넘겼거든요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 뭔지 한 번 확인해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr 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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;Copy on Write&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;수정 가능한 리소스에 대한 복사 작업을 효율적으로 구현하기 위해 사용되는 리소스 관리 기술&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전적 정의를 보고 있으면 뭔소리임? 싶지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;아주 큰 Value Type 유형을 전부 복사한다고 가정해볼게요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 아마도 데이터의 크기만큼 거대한 리소스가 들어갈 겁니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;모든 데이터&quot;를 &quot;복사&quot;해야 하기 때문이죠&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오후 11.49.29.png&quot; data-origin-width=&quot;2366&quot; data-origin-height=&quot;1398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xlO2y/btsFTY2WhYC/Lq8ytokLxeEEO97Pe1l78K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xlO2y/btsFTY2WhYC/Lq8ytokLxeEEO97Pe1l78K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xlO2y/btsFTY2WhYC/Lq8ytokLxeEEO97Pe1l78K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxlO2y%2FbtsFTY2WhYC%2FLq8ytokLxeEEO97Pe1l78K%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;789&quot; height=&quot;1398&quot; data-filename=&quot;스크린샷 2024-03-19 오후 11.49.29.png&quot; data-origin-width=&quot;2366&quot; data-origin-height=&quot;1398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 불상사를 막기 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 타입이어도 변경이 일어나지 않았다면 단순히 원본 데이터를 참조만 하고 있다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값이 변경되는 시점에 메모리를 복사한 다음, 수정한다는 소리입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 깔끔히 적어보자면&lt;/p&gt;
&lt;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;b&gt;불필요한 데이터 복사를 피하고 성능을 향상시킬 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;h2 data-ke-size=&quot;size26&quot;&gt;  Swift의 CoW&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트에서는 어떤 곳에서 CoW 방식을 사용하고 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 Array, Set, Dictionary, String 입니다&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔️ Array 예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-20 오전 12.05.34.png&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k8kBQ/btsFWlvLfOf/1AbgfI6fzJLLHnxZmUEnA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k8kBQ/btsFWlvLfOf/1AbgfI6fzJLLHnxZmUEnA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k8kBQ/btsFWlvLfOf/1AbgfI6fzJLLHnxZmUEnA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk8kBQ%2FbtsFWlvLfOf%2F1AbgfI6fzJLLHnxZmUEnA0%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;821&quot; height=&quot;291&quot; data-filename=&quot;스크린샷 2024-03-20 오전 12.05.34.png&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&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-origin-width=&quot;1548&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QcBST/btsFTb2rAJw/WENogdAdiT60a3pLbs0dXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QcBST/btsFTb2rAJw/WENogdAdiT60a3pLbs0dXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QcBST/btsFTb2rAJw/WENogdAdiT60a3pLbs0dXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQcBST%2FbtsFTb2rAJw%2FWENogdAdiT60a3pLbs0dXK%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;847&quot; height=&quot;336&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 직접 만든 구조체에는 적용되지 않는다는 점만 기억하면 좋을 것 같습니다~&lt;/p&gt;
&lt;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;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;값 타입의 복사 시 필요한 시점까지 메모리 복사를 미뤄주는 CoW!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-001 (15).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjLoq7/btsFVVjMj7P/KKXnU6WBXM19G7CKJZGMAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjLoq7/btsFVVjMj7P/KKXnU6WBXM19G7CKJZGMAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjLoq7/btsFVVjMj7P/KKXnU6WBXM19G7CKJZGMAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjLoq7%2FbtsFVVjMj7P%2FKKXnU6WBXM19G7CKJZGMAK%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;128&quot; height=&quot;128&quot; data-filename=&quot;개발블로그썸네일들-001 (15).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/swift/withunsafepointer(to:_:)-1wfum&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/swift/withunsafepointer(to:_:)-1wfum&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@lucianoalmeida1/understanding-swift-copy-on-write-mechanisms-52ac31d68f2f&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/@lucianoalmeida1/understanding-swift-copy-on-write-mechanisms-52ac31d68f2f&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sunny-maneg.tistory.com/entry/swift-Copy-On-Write-COW&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sunny-maneg.tistory.com/entry/swift-Copy-On-Write-COW&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/swift/array&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/swift/array&lt;/a&gt;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/161</guid>
      <comments>https://yy-dev.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 19 Mar 2024 23:23:43 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] static / class 키워드</title>
      <link>https://yy-dev.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static하면 어떤게 떠오르시나요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 tableView의 identifier 설정하는 게 떠오르네요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 싱글톤?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌든 여러곳에 사용할 수 있는 좋은 키워드죠&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Static&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스가 아니라 타입 자체에 속하게 될 메서드, 프로퍼티 등을 선언하기 위해서 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Static으로 선언된 메서드와 프로퍼티는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 생성하지 않아도 그냥 접근해서 사용할 수 있어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체, 열거형, 클래스 전부 다요!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오전 12.06.02.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;1284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvqkEN/btsFR9v1bkb/Fa8Xw5kMrzPxFkz0lOrDCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvqkEN/btsFR9v1bkb/Fa8Xw5kMrzPxFkz0lOrDCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvqkEN/btsFR9v1bkb/Fa8Xw5kMrzPxFkz0lOrDCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvqkEN%2FbtsFR9v1bkb%2FFa8Xw5kMrzPxFkz0lOrDCk%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;370&quot; data-filename=&quot;스크린샷 2024-03-19 오전 12.06.02.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;1284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  특징&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔️ 타입 속성 + 타입 메서드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 키워드를 통해서 선언하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;예를 들어 원주율을 제공하는 프로퍼티와과 사각형의 넓이를 구하는 메소드를 제공해주는 구조체가 있다고 해 볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명했듯이 어떠한 인스턴스에 속하는 것이 아니라 타입 그 자체에 속하게 되어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MathConstants라는 타입으로부터 바로 사용 가능해집니다&lt;/p&gt;
&lt;pre id=&quot;code_1710774518205&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct MathConstants {
    static let pi = 3.14159
    static func square(_ value: Double) -&amp;gt; Double {
    	return value * value
    }
}

let piValue = MathConstants.pi
let squearOfFour = MathConstants.square(4)&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&lt;/span&gt;오버라이딩 불가능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 오버라이딩이라는 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브 클래스에서 슈퍼 클래스의 메소드, 프로퍼티, 서브 스크립트의 기능을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신(서브 클래스)에게 맞도록 수정하는 것을 의미해요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오전 12.17.28.png&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVila/btsFUYG526Y/jokSZkKPQ4BuVjZd5nKsVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVila/btsFUYG526Y/jokSZkKPQ4BuVjZd5nKsVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVila/btsFUYG526Y/jokSZkKPQ4BuVjZd5nKsVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVila%2FbtsFUYG526Y%2FjokSZkKPQ4BuVjZd5nKsVk%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;639&quot; height=&quot;472&quot; data-filename=&quot;스크린샷 2024-03-19 오전 12.17.28.png&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속받은 기능을 수정하거나 확장할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;pre id=&quot;code_1710775173251&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
    func makeSound() {
    	print(&quot;동물이 소리를 냅니다&quot;)
    }
}

class Dog: Animal {
    override func makeSound() {
    	super.makeSound() // 오버라이딩
        print(&quot;멍멍멍!&quot;) // 추가구현
    }
}

let myDog = Dog()
myDog.makeSound() -&amp;gt; 동물이 소리를 냅니다 멍멍멍!&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;여기서는 Animal이라는 슈퍼 클래스를 Dog라는 서브 클래스가 상속하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부의 메서드를 super 키워드를 사용하여 오버라이딩 했네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;blockquote data-ke-style=&quot;style3&quot;&gt;✅ super 키워드&lt;br /&gt;&lt;br /&gt;- 슈퍼 클래스를 참조하기 위해 사용합니다&lt;br /&gt;- 슈퍼 클래스의 메서드, 프로퍼티, 서브 스크립트에 접근할 수 있습니다&lt;br /&gt;- 주로 오버라이드 된 메서드의 안에서 슈퍼 클래스의 원본 구현을 호출하기 위해 사용합니다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;h2 data-ke-size=&quot;size26&quot;&gt;  class 키워드 :: 메서드 오버라이딩을 가능하게 하는 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static은 서브 클래스의 오버라이딩을 불가능하게 막아버린다고 했었죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 class 라는 키워드는 서브 클래스의 오버라이딩을 허용해주는 역할입니다&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;func만 사용해도 잘만 쓸 수 있는데 왜 class 키워드를 붙이냐구요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-19 오전 12.38.31.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5Erpi/btsFTYnpfdY/XcQcyCC8KcUFEc9cyXzWjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5Erpi/btsFTYnpfdY/XcQcyCC8KcUFEc9cyXzWjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5Erpi/btsFTYnpfdY/XcQcyCC8KcUFEc9cyXzWjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5Erpi%2FbtsFTYnpfdY%2FXcQcyCC8KcUFEc9cyXzWjk%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;595&quot; height=&quot;404&quot; data-filename=&quot;스크린샷 2024-03-19 오전 12.38.31.png&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;아무 키워드도 없는 func은 반드시 인스턴스를 생성해야만 사용할 수 있는 인스턴스 메소드이기 때문입니다!!&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스가 아니라 타입에 속한다는 점에서 static과 결이 같죠? ㅎㅎ&lt;/p&gt;
&lt;pre id=&quot;code_1710775941155&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class SomeClass {
    var property: Int = 0
    
    func instanceMethod() {
        print(&quot;This is an instance method&quot;)
    }
    
    class func classMethod() {
        print(&quot;This is a class method&quot;)
    }
}

let instance = SomeClass()
instance.instanceMethod() // 인스턴스 메소드 호출

SomeClass.classMethod() // 클래스 메소드 호출&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;size16&quot;&gt;class func은 해당 메소드가 서브 클래스에서 오버라이딩 될 수 있게 허용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향의 특징인 다형성을 구현하고 코드의 유연성을 높여줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710776725318&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
    class func makeSound() {
        print(&quot;동물이 소리를 냅니다&quot;)
    }
}

class Dog: Animal {
    override class func makeSound() {
        print(&quot;멍멍&quot;)
    }
}

class Cat: Animal {
    override class func makeSound() {
        print(&quot;야옹&quot;)
    }
}

Animal.makeSound() // 출력: 동물이 소리를 냅니다
Dog.makeSound()    // 출력: 멍멍
Cat.makeSound()    // 출력: 야옹&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;여기서 Animal은 모든 동물이 가질 수 있는 공통 메서드를 class func으로 정의했어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 서브 클래스에서는 class func으로 선언된 메서드를 오버라이딩 할 수 있게 됐습니다&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;위에 있던 오버라이딩을 설명하는 Animal 클래스와 비교해보세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;&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;&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;처음 공부하던 시기에는 접근제한자와 static을 헷갈려서 막 뒤섞어 쓰던 기억이 나네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-001 (15).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NjtDh/btsFUmByrkz/OjPXW9mMthjshXHs6nEC1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NjtDh/btsFUmByrkz/OjPXW9mMthjshXHs6nEC1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NjtDh/btsFUmByrkz/OjPXW9mMthjshXHs6nEC1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjtDh%2FbtsFUmByrkz%2FOjPXW9mMthjshXHs6nEC1K%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;175&quot; height=&quot;175&quot; data-filename=&quot;개발블로그썸네일들-001 (15).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/160</guid>
      <comments>https://yy-dev.tistory.com/160#entry160comment</comments>
      <pubDate>Mon, 18 Mar 2024 23:37:23 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 24.03.15</title>
      <link>https://yy-dev.tistory.com/158</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EOdrZ/btsFOhtGGjj/AMmXDn6QP4ns8xXM09IGT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EOdrZ/btsFOhtGGjj/AMmXDn6QP4ns8xXM09IGT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EOdrZ/btsFOhtGGjj/AMmXDn6QP4ns8xXM09IGT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEOdrZ%2FbtsFOhtGGjj%2FAMmXDn6QP4ns8xXM09IGT1%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;400&quot; height=&quot;397&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;피곤하고 작성할 것도 많긴한데 정리가 안되어서 쉬어가는 til.....&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;요즘은 유닛 테스트를 공부중입니다&lt;br /&gt;캠프 극초반부터 코어데이터를 사용해봐서 다행이에요&lt;br /&gt;코어데이터 수정하면서 테스트 코드도 짜볼 수 있으니까요...&lt;br /&gt;&lt;br /&gt;나름대로 TDD를 해 본답시고 열심히 구현하다 튜터님께 한번 체크받으러 갔었는데&lt;br /&gt;역시나 잘못된 방향으로 하고 있었어요&lt;br /&gt;&lt;br /&gt;TDD를 완전히 이상하게 이해하고 있던 수준?&lt;br /&gt;입력값과 출력값에 대한 것만 정해놓고 진행을 하는 것 같은데... 아직 잘 모르겠네요&lt;br /&gt;내가 짠 코드가 올바르지 않음을 증명하는 건 얼마나 많은 케이스를 만들어야 하는 걸까여&lt;br /&gt;&lt;br /&gt;테스트 더블의 더미, 목 등 이런게 오히려 리소스 손해 아닌가 싶은 생각도 들어요&lt;br /&gt;작은 프로젝트이기 때문에 이 정도의 필요성을 느끼지 못하는 것 같기도 합니다&lt;br /&gt;&lt;br /&gt;그리고 어제 공부했던 DI에 관해서도... 역시 머리로 대강 아는 것과 코드를 짤 줄 아는 것은 다르더군요&lt;br /&gt;&lt;br /&gt;어쨌든!!&lt;br /&gt;&lt;br /&gt;테스트 클래스에서 코어데이터 의존성 빼고, 테스트 케이스를 좀 생각해보면서 몇개 만들어보고 있어요&lt;br /&gt;&lt;br /&gt;테스트 케이스를 이런 방향으로 생각하는 게 맞는건지&lt;br /&gt;테스트 코드는 어디서 끊어야 독립적인지&lt;br /&gt;심지어 이렇게 쓰면되는지,, 무지성으로 아무한테나 여쭤보고 싶어요&lt;br /&gt;실제로 구현하는 코어데이터 매니저 코드 로직에서 궁금한 점도 있구요&lt;br /&gt;&lt;br /&gt;이건 좀 많은 튜터님께 찾아가서 교차 답변을 들어보고 싶네요ㅎㅎ&lt;br /&gt;&lt;br /&gt;유닛테스트 너란 녀석 참 어렵다.... &lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;블로그썸네일-005.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZtYmQ/btsFOV40at4/cz8BVUK1qehCuJ8OYBgAyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZtYmQ/btsFOV40at4/cz8BVUK1qehCuJ8OYBgAyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZtYmQ/btsFOV40at4/cz8BVUK1qehCuJ8OYBgAyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZtYmQ%2FbtsFOV40at4%2Fcz8BVUK1qehCuJ8OYBgAyK%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;371&quot; height=&quot;371&quot; data-filename=&quot;블로그썸네일-005.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category> TIL</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/158</guid>
      <comments>https://yy-dev.tistory.com/158#entry158comment</comments>
      <pubDate>Thu, 14 Mar 2024 22:22:34 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 디자인 패턴 - 싱글톤(singleton)패턴 + DI (w. Swift)</title>
      <link>https://yy-dev.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&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;프로그램 설계를 할 때 많이 발생했던 문제점을&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;하나의 &quot;규약&quot;처럼 정해둔 패턴을 말해요!&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;iOS 개발을 공부하고 있는 지금으로서는 Delegate 패턴이 가장 친숙하네요~ :D&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  싱글톤 패턴&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특정한 객체의 인스턴스가 오직 1개만 생성된다고 정해둔 패턴&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1개의 인스턴스를 프로젝트 전역에서 사용할 수 있게 하는 패턴이에요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;이렇게 1회만 생성되고 전역으로 사용할 수 있기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 공유가 쉽고 메모리를 절약하는데 도움이 되어요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-14 오전 1.55.00.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RG0Yz/btsFLVR2gfi/AlMH2S6ZUy87kbvd1OKBl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RG0Yz/btsFLVR2gfi/AlMH2S6ZUy87kbvd1OKBl1/img.png&quot; data-alt=&quot;착한 싱글톤 인스턴스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RG0Yz/btsFLVR2gfi/AlMH2S6ZUy87kbvd1OKBl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRG0Yz%2FbtsFLVR2gfi%2FAlMH2S6ZUy87kbvd1OKBl1%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;582&quot; height=&quot;435&quot; data-filename=&quot;스크린샷 2024-03-14 오전 1.55.00.png&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;착한 싱글톤 인스턴스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 코드로는 이런 정도의 영향을 가지고 있다고 해볼게요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.11.16.png&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKdL5/btsFMCdBTCD/vxlSHGeap97tQwV1GOw2p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKdL5/btsFMCdBTCD/vxlSHGeap97tQwV1GOw2p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKdL5/btsFMCdBTCD/vxlSHGeap97tQwV1GOw2p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKdL5%2FbtsFMCdBTCD%2FvxlSHGeap97tQwV1GOw2p1%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;574&quot; height=&quot;290&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.11.16.png&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 피치못할 사정으로 해당 클래스에 문제가 생긴다면 어떨까요?&lt;/p&gt;
&lt;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-03-14 오전 2.06.28.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Id5D/btsFLPEkai1/uH6qcAk3Jr819Hpmy5wKM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Id5D/btsFLPEkai1/uH6qcAk3Jr819Hpmy5wKM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Id5D/btsFLPEkai1/uH6qcAk3Jr819Hpmy5wKM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Id5D%2FbtsFLPEkai1%2FuH6qcAk3Jr819Hpmy5wKM1%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;590&quot; height=&quot;421&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.06.28.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 극단적으로 프로퍼티를 삭제해봤습니다ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤가요, 3개가 전부 맛이 가버렸죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.13.01.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGY3a/btsFNueOSML/2D8uh5kP5UIwnlOwZL90Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGY3a/btsFNueOSML/2D8uh5kP5UIwnlOwZL90Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGY3a/btsFNueOSML/2D8uh5kP5UIwnlOwZL90Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGY3a%2FbtsFNueOSML%2F2D8uh5kP5UIwnlOwZL90Ak%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;659&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.13.01.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이렇게도 해 볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 값을 바꿔치기 해보는 거에요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.14.51.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1xBsA/btsFKao7CL4/3aooMNV4Cn9NWM1PDFXsy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1xBsA/btsFKao7CL4/3aooMNV4Cn9NWM1PDFXsy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1xBsA/btsFKao7CL4/3aooMNV4Cn9NWM1PDFXsy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1xBsA%2FbtsFKao7CL4%2F3aooMNV4Cn9NWM1PDFXsy1%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;522&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.14.51.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 갑자기 값이 변해버렸죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 의존도가 높다, 결합도가 높다, 각 객체가 독립적이지 않다. 라고 표현하는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 결국 해당하는 객체들이 독립적이지 않다는 것은 유닛테스트가 어렵다는 의미로 이어지고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Testable 하지 않다! 라는 결론까지 도달하게 되네요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  DI&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dependency Injection&amp;nbsp; |&amp;nbsp; 의존성 주입&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 단점을 보완하려면 의존성 주입이라는 걸 하면 된다고 하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;의존성 주입이란,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 필요로 하는 타 객체를 외부에서 생성하고 주입해서 사용하는 소프트웨어 설계 패턴입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 필요한 것을 직접 만들지 않고, 외부에서 만들어 넣어주는 방식이라고 보면 돼요&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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-03-14 오전 2.29.52.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRjFEc/btsFJ674wQE/fAQdl7mK7jJShWN3fNdecK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRjFEc/btsFJ674wQE/fAQdl7mK7jJShWN3fNdecK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRjFEc/btsFJ674wQE/fAQdl7mK7jJShWN3fNdecK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRjFEc%2FbtsFJ674wQE%2FfAQdl7mK7jJShWN3fNdecK%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;760&quot; height=&quot;512&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.29.52.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;어느 한 식당이 있습니다&lt;br /&gt;&lt;br /&gt;이 가게의 요리사는 파스타 메뉴를 추가하고 싶었지만 파스타 레시피를 몰라요&lt;br /&gt;이런 요리사가 직접 레시피를 만드는 것은 실수할 가능성도 있고 굉장히 번거로운 작업이 될 거에요&lt;br /&gt;&lt;br /&gt;하지만 가게 사장이 어딘가에서 딱 맞는 레시피를 공수해 왔다고 해 봅시다&lt;br /&gt;&lt;br /&gt;그러면 요리사는 해당 레시피만 전달 받아서 가장 잘 하는 요리만 해도 되지 않을까요?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런걸 바로 &lt;b&gt;의존성 주입&lt;/b&gt;이라고 합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요한 걸 직접 만들지 않고, 외부에서 만든 다음 전달해주는 방식&lt;/b&gt;이에요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 상황이라면 더 와닿을까요..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 데이터를, 여러 객체에다가, 외부에서 전달하는 걸 표현해본 그림입니다 ... ;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.50.21.png&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beOVlu/btsFMrJX4sU/Ct9z4AF2fT6CGW5YkLrHm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beOVlu/btsFMrJX4sU/Ct9z4AF2fT6CGW5YkLrHm0/img.png&quot; data-alt=&quot;주입받는 객체가 점점 늘어나고 있어~~ㅜㅜ!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beOVlu/btsFMrJX4sU/Ct9z4AF2fT6CGW5YkLrHm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeOVlu%2FbtsFMrJX4sU%2FCt9z4AF2fT6CGW5YkLrHm0%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;704&quot; height=&quot;415&quot; data-filename=&quot;스크린샷 2024-03-14 오전 2.50.21.png&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주입받는 객체가 점점 늘어나고 있어~~ㅜㅜ!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&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;static 키워드 사용하여 단일 인스턴스 만들기&lt;/h3&gt;
&lt;pre id=&quot;code_1710352408045&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Chef {
    static let shared = Chef()
    private init() {}
}&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;외부에서 다시 인스턴스를 생성하는 걸 방지하기 위해 private으로 init 구현까지 해 줄게요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 싱글톤 기본 골조는 끝입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 요리사가 직접 레시피도 만들고 조리도 해야해요&lt;/p&gt;
&lt;pre id=&quot;code_1710352595483&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Chef {
    static let shared = Chef()
    private init() {}

    func createPastaRecipe() -&amp;gt; String {
        return &quot;요리사가 만든 스파게티 레시피&quot;
    }

    func cookPasta() -&amp;gt; String {
        let recipe = createPastaRecipe()
        return &quot;직접 만든 레시피[\(recipe)]로 스파게티 요리!&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;size16&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  만든 싱글톤 패턴에 의존성 주입하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&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;사장이 레시피를 전달해 주는 모양새로 만들거에요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달받는 부분을 프로토콜로 만들어봅시다&lt;/p&gt;
&lt;pre id=&quot;code_1710353596558&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;protocol RecipeProviding {
    func fetchPastaRecipe() -&amp;gt; String
}

class Manager: RecipeProviding {
    func fetchPastaRecipe() -&amp;gt; String {
        return &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;size16&quot;&gt;프로토콜을 구현하고 해당 프로토콜을 준수하는 클래스 하나를 만들었어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책임을 분리시켜주는 겁니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1710354077704&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Chef {
    static let shared = Chef()
    private init() {}
    
    func cookPasta(using recipeProvider: RecipeProviding) -&amp;gt; String {
        let recipe = recipeProvider.fetchPastaRecipe()
        return &quot;건네받은 레시피[\(recipe)]로 스파게티 요리!&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;size16&quot;&gt;Chef 라는 싱글톤도 Recipe 프로토콜에 의존하게 되었어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;이렇게 결합도가 낮아지는 걸 영어로는 &lt;b&gt;디커플링&lt;/b&gt;이라고 한대요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존도가 낮은 싱글톤은 유지보수가 더 쉽고 유연하게 대처할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레시피가 추가될 때는 RecipeProviding을 준수하는 새로운 구현체를 만들면 되니까요 &amp;gt;_&amp;lt;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  iOS 에서 싱글톤을 사용하는 경우&lt;/h2&gt;
&lt;pre id=&quot;code_1710354737738&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let screen = UIScreen.main
let userDefault = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default&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;뭐 요런 기능에서 싱글톤 패턴을 채택하고 있다고 하네요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 개인적으로는 유저 로그인/로그아웃/정보 같은 사용자 세션 정보나 네트워크 관리 하는데 싱글톤을 써 본 적이 있습니다ㅎ&lt;/p&gt;
&lt;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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 보다가... 싱글톤 패턴에 대해 좀 파고들어 봤네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대체 왜 디자인 패턴은 보면 볼수록 헷갈리는지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static 키워드, class 키워드 같은 것도 알아보긴 했는데...ㅎㅎ&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;(23.03.19 추가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어지는 게시글!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yy-dev.tistory.com/160&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yy-dev.tistory.com/160&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710777032146&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] static / class 키워드&quot; data-og-description=&quot;static하면 어떤게 떠오르시나요 저는 tableView의 identifier 설정하는 게 떠오르네요... 아니면 싱글톤? 어쨌든 여러곳에 사용할 수 있는 좋은 키워드죠   Static 인스턴스가 아니라 타입 자체에 속하&quot; data-og-host=&quot;yy-dev.tistory.com&quot; data-og-source-url=&quot;https://yy-dev.tistory.com/160&quot; data-og-url=&quot;https://yy-dev.tistory.com/160&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JgxMz/hyVAAEQzyV/p4iB5WKkoCnkHFQQQzSmT0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bTty1P/hyVAGrwEbR/U5nMKQfzVk4zksSZ2Caqo0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cv7A6U/hyVAzlH1cu/YxLHuLho6E2CPqL4feCzs0/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750&quot;&gt;&lt;a href=&quot;https://yy-dev.tistory.com/160&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yy-dev.tistory.com/160&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JgxMz/hyVAAEQzyV/p4iB5WKkoCnkHFQQQzSmT0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bTty1P/hyVAGrwEbR/U5nMKQfzVk4zksSZ2Caqo0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cv7A6U/hyVAzlH1cu/YxLHuLho6E2CPqL4feCzs0/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750');&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] static / class 키워드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;static하면 어떤게 떠오르시나요 저는 tableView의 identifier 설정하는 게 떠오르네요... 아니면 싱글톤? 어쨌든 여러곳에 사용할 수 있는 좋은 키워드죠   Static 인스턴스가 아니라 타입 자체에 속하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yy-dev.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-002 (1).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3RGQY/btsFJIl4YpE/8dynGGkhEwuOrinptwi7RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3RGQY/btsFJIl4YpE/8dynGGkhEwuOrinptwi7RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3RGQY/btsFJIl4YpE/8dynGGkhEwuOrinptwi7RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3RGQY%2FbtsFJIl4YpE%2F8dynGGkhEwuOrinptwi7RK%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;176&quot; height=&quot;176&quot; data-filename=&quot;개발블로그썸네일들-002 (1).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림출처 : 본인&lt;/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;a href=&quot;https://developer.apple.com/documentation/swift/managing-a-shared-resource-using-a-singleton&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/swift/managing-a-shared-resource-using-a-singleton&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jeong-pro.tistory.com/86&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jeong-pro.tistory.com/86&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@naroti/iOS-%EA%B0%9C%EB%B0%9C-Singleton-Pattern-q4k3uzgf0n&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@naroti/iOS-%EA%B0%9C%EB%B0%9C-Singleton-Pattern-q4k3uzgf0n&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@ranga.c222/singleton-vs-dependency-injection-in-ios-swift-47a056a822f&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://medium.com/@ranga.c222/singleton-vs-dependency-injection-in-ios-swift-47a056a822f&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://babbab2.tistory.com/66&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://babbab2.tistory.com/66&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/157</guid>
      <comments>https://yy-dev.tistory.com/157#entry157comment</comments>
      <pubDate>Wed, 13 Mar 2024 22:06:39 +0900</pubDate>
    </item>
    <item>
      <title>[XCode] 내 iOS 기기로 빌드할 때 발생할 수 있는 트러블 슈팅</title>
      <link>https://yy-dev.tistory.com/156</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-007.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjRx5H/btsFIugu5Sl/AnNzOZjpIzlKoaoE2sCAn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjRx5H/btsFIugu5Sl/AnNzOZjpIzlKoaoE2sCAn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjRx5H/btsFIugu5Sl/AnNzOZjpIzlKoaoE2sCAn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjRx5H%2FbtsFIugu5Sl%2FAnNzOZjpIzlKoaoE2sCAn1%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;474&quot; height=&quot;474&quot; data-filename=&quot;개발블로그썸네일들-007.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 1차적으로 완성하고 실제 기기로 빌드를 돌려서 테스트하려는데 이게 웬걸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 안되는겁니다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄청나게 많은 이슈가 있었지만 그 중 핵심이었던 몇가지를 가져왔어요&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Bundle Identifier가 이미 다른 계정에 의해 사용 중&lt;/h2&gt;
&lt;pre id=&quot;code_1710245775802&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/Users/t2023-m0035/Desktop/todwoong/ToDwoong/ToDwoong.xcodeproj 
Failed Registering Bundle Identifier: 
The app identifier &quot;com.yenny42.ToDwoong&quot; cannot be registered 
to your development team because it is not available. 
Change your bundle identifier to a unique string to try again.&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;&quot;com.yenny42.ToDwoong&quot;라는 앱 식별자(Bundle Identifier)가 이미 다른 계정에 의해 사용 중이거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;rarr; Bundle Identifier를 Todwoong.NBCAMP으로 변경하여 해결했어요&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;로깅 시스템을 초기화하는 데 실패&lt;/h2&gt;
&lt;pre id=&quot;code_1710245837151&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;Logging Error: Failed to initialize logging system. 
Log messages may be missing. 
If this issue persists, 
try setting IDEPreferLogStreaming=YES 
in the active scheme actions environment variables.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&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;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;로깅 시스템은 개발자가 애플리케이션 실행 중 발생하는 이벤트, 오류, 기타 중요한 정보를 기록하는 데 사용됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 메시지가 나타난다면, Xcode나 애플리케이션의 로깅 기능이 제대로 초기화되지 않았다는 거에요&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;b&gt;IDEPreferLogStreaming=YES&lt;/b&gt;를 설정해줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode가 로그 스트리밍을 선호하게 하여 로깅 시스템의 초기화 문제를 우회할 수 있게 해줘요&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-origin-width=&quot;1280&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2BGDq/btsFIx5l05U/p5r4ri6qegSgrnEAxZlSF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2BGDq/btsFIx5l05U/p5r4ri6qegSgrnEAxZlSF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2BGDq/btsFIx5l05U/p5r4ri6qegSgrnEAxZlSF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2BGDq%2FbtsFIx5l05U%2Fp5r4ri6qegSgrnEAxZlSF1%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;1280&quot; height=&quot;688&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Product &amp;gt; Scheme &amp;gt; Edit Scheme... &amp;gt; Run &amp;gt; Arguments &amp;gt; 환경변수 &amp;gt; &lt;b&gt;IDEPreferLogStreaming=YES&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;SnapKit-Dynamic.framework 파일을 찾을 수 없음&lt;/h2&gt;
&lt;pre id=&quot;code_1710246053936&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;No such file or directory: 
'/Users/t2023-m0035/Library/Developer/Xcode/DerivedData
/ToDwoong-fzsslfhusiarsjfrrmtoqoahhpfg/Build
/Products/Debug-iphoneos
/PackageFrameworks/SnapKit-Dynamic.framework/SnapKit-Dynamic'&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;&lt;a href=&quot;https://github.com/apollographql/apollo-ios/issues/2108#issuecomment-1020799063&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/apollographql/apollo-ios/issues/2108#issuecomment-1020799063&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710246110314&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;clang: error: no such file or directory: Error &amp;middot; Issue #2108 &amp;middot; apollographql/apollo-ios&quot; data-og-description=&quot;Hey @designatednerd can you explain why I am getting this error I Don't Know about it. clang: error: no such file or directory: '/Users/chandan/Library/Developer/Xcode/DerivedData/Learning_GraphQL-...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/apollographql/apollo-ios/issues/2108#issuecomment-1020799063&quot; data-og-url=&quot;https://github.com/apollographql/apollo-ios/issues/2108&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yHSmQ/hyVAMqeCgr/KSeyZUe0at2oYWZERblQck/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/apollographql/apollo-ios/issues/2108#issuecomment-1020799063&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/apollographql/apollo-ios/issues/2108#issuecomment-1020799063&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yHSmQ/hyVAMqeCgr/KSeyZUe0at2oYWZERblQck/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;clang: error: no such file or directory: Error &amp;middot; Issue #2108 &amp;middot; apollographql/apollo-ios&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hey @designatednerd can you explain why I am getting this error I Don't Know about it. clang: error: no such file or directory: '/Users/chandan/Library/Developer/Xcode/DerivedData/Learning_GraphQL-...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거는 해당 이슈타래를 참고했어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;you should not use this unless you need a dynamically linked version of the library.&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 필요없는건 지우고 좀 써라 .. 라는 뜻이네요&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;Snapkit 재설치 후 dynamic을 삭제하니 해결됐어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;앱이 해당하는 프레임워크를 찾을 수 없음&lt;/h2&gt;
&lt;pre id=&quot;code_1710246337575&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dyld[669]: Library not loaded: @rpath/TodwoongDesign.framework/TodwoongDesign
  Referenced from: &amp;lt;--&amp;gt; /private/var/containers/Bundle/Application/4--/ToDwoong.app/ToDwoong
  Reason: tried: 
  '/Users/t2023-m0035/Library/Developer/Xcode/DerivedData
  /ToDwoong---/Build/Products/Debug-iphoneos
  /PackageFrameworks/TodwoongDesign.framework/TodwoongDesign' (no such file), 
  '/private/preboot/Cryptexes/OS/Users/t2023-m0035/Library
  /Developer/Xcode/DerivedData/ToDwoong---
  /Build/Products/Debug-iphoneos/PackageFrameworks/TodwoongDesign.framework
  /TodwoongDesign' (no such file), 
  '/private/var/containers/Bundle/Application/--
  /ToDwoong.app/Frameworks/TodwoongDesign.framework/TodwoongDesign' (no such file), 
  '/Users/t2023-m0035/Library/Developer/Xcode/DerivedData
  /ToDwoong---/Build/Products/Debug-iphoneos
  /PackageFrameworks/TodwoongDesign.framework/TodwoongDesign' (no such file), 
  '/private/preboot/Cryptexes/OS/Users/t2023-m0035/Library/Developer
  /Xcode/DerivedData/ToDwoong--
  /Build/Products/Debug-iphoneos/PackageFrameworks
  /TodwoongDesign.framework/TodwoongDesign' (no such file), 
  '/private/var/containers/Bundle/Application/--
  /ToDwoong.app/Frameworks/TodwoongDesign.framework/TodwoongDesign' (no such file)&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;극 초반에 만들었던 프레임워크 파일을 프로젝트에 직접 추가해서 쓴 적이 있었는데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니 이게 왜 아직도 파일에 남아있었지&amp;hellip; 지웠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;general에서 의존성연결된거도 싹 지웠는데 해결이 안되더군요&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;캐시 삭제, 프로젝트 클린, xcode 재시작&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUTedb/btsFIh9vPjG/sCIutqQyBW8nJXLf6qDokk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUTedb/btsFIh9vPjG/sCIutqQyBW8nJXLf6qDokk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUTedb/btsFIh9vPjG/sCIutqQyBW8nJXLf6qDokk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUTedb%2FbtsFIh9vPjG%2FsCIutqQyBW8nJXLf6qDokk%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;770&quot; height=&quot;274&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 그러나 아직도 안되는...&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;그러다 Do not Embed를 보게 되버렸어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;embed&amp;amp;sign으로 변경해주었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(원래 이렇게 쓰는데 재설치하고 변경 까먹은듯 하네요)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uoX9F/btsFJrDLCsT/MXYdCcZIYp87lTJEikznEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uoX9F/btsFJrDLCsT/MXYdCcZIYp87lTJEikznEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uoX9F/btsFJrDLCsT/MXYdCcZIYp87lTJEikznEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuoX9F%2FbtsFJrDLCsT%2FMXYdCcZIYp87lTJEikznEK%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;1280&quot; height=&quot;309&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이걸로 해결했어요!&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이걸 차례대로.. 중간중간 이상한것들 잡으며 고치다보니 앱 빌드 성공했습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 배포만 하면 되겠어요 (김칫국.)&lt;/p&gt;</description>
      <category>iOS/Xcode</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/156</guid>
      <comments>https://yy-dev.tistory.com/156#entry156comment</comments>
      <pubDate>Tue, 12 Mar 2024 21:31:18 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Unit Test (2) 유닛 테스트 시작하기</title>
      <link>https://yy-dev.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://yy-dev.tistory.com/153&quot;&gt;2024.03.06 - [iOS/SWIFT] - [Swift] Unit Test (1) 코드 테스트의 원칙&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #ef5369;&quot; href=&quot;https://yy-dev.tistory.com/154&quot;&gt;2024.03.07 - [iOS/SWIFT] - [Swift] Unit Test (2) 유닛 테스트 시작하기&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 유닛테스트를 위해 타겟을 추가하고 설정하는 법에 대해 알아볼게요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 간단하더군요&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Test 타겟 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어디서든 타겟 생성하는 창으로 들어가시면 됩니다ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1번 방법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.03.26.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvkftr/btsFA9X5Uva/rTGFEuRcvzffzxVFZmZJi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvkftr/btsFA9X5Uva/rTGFEuRcvzffzxVFZmZJi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvkftr/btsFA9X5Uva/rTGFEuRcvzffzxVFZmZJi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdvkftr%2FbtsFA9X5Uva%2FrTGFEuRcvzffzxVFZmZJi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;176&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.03.26.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2번 방법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_스크린샷 2024-03-08 오전 9.04.35.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n30YZ/btsFEMtko5D/WaonqoWh7TpYRpy1X8fbY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n30YZ/btsFEMtko5D/WaonqoWh7TpYRpy1X8fbY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n30YZ/btsFEMtko5D/WaonqoWh7TpYRpy1X8fbY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn30YZ%2FbtsFEMtko5D%2FWaonqoWh7TpYRpy1X8fbY1%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;347&quot; height=&quot;460&quot; data-filename=&quot;edited_edited_edited_스크린샷 2024-03-08 오전 9.04.35.png&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3번 방법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.04.57.png&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6iCMn/btsFEizfhkB/oPCL7OcO0PxLy2yuTIDkeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6iCMn/btsFEizfhkB/oPCL7OcO0PxLy2yuTIDkeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6iCMn/btsFEizfhkB/oPCL7OcO0PxLy2yuTIDkeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6iCMn%2FbtsFEizfhkB%2FoPCL7OcO0PxLy2yuTIDkeK%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;174&quot; height=&quot;330&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.04.57.png&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unit Testing Bundle 이라는 걸 추가해주시면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트폴더가 하나 자동으로 생길 거에요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.07.48.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2jqXZ/btsFDVRRW4P/HDkrbtzuePdYZWWuSCHab0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2jqXZ/btsFDVRRW4P/HDkrbtzuePdYZWWuSCHab0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2jqXZ/btsFDVRRW4P/HDkrbtzuePdYZWWuSCHab0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2jqXZ%2FbtsFDVRRW4P%2FHDkrbtzuePdYZWWuSCHab0%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;724&quot; height=&quot;514&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.07.48.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.09.04.png&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZHasH/btsFBcNRNbF/zonvb1nG3rCDBtfQzk5LI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZHasH/btsFBcNRNbF/zonvb1nG3rCDBtfQzk5LI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZHasH/btsFBcNRNbF/zonvb1nG3rCDBtfQzk5LI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZHasH%2FbtsFBcNRNbF%2Fzonvb1nG3rCDBtfQzk5LI0%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;253&quot; height=&quot;51&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.09.04.png&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 처음부터 테스트 코드 작성을 염두에 두고 프로젝트를 만든다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Include Tests를 체크하고 해주시면 됩니다ㅎㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2024-03-08 오전 9.12.19.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uAlWr/btsFABmO0F5/lJHYY5S0dxWi7NOJUt4H21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uAlWr/btsFABmO0F5/lJHYY5S0dxWi7NOJUt4H21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uAlWr/btsFABmO0F5/lJHYY5S0dxWi7NOJUt4H21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuAlWr%2FbtsFABmO0F5%2FlJHYY5S0dxWi7NOJUt4H21%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;731&quot; height=&quot;517&quot; data-filename=&quot;edited_스크린샷 2024-03-08 오전 9.12.19.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;h2 data-ke-size=&quot;size26&quot;&gt;  타겟과 번들?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유닛 테스트 타겟(Unit Test Target)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 애플리케이션 또는 라이브러리 코드의 일부(유닛)를 테스트하기 위한 설정을 포함하는 프로젝트 내의 구성요소&lt;/li&gt;
&lt;li&gt;개발자가 유닛 테스트 타겟을 만들 때, 테스트할 코드와 관련된 소스 파일과 리소스를 지정&lt;/li&gt;
&lt;li&gt;타겟은 테스트 실행을 위해 빌드 시스템에 의해 별도로 컴파일되고 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유닛 테스팅 번들(Unit Testing Bundle)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유닛 테스팅 번들은 유닛 테스트 타겟을 빌드하고 실행하기 위해 생성된 실행 가능한 파일의 집합&lt;/li&gt;
&lt;li&gt;테스트 케이스, 테스트 데이터, 그리고 테스트 실행을 위해 필요한 다른 리소스를 포함&lt;/li&gt;
&lt;li&gt;유닛 테스트 번들은 테스트 실행 환경에서 로드되어 실행되며, 테스트 케이스의 성공 여부에 대한 결과를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차이점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;&lt;b&gt;유닛 테스트 타겟 :&lt;/b&gt; 테스트 설정과 구성을 정의&lt;/u&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 설정의 일부&lt;/li&gt;
&lt;li&gt;테스트할 코드의 구성 및 테스트를 위한 설정을 정의&lt;/li&gt;
&lt;li&gt;개발 환경에서 이를 구성하여 테스트 코드와 테스트 대상 코드 간의 관계를 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;&lt;b&gt;유닛 테스팅 번들 :&lt;/b&gt; 실제 테스트 실행을 위해 생성된 물리적 파일&lt;/u&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유닛 테스트 타겟을 빌드한 결과물&lt;/li&gt;
&lt;li&gt;실제 테스트를 실행하는 데 사용되는 실행 파일과 리소스의 집합&lt;/li&gt;
&lt;li&gt;실행 시 테스트 환경에서 로드되어 테스트를 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;  테스트 코드 실행해보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 코드를 작성하기 전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스팅 실행은 잘 되나 테스트해봐야겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 1회 Run 시키고 시작합시다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;그런 다음엔 이런거...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.14.45.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRisCg/btsFBbOYofE/yTyobtBip59QkcmEpk2TYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRisCg/btsFBbOYofE/yTyobtBip59QkcmEpk2TYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRisCg/btsFBbOYofE/yTyobtBip59QkcmEpk2TYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRisCg%2FbtsFBbOYofE%2FyTyobtBip59QkcmEpk2TYk%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;388&quot; height=&quot;584&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.14.45.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 이런거...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.15.22.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7U4wZ/btsFB6ftWVM/jJyUzfzDAwN1kstSXJc96k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7U4wZ/btsFB6ftWVM/jJyUzfzDAwN1kstSXJc96k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7U4wZ/btsFB6ftWVM/jJyUzfzDAwN1kstSXJc96k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7U4wZ%2FbtsFB6ftWVM%2FjJyUzfzDAwN1kstSXJc96k%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;270&quot; height=&quot;185&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.15.22.png&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 커맨드 + U (Testing 단축키) 를 눌러서 한 번 실행해보세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시뮬레이터가 한번 꺼졌다 켜지거나, 다시 시작되면서 테스팅이 진행될거에요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 final class 좌측의 마름모 체크버튼으로 테스트해봤습니다&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;테스트가 성공하면 이렇게 초록불이 뜨고, 실패하면 빨간색 X 버튼이 보입니다&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-03-08 오전 9.16.11.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW87g2/btsFFlWzlOo/MFMfLOGWQ6urtpRW1LiINk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW87g2/btsFFlWzlOo/MFMfLOGWQ6urtpRW1LiINk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW87g2/btsFFlWzlOo/MFMfLOGWQ6urtpRW1LiINk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW87g2%2FbtsFFlWzlOo%2FMFMfLOGWQ6urtpRW1LiINk%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;710&quot; height=&quot;468&quot; data-filename=&quot;스크린샷 2024-03-08 오전 9.16.11.png&quot; data-origin-width=&quot;710&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 간단하게 설정할 수 있죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 종종 XCode 억까(..) 가 있어서 직접 테스트플랜을 추가해줘야 하는 경우가 생길 수 있어요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 직접 당해서 반나절을 날렸다네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 이것도 추가로 적어볼게요ㅠㅠ&lt;/p&gt;
&lt;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;a href=&quot;https://yy-dev.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.03.06 - [iOS/SWIFT] - [Swift] Unit Test (1) 코드 테스트의 원칙&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;a style=&quot;color: #ef5369;&quot; href=&quot;https://yy-dev.tistory.com/154&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2024.03.07 - [iOS/SWIFT] - [Swift] Unit Test (2) 유닛 테스트 시작하기&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-001 (13).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/de8aNJ/btsFEhAl4jV/ETBjPH2YMLxMscez3yWrBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/de8aNJ/btsFEhAl4jV/ETBjPH2YMLxMscez3yWrBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/de8aNJ/btsFEhAl4jV/ETBjPH2YMLxMscez3yWrBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fde8aNJ%2FbtsFEhAl4jV%2FETBjPH2YMLxMscez3yWrBK%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;121&quot; height=&quot;121&quot; data-filename=&quot;개발블로그썸네일들-001 (13).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/154</guid>
      <comments>https://yy-dev.tistory.com/154#entry154comment</comments>
      <pubDate>Thu, 7 Mar 2024 21:58:17 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Unit Test (1) 코드 테스트의 원칙</title>
      <link>https://yy-dev.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #ef5369;&quot; href=&quot;https://yy-dev.tistory.com/153&quot;&gt;2024.03.06 - [iOS/SWIFT] - [Swift] Unit Test (1) 코드 테스트의 원칙&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://yy-dev.tistory.com/154&quot;&gt;2024.03.07 - [iOS/SWIFT] - [Swift] Unit Test (2) 유닛 테스트 시작하기&lt;/a&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 코드라는 거 많이 들어보셨죠?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Integration Test, UI Test, Unit Test, End-to-End Test... 등등&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그 중에 유닛 테스트, 단위 테스트란 무엇일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용하려는 &lt;span style=&quot;text-align: start;&quot;&gt;개별 기능&lt;/span&gt;이 개발자의 의도에 맞게 동작하는지 작은 단위로 테스트 하는 것을 의미합니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;단위 테스트는 보통 이런 과정을 거쳐 작성합니다&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 대상을 선택하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 케이스를 작성하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 실행하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예상한 결과와 테스트 실행 결과가 일치하는지 확인하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위의 1-4를 반복!&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개발자는 이런 테스트를 활용해서 코드가 예상대로 동작하는지 확인하고 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이번에는 Unit Test를 도입하기 전,&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  7가지 테스트 원칙&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스팅을 하는 데도 원칙이 있다고 합니다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;40년간 관찰된 내용을 기반으로 한 7가지 원칙이 있어요!&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트는 결함의 존재를 보여준다&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 코드는 결함이 있다는 것은 알려줄 수 있습니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하지만 결함이 없음을 보장하지는 않습니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결함이 남아있을 확률을 줄여주는 것이죠&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;완벽한 테스트는 불가능&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모든 케이스의 테스트를 진행하는 건 현실적으로 불가능합니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;위험도, 우선순위를 잘 정해서 중요한 것 부터 테스트 합시다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 구성은 최대한 빨리!&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결함을 조기에 발견하려면 가능한 한 빠르게 테스트 코드 작성을 시작해야 합니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;분석, 기획 단계부터 테스트팀과 함께하면 빠르게 결함을 발견하여 리소스 를 크게 줄일 수 있습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결함은 밀도가 높다&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;결함의 8할은 아주 작은 코드의 오류에서 나옵니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;살충제 역설 Pesticide Paradox&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;비슷한 테스트가 반복되면 새로운 결함을 찾을 수 없습니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이를 방지하려면 테스트 케이스를 주기적으로 수정하고 검토해야 합니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;새롭고 다양한 테스트를 만드는 것도 중요합니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트는 상황에 따라 다르다&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트에 대한 집중은 프로그램의 요구 사항/ 용도에 따라 달라집니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;은행 애플리케이션은 금융, 정보 보호가 중요하므로 보안, 안정성에 대한 테스트에 중점&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;게임 애플리케이션의 경우, UX와 게임의 재미가 중요하므로 성능, UI에 대한 테스트에 중점&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;오류 부재의 오류&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용하지 않는 시스템 / 사용자가 기대하지 않는 기능의 결함을 찾고 수정하는 것은 의미가 없습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  FIRST 원칙&lt;/span&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Fast&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;유닛 테스트는 빨라야 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Isolated&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;다른 테스트와 종속 관계를 가지지 않는다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;독립적으로 동작&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Repetable&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;실행을 몇 번 하더라도 같은 결과를 반환&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Self-validating&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트가 스스로 결과가 올바른지 아닌지를 판단할 수 있어야 함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개발자는 코드를 변경할 때마다 수동으로 테스트 결과를 검토할 필요가 없음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;현대적 소프트웨어 개발 방법론에서 강조함&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;테스트 주도 개발(TDD)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지속적 통합(Continuous Integration, CI)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;지속적 배포(Continuous Deployment, CD)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Timely&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;실제 기능 구현 코드를 테스트 코드를 먼저 작성한 후에 작성해야 함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;TDD(테스트 주도 개발 / Test-driven Development)의 기본 원칙&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&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;다음에는 Unit Test를 시작하는 방법에 대한 글을 작성해보겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;~ヾ(＾&amp;nabla;＾)&lt;/h4&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: #ef5369;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #ef5369;&quot; href=&quot;https://yy-dev.tistory.com/153&quot;&gt;2024.03.06 - [iOS/SWIFT] - [Swift] Unit Test (1) 코드 테스트의 원칙&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://yy-dev.tistory.com/154&quot;&gt;2024.03.07 - [iOS/SWIFT] - [Swift] Unit Test (2) 유닛 테스트 시작하기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-001 (12).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM1KVO/btsFzfDHYNw/oXqSDchkokMx3ohAIIzKgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM1KVO/btsFzfDHYNw/oXqSDchkokMx3ohAIIzKgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM1KVO/btsFzfDHYNw/oXqSDchkokMx3ohAIIzKgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM1KVO%2FbtsFzfDHYNw%2FoXqSDchkokMx3ohAIIzKgK%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;196&quot; height=&quot;196&quot; data-filename=&quot;개발블로그썸네일들-001 (12).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://www.utest.com/articles/seven-testing-principles&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.utest.com/articles/seven-testing-principles&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://howtodoinjava.com/best-practices/first-principles-for-good-tests/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://howtodoinjava.com/best-practices/first-principles-for-good-tests/&lt;/a&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;</description>
      <category>iOS/Swift</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/153</guid>
      <comments>https://yy-dev.tistory.com/153#entry153comment</comments>
      <pubDate>Wed, 6 Mar 2024 23:55:05 +0900</pubDate>
    </item>
    <item>
      <title>[Git] git reset / 커밋 뒤로 되돌리기</title>
      <link>https://yy-dev.tistory.com/152</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Git reset은 Git에서 커밋의 위치를 변경하거나 스테이징된 변경 사항을 취소하는 데 사용됨. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 명령어는 주로 다음과 같은 세 가지 모드로 사용함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Soft Reset&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1709754342825&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git reset --soft &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HEAD를 특정 커밋으로 이동&lt;/li&gt;
&lt;li&gt;인덱스(Staging Area)와 워킹 디렉터리(Working Directory)에는 영향x&lt;/li&gt;
&lt;li&gt;이전 커밋의 변경 내용이 스테이징 영역에 남아 있기 때문에 이후에 새로운 커밋으로 스테이징하여 다시 커밋할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Mixed Reset&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1709754344486&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;git reset --mixed &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HEAD를 특정 커밋으로 이동&lt;/li&gt;
&lt;li&gt;인덱스(Staging Area)는 해당 커밋의 상태로 되돌림&lt;/li&gt;
&lt;li&gt;변경 내용을 워킹 디렉터리(Working Directory)에 유지하지만 스테이징 영역에서 취소하고 싶을 때 사용&lt;/li&gt;
&lt;/ul&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;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Hard Reset&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1709754345513&quot; class=&quot;swift&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;git reset --hard &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HEAD를 특정 커밋으로 이동&lt;/li&gt;
&lt;li&gt;인덱스(Staging Area)와 워킹 디렉터리(Working Directory)의 변경 사항을 모두 해당 커밋으로 되돌림&lt;/li&gt;
&lt;li&gt;이전에 작업한 내용이 모두 삭제될 수 있으므로 신중하게 사용할 것&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2O26I/btsFBdd6tjm/mYnsoB1ELiQ1wUk5cwtHP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2O26I/btsFBdd6tjm/mYnsoB1ELiQ1wUk5cwtHP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2O26I/btsFBdd6tjm/mYnsoB1ELiQ1wUk5cwtHP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2O26I%2FbtsFBdd6tjm%2FmYnsoB1ELiQ1wUk5cwtHP0%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;107&quot; height=&quot;107&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>버전관리</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/152</guid>
      <comments>https://yy-dev.tistory.com/152#entry152comment</comments>
      <pubDate>Tue, 5 Mar 2024 23:46:45 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 열거형 Enumeration / 타입 안정성</title>
      <link>https://yy-dev.tistory.com/151</link>
      <description>&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형 Enum은 한정된 범위에서 가능한 값(케이스)를 정의하기 위해 사용하는 타입입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;특히 &quot;타입 안정성&quot;을 보장한다고도 하는데요..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  타입 안정성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&quot;타입 안정성을 보장한다&quot; 라는 표현은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;개발자가 작성한 코드가, 시스템이 예상한 타입의 데이터만을 사용하도록 강제하여&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예를 들면, 정수형 타입 변수에 문자열을 할당하려고 하는 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;스위프트는 Strongly-typed 언어로, 변수나 상수에 할당되는 값의 타입이 명확해야 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;컴파일러가 타입 검사를 시행해서 타입의 불일치를 사전에 감지해요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  열거형&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형을 사용한다면 특정한 값만 허용해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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_1709573286262&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Family {
    case mother
    case father
    case sister
    case brother
}&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;가족 구성원을 나타내는 열거형을 예시로 만들어보았습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;여기서는 mother, father, sister, brother 만이 사용 가능한 값이고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이렇게 타입 안정성을 강화해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  사용방법&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔️ 정의하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아래 두가지 다 가능한 방법입니다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709573375197&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Weekday {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1709573400892&quot; class=&quot;crystal&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;enum Weekday {
    case monday, tuesday, wednesday, thursday, friday
}&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;today라는 변수는 Weekday라는 열거형 타입을 가집니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이렇게 열거형의 타입이 명확하다면 .monday 같이 케이스 앞에 열거형 이름을 생략할 수 있어요&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709573455732&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var today: Weekday = .monday&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;원시값&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형을 정의할 때 해당 열거형의 각 케이스에 고유한 값을 지정해 줍니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;케이스를 더욱 명시적으로 표현하고, 쉽게 사용할 수 있게 됩니다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709573672318&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Season: String {
    case spring = &quot;Spring&quot;
    case summer = &quot;Summer&quot;
    case autumn = &quot;Autumn&quot;
    case winter = &quot;Winter&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;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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;연관값&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형의 연관값은 각 케이스에 추가적인 정보를 나열할 수 있게 해 줍니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;연관값은 케이스별로 다른 타입을 가질 수 있어요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;더 다양하고 복잡한 구조를 모델링 할 수 있겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709574019610&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;enum Beverage {
    case water
    case soda(volume: Int)
    case coffee(sugar: Bool, milk: Bool)
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1709574029727&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let myDrink = Beverage.coffee(sugar: true, milk: false)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1709574037630&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func describe(beverage: Beverage) {
    switch beverage {
    case .water:
        print(&quot;Plain water&quot;)
    case .soda(let volume):
        print(&quot;A soda of \(volume)ml&quot;)
    case .coffee(let sugar, let milk):
        let sugarDescription = sugar ? &quot;with sugar&quot; : &quot;no sugar&quot;
        let milkDescription = milk ? &quot;with milk&quot; : &quot;no milk&quot;
        print(&quot;Coffee \(sugarDescription) and \(milkDescription)&quot;)
    }
}

describe(beverage: myDrink)&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;열거형의 가장 기본적인 정보만 추려서 정리해봤어요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;재귀 열거형, 계산 속성 등 남은 정보는 조금 더 공부해서 적어볼게요 &lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;（；^&amp;omega;^）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아참 그리고 신기한 사실을 하나 알았습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-05 오전 2.49.17.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEc2nc/btsFpSI7Hvk/v76kt4l2Ldpbf6VrYikD7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEc2nc/btsFpSI7Hvk/v76kt4l2Ldpbf6VrYikD7K/img.png&quot; data-alt=&quot;진짜로..ㅇㅇ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEc2nc/btsFpSI7Hvk/v76kt4l2Ldpbf6VrYikD7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEc2nc%2FbtsFpSI7Hvk%2Fv76kt4l2Ldpbf6VrYikD7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;236&quot; data-filename=&quot;스크린샷 2024-03-05 오전 2.49.17.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진짜로..ㅇㅇ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;요 부분도 조금 더 알아보고 공유해보고 싶습니다&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;~ヾ(＾&amp;nabla;＾)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-001 (11).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efpMwO/btsFofqXlkq/GeUJTEQysoCquPt73z7igk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efpMwO/btsFofqXlkq/GeUJTEQysoCquPt73z7igk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efpMwO/btsFofqXlkq/GeUJTEQysoCquPt73z7igk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefpMwO%2FbtsFofqXlkq%2FGeUJTEQysoCquPt73z7igk%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;141&quot; height=&quot;141&quot; data-filename=&quot;개발블로그썸네일들-001 (11).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://www.aidanf.net/learn-swift/types_and_type_inference&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.aidanf.net/learn-swift/types_and_type_inference&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS/Swift</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/151</guid>
      <comments>https://yy-dev.tistory.com/151#entry151comment</comments>
      <pubDate>Mon, 4 Mar 2024 23:50:41 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] iOS 알림 설정 허용받기 - User Notifications</title>
      <link>https://yy-dev.tistory.com/149</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VlGm/btsFnYhOsDy/hBLAuVKy7KR7ZfpN2wA06K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VlGm/btsFnYhOsDy/hBLAuVKy7KR7ZfpN2wA06K/img.webp&quot; data-alt=&quot;지긋...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VlGm/btsFnYhOsDy/hBLAuVKy7KR7ZfpN2wA06K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VlGm%2FbtsFnYhOsDy%2FhBLAuVKy7KR7ZfpN2wA06K%2Fimg.webp&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;693&quot; height=&quot;389&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지긋...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;최근 애플리케이션에서 &quot;알림&quot;이라는 기능이 없는 앱.. 혹시 보셨나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;전 못본 것 같아요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;iOS 환경에서 개발자는 두가지 종류의 알림을 보내줄 수 있어요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;서버에서 원격으로 알림을 생성하여 APNs(Apple 푸시 알림 서비스)가 기기에 전달해주는 방법,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;네...&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용자 기기에 알림을 보낼 수 있게 권한 허용받기&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;  NotificationCenter&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NotificationCenter 하면 어떤게 떠오르시나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;일단 &quot;알림&quot;에 관련된 건 맞습니다ㅎㅎ&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NotificationCenter는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용자에게 뭔가를 알려주는 역할이라기 보다,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;공식문서에는 이렇게 작성되어 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;A notification dispatch mechanism that enables the broadcast of information to registered observers.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&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;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NotificationCenter는 애플리케이션에서 특정한 이벤트가 발생했을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이벤트가 발생했다는 사실을&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이런건 간단히 &lt;b&gt;Observer 패턴&lt;/b&gt;이라고도 하죠&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;앱의 각기 다른 부분이 독립적으로 유지되면서 특정 이벤트에 반응할 수 있게 하는 것이죠!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;예를 들어, 중요한 데이터가 업데이트 됐을 때 여러 UI 컴포넌트가 이것을 감지하고 업데이트를 준비하는 것 처럼 말이에요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(사실 이런 부분에서는 Delegate 패턴을 더 많이 써요  )&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔️ 구성 요소&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Notifications&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;발생하는 이벤트를 의미합니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NSNotification 객체로 표현되어요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 객체는 이벤트에 대한 정보를 담고 있습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NotificationCenter&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모든 알림이 NotificationCenter의 인스턴스를 통해 관리됩니다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모든 앱은 default NotificationCenter 인스턴스를 가지고 있어요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;✔️ 사용 방법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;알림 수신자 등록하기&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;특정 이벤트에 반응하고 싶은 객체는 자기 자신을 알림 수신자로 등록해야 합니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709389453131&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;addObserver(_:selector:name:object:)&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;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;알림 발송하기&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;특정 이벤트가 발생했을 때, 관련된 알림을 발송할 수 있어요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709389478700&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;post(name:object:userInfo:)&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;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;알림 수신자 제거하기&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;더 이상 변경등의 알림을 받고 싶지 않은 객체라면 NotificationCenter에서 자기 자신을 제거하면 돼요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709389521555&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;removeObserver(_:)&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;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;AppDelegate 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용자에게 권한 요청을 하기 위해서는 UserNotifications를 사용해야 합니다&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하지만! 절대로 인스턴스를 직접 생성하면 안됩니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;current()라는 메서드를 통해 앱의 NotificationCenter를 반환해주어야 해요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/usernotifications/unusernotificationcenter/current()&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/usernotifications/unusernotificationcenter/current()&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709386733393&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UserNotifications


@main
class AppDelegate: UIResponder, UIApplicationDelegate {
	func application(_:didFinishLaunchingWithOptions:) // 여기에 작성
}&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;UNAuthorizationOptions : badge, sound, alert&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;requestAutorization(options:completionHandler:) 메서드&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 2개의 요소를 사용해서 기본 옵션을 설정해줍니다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709391160406&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&amp;gt; Bool {
    let authOptions: UNAuthorizationOptions = [.alert, .sound, .badge]
        
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { res, error in
        if res {
            print(&quot;사용자가 알림을 허용했습니다.&quot;)
        } else {
            print(&quot;사용자가 알림을 거부했습니다.&quot;)
        }
    }
        
    return true
}&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;size16&quot;&gt;대충 테스트해보면 이런식으로 정상 작동!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-03-03 오전 12.14.04.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cliVEE/btsFqYBcl0A/YQsAxwQxIqhoaAzcR2Nsw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cliVEE/btsFqYBcl0A/YQsAxwQxIqhoaAzcR2Nsw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cliVEE/btsFqYBcl0A/YQsAxwQxIqhoaAzcR2Nsw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcliVEE%2FbtsFqYBcl0A%2FYQsAxwQxIqhoaAzcR2Nsw1%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;437&quot; height=&quot;198&quot; data-filename=&quot;스크린샷 2024-03-03 오전 12.14.04.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span&gt; &lt;/span&gt;&lt;/span&gt;원격 알림 / 로컬 알림 차이점&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;푸시 알림 기능을 사용하기 위해서 위에 적힌 정도까지만 해 주면 로컬 알림은 사용할 수 있어요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하지만! 원격 알림을 사용하려면 추가적인 작업이 필요합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;APNs에 디바이스 등록하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;디바이스 토큰 받아오기&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 토근은 서버가 특정한 사용자에게 알림을 보낼 때 사용됩니다!&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709391317384&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&amp;gt; Bool {
        // 알림 권한 요청
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { res, error in
            if res {
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                }
            }
        }
        return true
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // 디바이스 토큰을 받음
        let tokenParts = deviceToken.map { data in String(format: &quot;%02.2hhx&quot;, data) }
        let token = tokenParts.joined()
        print(&quot;Device Token: \(token)&quot;)
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // 디바이스 토큰 등록 실패
        print(&quot;Failed to register: \(error)&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; 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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기초중의 기초!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&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;조금 더 세세한 트리거를 다루는 방법도 공부중입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재로서는 APNs는 사용할 일이 없어서,,, 로컬 알림쪽으로만ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;~ヾ(＾&amp;nabla;＾)&lt;/h4&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;개발블로그썸네일들-001 (10).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2dqNP/btsFqJYvolH/6r5thpoD9QgIhIliTnqRPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2dqNP/btsFqJYvolH/6r5thpoD9QgIhIliTnqRPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2dqNP/btsFqJYvolH/6r5thpoD9QgIhIliTnqRPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2dqNP%2FbtsFqJYvolH%2F6r5thpoD9QgIhIliTnqRPK%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;129&quot; height=&quot;129&quot; data-filename=&quot;개발블로그썸네일들-001 (10).png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/usernotifications&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/usernotifications&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://developer.apple.com/documentation/foundation/notificationcenter&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.apple.com/documentation/foundation/notificationcenter&lt;/a&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;</description>
      <category>iOS/Swift</category>
      <author>YEN_</author>
      <guid isPermaLink="true">https://yy-dev.tistory.com/149</guid>
      <comments>https://yy-dev.tistory.com/149#entry149comment</comments>
      <pubDate>Sat, 2 Mar 2024 23:49:23 +0900</pubDate>
    </item>
  </channel>
</rss>