<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BoreumiOS</title>
    <link>https://boreum.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 1 Aug 2026 13:24:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_보름</managingEditor>
    <image>
      <title>BoreumiOS</title>
      <url>https://tistory1.daumcdn.net/tistory/4489104/attach/b6bad97d71e247cf96c6ec5a8fd59e42</url>
      <link>https://boreum.tistory.com</link>
    </image>
    <item>
      <title>[iOS] iTunes Search API</title>
      <link>https://boreum.tistory.com/69</link>
      <description>&lt;h1&gt;iTunes Search API&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/&quot;&gt;iTunes Search API&lt;/a&gt;는 iTunes Store 및 Apple Books Store 내에서 콘텐츠를 검색할 수 있는 API입니다.&lt;br /&gt;AppStore 구현을 하며 iTunes Search API를 사용하게 되어 학습 목적으로 글을 작성합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;검색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트의 필드에서 콘텐츠를 검색하고 웹 사이트에 결과를 표시하려면 정규화된 URL 콘텐츠 요청을 iTunes Store로 전달하는 검색 필드를 생성하여야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규화된 URL의 형식은 다음과 같아야 합니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://itunes.apple.com/search?parameterkeyvalue&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;code&gt;parameterkeyvalue&lt;/code&gt;는 쿼리의 세부 정보를 나타내는 하나 이상의 매개 변수 키 및 값 쌍일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수 키와 값 쌍을 구성하려면 각 매개변수 키를 &lt;code&gt;=&lt;/code&gt; 및 값 문자열로 연결해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;key1=value1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수 키 및 값 쌍의 문자열을 생성하려면 &lt;code&gt;&amp;amp;&lt;/code&gt;를 사용하여 각 쌍을 연결해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;ceylon&quot;&gt;&lt;code&gt;key1=value1&amp;amp;key2=value2&amp;amp;key3=value3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ParameterKey&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘텐츠를 검색하기 위하여 지정할 수 있는 매개변수 키와 값을 설명하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;term&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하려는 URL의 인코딩 된 텍스트 문자열입니다.&lt;br /&gt;URL 인코딩은 공백을 &lt;code&gt;+&lt;/code&gt;로 바꾸고 문자, 숫자, &lt;code&gt;.&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;를 제외한 모든 문자가 인코딩 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;country&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하려는 스토어의 두 자리 국가 코드입니다.&lt;br /&gt;검색은 지정된 국가에 대한 기본 스토어 정보를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국가 코드 목록은 &lt;a href=&quot;http://en.wikipedia.org/wiki/%20ISO_3166-1_alpha-2&quot;&gt;http://en.wikipedia.org/wiki/ ISO_3166-1_alpha-2&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국은 &lt;code&gt;KR&lt;/code&gt; 이니까 &lt;code&gt;country=KR&lt;/code&gt;로 지정해주면 되겠네요!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;media&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하려는 미디어 유형입니다.&lt;br /&gt;&lt;code&gt;movie&lt;/code&gt;, &lt;code&gt;podcast&lt;/code&gt;, &lt;code&gt;music&lt;/code&gt;, &lt;code&gt;musicVideo&lt;/code&gt;, &lt;code&gt;audiobook&lt;/code&gt;, &lt;code&gt;shortFilm&lt;/code&gt;, &lt;code&gt;tvShow&lt;/code&gt;, &lt;code&gt;software&lt;/code&gt;, &lt;code&gt;ebook&lt;/code&gt;, &lt;code&gt;all&lt;/code&gt;을 값으로 입력할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱스토어를 구현하기 위해서는 &lt;code&gt;software&lt;/code&gt;가 필요하겠네요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;entity&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 미디어 유형과 관련하여 반환하려는 결과 유형입니다.&lt;br /&gt;&lt;code&gt;software&lt;/code&gt;의 값에는 &lt;code&gt;software&lt;/code&gt;, &lt;code&gt;iPadSoftware&lt;/code&gt;, &lt;code&gt;macSoftware&lt;/code&gt;가 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;attribute&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 미디어 유형과 관련하여 스토어에서 검색하려는 속성입니다.&lt;br /&gt;기본값은 지정된 미디어 유형과 관련된 모든 속성입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;software&lt;/code&gt; 유형에 대해 &lt;code&gt;softwareDeveloper&lt;/code&gt; 속성을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;all&lt;/code&gt; 유형에 대해선 &lt;code&gt;languageTerm&lt;/code&gt;, &lt;code&gt;releaseYearTerm&lt;/code&gt;, &lt;code&gt;titleTerm&lt;/code&gt;, &lt;code&gt;ratingIndex&lt;/code&gt;, &lt;code&gt;keywordsTerm&lt;/code&gt;, &lt;code&gt;descriptionTerm&lt;/code&gt;, &lt;code&gt;authorTerm&lt;/code&gt;, &lt;code&gt;mixTerm&lt;/code&gt;, &lt;code&gt;ratingTerm&lt;/code&gt; 등의 속성을 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;callback&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트에 검색 결과를 반환할 때 사용할 자바스크립트 콜백 함수의 이름입니다.&lt;br /&gt;교차 사이트 검색용으로 &lt;code&gt;wsSearchCB&lt;/code&gt; 값을 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;limit&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iTunes Store에서 반환할 검색 결과의 수를 제한합니다.&lt;br /&gt;기본 값은 50이며 1에서 200의 값으로 제한할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;lang&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 결과를 반환할 때 사용할 언어를 5자리 코드명을 사용하여 지정합니다.&lt;br /&gt;기본값은 &lt;code&gt;en_us&lt;/code&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;version&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색에서 다시 수신하려는 검색 결과 키 버전입니다.&lt;br /&gt;기본값은 2입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;explicit&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 결과에 명시적 콘텐츠를 포함할지 여부를 나타내는 플래그입니다.&lt;br /&gt;기본값은 Yes입니다.&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;다음은 특정 검색 요청에 대한 정규화된 URL의 예입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 Jack Johnson 콘텐츠를 검색하는 URL은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://itunes.apple.com/search?term=jack+johnson&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 Jack Johnson 콘텐츠를 검색하고 처음 25개 항목만 반환하려면 URL은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://itunes.apple.com/search?term=jack+johnson&amp;amp;limit=25&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jack Johnson 뮤직 비디오만 검색하려면 URL은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://itunes.apple.com/search?term=jack+johnson&amp;amp;entity=musicVideo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 Jim Jones 콘텐츠를 검색하고 Canada iTunes Store의 결과만 반환하려면 URL은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;https://itunes.apple.com/search?term=jim+jones&amp;amp;country=ca&lt;/code&gt;&lt;/pre&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;iTunes ID, UPC/EAN, AMG(All Music Guide) ID를 기반으로 스토어에서 콘텐츠를 검색하기 위한 조회 요청을 생성할 수도 있습니다.&lt;br /&gt;ID 기반 조회는 더 빠르고 오탐 결과가 더 적습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 특정 조회 요청에 대한 정규화된 URL의 예입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID로 Jack Johnson 조회&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://itunes.apple.com/lookup?id=909253&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AMG 아티스트 ID로 Jack Johnson 조회&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://itunes.apple.com/lookup?amgArtistId=468749&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AMG 아티스트 ID로 여러 아티스트 조회&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://itunes.apple.com/lookup?amgArtistId=468749,5723&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jack Johnson의 모든 앨범 조회&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://itunes.apple.com/lookup?id=909253&amp;amp;entity=album&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPC로 앨범 또는 비디오 조회&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://itunes.apple.com/lookup?upc=720642462928&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13자리 ISBN으로 책 조회&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;https://itunes.apple.com/lookup?isbn=9780316069359&lt;/code&gt;&lt;/pre&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;API는 검색 결과를 JSON 형식으로 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON은 객체와 배열 두 가지 구조를 기반으로 합니다.&lt;br /&gt;객체는 &lt;code&gt;{&lt;/code&gt;로 시작하여 &lt;code&gt;}&lt;/code&gt;로 끝나는 이름/값 쌍의 정렬되지 않은 집합입니다.&lt;br /&gt;각 이름은 &lt;code&gt;&quot;&quot;&lt;/code&gt;로 묶이고 그 뒤에 &lt;code&gt;:&lt;/code&gt;이 옵니다. 이름/값 쌍은 &lt;code&gt;,&lt;/code&gt;로 구분됩니다.&lt;br /&gt;배열은 &lt;code&gt;[&lt;/code&gt;로 시작하여 &lt;code&gt;]&lt;/code&gt;로 끝나는 정렬된 값 모음입니다. 값은 &lt;code&gt;,&lt;/code&gt;로 구분됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 JSON 결과는 UTF-8로 인코딩 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 JSON 결과 키와 값을 설명하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;wrapperType&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 요청에서 반환된 개체의 이름입니다.&lt;br /&gt;반환 값의 예시로는 &lt;code&gt;track&lt;/code&gt;, &lt;code&gt;collection&lt;/code&gt;, &lt;code&gt;artistFor&lt;/code&gt;이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;kind&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 요청에 의해 반환된 콘텐츠의 종류입니다.&lt;br /&gt;&lt;code&gt;book&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;software-package&lt;/code&gt; 등과 같은 값이 반환됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;artworkUrl100, artworkUrl60&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환된 미디어 유형과 관련된 아트웍의 URL로, 크기는 100x100 픽셀 또는 60x60픽셀입니다. 아트웍이 있는 경우에만 반환됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;*viewURL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환된 미디어 유형과 연결된 콘텐츠의 URL입니다.&lt;br /&gt;URL을 클릭하여 iTunes Store에서 콘텐츠를 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/&quot;&gt;iTunes Search API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS</category>
      <category>API</category>
      <category>AppStore</category>
      <category>IOS</category>
      <category>itunes</category>
      <category>iTunes Search API</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/69</guid>
      <comments>https://boreum.tistory.com/69#entry69comment</comments>
      <pubDate>Thu, 6 Jan 2022 16:48:31 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] Calendar 구조체로 달력 구현하기 (4) - 달력 표시, 버튼 기능 구현하기</title>
      <link>https://boreum.tistory.com/67</link>
      <description>&lt;div id=&quot;polyglot__panel&quot; style=&quot;left: 330px; top: 352.90625px;&quot;&gt;
&lt;div class=&quot;polyglot__inner&quot;&gt;&lt;button class=&quot;polyglot__confirm-button&quot;&gt; &lt;img src=&quot;safari-extension://DDDE585E-7591-4ACA-9687-03ECCC3BF887/23990b90/icon.png&quot; alt=&quot;Translate&quot; /&gt; &lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;이번 달 달력 표시하기&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커스텀 셀&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 달 달력을 표시해주기 위하여 &lt;code&gt;CalendarCollectionViewCell&lt;/code&gt;의 &lt;code&gt;configure()&lt;/code&gt;를 수정하겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.dayLabel.text = &quot;0&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;dayLabel&lt;/code&gt;의 텍스트를 &lt;code&gt;&quot;0&quot;&lt;/code&gt;으로 설정해주는 코드를 삭제합니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configure() {
        self.addSubview(self.dayLabel)
        self.dayLabel.font = .boldSystemFont(ofSize: 12)
        self.dayLabel.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.dayLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: 5),
            self.dayLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;code&gt;configure()&lt;/code&gt;가 위와 같아지겠죠?&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    func update(day: String) {
        self.dayLabel.text = day
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 위의 메서드를 추가해줍니다.&lt;br /&gt;&lt;code&gt;day&lt;/code&gt;로 들어오는 문자열로 &lt;code&gt;dayLabel&lt;/code&gt;을 설정해주는 코드입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;뷰 컨트롤러&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;ViewController&lt;/code&gt;로 돌아오겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&amp;gt; Int {
        return self.days.count
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;numberOfItemsInSection&lt;/code&gt;을 수정해주겠습니다.&lt;br /&gt;&lt;code&gt;days&lt;/code&gt;에 있는 값으로 셀을 설정해주기 위해 위의 코드처럼 &lt;code&gt;self.days.count&lt;/code&gt;로 바꿔줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 1월 기준으로 &lt;code&gt;days&lt;/code&gt;에 37개의 값이 들어가 있으니 37개의 셀이 생성되겠네요.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&amp;gt; UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CalendarCollectionViewCell.identifier, for: indexPath) as? CalendarCollectionViewCell else { return UICollectionViewCell() }
        cell.update(day: self.days[indexPath.item])
        return cell
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 커스텀 셀에서 만들어 둔 &lt;code&gt;update(day:)&lt;/code&gt;를 &lt;code&gt;cellForItemAt&lt;/code&gt;에서 불러주겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;self.days[indexPath.item]&lt;/code&gt;을 통하여 0번부터 36번까지 &lt;code&gt;days&lt;/code&gt;에 접근하여 문자열을 가져와 &lt;code&gt;update(day:)&lt;/code&gt;에 넣어주게 됩니다.&lt;br /&gt;&lt;code&gt;update(day:)&lt;/code&gt;는 &lt;code&gt;dayLabel&lt;/code&gt;을 받은 문자열로 설정하게 되겠죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/94eVA/btrpRWly0kj/0jFmhCqpjZrzTdJDtux6v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/94eVA/btrpRWly0kj/0jFmhCqpjZrzTdJDtux6v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/94eVA/btrpRWly0kj/0jFmhCqpjZrzTdJDtux6v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F94eVA%2FbtrpRWly0kj%2F0jFmhCqpjZrzTdJDtux6v0%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;300&quot; height=&quot;2556&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&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;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;버튼 기능 구현하기&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이전 달, 다음 달 이동하기&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    @objc private func didPreviousButtonTouched(_ sender: UIButton) {
        self.minusMonth()
    }

    @objc private func didNextButtonTouched(_ sender: UIButton) {
        self.plusMonth()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 &lt;code&gt;ViewController&lt;/code&gt;에 추가해줍니다.&lt;br /&gt;&lt;code&gt;didPreviousButtonTouched()&lt;/code&gt;에서는 &lt;code&gt;minusMonth()&lt;/code&gt;를 &lt;code&gt;didNextButtonTouched()&lt;/code&gt;에서는 &lt;code&gt;plusMonth()&lt;/code&gt;를 불러줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 코드를 버튼에 적용해야겠죠?&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configurePreviousButton() {
        self.contentView.addSubview(self.previousButton)
        self.previousButton.tintColor = .label
        self.previousButton.setImage(UIImage(systemName: &quot;chevron.left&quot;), for: .normal)
        self.previousButton.addTarget(self, action: #selector(self.didPreviousButtonTouched), for: .touchUpInside)
        self.previousButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.previousButton.widthAnchor.constraint(equalToConstant: 44),
            self.previousButton.heightAnchor.constraint(equalToConstant: 44),
            self.previousButton.trailingAnchor.constraint(equalTo: self.titleLabel.leadingAnchor, constant: -5),
            self.previousButton.centerYAnchor.constraint(equalTo: self.titleLabel.centerYAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;addTarget()&lt;/code&gt;을 이용하여 &lt;code&gt;.touchUpInside&lt;/code&gt;가 됐을 때 &lt;code&gt;didPreviousButtonTouched()&lt;/code&gt;를 부르도록 지정해주면 됩니다.&lt;br /&gt;아무 데나 해당 코드를 넣어도 되지만 저는 &lt;code&gt;configurePreviousButton()&lt;/code&gt;에 넣어주었습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.nextButton.addTarget(self, action: #selector(self.didNextButtonTouched), for: .touchUpInside)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;nextButton&lt;/code&gt;에도 &lt;code&gt;addTarget()&lt;/code&gt;을 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;1920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/divQ9s/btrpOxtAb3B/4tmhV3C7CiCfYKnO9kmbWK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/divQ9s/btrpOxtAb3B/4tmhV3C7CiCfYKnO9kmbWK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/divQ9s/btrpOxtAb3B/4tmhV3C7CiCfYKnO9kmbWK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/divQ9s/btrpOxtAb3B/4tmhV3C7CiCfYKnO9kmbWK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;1920&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;1920&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;이번 달로 이동하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;달력 하면 빠질 수 없는 이번 달로 이동하는 기능을 구현해보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;private func configureCalendar() { 
    let components = self.calendar.dateComponents([.year, .month], from: Date()) 
    self.calendarDate = self.calendar.date(from: components) ?? Date() 
    self.dateFormatter.dateFormat = &quot;yyyy년 MM월&quot; 
    self.updateCalendar() 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 기존의 &lt;code&gt;configureCalendar()&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 설정에서 &lt;code&gt;calendarDate&lt;/code&gt;, &lt;code&gt;dateFormatter&lt;/code&gt;를 설정해준 후 &lt;code&gt;updateCalendar()&lt;/code&gt;를 불러주는데,&lt;br /&gt;이번 달로 이동할 때 &lt;code&gt;calendarDate&lt;/code&gt; 설정 후 &lt;code&gt;updateCalendar()&lt;/code&gt;를 불러주어야 해서 3줄의 코드가 중복됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복되는 코드를 작성하기는 싫으니 &lt;code&gt;configureCalendar()&lt;/code&gt;를 분리하겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func today() {
        let components = self.calendar.dateComponents([.year, .month], from: Date())
        self.calendarDate = self.calendar.date(from: components) ?? Date()
        self.updateCalendar()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;today()&lt;/code&gt; 메서드를 추가한 후 초기 설정과 이번 달 이동 기능의 중복되는 코드를 분리시켜줍니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureCalendar() {
        self.dateFormatter.dateFormat = &quot;yyyy년 MM월&quot;
        self.today()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;configureCalendar()&lt;/code&gt;에서 &lt;code&gt;today()&lt;/code&gt;를 불러주면 분리 전과 같은 동작을 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;today()&lt;/code&gt;를 이용하여 &lt;code&gt;todayButton&lt;/code&gt;의 기능을 추가해보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    @objc private func didTodayButtonTouched(_ sender: UIButton) {
        self.today()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;didTodayButtonTouched()&lt;/code&gt;를 추가한 후 여기서도 &lt;code&gt;today()&lt;/code&gt;를 불러줍니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.todayButton.addTarget(self, action: #selector(self.didTodayButtonTouched), for: .touchUpInside)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;addTarget()&lt;/code&gt;만 해주면 이번 달로 이동하는 기능도 완성입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/co3oing/Calendar/tree/e6939d2d6504ad5dbbc27427a8334144c3d84df9&quot;&gt;co3oing/Calendar - 달력 표시, 버튼 기능 구현하기 Github 소스 코드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/67</guid>
      <comments>https://boreum.tistory.com/67#entry67comment</comments>
      <pubDate>Wed, 5 Jan 2022 16:51:45 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] Calendar 구조체로 달력 구현하기 (3) - 메서드 구현하기</title>
      <link>https://boreum.tistory.com/65</link>
      <description>&lt;div id=&quot;polyglot__panel&quot; style=&quot;left: 303px; top: 6133.90625px;&quot;&gt;
&lt;div class=&quot;polyglot__inner&quot;&gt;&lt;button class=&quot;polyglot__confirm-button&quot;&gt; &lt;img src=&quot;safari-extension://DDDE585E-7591-4ACA-9687-03ECCC3BF887/95e884c4/icon.png&quot; alt=&quot;Translate&quot; /&gt; &lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h1&gt;프로퍼티&lt;/h1&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;private let calendar = Calendar.current
private let dateFormatter = DateFormatter()
private var calendarDate = Date()
private var days = [String]()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 필요한 프로퍼티는 위와 같습니다.&lt;br /&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;code&gt;calendar&lt;/code&gt; : &lt;code&gt;Calendar&lt;/code&gt; 구조체를 사용하기 위하여 사용자의 현재 달력으로 초기화해놓은 프로퍼티입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dateFormatter&lt;/code&gt; : &lt;code&gt;2022년 01월&lt;/code&gt;과 같은 형태로 타이틀을 만들어 주기 위한 &lt;code&gt;DateFormatter&lt;/code&gt;입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;calendarDate&lt;/code&gt; : 달력에 표시될 날짜를 저장합니다. 이전 달이나 다음 달로 이동하게 되면 이동한 달이 포함된 날짜를 가지고 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;days&lt;/code&gt; : 달력에 날짜를 표시하기 위한 String 배열입니다. 1일이 화요일부터 시작된다면 &lt;code&gt;[&quot;&quot;, &quot;&quot;, &quot;1&quot;, &quot;2&quot;...]&lt;/code&gt;와 같은 형태로 저장이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;메서드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;필요한 메서드&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;configureCalendar()&lt;/code&gt; : 달력을 표시해주기 위하여 &lt;code&gt;calendarDate&lt;/code&gt;와 &lt;code&gt;dateFormmatter&lt;/code&gt;를 초기화합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;startDayOfTheWeek() -&amp;gt; Int&lt;/code&gt; : &lt;code&gt;calendarDate&lt;/code&gt;가 해당하는 달의 1일이 시작되는 요일을 리턴합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;endDate() -&amp;gt; Int&lt;/code&gt; : &lt;code&gt;calendarDate&lt;/code&gt;가 해당하는 달의 날짜 개수를 리턴합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updateTitle()&lt;/code&gt; : &lt;code&gt;titleLabel&lt;/code&gt;에 &lt;code&gt;2022년 01월&lt;/code&gt;과 같이 년, 월을 업데이트합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updateDays()&lt;/code&gt; : &lt;code&gt;startDayOfTheWeek()&lt;/code&gt;과 &lt;code&gt;endDate()&lt;/code&gt;를 이용하여 &lt;code&gt;days&lt;/code&gt;에 &lt;code&gt;String&lt;/code&gt; 배열을 만들어 넣습니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updateCalendar()&lt;/code&gt; : 달력을 처음 띄우거나 달을 이동할 때 마다 &lt;code&gt;updateTitle()&lt;/code&gt;, &lt;code&gt;updateDate()&lt;/code&gt;를 호출합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minusMonth()&lt;/code&gt; : &lt;code&gt;calendarDate&lt;/code&gt;의 달을 이전 달로 변경합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plusMonth()&lt;/code&gt; : &lt;code&gt;calendarDate&lt;/code&gt;의 달을 다음 달로 변경합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 메서드는 위와 같습니다.&lt;br /&gt;이제 하나하나 구현 해볼게요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;configureCalendar()&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;let components = self.calendar.dateComponents([.year, .month], from: Date())
self.calendarDate = self.calendar.date(from: components) ?? Date()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 날짜에서 년, 월만 뽑아냅니다. 2022년 1월 03일 17:41 이면 2022년 1년만 뽑아내는 거죠!&lt;br /&gt;년, 월만 뽑아낸 &lt;code&gt;DateComponents&lt;/code&gt; 타입을 &lt;code&gt;date(from:)&lt;/code&gt;을 이용하여 &lt;code&gt;Date&lt;/code&gt; 타입으로 바꿔주고 &lt;code&gt;calendarDate&lt;/code&gt;에 저장합니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.dateFormatter.dateFormat = &quot;yyyy년 MM월&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;dateFormatter&lt;/code&gt; 도 원하는 포맷으로 설정해줍니다.&lt;br /&gt;저는 &lt;code&gt;2022년 01월&lt;/code&gt;과 같이 표시하고 싶어서 &lt;code&gt;yyyy년 MM월&lt;/code&gt;로 설정해줬어요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;startDayOfTheWeek() -&amp;gt; Int&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;return self.calendar.component(.weekday, from: self.calendarDate) - 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;component()&lt;/code&gt;를 이용하여 1일이 시작하는 요일을 계산하면 1은 일요일, 7은 토요일로 반환이 됩니다.&lt;br /&gt;&lt;code&gt;days&lt;/code&gt; 배열의 0번 인덱스를 일요일로 표시해주기 위하여 &lt;code&gt;-1&lt;/code&gt; 을 해준 후 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 1월은 1일이 토요일부터 시작이니 6이 반환되겠네요.&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;endDate() -&amp;gt; Int&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;return self.calendar.range(of: .day, in: .month, for: self.calendarDate)?.count ?? Int()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;range(of:, in:, for:)&lt;/code&gt;를 이용하여 &lt;code&gt;calendarDate&lt;/code&gt;가 해당하는 달의 날짜가 며칠까지 있는지 계산하여 반환합니다.&lt;br /&gt;2022년 1월은 31일까지 있으니 31이 반환되겠죠?&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;updateTitle()&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;let date = self.dateFormatter.string(from: self.calendarDate)
self.titleLabel.text = date&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;dateFormmater&lt;/code&gt;를 이용하여 &lt;code&gt;calendarDate&lt;/code&gt;를 설정해놓은 포맷으로 만들어준 후 타이틀에 적용시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;updateDays()&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.days.removeAll()
let startDayOfTheWeek = self.startDayOfTheWeek()
let totalDays = startDayOfTheWeek + self.endDate()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;updateDays()&lt;/code&gt;가 불렸을 때 이전의 데이터는 필요 없어지기 때문에 &lt;code&gt;days&lt;/code&gt;를 비워줍니다.&lt;br /&gt;&lt;code&gt;startDayOfTheWeek&lt;/code&gt;에 요일의 시작 인덱스를 저장해주고 &lt;code&gt;totalDays&lt;/code&gt;에 시작 인덱스와 날짜 개수를 더해서 넣어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 1월은 1일이 토요일이니까 6, 총 31일까지 있으니 31. 따라서 &lt;code&gt;totalDays&lt;/code&gt;에 37이 저장됩니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;for day in Int()..&amp;lt;totalDays {
    if day &amp;lt; startDayOfTheWeek {
        self.days.append(&quot;&quot;)
        continue
    }
    self.days.append(&quot;\(day - startDayOfTheWeek + 1)&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0부터 36까지 총 37번 동안 &lt;code&gt;for&lt;/code&gt;문을 돌면서 &lt;code&gt;days&lt;/code&gt;에 문자열을 넣어줍니다.&lt;br /&gt;&lt;code&gt;for&lt;/code&gt;문 안의 코드를 자세히 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;if day &amp;lt; startDayOfTheWeek {
    self.days.append(String())
    continue
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;day&lt;/code&gt;가 &lt;code&gt;startDayOfTheWeek&lt;/code&gt; 보다 작으면 &lt;code&gt;days&lt;/code&gt;에 빈 문자열을 넣어줍니다.&lt;br /&gt;즉, 1일이 시작하는 요일의 인덱스 전까지 빈 문자열을 넣는 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 1월 기준으로 &lt;code&gt;days&lt;/code&gt;에 &lt;code&gt;[&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;]&lt;/code&gt;가 들어가겠네요.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.days.append(&quot;\(day - startDayOfTheWeek + 1)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;day&lt;/code&gt;가 6이 되면 &lt;code&gt;if&lt;/code&gt;문에 걸리지 않겠네요. 6번 인덱스부터 1부터 31까지의 숫자가 들어갑니다.&lt;br /&gt;&lt;code&gt;day&lt;/code&gt;가 6일 때 &lt;code&gt;startDayOfTheWeek&lt;/code&gt;이 6이니까 1이 들어가게 되고,&lt;br /&gt;&lt;code&gt;day&lt;/code&gt;가 7일 때 2, &lt;code&gt;day&lt;/code&gt;가 8일 때 3... 이 들어가게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;for&lt;/code&gt;문이 끝나면 &lt;code&gt;days&lt;/code&gt;의 값이 &lt;code&gt;[&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, ... &quot;31&quot;]&lt;/code&gt;로 업데이트됩니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.collectionView.reloadData()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드 마지막에 &lt;code&gt;reloadData()&lt;/code&gt;를 불러 바뀐 &lt;code&gt;days&lt;/code&gt;에 맞게 &lt;code&gt;collectionView&lt;/code&gt;를 업데이트하도록 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;updateCalendar()&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.updateTitle()
self.updateDays()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이틀과 날짜를 업데이트해주는 메서드를 불러줍니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;private func configureCalendar() {
    let components = self.calendar.dateComponents([.year, .month], from: Date())
    self.calendarDate = self.calendar.date(from: components) ?? Date()
    self.dateFormatter.dateFormat = &quot;yyyy년 MM월&quot;
    self.updateCalendar()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 작성한 &lt;code&gt;configureCalendar()&lt;/code&gt;에서 &lt;code&gt;updateCalendar()&lt;/code&gt;를 불러주겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfyhCy/btrpPEE7E8O/M88ykoEjss3QIU1sLkASz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfyhCy/btrpPEE7E8O/M88ykoEjss3QIU1sLkASz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfyhCy/btrpPEE7E8O/M88ykoEjss3QIU1sLkASz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfyhCy%2FbtrpPEE7E8O%2FM88ykoEjss3QIU1sLkASz1%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;300&quot; height=&quot;2556&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 작성하고 실행해주면 위의 사진과 같이 타이틀에 년, 월 정보가 표시되는 것을 볼 수 있습니다.&lt;br /&gt;날짜 부분의 업데이트는 Calendar 구조체로 달력 구현하기 (4)에서 다루겠습니다!&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;minusMonth()&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.calendarDate = self.calendar.date(byAdding: DateComponents(month: -1), to: self.calendarDate) ?? Date()
self.updateCalendar()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;date(byAdding:, to:)&lt;/code&gt;를 이용해서 -1 연산을 해준 후 &lt;code&gt;updateCalendar()&lt;/code&gt;를 불러줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;plusMonth()&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.calendarDate = self.calendar.date(byAdding: DateComponents(month: 1), to: self.calendarDate) ?? Date()
self.updateCalendar()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;minusMonth()&lt;/code&gt;와 같은 메서드를 이용하여 +1 연산을 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;달력 구현을 위한 메서드 구현이 끝났습니다.&lt;br /&gt;구현한 메서드를 이용하여 날짜를 표시해주고, 버튼을 설정하는 과정은 다음 글에서 다루겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/co3oing/Calendar/tree/a57f812e72f3f9e51878ba2fa187e02b5eca50a2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;co3oing/Calendar - 메서드 구현하기 Github 소스 코드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS</category>
      <category>calendar</category>
      <category>IOS</category>
      <category>SWIFT</category>
      <category>달력</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/65</guid>
      <comments>https://boreum.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 4 Jan 2022 23:10:47 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] Calendar 구조체로 달력 구현하기 (2) - 달력 뷰 구성하기</title>
      <link>https://boreum.tistory.com/63</link>
      <description>&lt;h1&gt;달력 뷰 미리 보기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Calendar&lt;/code&gt; 구조체도 알아봤으니 이제 달력 구현을 위하여 뷰를 구성해 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y00vj/btrpIyeRZM2/2vSJHKBKG3EIZw32pK7os1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y00vj/btrpIyeRZM2/2vSJHKBKG3EIZw32pK7os1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y00vj/btrpIyeRZM2/2vSJHKBKG3EIZw32pK7os1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY00vj%2FbtrpIyeRZM2%2F2vSJHKBKG3EIZw32pK7os1%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;2652&quot; height=&quot;1880&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진과 같은 심플한 달력을 만들 겁니다.&lt;br /&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;code&gt;titleLabel&lt;/code&gt; : &lt;code&gt;2022년 01&lt;/code&gt;월과 같이 년, 월 정보를 보여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;previousButton&lt;/code&gt; : 이전 달로 이동하는 버튼입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nextButton&lt;/code&gt; : 다음 달로 이동하는 버튼입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;todayButton&lt;/code&gt; : 현재 달로 이동합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weekStackView&lt;/code&gt; : 일요일부터 토요일까지 요일을 보여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;collectionView&lt;/code&gt; : 1일부터 날짜를 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;달력 뷰 구성하기&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 생성 및 초기 설정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJ5sR/btrpDKzsTg0/BkpoRYTz2h5bU84g42g6Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJ5sR/btrpDKzsTg0/BkpoRYTz2h5bU84g42g6Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJ5sR/btrpDKzsTg0/BkpoRYTz2h5bU84g42g6Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJ5sR%2FbtrpDKzsTg0%2FBkpoRYTz2h5bU84g42g6Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1116&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS App으로 프로젝트를 생성하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;1106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsOlbs/btrpIzdMdG4/mO5naKzF6qTwprPm5TZHPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsOlbs/btrpIzdMdG4/mO5naKzF6qTwprPm5TZHPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsOlbs/btrpIzdMdG4/mO5naKzF6qTwprPm5TZHPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsOlbs%2FbtrpIzdMdG4%2FmO5naKzF6qTwprPm5TZHPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1106&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;1106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Product Name에 원하는 앱 이름을 적어주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 스토리보드 없이 코드로만 작성할 거라서 스토리보드를 삭제했습니다.&lt;br /&gt;&lt;a href=&quot;https://boreum.tistory.com/45&quot;&gt;스토리보드 없이 뷰 컨트롤러 연결하는 방법&lt;/a&gt;은 여기에서 확인해주세요!&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import UIKit

final class ViewController: UIViewController {

    private lazy var scrollView = UIScrollView()
    private lazy var contentView = UIView()
    private lazy var titleLabel = UILabel()
    private lazy var previousButton = UIButton()
    private lazy var nextButton = UIButton()
    private lazy var todayButton = UIButton()
    private lazy var weekStackView = UIStackView()
    private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ViewController&lt;/code&gt;에 필요한 프로퍼티를 생성해줍니다.&lt;br /&gt;작은 화면에서도 잘리지 않고 잘 보였으면 해서 &lt;code&gt;UIScrollView&lt;/code&gt;도 생성해줬습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .systemBackground
        self.configure()
    }

    private func configure() {
        self.configureScrollView()
        self.configureContentView()
        self.configureTitleLabel()
    }

    private func configureScrollView() {

    }

    private func configureContentView() {

    }

    private func configureTitleLabel() {

    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;viewDidLoad()&lt;/code&gt;에서 뷰의 색상을 &lt;code&gt;.systemBackground&lt;/code&gt;로 바꿔주고, 설정 메서드를 모아 놓은 메서드인 &lt;code&gt;configure()&lt;/code&gt;를 불러주겠습니다.&lt;br /&gt;&lt;code&gt;configure()&lt;/code&gt;에서는 &lt;code&gt;scrollView&lt;/code&gt;, &lt;code&gt;contentView&lt;/code&gt;, &lt;code&gt;titleLabel&lt;/code&gt;을 설정해 주는 메서드를 불러주세요.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureScrollView() {
        self.view.addSubview(self.scrollView)
        self.scrollView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.scrollView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor),
            self.scrollView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),
            self.scrollView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor),
            self.scrollView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor)
        ])
    }

    private func configureContentView() {
        self.scrollView.addSubview(self.contentView)
        self.contentView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.contentView.topAnchor.constraint(equalTo: self.scrollView.topAnchor),
            self.contentView.leadingAnchor.constraint(equalTo: self.scrollView.leadingAnchor),
            self.contentView.trailingAnchor.constraint(equalTo: self.scrollView.trailingAnchor),
            self.contentView.bottomAnchor.constraint(equalTo: self.scrollView.bottomAnchor),
            self.contentView.widthAnchor.constraint(equalTo: self.scrollView.widthAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;self.view&lt;/code&gt;에 &lt;code&gt;scrollView&lt;/code&gt;를 넣고 &lt;code&gt;scrollView&lt;/code&gt;에 &lt;code&gt;contentView&lt;/code&gt;를 넣어주었습니다.&lt;br /&gt;위아래로만 스크롤할 거니 &lt;code&gt;contentView&lt;/code&gt;의 &lt;code&gt;width&lt;/code&gt;를 &lt;code&gt;scrollView&lt;/code&gt;의 &lt;code&gt;width&lt;/code&gt;와 같게 제약사항을 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 &lt;code&gt;contentView&lt;/code&gt;에 타이틀, 요일 스택 뷰, 달력 등을 넣어주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;년, 월 타이틀&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureTitleLabel() {
        self.contentView.addSubview(self.titleLabel)
        self.titleLabel.text = &quot;2000년 01월&quot;
        self.titleLabel.font = .monospacedSystemFont(ofSize: 18, weight: .bold)
        self.titleLabel.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.titleLabel.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 20),
            self.titleLabel.centerXAnchor.constraint(equalTo: self.contentView.centerXAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;contentView&lt;/code&gt;에 &lt;code&gt;titleLabel&lt;/code&gt;을 넣고 텍스트, 폰트 설정을 주고 상단에서 20 떨어진 위치 중앙에 배치를 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLLfsP/btrpxyfhUyj/U2KKl8k3tTbUp7LOPSYLSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLLfsP/btrpxyfhUyj/U2KKl8k3tTbUp7LOPSYLSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLLfsP/btrpxyfhUyj/U2KKl8k3tTbUp7LOPSYLSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLLfsP%2FbtrpxyfhUyj%2FU2KKl8k3tTbUp7LOPSYLSK%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;300&quot; height=&quot;2556&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;버튼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 달, 다음 달, 이번 달로 이동하는 버튼을 설정해주겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;    private func configure() {
        self.configureScrollView()
        self.configureContentView()
        self.configureTitleLabel()
        self.configurePreviousButton()
        self.configureNextButton()
        self.configureTodayButton()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 메서드를 만들어주고 &lt;code&gt;configure()&lt;/code&gt;에서 불러줍니다.&lt;br /&gt;앞으로 만드는 메서드들은 생성 후 모두 &lt;code&gt;configure()&lt;/code&gt;에서 불러주면 됩니다!&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configurePreviousButton() {
        self.contentView.addSubview(self.previousButton)
        self.previousButton.tintColor = .label
        self.previousButton.setImage(UIImage(systemName: &quot;chevron.left&quot;), for: .normal)
        self.previousButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.previousButton.widthAnchor.constraint(equalToConstant: 44),
            self.previousButton.heightAnchor.constraint(equalToConstant: 44),
            self.previousButton.trailingAnchor.constraint(equalTo: self.titleLabel.leadingAnchor, constant: -5),
            self.previousButton.centerYAnchor.constraint(equalTo: self.titleLabel.centerYAnchor)
        ])
    }

    private func configureNextButton() {
        self.contentView.addSubview(self.nextButton)
        self.nextButton.tintColor = .label
        self.nextButton.setImage(UIImage(systemName: &quot;chevron.right&quot;), for: .normal)
        self.nextButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.nextButton.widthAnchor.constraint(equalToConstant: 44),
            self.nextButton.heightAnchor.constraint(equalToConstant: 44),
            self.nextButton.leadingAnchor.constraint(equalTo: self.titleLabel.trailingAnchor, constant: 5),
            self.nextButton.centerYAnchor.constraint(equalTo: self.titleLabel.centerYAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑같이 &lt;code&gt;contentView&lt;/code&gt;에 넣어주고 색상, 이미지, 제약 사항을 설정해줍니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureTodayButton() {
        self.contentView.addSubview(self.todayButton)
        self.todayButton.setTitle(&quot;Today&quot;, for: .normal)
        self.todayButton.setTitleColor(.systemBackground, for: .normal)
        self.todayButton.backgroundColor = .label
        self.todayButton.layer.cornerRadius = 5
        self.todayButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.todayButton.widthAnchor.constraint(equalToConstant: 60),
            self.todayButton.heightAnchor.constraint(equalToConstant: 30),
            self.todayButton.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -10),
            self.todayButton.centerYAnchor.constraint(equalTo: self.titleLabel.centerYAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 달로 이동하는 버튼은 타이틀과 배경색을 모두 설정해주었습니다.&lt;br /&gt;약간 둥근 사각형을 만들고 싶어서 &lt;code&gt;cornerRadius&lt;/code&gt;를 5로 주었습니다.&lt;br /&gt;위치는 &lt;code&gt;contentView.trailing&lt;/code&gt; 에서 -10 떨어진 위치에 &lt;code&gt;todayButton.trailing&lt;/code&gt;이 오게 설정해주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5aExG/btrpMRqXHa2/0RHLjDMxDz3sxGrccSGX7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5aExG/btrpMRqXHa2/0RHLjDMxDz3sxGrccSGX7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5aExG/btrpMRqXHa2/0RHLjDMxDz3sxGrccSGX7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5aExG%2FbtrpMRqXHa2%2F0RHLjDMxDz3sxGrccSGX7k%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;300&quot; height=&quot;616&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;요일 스택 뷰&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureWeekStackView() {
        self.contentView.addSubview(self.weekStackView)
        self.weekStackView.distribution = .fillEqually
        self.weekStackView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.weekStackView.topAnchor.constraint(equalTo: self.titleLabel.bottomAnchor, constant: 40),
            self.weekStackView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 5),
            self.weekStackView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -5)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;weekStackView&lt;/code&gt;의 distribution을 &lt;code&gt;.fillEqually&lt;/code&gt;로 설정하여 스택 뷰에 들어가는 아이템이 모두 같은 크기를 가지게 해 줍니다.&lt;br /&gt;스택 뷰 설정이 끝났으니 아래에서 스택 뷰에 들어갈 아이템을 생성해주겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureWeekLabel() {
        let dayOfTheWeek = [&quot;일&quot;, &quot;월&quot;, &quot;화&quot;, &quot;수&quot;, &quot;목&quot;, &quot;금&quot;, &quot;토&quot;]

        for i in 0..&amp;lt;7 {
            let label = UILabel()
            label.text = dayOfTheWeek[i]
            label.textAlignment = .center
            self.weekStackView.addArrangedSubview(label)

            if i == 0 {
                label.textColor = .systemRed
            } else if i == 6 {
                label.textColor = .systemBlue
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열에 요일을 넣어 준 후 &lt;code&gt;for&lt;/code&gt;문을 돌며 &lt;code&gt;UILabel&lt;/code&gt;을 만들어 &lt;code&gt;weekStackView&lt;/code&gt;에 넣어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zemrh/btrpPEEGaDV/NVKQej4Qce2FqaoElEwdX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zemrh/btrpPEEGaDV/NVKQej4Qce2FqaoElEwdX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zemrh/btrpPEEGaDV/NVKQej4Qce2FqaoElEwdX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzemrh%2FbtrpPEEGaDV%2FNVKQej4Qce2FqaoElEwdX0%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;300&quot; height=&quot;2556&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;달력 컬렉션 뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 진짜 마지막입니다.&lt;br /&gt;가장 중요한 &lt;code&gt;collectionView&lt;/code&gt;설정만 해주면 끝입니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rejJw/btrpJRyx35f/2lAwLl4iSTv08ZDERCXAw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rejJw/btrpJRyx35f/2lAwLl4iSTv08ZDERCXAw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rejJw/btrpJRyx35f/2lAwLl4iSTv08ZDERCXAw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrejJw%2FbtrpJRyx35f%2F2lAwLl4iSTv08ZDERCXAw0%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;309&quot; height=&quot;244&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 셀을 위하여 새로운 파일을 만들어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caysLt/btrpGBbVWeB/AqjfbSM6HBtxuiCKvJNiq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caysLt/btrpGBbVWeB/AqjfbSM6HBtxuiCKvJNiq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caysLt/btrpGBbVWeB/AqjfbSM6HBtxuiCKvJNiq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaysLt%2FbtrpGBbVWeB%2FAqjfbSM6HBtxuiCKvJNiq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;435&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;1112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cocoa Touch Class를 선택해 준 후 Class이름을 설정해주세요.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    static let identifier = &quot;CalendarCollectionViewCell&quot;
    private lazy var dayLabel = UILabel()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;CalendarCollectionViewCell&lt;/code&gt;에 &lt;code&gt;identifier&lt;/code&gt;와 &lt;code&gt;dayLabel&lt;/code&gt;을 추가해 줍니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.configure()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.configure()
    }

    private func configure() {
        self.addSubview(self.dayLabel)
        self.dayLabel.text = &quot;0&quot;
        self.dayLabel.font = .boldSystemFont(ofSize: 12)
        self.dayLabel.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.dayLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: 5),
            self.dayLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;required init?(coder: NSCoder)&lt;/code&gt;과 &lt;code&gt;override init(frame: CGRect)&lt;/code&gt;에서 &lt;code&gt;configure()&lt;/code&gt;를 불러줍니다.&lt;br /&gt;잘 보이는지 확인하기 위해 텍스트를 &lt;code&gt;&quot;0&quot;&lt;/code&gt;으로 설정해줬습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 &lt;code&gt;ViewController&lt;/code&gt;로 돌아가겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    private func configureCollectionView() {
        self.contentView.addSubview(self.collectionView)
        self.collectionView.dataSource = self
        self.collectionView.delegate = self
        self.collectionView.register(CalendarCollectionViewCell.self, forCellWithReuseIdentifier: CalendarCollectionViewCell.identifier)
        self.collectionView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.collectionView.topAnchor.constraint(equalTo: self.weekStackView.bottomAnchor, constant: 10),
            self.collectionView.leadingAnchor.constraint(equalTo: self.weekStackView.leadingAnchor),
            self.collectionView.trailingAnchor.constraint(equalTo: self.weekStackView.trailingAnchor),
            self.collectionView.heightAnchor.constraint(equalTo: self.collectionView.widthAnchor, multiplier: 1.5),
            self.collectionView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor)
        ])
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;collectionView&lt;/code&gt;를 설정해주는 메서드를 생성한 후 &lt;code&gt;collectionView&lt;/code&gt;의 &lt;code&gt;dataSource&lt;/code&gt;와 &lt;code&gt;delegate&lt;/code&gt;를 &lt;code&gt;self&lt;/code&gt;로 설정해줍니다.&lt;br /&gt;아까 생성한 커스텀 셀을 넣어주기 위해서 &lt;code&gt;register&lt;/code&gt;도 해줍니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;extension ViewController: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ViewController&lt;/code&gt;에서 &lt;code&gt;UICollectionView&lt;/code&gt; 설정에 필요한 프로토콜 세 가지를 채택합니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&amp;gt; Int {
        return 42
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트용으로 42개의 셀을 생성해주겠습니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&amp;gt; UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CalendarCollectionViewCell.identifier, for: indexPath) as? CalendarCollectionViewCell else { return UICollectionViewCell() }
        return cell
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 만들어준 커스텀 셀을 &lt;code&gt;collectionView&lt;/code&gt;에 넣어주도록 설정합니다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -&amp;gt; CGSize {
        let width = self.weekStackView.frame.width / 7
        return CGSize(width: width, height: width * 1.3)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -&amp;gt; CGFloat {
        return .zero
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셀의 크기와 간격을 위와 같이 설정해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cePuIp/btrpGBiJg0H/j8LsmKF6GHQ8OvEJxz5wgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cePuIp/btrpGBiJg0H/j8LsmKF6GHQ8OvEJxz5wgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cePuIp/btrpGBiJg0H/j8LsmKF6GHQ8OvEJxz5wgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcePuIp%2FbtrpGBiJg0H%2Fj8LsmKF6GHQ8OvEJxz5wgK%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;300&quot; height=&quot;616&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;2556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행시켜 보면 위와 같은 화면을 만날 수 있습니다.&lt;br /&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 data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/co3oing/Calendar/tree/99ff108e99fee71492a4b5ace3393bae0c142c63&quot;&gt;co3oing/Calendar - 달력 화면 구성하기 Github 소스 코드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS</category>
      <category>calendar</category>
      <category>IOS</category>
      <category>SWIFT</category>
      <category>달력</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/63</guid>
      <comments>https://boreum.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 3 Jan 2022 17:14:33 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 2021.12.27</title>
      <link>https://boreum.tistory.com/58</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 한 일&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VIPER, RIBs, VIP 아키텍처 학습하기&lt;/li&gt;
&lt;li&gt;CPU 스케줄링 다시 정리하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 느낀 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VIPER, RIBs, VIP 아키텍처에 대하여 학습했는데, 글로만&amp;nbsp;읽어서는&amp;nbsp;확실히 모르겠다. 직접 써봐야 확실히 알 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내일 할 일&lt;/h2&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;/ul&gt;</description>
      <category>TIL</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/58</guid>
      <comments>https://boreum.tistory.com/58#entry58comment</comments>
      <pubDate>Mon, 27 Dec 2021 16:03:49 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 2021.12.26</title>
      <link>https://boreum.tistory.com/57</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 한 일&lt;/h2&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;아프리카TV 지원서 작성하기&lt;/li&gt;
&lt;li&gt;class 메서드와 static 메서드 학습하기&lt;/li&gt;
&lt;li&gt;Delegate, Notification 학습하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 느낀 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jira를 꼭 써야 한다는 말을 들었지만, 아직도 써보지 못했다. iOSDeveloperKR에 Jira 관련 글이 올라왔는데 직접 써보면서 ticket 없이는 업무도 없다는 말이 뭔지 직접 느껴보고 싶다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내일 할 일&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ribs, VIP 아키텍처 학습하기&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/57</guid>
      <comments>https://boreum.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 27 Dec 2021 00:08:47 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 2021.12.25</title>
      <link>https://boreum.tistory.com/56</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; 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;/li&gt;
 &lt;li&gt;스노우 지원서 작성하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; 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;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; 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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>TIL</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/56</guid>
      <comments>https://boreum.tistory.com/56#entry56comment</comments>
      <pubDate>Sat, 25 Dec 2021 23:41:29 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 2021.12.18</title>
      <link>https://boreum.tistory.com/55</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 한 일&lt;/h2&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;알고리즘 풀이 - python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 느낀 것&lt;/h2&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;카카오엔터프라이즈 코딩테스트에 swift가 안 된대서 python을 연습 중이다.&amp;nbsp;Django 이후로 써본 적이 없어서인지 Lv.1도 힘들다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내일 할 일&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3-way hand shake, 4-way hand shake 흐름 학습하기&lt;/li&gt;
&lt;li&gt;스택, 큐 학습하기&lt;/li&gt;
&lt;li&gt;오버로딩, 오버라이딩 학습하기&lt;/li&gt;
&lt;li&gt;Singleton 패턴 학습하기&lt;/li&gt;
&lt;li&gt;Optional 학습하기&lt;/li&gt;
&lt;li&gt;Dynamic Dispatch 학습하기&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIL</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/55</guid>
      <comments>https://boreum.tistory.com/55#entry55comment</comments>
      <pubDate>Sat, 18 Dec 2021 23:53:57 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 2021.12.16</title>
      <link>https://boreum.tistory.com/54</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 한 일&lt;/h2&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;li&gt;카카오페이 지원서 작성하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 느낀 것&lt;/h2&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;알고리즘 안하다 하려니 너무 힘들다.. 2단계 올클 할 수 있겠지..?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내일 할 일&lt;/h2&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;/ul&gt;</description>
      <category>TIL</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/54</guid>
      <comments>https://boreum.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 16 Dec 2021 23:37:10 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 2021.12.15</title>
      <link>https://boreum.tistory.com/53</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 한 일&lt;/h2&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;Race Condition 학습하기&lt;/li&gt;
&lt;li&gt;프로세스, 스레드 학습하기&lt;/li&gt;
&lt;li&gt;class의 성능 향상 방법 학습하기&lt;/li&gt;
&lt;li&gt;NSObject부터 UIButton까지 상속 과정 학습하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘 느낀 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상속하지 않는 class에 final 키워드를 붙이면 성능이 향상된다고 알고 있었지만 그 이유를 몰랐다. 앞으로는 &quot;왜?&quot;라는 생각을 해야겠다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내일 할 일&lt;/h2&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;/ul&gt;</description>
      <category>TIL</category>
      <category>TIL</category>
      <author>_보름</author>
      <guid isPermaLink="true">https://boreum.tistory.com/53</guid>
      <comments>https://boreum.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 16 Dec 2021 00:33:59 +0900</pubDate>
    </item>
  </channel>
</rss>