<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Challenger_day100.log</title>
        <link>https://velog.io/</link>
        <description>롤 챌린저의 100일 개발 도전기</description>
        <lastBuildDate>Sun, 10 Oct 2021 11:08:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Challenger_day100.log</title>
            <url>https://images.velog.io/images/d_day100/profile/f437766c-706b-48cb-b538-5ffecb1f8f0e/maxresdefault.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Challenger_day100.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/d_day100" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[RIOT API]]></title>
            <link>https://velog.io/@d_day100/RIOT-API</link>
            <guid>https://velog.io/@d_day100/RIOT-API</guid>
            <pubDate>Sun, 10 Oct 2021 11:08:14 GMT</pubDate>
            <description><![CDATA[<p>!youtube[n2KTiT-b9Qo]</p>
<h2 id="과정-정리">과정 정리</h2>
<ol>
<li>첫 API 호출</li>
<li>API의 데이터 인자로 받아서 API 호출</li>
<li>API를 신뢰하지 않는 경우
&quot;The resource could not be loaded because the App Transport Security policy requires the use of a secure connection&quot;</li>
</ol>
<p><a href="https://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi">https://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[URL 중간에 변수를 집어넣어 API 호출하기]]></title>
            <link>https://velog.io/@d_day100/URL-%EC%A4%91%EA%B0%84%EC%97%90-%EB%B3%80%EC%88%98%EB%A5%BC-%EC%A7%91%EC%96%B4%EB%84%A3%EC%96%B4-API-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@d_day100/URL-%EC%A4%91%EA%B0%84%EC%97%90-%EB%B3%80%EC%88%98%EB%A5%BC-%EC%A7%91%EC%96%B4%EB%84%A3%EC%96%B4-API-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 27 Sep 2021 02:32:36 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-상황">문제 상황</h2>
<p>RIOT API를 사용해야 하는 상황
SearchBar를 통해 아이디를 검색하고 싶은데 </p>
<p>소환사 정보를 가져오는 API는 다음과 같다</p>
<pre><code>https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/&lt;name&gt;?api_key?&lt;apikey&gt;</code></pre><p>apikey는 고정이라 상관이 없는데 name에 들어갈 소환사 이름은 항상 바뀌기 때문에 이걸 처리해줘야 하는 상황이다 </p>
<h2 id="1차-시도실패">1차 시도(실패)</h2>
<p><img src="https://images.velog.io/images/d_day100/post/4747f61b-4459-4d01-94f1-b1a3afb196f1/image.png" alt="">
URL 문자열 중간에 name을 넣어서 하려고 했는데 이건 컴퓨터가 못 읽더라 </p>
<p>지금 배우고 있는  강의에서는 QueryItem을 추가해서 인코딩해주었는데 내가 사용하려는 API는 그런 구조가 아닌 것 같아서 사용하기 어려웠다 (내가 모르는 것일 수 있으나 따라했더니 안 됐음) </p>
<p>그래서 name이라는 문자열이 애초에 인코딩된 상태로 들어갈 필요가 있었음</p>
<h2 id="2차-시도성공">2차 시도(성공)</h2>
<p><img src="https://images.velog.io/images/d_day100/post/3c0cb0ba-c58e-4dbc-bd30-152a8e670ed0/image.png" alt="">
검색해보니 이렇게 바로 인코딩작업을 진행해줄 수 있더라</p>
<p><img src="https://images.velog.io/images/d_day100/post/1006fea1-4387-4c21-80b3-2b8e0c442c02/image.png" alt="">
그래서 name을 인코딩한 nameIncoding을 URL 문자열 안에 넣었더니 잘 된다</p>
<p>고로 고로 고로케 (너무 신나서 죄송...)</p>
<p>고로 UISearchBar에서도 
let name = UISearchBar.text
let nameIncoding = name.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
이렇게 작업하면 서치바에 나오는 텍스트를 통해 바로 URL을 호출할 수 있을 것 같다</p>
<p>아직 안 해봤으니 해보고 후기를 추가해보겠다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 14강 - 네트워킹]]></title>
            <link>https://velog.io/@d_day100/FC-14%EA%B0%95-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9</link>
            <guid>https://velog.io/@d_day100/FC-14%EA%B0%95-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9</guid>
            <pubDate>Sat, 25 Sep 2021 00:59:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/69fba705-3ff4-40a9-9009-eea94ca7b509/image.png" alt=""></p>
<h2 id="url-세션-오버뷰">URL 세션 오버뷰</h2>
<p>URLSessionConfiguration을 이용해서 생성하게 됨
URLSession은 여러 개의 URLSession Task을 만들 수 있음 - URLSession Task를 통해 서버와 통신함
URLSession Delegate를 통해 서버통신 중간과정을 확인할 수 있음. 필수는 아님
URLSessionConfiguration은 Default(기본 통신), Ephemeral(쿠키, 캐시를 저장하지 않을 때. 시크릿 모드), Background(앱이 백그라운드에서 다운을 받는 등 이렇게 3가지로 만들 수 있음</p>
<p>URLSession Task는 3가지로 나뉨.</p>
<ol>
<li>URLSessionDataTask: 리스폰스 데이터를 메모상에서 처리하게 됨. 간단한 데이터를 받을 때 사용하면 됨. 백그라운드에서는 사용이 안 됨</li>
<li>URLSessionUploadTask: 업로드할 때 씀. 리퀘스트 바디를 제공함</li>
<li>URLSessionDownloadTask: 파일을 받아 디스크에서 쓸 때 사용</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[API Key 유출되니까...]]></title>
            <link>https://velog.io/@d_day100/API-Key-%EC%9C%A0%EC%B6%9C%EB%90%98%EB%8B%88%EA%B9%8C</link>
            <guid>https://velog.io/@d_day100/API-Key-%EC%9C%A0%EC%B6%9C%EB%90%98%EB%8B%88%EA%B9%8C</guid>
            <pubDate>Fri, 24 Sep 2021 00:50:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/80745cbc-9534-46b2-ab1d-73ee307c58b8/image.png" alt=""></p>
<p>아침에 일어나서 메일을 쓱 둘러보는데
API Key가 유출됐다는 메일이 왔더라</p>
<p>내가 공개 레포에다가 key를 적어뒀는데 그게 공개된 것이었음</p>
<p><a href="https://blog.gitguardian.com/leaking-secrets-on-github-what-to-do/">https://blog.gitguardian.com/leaking-secrets-on-github-what-to-do/</a>
그래서 어떻게 대처해야 할지 찾아봤는데</p>
<p><img src="https://images.velog.io/images/d_day100/post/bbe1ba7b-972b-4585-a3e1-687b2f791593/image.png" alt="">
파일이나 저장소를 삭제해도 안전하지 않다고 하더라
그래서 우선 레포를 다 비공개로 돌렸고
API Key를 다시 발급받았다</p>
<p>놀래라... 큰 일은 아니라 다행이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 10장 - MVVM 디자인 패턴]]></title>
            <link>https://velog.io/@d_day100/FC-10%EC%9E%A5-MVVM-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@d_day100/FC-10%EC%9E%A5-MVVM-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Tue, 21 Sep 2021 17:35:21 GMT</pubDate>
            <description><![CDATA[<h2 id="mvc란">MVC란?</h2>
<p><img src="https://images.velog.io/images/d_day100/post/c567a62f-3c3d-44bd-bf0d-0e5a9897d80f/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/7ccee27b-abb3-4a66-ad92-564513169c5d/image.png" alt=""></p>
<p>ViewController가 너무 많을 일을 하다보니
기술부채가 발생하게 됨</p>
<p>그래서 MVC를 Massive View Controller라고 비아냥함</p>
<h2 id="mvvm이란">MVVM이란?</h2>
<p><img src="https://images.velog.io/images/d_day100/post/e9bb6a0d-8051-4d4c-8c5a-5f8d88cd87cb/image.png" alt="">
클린 아키텍처, 디자인 패턴이라고도 불린다</p>
<p><img src="https://images.velog.io/images/d_day100/post/f4ce05a1-25dc-413e-a56f-97b4302d8a2e/image.png" alt="">
MVC와의 차이점으로는 뷰컨이 모델에 직접 접근하지 못함, 뷰컨이 뷰레이어에 있다 </p>
<p><img src="https://images.velog.io/images/d_day100/post/8e131159-0d70-4af8-8f9f-89cab27a6167/image.png" alt=""></p>
<h2 id="mvvm의-목표">MVVM의 목표</h2>
<ul>
<li>기술부채 최소화 </li>
<li>재사용 및 지속가능한 코드 만들기</li>
</ul>
<h2 id="리펙터링">리펙터링</h2>
<ul>
<li>중복 제거</li>
<li>단일 책임 갖기 (매서드, 오브젝트 단위까지)</li>
<li>10, 200 rule (초심자는 30, 400으로)
매서드는 10줄 안에 클래스는 200줄 안에 짜기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 8장 - Class]]></title>
            <link>https://velog.io/@d_day100/FC-8%EC%9E%A5-Class</link>
            <guid>https://velog.io/@d_day100/FC-8%EC%9E%A5-Class</guid>
            <pubDate>Wed, 15 Sep 2021 02:59:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/d7522e3b-57dc-4f63-8eb3-24bcb5cf4321/image.png" alt=""></p>
<p>Struct와 Class는 이런 차이점이 있다
코드 상에서는 어떻게 다른지 알아보자</p>
<p><img src="https://images.velog.io/images/d_day100/post/dd3cb9c6-7e31-49bd-ab6c-1e8ffa73bb39/image.png" alt=""></p>
<p>Struct는 Copy해서 할당하기 때문에 personStruct1과 2가 값이 다를 수 있다</p>
<h4 id="struct">Struct</h4>
<p>personStruct2에 값을 할당해도 personStruct1의 값은 변하지 않는다</p>
<h4 id="class">Class</h4>
<p>personClass2 = personClass1을 통해 2에 1을 할당한 모습
personClass2 값에 변화를 주었더니 personClass1의 값도 변했다</p>
<p>다시 personClass2 = PersonClass(firstName: &quot;Bob&quot;, lastName: &quot;Lee&quot;)를 할당했는데
그 아래에 보면 
personClass1의 값은 그대로지만 2의 값은 변한 것을 볼 수 있다</p>
<p>그러나 맨 아래에서 personClass1에 personClass2를 할당했더니
다시 Bob으로 다 일치된 것을 확인할 수 있다</p>
<h1 id="struct-vs-class-언제-무엇을-써야-할까">Struct VS Class 언제, 무엇을 써야 할까?</h1>
<h2 id="struct는-이럴-때-쓰자">Struct는 이럴 때 쓰자!</h2>
<ol>
<li>두 object를 &quot;같다, 다르다&quot;로 비교해야 하는 경우<img src="https://images.velog.io/images/d_day100/post/b18f1595-fbd4-419c-a216-81d10a0a7cd3/image.png" alt=""></li>
</ol>
<ol start="2">
<li><p>Copy된 각 개체들이 독립적인 상태를 가져야 하는 경우<img src="https://images.velog.io/images/d_day100/post/f28758f9-979d-4c35-bd30-a978eaff2e3d/image.png" alt=""></p>
</li>
<li><p>코드에서 오브젝트의 데이터를 여러 스레드에 걸쳐 사용할 경우</p>
</li>
</ol>
<h2 id="class는-이럴-때-쓰자">Class는 이럴 때 쓰자!</h2>
<ol>
<li><p>두 object의 인스턴스 자체가 같음을 확인해야 할 때</p>
</li>
<li><p>하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우</p>
</li>
</ol>
<h2 id="아-그래도-모르겠다면">아 그래도 모르겠다면!</h2>
<p><img src="https://images.velog.io/images/d_day100/post/46efa2a8-5c43-4da1-826d-6ae3409af663/image.png" alt=""></p>
<ol>
<li>일단 Sturct로 쓰자 (Struct에서 Class로 바꾸는 건 쉽다) Swift는 Struct를 좋아한다 </li>
</ol>
<h1 id="class-상속">Class 상속</h1>
<p><img src="https://images.velog.io/images/d_day100/post/d7988517-bbef-48f8-895e-a146ea99e111/image.png" alt=""><img src="https://images.velog.io/images/d_day100/post/95811697-abeb-4904-a1b3-af81ae29e7fa/image.png" alt=""></p>
<p>Class가 비슷하고 A가 B에 포함될 경우
A를 B에 상속시키고 B에는 A와 겹치지 않는 부분만 적을 수 있다</p>
<p><img src="https://images.velog.io/images/d_day100/post/5725ec0c-3e01-457c-a1c9-bc95bfba6603/image.png" alt="">
위의 예시처럼 Person(기본 틀)은 Super Class, Student는 SubClass다</p>
<p><img src="https://images.velog.io/images/d_day100/post/19f9f53b-8806-447d-b746-658042a7aae8/image.png" alt="">
이러한 상속 규칙을 수립할 수 있다
3번 상속의 깊이는 상관이 없다는 것은 서브 클래스를 부모클래스로한 서브클래스가 생길 수 있다는 뜻</p>
<p>여기서 잠꽌!!!!!!</p>
<h3 id="is란-무엇인가">is란 무엇인가</h3>
<pre><code>var yangwon = Person(name: &quot;Chall&quot;)

if yangwon is Person {
    print(true)        // true
}    
</code></pre><p>이렇게 is를 쓰면 yangwon의 Super Class가 Person이 맞나 아닌가 판단할 수 있다
맞으면 true, 틀리면 false</p>
<pre><code>let char: Character = &quot;A&quot;

char is Character       // true
char is String          // false


let bool: Bool = true

bool is Bool            // true
bool is Character       // false</code></pre><p>이렇게 class가 아닌 곳에서도 활용 가능</p>
<h3 id="as">as?</h3>
<p><img src="https://images.velog.io/images/d_day100/post/6141994f-a07d-4629-b6d4-793c59b6935a/image.png" alt=""><img src="https://images.velog.io/images/d_day100/post/d74e8e16-64bf-4e30-a5d5-a31696fe3723/image.png" alt=""></p>
<p>가장 하단을 보면 된다
if let movie = item as? Movie
이걸 해석하면 item이 Movie를 상속받았어? 
만약 그렇다면 movie에 값이 들어갈 수 있어서 if가 참이 된다
따라서 print를 실행해!
이런 의미이다</p>
<p>만약 item이 Movie를 상속받지 않았다면 nil이기 때문에 movie에 할당할 수 없고 
따라서 else if로 넘어가게 된다</p>
<p>즉 as?는 &quot;그게 이걸 상속받았니 안 받았니?&quot; 이렇게 물어본다고 이해하면 된다</p>
<h2 id="asupcasting">as(upcasting)</h2>
<p><img src="https://images.velog.io/images/d_day100/post/df0e038b-d8d9-4de8-98ef-ed58e9e5e49a/image.png" alt="">
와 이것 때문에 정신 나가는 줄
아니 athlete1 = athelete2 as StudentAthlete
이게 의미하는 건 athelete2가 FootballPlayer지만 Student인척 해달라는 의미인데
Student임에도 불구하고 train()을 했을 때 +2씩 증가하더라 (FootballPlayer의 프로퍼티를 받았다는 의미)</p>
<p>알고보니까 이게 싹다 Student처리되는 게 아니라 override된 것은 자식으로 처리하는 것이었음</p>
<h2 id="상속은-언제-하면-좋을까">상속은 언제 하면 좋을까?</h2>
<p>상속의 장점은 중복되는 코드를 제거할 수 있음 
단 깊어지면 복잡해져서 유지보수가 어려워진다 
고로 짬에서 나오는 바이브가 필요한... </p>
<h4 id="1-single-responsibility단일-책임">1. Single Responsibility(단일 책임)</h4>
<ul>
<li>클래스는 한 개의 고려사항만 가지면 된다 한 가지 일에 집중할 수 있도록  정체성도 모호해지고 유지보수도 하기 어렵기 때문에 단일 책임을 고려하면 좋다  </li>
</ul>
<h4 id="2-type-safety-타입이-분명해야-할-때">2. Type Safety 타입이 분명해야 할 때</h4>
<h4 id="3-shared-base-classes다자녀가-있다">3. Shared Base Classes(다자녀가 있다!)</h4>
<p>내용 자체가 다르게 구현되어야 할 때 
ex. 학생의 학습이라 치면 음악, 체육, 문학 등 다르니까 이럴 때는 상속을 이용하면 좋다)</p>
<h4 id="4-extensibility">4. Extensibility</h4>
<p>확장성이 필요한 경우 - 캔이라는 클래스를 만들어서 콜라캔, 맥주캔 이렇게 확장할 경우  </p>
<h4 id="5-identity">5. Identity</h4>
<p>정체를 파악하기 위해  변수가 있는데 학생인데 체대생? 미대생? 이런 것을 확인해야 할 때 </p>
<h1 id="init-생성">init 생성</h1>
<h2 id="2-phase-initialization-클래스-생성-시-2단계">2-phase Initialization (클래스 생성 시 2단계)</h2>
<h3 id="phase-1">Phase 1</h3>
<p><img src="https://images.velog.io/images/d_day100/post/fd04f086-d875-41ae-ae11-08e83da32b01/image.png" alt=""></p>
<ul>
<li>모든 스토어드 프로퍼티는 모두 init 처리되어야 한다</li>
<li>자식프로퍼티부터 init하고 뒤에 super로 부모클래스 프로퍼티를 init 처리한다</li>
</ul>
<h3 id="phase-2">Phase 2</h3>
<p><img src="https://images.velog.io/images/d_day100/post/13371003-1d35-41f2-8946-c227baae9bf9/image.png" alt=""></p>
<ul>
<li>Phase 1이 마무리되기 전에는 사용할 수 없음 그래서 Phase 2가 있다. </li>
<li>Phase 2는 반대 방향 프로퍼티를 다 세팅하고 매서드를 쓸 수 있다</li>
</ul>
<h2 id="designated-init주-이니셜라이져-vs-convenience-init간편하게-쓰는-이니셜라이져">designated init(주 이니셜라이져) VS convenience init(간편하게 쓰는 이니셜라이져)</h2>
<p><img src="https://images.velog.io/images/d_day100/post/b90d6164-452a-4dd2-ba9f-31cc0371690e/image.png" alt="">
(강사님의 잘린 머리...)</p>
<p><img src="https://images.velog.io/images/d_day100/post/ee66dcd2-6533-4f7d-b314-f56dafcb14e1/image.png" alt="">
그림으로 보면 이러하다</p>
<p><img src="https://images.velog.io/images/d_day100/post/d8374e3e-33be-48cc-a976-f9170c37657f/image.png" alt="">
코드상에서는 이렇게 convenience를 활용할 수 있다
근데 override로 init을 가져와서 활용하는 건 아직 모르겠다
일단 넘기고 싶은 욕구가 솟아오르기 때문에 일단 패스</p>
<h4 id="요약">요약</h4>
<ul>
<li>클래스 안에는 여러 init을 만들 수 있다. </li>
<li>이게 크게 주, 부 init으로 나누어 볼 수 있다. </li>
<li>부 init은 다른 init을 호출하게 되어있다. </li>
<li>최종적으로 부 init은 주 init 불러야 한다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 7장 - Struct, Protocol, Property, Method]]></title>
            <link>https://velog.io/@d_day100/FC-7%EC%9E%A5-</link>
            <guid>https://velog.io/@d_day100/FC-7%EC%9E%A5-</guid>
            <pubDate>Sun, 12 Sep 2021 08:01:28 GMT</pubDate>
            <description><![CDATA[<h1 id="구조체-1--3">구조체 (1 ~ 3)</h1>
<h4 id="언제-사용">언제 사용?</h4>
<p>값을 많이 저장할 때 서로 관계가 있는 값을 한 번에 관리하거나 표현할 때 사용 
관계가 있는 여러 데이터를 묶어서 표현할 수 있다</p>
<p>ex) 강의 정보 - 강의이름, 강사이름, 학생 수 등 이런 것을 낱개가 아닌 뭉텅이로 관리 가능</p>
<h4 id="object를-표현하는데-사용됨">object를 표현하는데 사용됨</h4>
<p>object는 2가지 방식으로 구현 됨 </p>
<ol>
<li>structure </li>
<li>Class
<img src="https://images.velog.io/images/d_day100/post/c05e807d-1390-4e97-b954-746c9087d78d/image.png" alt=""></li>
</ol>
<p>Structure는 Vlaue Types라 복사돼서 할당
Class는 참조돼서 할당(공유하게 되는 구조)</p>
<p><img src="https://images.velog.io/images/d_day100/post/08d11c41-f210-4032-977f-be6d456397b0/image.png" alt=""></p>
<p>이렇게 Structure와 Class는 구현될 때 차이가 있음
Class의 경우에는 둘 다 값이 Hey로 변했지만
Structure는 pStruct2만 Hey로 변한 것을 볼 수 있다</p>
<p><img src="https://images.velog.io/images/d_day100/post/5daee6ac-9c1a-4bb2-90a9-3e22a2b02ffb/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/5e14b290-b4cf-4e21-809f-e6a4ddc651a2/image.png" alt=""></p>
<p>그 이유는 다음과 같다
Class의 경우에는 하나를 바라보는데
Structure는 복사해서 있기 떄문에 이게 값이 다름
(뭔소린지 나도 잘 모르겠는데 쨌든 값이 다르게 나온 거 보면 뭔가 다름)</p>
<p><img src="https://images.velog.io/images/d_day100/post/46b384e1-2bf2-48e9-8c0a-8ef644f044c5/image.png" alt="">
생겨나는 공간에서 차이가 있음
필요한 메모리 공간이 달라서 구현에서도 차이가 생긴다 
Structure는 Stack이라는 공간에, Class는 Heap이라는 공간에 생긴단다
(뭐 그렇다는데 솔직히 두 개가 뭔지도 모름)</p>
<h2 id="실습">실습</h2>
<p><img src="https://images.velog.io/images/d_day100/post/847519b2-0396-43fe-bee9-2268af62503b/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/48fb9953-042a-49a4-91bb-bf319d27ba5a/image.png" alt="">
이렇게 struct를 활용할 수 있는데
솔직히 제대로 이해하지 못했음
많이 써봐야 할 것 같은데 아직은 너무 어렵다
어디에 뭐가 들어가는지 이게 너무 헷갈림...
아 빡친다
일단 이거 다 이해할라고 하면 시간 너무 오래걸릴 것 같아서
일단 넘어가자</p>
<h1 id="프로토콜-4">프로토콜 (4)</h1>
<p>Protocol - 지켜야 할 약속이라고 보면 됨
꼭 구현되어야 할 것들
어떤 서비스를 이용할 때 꼭 해야 할 일의 목록
ex. 음악 서비스라면 가입, 결제 등이 있겠다</p>
<h1 id="프로퍼티-properties5--7">프로퍼티 Properties(5 ~ 7)</h1>
<p><img src="https://images.velog.io/images/d_day100/post/92444d4c-347f-4d50-9def-e081fb722e4e/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/51ce2926-7806-4cfd-96a9-0ef1e991c40c/image.png" alt="">
stucture에서도 데이터, 메소드 두 가지 부분으로 나뉨
data 부분을 Properties라고 말함</p>
<p><img src="https://images.velog.io/images/d_day100/post/4fd55be0-7ef4-40d0-9baf-87151c944069/image.png" alt="">
값을 직접 저장한 게 Stored Property
<img src="https://images.velog.io/images/d_day100/post/4305fb5d-7e8d-4d87-8539-fae6eb5003ff/image.png" alt="">
데이터를 가져와서 활용하는 게 Computed Property
접근할 때마다 다시 계산함</p>
<ul>
<li>오브젝트는 데이터와 매소드로 구성되어 있다 </li>
<li>데이터에 해당하는 부분이 프로퍼티다</li>
<li>크게 stored(값 저장), computed(값 활용)로 나뉜다 </li>
<li>computed property는 값 변경이 안 되고, 리드만 가능하다 (var 키워드로 선언 가능하다)</li>
<li>그러나 get set을 통해 값 변경 가능하도록 설정하여 값을 변경할 수 있다</li>
<li>인스턴스를 만드는 것과 별개로 타입 자체에 속한 프로퍼티를 쓸 때는 static을 활용하여 타입 프로퍼티를 만들 수 있다 </li>
</ul>
<h2 id="properties-vs-method">Properties VS Method</h2>
<p><img src="https://images.velog.io/images/d_day100/post/4c0e2e11-5857-4652-8f15-324230b2e8f8/image.png" alt=""></p>
<p>computed properties와 method로 쓰는 것 중 무엇이 더 좋을지 고민했던 강사님
기본적으로 
Properties는 호출시 (저장된) 값을 하나 반환한다 
Method는 호출시 어떤 작업을 한다 
<img src="https://images.velog.io/images/d_day100/post/7264b954-97a4-4a85-80ad-2d085a93b047/image.png" alt="">
이런 기준을 사용한다고 함</p>
<h1 id="메소드-8--10">메소드 (8 ~ 10)</h1>
<p><img src="https://images.velog.io/images/d_day100/post/139f8abb-6f9e-4ca2-ba6b-95d72865f1f7/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/4b3eb90f-71be-472e-b974-9e577a9d2974/image.png" alt=""></p>
<ul>
<li>mutating = 매소드가 스토어드 프로퍼티를 바꿀 경우에는 mutating을 넣는다</li>
<li>타입프로퍼티 = 타입프로퍼티를 쓰면 인스턴스로 안 빼고 오브젝트에서 바로 프로퍼티 사용 가능(함수로도 만들 수 있음)
ex. Lecture.target 
ex. Lecture.소속학원이름()</li>
</ul>
<h2 id="extension">extension</h2>
<p><img src="https://images.velog.io/images/d_day100/post/a584b6f2-4c5d-405b-94ec-90b2d1dd8cc4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 6장 - 4_Collection - Closure
]]></title>
            <link>https://velog.io/@d_day100/FC-6%EC%9E%A5-4Collection-Closure</link>
            <guid>https://velog.io/@d_day100/FC-6%EC%9E%A5-4Collection-Closure</guid>
            <pubDate>Sun, 12 Sep 2021 06:53:56 GMT</pubDate>
            <description><![CDATA[<p>이름이 없는 매서드(함수)라고 생각하면 됨
<img src="https://images.velog.io/images/d_day100/post/81d58905-fd8f-4bcc-975f-f0ae3e131960/image.png" alt=""></p>
<ul>
<li>in 키워드 앞에는 타입이 파라미터와 리턴, 뒤에는 statements가 온다</li>
<li>출력 타입을 Void or ()으로 하면 return하지 않아도 괜찮지만, Int 혹은 String 같은 타입을 설정했을 경우에는 return해줘야 에러가 안 뜬다</li>
</ul>
<h3 id="이럴-때-주로-씀">이럴 때 주로 씀</h3>
<ul>
<li><p>Completion Block (뭔가 일이 끝나고 돌아갈 코드 블럭을 만들 때)
: 네트워크를 통해 데이터를 받아올 때 데이터를 빨리 혹은 늦게 받아오게 된다
비동기적으로 언제 끝날지 모르는 일일 경우. 해당 일이 끝났을 때 행동하도록
데이터를 뿌려주거나 하는 등의 코드블럭 자체를 수행시킬 때 closure를 사용한다</p>
</li>
<li><p>Higher Order Functions (함수인데 인자를 함수로 받을 수 있는 함수를 만들 때) 
: input으로 함수를 받을 수 있는 유형의 함수. 한국말로 고계함수</p>
</li>
<li><p>map, filler 이런 게 고계함수 - 이런 것을 쓸 때 closure을 사용한다</p>
</li>
</ul>
<h2 id="closure-기본-형태">Closure 기본 형태</h2>
<p><img src="https://images.velog.io/images/d_day100/post/9cd99a39-faa1-44de-bdf6-3982dfdc0b7f/image.png" alt=""></p>
<h2 id="closure-실습-6개">Closure 실습 6개</h2>
<p><img src="https://images.velog.io/images/d_day100/post/001a4c1a-4219-4d67-b779-f8e842e48932/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/2f73ac1a-d0df-4f56-bd65-66b1d181ba6c/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/623f0de1-5ee7-45d3-ba96-61a3a72236cb/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/8f8a011f-30f2-41a8-863e-3e673f64e157/image.png" alt=""></p>
<h1 id="caputuring-values">Caputuring Values</h1>
<p><img src="https://images.velog.io/images/d_day100/post/515e4681-ed78-4bec-8b93-84652d183653/image.png" alt=""></p>
<p>바깥 scope에서는 안쪽 scope에서 선언한 변수 사용 불가능
안쪽 scope에서는 바깥 scope에서 선언한 변수 사용 가능</p>
<p><img src="https://images.velog.io/images/d_day100/post/86cbe0c2-50d6-462c-8333-e8b422d939b2/image.png" alt="">
printClosure는 if문을 벗어나도 사용 가능 - name 컨스턴트도 사용 가능
closure에게 잡혀서 사용 가능
이것을 captured 됐다고 함</p>
<h4 id="closure가-살아있는한-잡힌-변수는-scope를-벗어나도-사용-가능">closure가 살아있는한 잡힌 변수는 scope를 벗어나도 사용 가능</h4>
<p><img src="https://images.velog.io/images/d_day100/post/607f042e-08b3-4cf7-aceb-d1a18a5d26b2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 6장 - 3_Collection - Set
]]></title>
            <link>https://velog.io/@d_day100/FC-6%EC%9E%A5-3Collection-Set</link>
            <guid>https://velog.io/@d_day100/FC-6%EC%9E%A5-3Collection-Set</guid>
            <pubDate>Sat, 11 Sep 2021 13:42:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/88021e8f-e673-49f4-bc6e-8bdaacfdaeba/image.png" alt=""></p>
<p>Set은 순서가 없고, 유니크한 값을 가지는 타입 
(같은 이름의 아이템이 있으면 하나로 취급함. 중복이 없는 유니크한 아이템을 관리할 때 사용할 수 있다)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 6장 - 2_Collection - Dictionary
]]></title>
            <link>https://velog.io/@d_day100/FC-6%EC%9E%A5-2Collection-Dictionary</link>
            <guid>https://velog.io/@d_day100/FC-6%EC%9E%A5-2Collection-Dictionary</guid>
            <pubDate>Sat, 11 Sep 2021 13:37:57 GMT</pubDate>
            <description><![CDATA[<h1 id="6-5-dintionary-개념">6-5 Dintionary 개념</h1>
<p><img src="https://images.velog.io/images/d_day100/post/eab32cee-c69f-49a2-8b50-bcfa3e408117/image.png" alt=""></p>
<ul>
<li>순서가 없다 (Array와 차이점)</li>
<li>key는 유니크해야 함</li>
</ul>
<p><img src="https://images.velog.io/images/d_day100/post/f7b563a5-8af9-4aa6-ada1-a6871b810b79/image.png" alt="">
기본적인 설명
가볍게 보면 됨</p>
<p><img src="https://images.velog.io/images/d_day100/post/fccac21a-7827-4f75-8290-de53ceb1a9f4/image.png" alt=""></p>
<p>이것도 쉬운 내용</p>
<p><img src="https://images.velog.io/images/d_day100/post/456fae00-48bc-497c-98b6-0f809fd67c1b/image.png" alt="">
도전과제 풀이
3번이 조금 헷갈릴 수 있는데 찬찬히 해보면 됨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 6장 - 1_Collection - Array]]></title>
            <link>https://velog.io/@d_day100/FC-6%EC%9E%A5-1Collection-Array</link>
            <guid>https://velog.io/@d_day100/FC-6%EC%9E%A5-1Collection-Array</guid>
            <pubDate>Fri, 10 Sep 2021 08:36:44 GMT</pubDate>
            <description><![CDATA[<h1 id="6-1-개요">6-1 개요</h1>
<p>작업하면 변수가 너무 많아서 난장판이 되는데
<img src="https://images.velog.io/images/d_day100/post/60be2e3a-0a34-400a-98e4-5c77cd165d5b/image.png" alt="">이걸 쉽게 관리할 수 있도록 돕는 게 Collection
이렇게 쉽게 들 수 있도록
<img src="https://images.velog.io/images/d_day100/post/55bf34d5-5623-4392-970a-f0c1fe91b957/image.png" alt="">
이렇게 컵에 이름을 붙여서 쉽게 찾을 수 있도록 하는 방법도 있다</p>
<ul>
<li>Array</li>
<li>Dictionary</li>
<li>set
이렇게 3가지 개념을 다룬다 </li>
</ul>
<p>추가로 Closure(코드를 수행할 수 있는 코드블럭) 개념도 다시 다룬다</p>
<h1 id="6-2-array">6-2 Array</h1>
<h2 id="가장-중요한-것들-정리">가장 중요한 것들 정리</h2>
<ol>
<li>isEmpty - 비어있는지를 불리언 값으로</li>
<li>count - 값이 몇 개 존재하는지</li>
<li>evenNumber[4] - 몇 번째 아이템에 접근한다는 것</li>
<li>for in enumerated - 하나씩 가져오기, index와 value를 같이 가져오는 것</li>
</ol>
<p><img src="https://images.velog.io/images/d_day100/post/fff89bc7-ccbd-4235-b553-b8c7029b86f0/image.png" alt="">
통에 담을 수 있는 Element(요소)를 순서에 따라 담을 수 있게 한다
아래 2가지를 주의해야 한다</p>
<ol>
<li>통에 담을 때 같은 타입을 담아야 한다 (다를 수 있긴한데 일단 나중에)</li>
<li>Element는 순서가 있다 Index가 있다고 표현한다 (1번째 Element는 Index 0임)</li>
</ol>
<p>이럴 때 유용하다</p>
<ul>
<li>순서가 있는 아이템</li>
<li>아이템의 순서를 알면 유용할 때</li>
</ul>
<h1 id="6-3">6-3</h1>
<p><img src="https://images.velog.io/images/d_day100/post/b078a55a-b7de-4e12-bafb-7da568e5293c/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/ff92063f-dbb4-4d89-9929-3df7bd202165/image.png" alt=""></p>
<h1 id="6-4">6-4</h1>
<p><img src="https://images.velog.io/images/d_day100/post/cb270b64-3afa-41ed-86e4-53ce15f9994c/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/d_day100/post/f16b9e7e-6de2-44ba-a7c2-3585cc01af04/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 5장_Function and Optional
]]></title>
            <link>https://velog.io/@d_day100/FC-5%EC%9E%A5Function-and-Optional</link>
            <guid>https://velog.io/@d_day100/FC-5%EC%9E%A5Function-and-Optional</guid>
            <pubDate>Thu, 09 Sep 2021 08:00:57 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/9007e4e8-e527-4575-9a6b-ea1b6c36a930/image.png" alt=""></p>
<p>디폴트를 설정할 수 있다는 것
그렇다면 호출할 때 생략 가능!</p>
<p><img src="https://images.velog.io/images/d_day100/post/d6acd8df-ada7-4e0c-9bc6-23115b44b59e/image.png" alt=""></p>
<p>-&gt;를 통해 출력값의 타입을 설정 가능하고
return을 통해 출력이 가능하다</p>
<p>또한 param 앞에 글자를 쓰면 externalName이라고 해서 호출할 때 externalName으로 param 호출 가능</p>
<h2 id="_-underscore">_ UnderScore</h2>
<p>_를 사용하면 호출 시 label을 생략하고 값만 대입하여 호출할 수 있다 
파라미터 이름 생략 가능</p>
<p><img src="https://images.velog.io/images/d_day100/post/dbdf37c6-a9c6-44bf-9dd9-74113ebe8177/image.png" alt=""></p>
<p>이렇게 같은 함수 이름을 갖고 파라미터 이름, 타입을 변화할 수 있다
이걸 오버로드, 오버로딩이라고 한다
단, 함수 안의 코드 부분을 변경하면 잘못된 재선언이라고 뜬다
위에 언급한 것만 변화할 수 있는 것 같다</p>
<h2 id="inout-파라미터-값-변경">inout (파라미터 값 변경)</h2>
<p><img src="https://images.velog.io/images/d_day100/post/3a4657a8-5bb7-4513-99ba-02c438fb73be/image.png" alt="">
기본적으로 파라미터인 value는 constant임 고로 값 변경하려고 하면 에러가 뜸
이걸 inout을 통해 해결할 수 있음</p>
<p><img src="https://images.velog.io/images/d_day100/post/14288374-3fdf-4f30-b252-f334a8aa37cc/image.png" alt="">
위에 var로 value를 선언했고, 파라미터 앞에 언더스코어가 들어갔고, 함수호출시 &amp;가 들어갔다
굉장히 귀찮다
쓸 일이 있는지 모르겠다
일단 이런 게 있다~ 정도만 알아두자</p>
<h1 id="5-7">5-7</h1>
<h2 id="함수에-함수-넣기">함수에 함수 넣기</h2>
<p><img src="https://images.velog.io/images/d_day100/post/66afab8c-c4d6-4abf-bc23-b4cc520c108d/image.png" alt=""></p>
<p>var function = add 를 통해 함수에 함수를 넣어줄 수 있다</p>
<p><img src="https://images.velog.io/images/d_day100/post/a21d5f25-72d1-4e71-a92b-4281904b844d/image.png" alt=""></p>
<p>매개변수에 함수를 넣는 것도 가능하다
함수를 쪼갤 때 유용할 것 같다</p>
<h1 id="5-10">5-10</h1>
<h2 id="옵셔널바인딩-1---if-let">옵셔널바인딩 1. - if let</h2>
<p><img src="https://images.velog.io/images/d_day100/post/ee48b3b5-1b64-46da-a629-7dff1e4cb976/image.png" alt="">
if let을 통해 nil일 경우와 아닐 경우 처리가 가능하다</p>
<p><img src="https://images.velog.io/images/d_day100/post/75d6fe53-1532-4aaa-9262-952d098ffa6f/image.png" alt="">
그런데 이렇게 시스템에서 추천해주더라
아싸리 새로운 변수에 할당해서 체크하는 방식 말고
!= nil을 통해 체크하는 방법도 꽤 괜찮게 보인다
근데 선언한 상수를 써먹지 않을 경우에만 이렇게 쓰고
nil이 아닐 경우의 값을 빼와서 써야 할 경우는 당연히 if let을 쓰는 게 낫다</p>
<h2 id="옵셔널바인딩-2-guard-let">옵셔널바인딩 2. guard let</h2>
<p><img src="https://images.velog.io/images/d_day100/post/7ce5e78d-07f9-4a2c-85dc-f08e5062c623/image.png" alt="">
if let이랑 똑같은데 guard가 더 깔끔한? 코드를 짤 수 있다카더라?
솔직히 뭔차이가 있는진 모르겠지만 guard를 사람들이 많이 쓰는 것 같아서 이걸로 연습해야겠다</p>
<ul>
<li>guard는 함수 안에서 실행할 수 있다</li>
<li>return을 써야 한다</li>
</ul>
<p>이런 특징을 갖고 있다
위의 코드에서는 from을 String 타입으로 선언했고,
pasedInt에서 from을 Int로 타입캐스팅 해주었다
즉 from에는 &quot;10&quot;이 들어가면 Int로 변환이 가능하지만
from에 &quot;하이&quot;처럼 문자가 들어가면 변환이 안 되기 때문에 else로 빠진다</p>
<h2 id="닐-코얼레이싱">닐 코얼레이싱</h2>
<p><img src="https://images.velog.io/images/d_day100/post/9640c61f-0f39-4701-be02-23d0c03efa0f/image.png" alt=""></p>
<p>String에 옵셔널 값을 할당하려고 하면 에러가 뜬다 
그런데 ??를 통해 nil일 경우에 할당할 기본값을 설정하여 할당할 수 있다
우측에 보이는 것처럼 모델 5가 할당된 것을 확인 가능</p>
<p><img src="https://images.velog.io/images/d_day100/post/7caa86c8-8596-4ef5-9a33-03cd5782be43/image.png" alt="">
이렇게 carName의 값이 존재할 경우에는 ?? 뒤에 할당한 기본값이 아닌 원래 있던 값이 할당된 것을 확인 가능</p>
<h1 id="5-12-옵셔널-도전과제">5-12 옵셔널 도전과제</h1>
<p><img src="https://images.velog.io/images/d_day100/post/d71f0d15-87d3-42b9-baf6-77955eb95c27/image.png" alt="">
도전과제는 이러하다
님들도 해보시길 추천드림</p>
<h2 id="1-2번">1, 2번</h2>
<p><img src="https://images.velog.io/images/d_day100/post/861c6716-0f3c-4fed-bd12-e3250799dbfb/image.png" alt="">
위에서 String?으로 옵셔널 선언해주면 됨
if let으로 해도 되지만 나는 guard 연습 중이라 이렇게 했음</p>
<h2 id="3번">3번</h2>
<p><img src="https://images.velog.io/images/d_day100/post/e0a2dadd-4ce2-4149-83f8-b30d1b480d5f/image.png" alt="">
이건 입력 파라미터에 String?을 만들어준 게 2번과 다른 점임
이게 좋은 게 따로 뭔가 안 만들고 한 방에 처리할 수 있어서 편하네</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 4장_Flow Control
]]></title>
            <link>https://velog.io/@d_day100/FC-4%EC%9E%A5Flow-Control</link>
            <guid>https://velog.io/@d_day100/FC-4%EC%9E%A5Flow-Control</guid>
            <pubDate>Wed, 08 Sep 2021 12:16:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/8b6a3b74-8fb4-4d93-8a86-aae580a759a0/image.png" alt=""></p>
<h2 id="refeat">refeat</h2>
<pre><code>repeat {
    반복할 코드
} while 조건</code></pre><pre><code>repeat {
    print(&quot;hi&quot;)
    i += 1
} while i &lt; 10</code></pre><p>최초 1번은 반복할 코드가 실행된다는 게 특징</p>
<h2 id="for---in---where">for - in - where</h2>
<p><img src="https://images.velog.io/images/d_day100/post/9b8aefeb-a2c2-418e-be00-4b76716d9892/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/c9076cd2-41f8-47c8-9d83-914379afdcfc/image.png" alt=""></p>
<p>위와 아래는 같은 결과를 도출함
where을 통해 조건 처리가 가능함
장점이라면 코드 줄 수가 줄어든다는 것</p>
<h2 id="continue">continue</h2>
<p><img src="https://images.velog.io/images/d_day100/post/609a499e-d7cd-49cc-847b-05f5a61cd350/image.png" alt=""></p>
<p>i == 3이라는 조건일 경우에는 코드를 넘긴다는 의미 
고로 print가 실행되지 않음
출력값은 3빼고 1 ~ 10까지 출력이 됨</p>
<h2 id="for-안에-for">for 안에 for</h2>
<p><img src="https://images.velog.io/images/d_day100/post/2e539b13-2b69-4db3-a7aa-bc05eb9656d3/image.png" alt="">
<img src="https://images.velog.io/images/d_day100/post/dc54a9ff-5063-4c9d-bf9b-f183fba9d923/image.png" alt="">
이렇게 활용 가능함</p>
<p>그러나 성능이 안 좋고, 가독성도 떨어져 비추천</p>
<h1 id="switch-심화">switch 심화</h1>
<p><img src="https://images.velog.io/images/d_day100/post/b594c644-c7e6-4f6e-82f7-c3d76168a92d/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/d_day100/post/46aa7d28-1b33-4a3f-948d-ca93c111cbd0/image.png" alt=""></p>
<ul>
<li>where을 통해 조건 설정 가능</li>
<li>let을 통해 값을 유추할 수 있음</li>
<li>_(언더스코어)를 통해 빈값으로 넣는 것도 가능</li>
<li>case에 1...10 이런 범위 사용 가능</li>
<li>case 조건이 문자일 경우 &quot;pet&quot;, &quot;cat&quot; 이렇게 이어서 사용 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[팟짱님의 특별과외 1차]]></title>
            <link>https://velog.io/@d_day100/%ED%8C%9F%EC%A7%B1-%ED%8A%B9%EB%B3%84%EA%B3%BC%EC%99%B8-1%EC%B0%A8</link>
            <guid>https://velog.io/@d_day100/%ED%8C%9F%EC%A7%B1-%ED%8A%B9%EB%B3%84%EA%B3%BC%EC%99%B8-1%EC%B0%A8</guid>
            <pubDate>Tue, 07 Sep 2021 13:38:10 GMT</pubDate>
            <description><![CDATA[<h2 id="chapter-1-iterm-설치">Chapter 1. iTerm 설치</h2>
<h4 id="설치-방법">설치 방법</h4>
<p><a href="https://medium.com/harrythegreat/oh-my-zsh-iterm2%EB%A1%9C-%ED%84%B0%EB%AF%B8%EB%84%90%EC%9D%84-%EB%8D%94-%EA%B0%95%EB%A0%A5%ED%95%98%EA%B2%8C-a105f2c01bec">https://medium.com/harrythegreat/oh-my-zsh-iterm2로-터미널을-더-강력하게-a105f2c01bec</a></p>
<h4 id="터미널-명령어">터미널 명령어</h4>
<p><a href="https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=thdbsgh3443&amp;logNo=221286374424">https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=thdbsgh3443&amp;logNo=221286374424</a></p>
<h4 id="터미널-git-명령어">터미널 git 명령어</h4>
<p><a href="https://gorokke.tistory.com/22">https://gorokke.tistory.com/22</a></p>
<p>명령어는 구글링만 하면 다 나오니까 문제없음</p>
<p>앞으로 잔디쌓을 때 터미널 활용을 연습해야겠다.</p>
<h2 id="chapter-2-깃-협업-방식-전체-흐름">Chapter 2. 깃 협업 방식 전체 흐름</h2>
<ul>
<li><p>main ppt로 </p>
</li>
<li><p>키워드 : main branch, subBranch, </p>
</li>
<li><p>파일에는 숨겨진 파일이 존재함 .으로 된 것이 그러함 - 안 보이는 파일 찾으려면 이렇게</p>
</li>
<li><p>파일에 진입하려면 cd를 통해 진입</p>
</li>
<li><p>branch 파는 방법</p>
</li>
<li><p>전체 맥락</p>
</li>
<li><p>commit</p>
</li>
<li><p>push</p>
</li>
<li><p>pull request</p>
</li>
<li><p>mergy : 혼자서 작업을 한다면 풀리퀘하고 바로 머지가 되는 것인데. 협업을 할 때는 전체에 합치기 전(머지) 검수를 하기 때문에 작업이 풀리퀘, 머지로 나눠짐</p>
</li>
</ul>
<h4 id="큰-맥락">큰 맥락</h4>
<p>협업을 할 때는 각자 할 일을 나눠서 작업하고 전체에 합쳐주는 방식으로 진행한다
자동차라고 치면 엔진, 문, 핸들 이렇게 부분을 나눠 작업하고 하나로 합친다고 이해하면 된다</p>
<p>근데 내가 제작한 문이 제대로 작동하는지, 규격이 적절한지 체크하지 않고 무작정 자동차 프레임에 합치면 문제가 발생할 수 있다
그래서 완전히 합치기 전 Pull Request를 통해 팀원들에게 내가 이렇게 만들었다는 것을 보여준다
팀원들도 이를 보고 적절하다고 판단하면 수락하게 되고 병합된 것을 Merge 되었다고 표현한다</p>
<h4 id="세부-사항">세부 사항</h4>
<p>팀 전체가 최종적으로 합치게 될 것을 main branch라고 한다
그리고 각각의 개발자들은 main 브렌치를 복제한 개인의 branch를 따로 파서 작업한다</p>
<h5 id="add">add</h5>
<p>add 명령어는 commit으로 기록하기 전에 변경된 것들을 &quot;Staging Area에 모아놓는 역할&quot;을 한다
그렇기에 commit을 하기 전까지는 사실 Git directory에 아무런 영향을 미치지 않는다</p>
<h5 id="commit">commit</h5>
<p>add를 통해 Staging Area에 올린 것을 commit으로 &#39;저장&#39;하게 된다
나는 이걸 게임의 세이브포인트로 이해했다</p>
<h5 id="push">push</h5>
<p>commit으로 기록한 것을 push 때리면 github에 짜란하고 올라간다</p>
<p>내가 봐도 설명이 부족하고, 실제 적용을 하지 않아 아직 이해도가 적으니 구글링해보시길...</p>
<h2 id="chapter-3-tableview-xib">Chapter 3. TableView xib</h2>
<p><img src="https://images.velog.io/images/d_day100/post/b70c54bd-e787-4235-b318-ab5f66f63e06/image.png" alt="">
TableViewCell 파일을 만들면서 중단에 XIB fire 이 부분을 체크하면 파일이 생성된다</p>
<h2 id="chapter-4-tableview-작업">Chapter 4. TableView 작업</h2>
<ul>
<li>기존 방식과 다른 부분 (extention, xib ...)</li>
</ul>
<ul>
<li>class (공장)</li>
<li>extention  공장 몇 개 더 찍어낼 수 있도록? 어쨌든 클래스의 확장 느낌? 느낌적인 느낌?</li>
<li>imageView의 경우에는 x축, y축에 크기까지 설정해야 빨간색이 안 뜸(auto layout에 빨간색 나오는 건 문제가 있다는 의미)</li>
<li>cell 높이 설정 - heightForRowAt</li>
</ul>
<h3 id="1-내가-만든-cell로-지정해주기">1) 내가 만든 cell로 지정해주기</h3>
<p><img src="https://images.velog.io/images/d_day100/post/96c5d666-df97-494f-8b71-3788bcdf7847/image.png" alt=""></p>
<p>우리가 만든 xib 파일을 뷰컨에 지정해주는 작업</p>
<p><img src="https://images.velog.io/images/d_day100/post/136a89bc-131a-4fbd-914d-b7ae9a6550d1/image.png" alt="">그리고 이렇게 아래에서 만든 delegate, dataSource를 불러오고</p>
<p><img src="https://images.velog.io/images/d_day100/post/9ae611a1-d1b0-4bd1-8497-24e2f06554c8/image.png" alt="">이걸 ViewDidLoad에 넣어주면 된다</p>
<h3 id="2-datasource로-cell의-데이터-지정하기">2) DataSource로 cell의 데이터 지정하기</h3>
<h4 id="2-1-cell-개수">2-1) cell 개수</h4>
<pre><code>func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
        return nameList.count
    }</code></pre><p>nameList.count 만큼 cell을 가져온다는 뜻
숫자를 넣어줘도 됨
API를 사용한다면 API로 불어들인 데이터 리스트의 count를 해주면 되겠다</p>
<h4 id="2-2-cell-요소에-들어갈-데이터">2-2) cell 요소에 들어갈 데이터</h4>
<pre><code>func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
        //as?로 타입캐스팅?을 처리해야 클래스에 우리가 추가한 내용까지 활용 가능함
        guard let cell = tableView.dequeueReusableCell(withIdentifier: &quot;PogTestTVC&quot;) as? PogTestTVC else {
            return UITableViewCell()
        }
        // 언제 . () [] 이걸 사용하는지 이해하지 못함
        cell.nameLabel.text = nameList[indexPath.row]
        cell.imageView?.image = UIImage(named: nameList[indexPath.row])
        return cell
    }</code></pre><h3 id="3-delegate로-액션-높이-설정">3) Delegate로 액션, 높이 설정</h3>
<h4 id="3-1-셀-높이">3-1) 셀 높이</h4>
<pre><code>func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -&gt; CGFloat {
        return 200
    }</code></pre><h4 id="3-2-셀-눌렀을-때-액션">3-2) 셀 눌렀을 때 액션</h4>
<p>내 경우 액션을 추가하지 않았음</p>
<pre><code>func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        &lt;#code#&gt;
    }
</code></pre><h2 id="chapter-5-tableviewcell-작업">Chapter 5. TableViewCell 작업</h2>
<pre><code>import UIKit

class POGTableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
</code></pre><p>VC 파일을 xib 파일과 만들면 위와 같은 코드가 제공된다
여기서는 아래처럼 요소만 아울렛으로 연결해주면 된다
나머지는 VC 파일에서 진행한다</p>
<pre><code>import UIKit

class PogTestTVC: UITableViewCell {

    //static let identifier = &quot;PogTestTVC&quot;

    @IBOutlet weak var profileImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}</code></pre><h2 id="앞으로-할-것">앞으로 할 것</h2>
<ul>
<li>class</li>
<li>전체 개념 이해</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 3장_스위프트 기초
]]></title>
            <link>https://velog.io/@d_day100/FC-3%EC%9E%A5%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@d_day100/FC-3%EC%9E%A5%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Mon, 06 Sep 2021 03:28:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/1034b9a6-9ed7-47ae-a2ee-85c527ecf510/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 2장_MyAlbum]]></title>
            <link>https://velog.io/@d_day100/FC-2-13</link>
            <guid>https://velog.io/@d_day100/FC-2-13</guid>
            <pubDate>Sun, 05 Sep 2021 01:06:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/6c53ae92-2d22-4f3d-8d5b-dadc43b7c125/image.png" alt=""><img src="https://images.velog.io/images/d_day100/post/79e902bf-8531-40ef-b5f7-d13876a48c1e/image.png" alt="">
얼럿의 3단계 addAction(Action)까지하면 4단계
그리고 기본 개념을 다뤘음</p>
<ul>
<li>랜덤 숫자는 arc4random_uiniform(최대 수) </li>
<li>오브젝트는 데이터와 매소드로 구성되었다는 것 </li>
<li>변수는 local로 선언할지, instance로 선언할지 중요</li>
</ul>
<p>요정도</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스파르톤 달린다!]]></title>
            <link>https://velog.io/@d_day100/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%86%A4-%EB%8B%AC%EB%A6%B0%EB%8B%A4</link>
            <guid>https://velog.io/@d_day100/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%86%A4-%EB%8B%AC%EB%A6%B0%EB%8B%A4</guid>
            <pubDate>Sat, 04 Sep 2021 11:20:45 GMT</pubDate>
            <description><![CDATA[<p>2020
지금 스파르톤 게더에 접속 완료</p>
<p>2200
&quot;멈춰!&quot; 외쳤다가 멈춰가 팀 이름이 되어버렸다
아쉽게도 급한 이슈가 생겨서 게임은 참여하지 못했다 
빡쌔게 달려보자 :)</p>
<p>2300 
핫식스 하나 야무지게 비웠다
지금 riot API 사용을 공부하고 있다
API Key도 다시 신청해야 하고...
API 어렵다...</p>
<p>2400 
API 조사하고 있음
다른 사람들은 어떻게 적용했나 찾음</p>
<p>0100 
저녁 8시부터 빡쌔게 달렸던 나에게 주는
달달한 휴식...!</p>
<p>0200
API 실제 적용을 해야 감이 잡힐 것 같아서 검색 API를 우선 구현하고 있음</p>
<p>0300
<img src="https://images.velog.io/images/d_day100/post/187907e9-65ec-4d43-b59a-af2ab332643b/image.png" alt=""> 게더에서 한바퀴 돌았는데
와 다같이 G누르고 도니까 게더가 멈춰버린다
매니저님에게 전화도 왔는데 아이디어 얘기하며 장난쳤는데 잼썼당 
일단 리액션이 너무 혜자신 것 같음 ㅇㅇ;</p>
<p>0400
배고파서 샌드위치를 먹었는데 매니저님과 팀 사람들에게 걸렸다
베이컨 샌드위치가 맛있다고 강력 추천드렸다 ㅋㅋㅋㅋㅋㅋㅋ</p>
<p>0500
매니저님과의 2차 통화!
매니저님도 졸리신 것 같음...
나도 조금 쉬고 있었는데 다시 의욕이 생긴다</p>
<p>0600
<img src="https://images.velog.io/images/d_day100/post/581f44e7-7eec-43bb-b6b2-e7507c24c230/image.png" alt="">
하늘이 파스텔톤이 됐다
마지막에는 집중력이 흐려져서 다른 작업을 마무리했다
역시 다같이 하니까 더 의욕이 생겼던 것 같다
다들 너무 고생 많으셨습니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 9-6 커스텀 테이블뷰 셀 만들기]]></title>
            <link>https://velog.io/@d_day100/FC-9-5-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%B7%B0-%EC%85%80-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@d_day100/FC-9-5-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%B7%B0-%EC%85%80-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 02 Sep 2021 06:39:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/7f20d608-4357-4a78-93ca-e6f166066ce8/image.png" alt=""></p>
<p>꺼이꺼이꺼이꺼이 이게 되네 ㅋㅋ</p>
<pre><code>
import UIKit

class BountyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    let nameList = [&quot;luffy&quot;,&quot;zoro&quot;,&quot;sanji&quot;,&quot;nami&quot;,&quot;robin&quot;,&quot;chopper&quot;,&quot;franky&quot;,&quot;brook&quot;]
    let bountyList = [300000000, 120000000, 77000000, 16000000, 80000000, 50, 44000000, 33000000]

    override func viewDidLoad() {
        super.viewDidLoad()

    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
        return bountyList.count
    }

    // 여기가 이 셀을 반복한다 이런 곳이니까 이곳에다가 데이터를 넣는다...? 일단 dataSource니까 이쪽이 맞는 것 같긴함
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
        // &quot;cell&quot;부분에는 tableViewCell의 식별자를 똑같이 cell로 맞춰야 함
        guard let cell = tableView.dequeueReusableCell(withIdentifier: &quot;cell&quot;, for: indexPath) as? ListCell else {
            return UITableViewCell()
        }

    let img = UIImage(named: &quot;\(nameList[indexPath.row]).jpg&quot;)
    cell.imgView.image = img
    cell.nameLabel.text = nameList[indexPath.row]
    cell.bountyLabel.text = &quot;\(bountyList[indexPath.row])&quot;
    return cell
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(&quot;--&gt;\(indexPath.row)&quot;)
        performSegue(withIdentifier: &quot;showDetail&quot;, sender: nil)
        //모달코드
//        guard let modalVC = self.storyboard?.instantiateViewController(identifier: &quot;ModalViewController&quot;) as? ModalViewController else {return}
//        self.present(modalVC, animated: true, completion: nil)

    }
}


class ListCell: UITableViewCell {
    @IBOutlet weak var imgView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var bountyLabel: UILabel!
}
</code></pre><p>이게 전체 코드인데
크게 2가지 부분이 추가됐다</p>
<ol>
<li>imageView, label에 데이터를 넣는 작업 </li>
<li></li>
</ol>
<p>class ListCell로 선언한 부분은 class개념을 잘 몰라서;
guard let else는 걍 if랑 비슷함</p>
<pre><code>let img = UIImage(named: &quot;\(nameList[indexPath.row]).jpg&quot;)
cell.imgView.image = img
cell.nameLabel.text = nameList[indexPath.row]
cell.bountyLabel.text = &quot;\(bountyList[indexPath.row])&quot;
return cell</code></pre><p>  여기 코드가 중요한데
  이걸 통해 데이터를 image와 label에 넣어줄 수 있음</p>
<pre><code>    return bountyList.count</code></pre><p>또한 이걸 통해 같고 있는 리스트의 index 수만큼 셀을 생성 가능</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 9-4 테이블뷰 프로토콜 실습]]></title>
            <link>https://velog.io/@d_day100/FC-9-4-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%B7%B0-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@d_day100/FC-9-4-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%B7%B0-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Thu, 02 Sep 2021 02:27:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/d_day100/post/99659290-b82f-40ba-92af-4d5606712421/image.png" alt="">테이블뷰에서는
UITableViewDataSource UITableViewDelegate
이렇게 두 가지를 통해 tableView를 그린다 (이 두 개는 필수)</p>
<p><img src="https://images.velog.io/images/d_day100/post/b94a75de-86ce-409a-b434-0e7b751f5e19/image.png" alt="">
일단 이렇게 UITableViewDataSource, UITableViewDelegate를 추가하면 빨갛게 표시되면서 fix를 누르면 코드를 준다</p>
<p><img src="https://images.velog.io/images/d_day100/post/0d7170b7-9697-402b-a178-441fc78785d3/image.png" alt="">
그게 바로 이렇게 2가지인데
내용을 채워주면 된다
첫 번째 func의 경우에는 이 셀이 몇 개 나올 것인지 설정할 수 있는데
5 이렇게 숫자를 넣어줄 수 있지만
나중에는 가져올 API나 JSON 데이터의 index 넘버를 가져올 수 있을 것 같다</p>
<p>두 번째 함수는 제대로 이해하지 못했는데
cell는 재활용하는데 그걸 dequeueReusableCell을 통해 cell을 indexPath의 위치에서 계속 재활용한다? 뭐 이런 의미인듯?
쨌든 필수로 들어가야할 코드니까 일단 외운다</p>
<p><img src="https://images.velog.io/images/d_day100/post/b1853e19-6243-4b65-8ce2-5c52d97bc2de/image.png" alt="">
또 중요한 게 있는데
우리가 tableViewController에 적은 코드를 연결할 필요가 있음
위에 보이는 것처럼 dataSource, delegate를 뷰컨에 연결해야 인식함
<img src="https://images.velog.io/images/d_day100/post/d0473d04-cdc2-44e3-b431-e5926503b7c0/image.png" alt="">
마지막으로 cell의 Identifier를 위의 코드와 같게 cell로 맞춰야 함</p>
<p><img src="https://images.velog.io/images/d_day100/post/9feb12e0-7230-48ef-9f50-4bb08017ceb9/image.png" alt="">
이건 Delegate 부분인데
셀을 눌렀을 때 어떻게 반응할 것인지를 설정한다
여기서는 print를 통해 누른 셀의 row를 출력하도록 했다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FC 2-5 Alert]]></title>
            <link>https://velog.io/@d_day100/FC-2-5-Alert</link>
            <guid>https://velog.io/@d_day100/FC-2-5-Alert</guid>
            <pubDate>Wed, 01 Sep 2021 08:06:26 GMT</pubDate>
            <description><![CDATA[<p> 얼럿의 구성요소는 3개
         1. 상단 내용을 차지하는 UIAlertController
         2, 하단 버튼 부분의 UIAlertAction
         이 두 개를 UIAlertController.adAlert(UIAlertAction) 이렇게 활용 가능함
         3. 마지막으로 present를 통해 alert을 띄우게 됨
         정리하면 내용, 버튼, 어떻게 띄울 것인가</p>
<p><img src="https://images.velog.io/images/d_day100/post/fc7109ef-aa96-4cb7-b6ba-b6274a1211ba/image.png" alt="">UIAlertController으로 얼럿의  만든다 이를 통해 title, message를 설정할 수 있다 </p>
<pre><code>let alert = UIAlertController(
title: &quot;반갑다&quot;, 
message: &quot;이제 씻을란다&quot;, 
preferredStyle: .alert)</code></pre><p><img src="https://images.velog.io/images/d_day100/post/fc1db813-53df-493d-8109-aa6f5de7946d/image.png" alt="">
UIAlertAction을 통해 얼럿의 버튼을 만든다</p>
<pre><code>let action = UIAlertAction(
            title: &quot;OK&quot;,
            style: .default,
            handler: nil)</code></pre><pre><code>
    @IBAction func hello(_ sender: Any) {
      let alert = UIAlertController(title: &quot;반갑다&quot;, message: &quot;이제 씻을란다&quot;, preferredStyle: .alert)
        let action = UIAlertAction(
            title: &quot;OK&quot;,
            style: .default,
            handler: nil)

        //
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }
</code></pre><pre><code>@IBAction func hello(_ sender: Any) {
  let alert = UIAlertController(title: &quot;반갑다&quot;, message: &quot;이제 씻을란다&quot;, preferredStyle: .alert)
    let action = UIAlertAction(
        title: &quot;OK&quot;,
        style: .default,
        handler: nil)

    alert.addAction(action)

    present(alert, animated: true, completion: nil)
}</code></pre><p>present를 안 쓰면 얼럿이 안 나옴
alert.addAction(action)이 있어야 액션이 붙음</p>
]]></description>
        </item>
    </channel>
</rss>