<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>feat: Pick up new skills</title>
        <link>https://velog.io/</link>
        <description>하고풍거(河鼓風去) 삭다하자(削多㰤慈)</description>
        <lastBuildDate>Sun, 04 Feb 2024 14:24:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>feat: Pick up new skills</title>
            <url>https://velog.velcdn.com/images/_jhkim/profile/0ece4f80-3ff6-4ca2-8752-92a7e77900f9/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. feat: Pick up new skills. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_jhkim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[UI/UX] 디자인할 때 참고하라고? ㄴ😮ㄱ]]></title>
            <link>https://velog.io/@_jhkim/UI-UX-Design</link>
            <guid>https://velog.io/@_jhkim/UI-UX-Design</guid>
            <pubDate>Sun, 04 Feb 2024 14:24:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>💡 이 글은 Toy Project 진행을 위해 UI/UX를 조사하며 알게된 유용한 사이트 및 플러그인들을 정리한 글입니다.
다양한 서비스들을 비교해보고 &quot;무료&quot;, &quot;정보의 다양성&quot;, &quot;이용의 편리성&quot;등을 위주로 정리하였습니다.</p>
<h6 id="포스팅-의도-br---hotfancygorgeous한-정보를-모든-사람과-공유-1-br---분명-나중에-아-뭐였드라할-나를-위한-메모-99">[포스팅 의도] <br> - Hot,Fancy,Gorgeous한 정보를 모든 사람과 공유: 1% <br> - 분명 나중에 &quot;아 뭐였드라..&quot;할 나를 위한 메모: 99%</h6>
</blockquote>
<pre><code>🔗 각 이미지를 클릭하면 해당 사이트로 이동합니다.</code></pre><br>

<h2 id="reference-참고">Reference 참고</h2>
<ul>
<li><h3 id="dribbble">Dribbble</h3>
디자인 소셜 네트워킹 및 포트폴리오 공유 사이트.
다양한 레퍼런스를 참고할 수 있고, 해외에서는 채용 플랫폼으로서의 역할도 한다.
<a href="https://dribbble.com"><img src="https://velog.velcdn.com/images/_jhkim/post/56b908e0-a37f-4ce5-a919-7992002ed4d1/image.png" alt="Dribbble"></a></li>
</ul>
<br>

<ul>
<li><h3 id="mobbin">Mobbin</h3>
상용 서비스들의 iOS/Android/Web 디자인들을 정리해놓은 사이트.
Screens, UI Elements, Flows로 정리하여 볼 수 있는 점이 가장 유용하다. (Flows는 유료 기능..🥲)
<a href="https://mobbin.com"><img src="https://velog.velcdn.com/images/_jhkim/post/f6e5f348-44b6-4e46-9a2c-81bd3da243c3/image.png" alt="Mobbin"></a></li>
</ul>
<br>

<ul>
<li><h3 id="figma-community">Figma Community</h3>
Figma의 커뮤니티 사이트.
바로 사용할 수 있는 애셋과 자료들이 많아서 Figma 사용자에겐 일석이조.
<a href="https://www.figma.com/community"><img src="https://velog.velcdn.com/images/_jhkim/post/af59d9a7-743c-412a-8bb8-9f6f3d8f63d9/image.png" alt="Figma Community"></a></li>
</ul>
<br>

<ul>
<li><h3 id="wwit">WWIT</h3>
국내 App들의 디자인을 이미지로 정리해놓은 사이트.
App을 들어가보면 페이지 별로 분류된 이미지들이 상세하게 기록되어 있다.
<a href="https://wwit.design"><img src="https://velog.velcdn.com/images/_jhkim/post/1bcc435e-91ca-4268-b3f7-15fa6e6af6a7/image.png" alt="WWIT"></a></li>
</ul>
<hr>
<h2 id="color-제작">Color 제작</h2>
<ul>
<li><h3 id="foundation-color-generator">Foundation: Color Generator</h3>
유명 디자인 시스템(Material, Atlassian, Orbit, Ant Design)을 기준으로 컬러 팔레트를 만들어주는 Figma의 플러그인.
<a href="https://www.figma.com/community/plugin/1024452006068794933/foundation-color-generator"><img src="https://velog.velcdn.com/images/_jhkim/post/5b3a9682-817c-4713-a0a7-3c5fca2f5763/image.png" alt="WWIT"></a></li>
</ul>
<br>

<ul>
<li><h3 id="swatchy">Swatchy</h3>
기본 고유 색상을 기준으로 연관된 색상 팔레트를 추출해주는 사이트.
<a href="https://swatchy.twosix.studio/"><img src="https://velog.velcdn.com/images/_jhkim/post/741b50a4-0ba3-47c3-b90d-515b609f1c28/image.png" alt="Swatchy"></a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] 이렇게 하는 거 맞나🤨 (Week 6)]]></title>
            <link>https://velog.io/@_jhkim/study-retrospect-week-6</link>
            <guid>https://velog.io/@_jhkim/study-retrospect-week-6</guid>
            <pubDate>Tue, 23 Jan 2024 15:23:18 GMT</pubDate>
            <description><![CDATA[<h3 id="🔖-요약">🔖 요약</h3>
<ol>
<li>기간: 24.01.15 ~ 24.01.21</li>
<li>이번 주 타이틀: 뒤죽박죽 생각이 많지만 재밌어!</li>
<li>한 줄 평: 그림은 조금씩 그려지고 있지만 아직 정리해야 할 내용이 더 많다. 그런대로 재밌어 하는 중.. </li>
</ol>
<hr>
<h3 id="📌-목표">📌 목표</h3>
<ol>
<li>Toy Project 1차 기획 진행 (~01.21)</li>
<li>Flutter 도서 공부(~3차시)</li>
</ol>
<table>
<thead>
<tr>
<th align="left">목표</th>
<th align="left">완료율</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1.</td>
<td align="left">80%</td>
<td align="left">&#39;화면 설계서&#39; &amp; &#39;Flowchart&#39;는 2차 기획에서 작성해보기 (UI/UX 디자인)</td>
</tr>
<tr>
<td align="left">2.</td>
<td align="left">100%</td>
<td align="left">ToyProject 진행에 집중하고싶어 한 개 차시씩 진행할 생각</td>
</tr>
</tbody></table>
<hr>
<h3 id="📈-good">📈 Good</h3>
<ol>
<li>출퇴근 시간에도 공부한 것</li>
<li>reference를 많이 찾아본 것 (비록 UI/UX에 더 꽂혔지만.)</li>
</ol>
<h3 id="📉-bad">📉 Bad</h3>
<ol>
<li>문서로의 정리가 더딘 것</li>
<li>기획 중에 생각이 길을 잃는 것ㅋㅋㅋ🧭</li>
</ol>
<hr>
<h3 id="📝-주요-스터디-내용">📝 주요 스터디 내용</h3>
<ul>
<li><h2 id="toy-project---기획-1">Toy Project - 기획 #1</h2>
지난 주에 다 못했던 기획을 조금씩 진행해보고 있는데, 선택 장애와 흥미를 같이 느끼는 중이다.
금주에는 기존 App들을 비교해보고, 갖춰야하는 최소한의 공통 기능에 따라 정리해보았다.<blockquote>
<p>📝 ToyProject 기획에 대한 조금 더 상세한 내용은 따로 작성한 포스트를 첨부한다.
참고: <a href="https://velog.io/@_jhkim/MUPIN-project-design-1">[Toy] 우당탕탕 음악 App 만들기 - 기획 #1</a></p>
</blockquote>
</li>
</ul>
<ul>
<li><h2 id="flutter-도서-공부">Flutter 도서 공부</h2>
이번 차시의 내용은 Dart의 클래스 관련 내용으로,
이전에 몰랐던 혹은 기억하고픈 내용들만 간단히 작성해보았다.<blockquote>
<p>📝 회고록에 작성하면 어떤 내용이 포함됐는지 파악하기 힘들어 따로 작성한 포스트를 첨부한다.
참고: <a href="https://velog.io/@_jhkim/Dart-Class">[Dart] 클래스와 친구들</a></p>
</blockquote>
</li>
</ul>
<hr>
<h3 id="💭-이모저모">💭 이모저모</h3>
  <img src="https://velog.velcdn.com/images/_jhkim/post/9a9e6559-1138-4cb3-bdeb-3e4c2d661745/image.jpeg" width=350/>

<p>스포티파이 재즈 플레이리스트 넘나 좋다..!
돈 쓰고 싶게 만드네 참나😌</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Toy] 우당탕탕 음악 App 만들기 - 기획 #1]]></title>
            <link>https://velog.io/@_jhkim/MUPIN-project-design-1</link>
            <guid>https://velog.io/@_jhkim/MUPIN-project-design-1</guid>
            <pubDate>Tue, 23 Jan 2024 15:10:19 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>💡 이 글은 ToyProject를 진행하기 위해 구상한 뒤죽박죽의 생각들을
&quot;기획&quot;이라는 범주에 포함될 수 있도록 정리한 글입니다. (a.k.a 일단 기획이라고 우기기)</p>
</blockquote>
<ul>
<li><h2 id="아이디어-출발">아이디어 출발</h2>
<p>나는 음악이 가진 무언가를 좋아한다.
그 무언가는 사람의 기분부터, 심지어 그 공간의 분위기까지 영향을 미친다고 느낀다.</p>
<p>해안가를 따라 드라이브 할 때.
조용한 도서관에서 책을 읽을 때.
캄캄한 밤 거리를 걸을 때.</p>
<p>같은 공간에서도 듣는 음악에 따라 시공간의 기억은 각자 다르게 남는다.
나는 그 기억들을 기록하고 싶었고,
이 생각이 App의 시작이었다.</p>
</li>
</ul>
<hr>
<ul>
<li><h2 id="레퍼런스-분석">레퍼런스 분석</h2>
<p>음원 스트리밍 앱은 벅스만 오래 사용해왔던 터라 다른 앱들도 파악이 필요하다고 느꼈다.
Spotify, Apple Music, SoundCloud, 멜론, 벅스 등을 번갈아가며 제공하는 기능들과 구성을 살펴보았다.</p>
<ul>
<li><h3 id="공통-기능">공통 기능</h3>
<table>
<thead>
<tr>
<th align="left">기능</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="left">오디오 스트리밍</td>
<td align="left">사용자가 원하는 음악을 언제 어디서든 실시간으로 즐길 수 있다.</td>
</tr>
<tr>
<td align="left">음악 검색</td>
<td align="left">사용자가 검색어를 통해 원하는 음악을 쉽고 빠르게 찾을 수 있다.</td>
</tr>
<tr>
<td align="left">음악 플레이어</td>
<td align="left">사용자가 재생/일시정지/다음 곡으로 넘기기 등 자유롭게 음악을 제어한다.</td>
</tr>
<tr>
<td align="left">가사 표시</td>
<td align="left">사용자는 재생 중인 음악의 가사를 확인할 수 있다. (음악 플레이어에 포함)</td>
</tr>
<tr>
<td align="left">음악 추천</td>
<td align="left">사용자의 음악 청취 패턴에 따라 개인화된 음악 추천을 제공한다.</td>
</tr>
<tr>
<td align="left">플레이리스트</td>
<td align="left">사용자가 자신만의 플레이리스트를 만들고 관리할 수 있다.</td>
</tr>
<tr>
<td align="left">다운로드</td>
<td align="left">사용자가 원하는 음악을 다운로드하여 오프라인에서도 들을 수 있다.</td>
</tr>
<tr>
<td align="left">팟캐스트와 라디오</td>
<td align="left">사용자가 음악 외에도 팟캐스트나 라디오를 들을 수 있다. (이 기능은 글쎄.. 후순위로!)</td>
</tr>
</tbody></table>
</li>
</ul>
<blockquote>
<h4 id="💡-how-to-make-a-music-app-">💡 How to make a Music app ?</h4>
<p>음악 앱 관련 시장 현황, 필수 기능 등을 상세히 정리해 놓은 좋은 자료들이 생각보다 많아 그 중 일부를 첨부한다.<br>
[참고]
post: <a href="https://www.purrweb.com/blog/how-to-make-a-music-app-like-spotify/">How to Start a Music App Like Spotify</a>
post: <a href="https://www.cleveroad.com/blog/how-to-create-a-music-streaming-app/">How to Make a Music Streaming App</a></p>
</blockquote>
<ul>
<li><h3 id="화면-구성">화면 구성</h3>
모두 <code>Home</code>, <code>검색</code>, <code>라이브러리</code> 탭을 공통적으로 갖추고 있고,
각 페이지 안의 구성도 크게 다르지 않았다.
이를 참고하여 나만의 MVP를 만들어 볼 생각이다.</li>
</ul>
<pre><code>[ 공통 탭 : 내부 구성 ]
 ㅁ Home: 최근 재생 음악 / 추천 음악 / 최신 음악
 ㅁ 검색: 검색 바 / 장르 및 테마 별 추천
 ㅁ 라이브러리: 플레이리스트</code></pre></li>
</ul>
<hr>
<ul>
<li><h2 id="정리-및-결과">정리 및 결과</h2>
<p>가칭이지만 App 이름은 MUPIN(뮤핀)으로 정했다! 유니크 아이디어와 연관되는 제일 직관적인 단어였다ㅋㅋㅋ
(짝꿍이 보자마자 &#39;머핀&#39;이냐고 물었다; 아 그렇게 읽는 거 아니라고;)</p>
<p>Sitemap은 크게 사진과 같은 흐름으로 구성하였고, 차주 기획에서 번호에 따라 화면 설계서를 작성해볼까 한다.</p>
<h5 id="ps-유니크-아이디어는-일찍-알면-재미없으니-마지막에-올려야지-싶다-부끄러워서-그런거-아님🥲">p.s 유니크 아이디어는 일찍 알면 재미없으니.. 마지막에 올려야지 싶다 (부끄러워서 그런거 아님🥲)</h5>
<ul>
<li><h3 id="컨셉">컨셉</h3>
<img src="https://velog.velcdn.com/images/_jhkim/post/ff1bf515-6be5-470e-be61-941d947948c8/image.png" width=800/>

</li>
</ul>
<br>

<ul>
<li><h3 id="sitemap">Sitemap</h3>
<img src="https://velog.velcdn.com/images/_jhkim/post/cc17064b-ccfc-48a2-84c5-b8995f8b8174/image.png" width=1200/>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dart] 클래스와 친구들]]></title>
            <link>https://velog.io/@_jhkim/Dart-Class</link>
            <guid>https://velog.io/@_jhkim/Dart-Class</guid>
            <pubDate>Tue, 23 Jan 2024 13:10:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>💡 이 글은 &quot;깡샘의 플러터&amp;다트 프로그래밍&quot; 도서에서 
&#39;클래스와 생성자&#39; &amp; &#39;상속과 추상 클래스&#39; 내용을 바탕으로 정리한 것입니다.</p>
</blockquote>
<ul>
<li><h2 id="생성자">생성자</h2>
<p>Dart의 클래스는 다른 객체지향 언어의 클래스와 비슷하지만 몇 가지 독특한 내용을 정리해본다.</p>
<ul>
<li><p>멤버 초기화 생성자 단순화</p>
<pre><code class="language-dart">class User {
late String name;
late int age;
User(this.name, this.age);  // this 키워드로 멤버 바로 초기화
}</code></pre>
</li>
<li><p>초기화 목록(Initializer list)</p>
<pre><code class="language-dart">// &#39;:&#39; 사용한 초기화 목록
User(String name, int age) : this.name = name, this.age = age { }</code></pre>
<pre><code class="language-dart">// 리스트 데이터로 초기화
class MyClass { 
late int data1;
late int data2;

MyClass(List&lt;int&gt; args) 
  : this.data1 = args[0],
    this.data2 = args[1] { }
}</code></pre>
<pre><code class="language-dart">// 멤버 함수 반환값으로 초기화
class MyClass { 
late int data1;
late int data2;

MyClass(int arg1， int arg2)
  : this.data1 = calFun(arg1),
    this.data2 = calFun(arg2) { } 

static int calFun(int arg) {
  return arg * 10; 
}
}</code></pre>
<ul>
<li>명명된 생성자(Named Constructor)
생성자 오버로딩대신 이름이 있는 생성자를 여러 개 선언하는 기법<pre><code class="language-dart">// 명명된 생성자
class MyClass {
late imt data1;
late imt data2; 
</code></pre>
</li>
</ul>
<p>MyClass(this.data1, this.data2);
MyClass.first(int arg) : this(arg, 0);  // 기본 생성자(MyClass) 호출
MyClass.second() : this.first(0);       // 명명된 생성자(MyClass.first) 호출
}</p>
<pre><code>
* 팩토리 생성자(Factory Constructor)
클래스 외부에서는 생성자처럼 이용하지만 실제로 객체를 생성하진 않고, 상황에 맞는 객체를 반환하는 역할
캐시 알고리즘이나 상속 관계에 따른 다형성 구현 시 유용.
```dart
// 캐시 알고리즘 구현 예
class Image {
late String url;
static Map&lt;String, Image&gt; _cache = 〈String, Image&gt;{};
Image._instance(this.url);           // named constructor
factory Image(String url) {
  if (_cache[url] == null) {         // 전달받은 식별자가 캐시에 없으면
    var obj = Image.instance(url);   // 해당 식별자로 객체를 새로 생성하고 
    _cache[url] = obj;               // 캐시에 추가
  }
  return _cache[url]!;               // 캐시에서 식별자에 해당하는 객체 반환
}
}
</code></pre></li>
</ul>
<p>main() {
  var imagel = Image(&#39;a.jpg&#39;);
  var image2 = Image(&#39;a.jpg&#39;);
  print(&#39;image1 == imaged : ${image1 == image2}&#39;);  // image1 == image2 : true
}</p>
<pre><code>

</code></pre></li>
</ul>
<ul>
<li><h2 id="상속과-추상-클래스">상속과 추상 클래스</h2>
<p>다른 객체지향 언어와 큰 차이는 없다.</p>
<ul>
<li>상속, 오버라이딩, 부모 클래스 멤버 접근<pre><code class="language-dart">// 함수 객체 활용 예
class SuperClass {
int myData = 10;
void myFun() {
 print (&#39;Super..myFun()...&#39;);
}
}
</code></pre>
</li>
</ul>
<p>class SubClass extends Superclass {    // &#39;extends&#39; 키워드로 상속
 int myData = 20;
 void myFun() {
   super.myFun();    // &#39;super&#39; 키워드로 부모 클래스 멤버 접근
   print(&#39;Sub..myFun()..myData : $myData, super.myData : ${super.myData}&#39;);  // &#39;super&#39; 키워드로 부모 클래스 멤버 접근
 }
}</p>
<p>main(List<String> args) {
 var obj = SubClass();
 obj.myFun();
}</p>
<pre><code></code></pre><p>// 실행 결과
Super..myFun()...
Sub..myFun()..myData : 20, super.myData : 10</p>
<pre><code>
* 부모 생성자 호출 및 멤버 초기화
```dart
// 부모 클래스 생성자 호출 및 멤버 변수 초기화
class Superclass {
 String name;
 int age;
 SuperClass(this.name, this.age) {}
}

class SubClass1 extends Superclass {
 SubClass(String name, int age) : super(name, age) {}    // 부모 클래스 멤버 초기화
}

class SubClass2 extends Superclass {
 SubClass(super.name, super.age); 
}

main() {
 var obj1 = SubClass1(&#39;kkang&#39;, 10);
 print(&#39;${obj1.name}, ${obj1.age}&#39;);
 var obj2 = SubClass2(&#39;kkim&#39;, 20);
 print(&#39;${obj2.name}, ${obj2.age}&#39;);
}</code></pre><pre><code>// 실행 결과
kkang, 10
kkim, 20</code></pre><ul>
<li>추상 클래스<pre><code class="language-dart">// 추상 클래스 선언 및 재정의
abstract class User {    // &#39;abstract&#39; 키워드로 추상 클래스 선언
void some();
}
</code></pre>
</li>
</ul>
<p>class Customer extends User {
 @override
 void some() {} 
}</p>
<pre><code>
* 인터페이스
```dart
// 일반 클래스
class User { 
 String name;
 User(this.name);
 String greet(String who) =&gt; &#39;Hello, $who. I&#39;m $name&#39;;
}

// &#39;implements&#39; 키워드로 인터페이스 구현 클래스 선언
class MyClass implements User {    // User는 암시적 인터페이스 역할
 String name = &#39;kim&#39;;
 @override
 String greet(String who) =&gt; return &#39;hello&#39;;
}

main() {
 User user = MyClass();    // 구현 클래스 객체는 인터페이스 타입으로 선언 가능
}</code></pre><ul>
<li>믹스인(Mixin)
믹스인은 변수와 함수는 선언할 수 있지만 클래스가 아니므로 생성자가 없다.
하지만 내부에 선언된 멤버들을 다른 클래스에 상속한 것처럼 이용할 수 있다.<pre><code class="language-dart">// 믹스인을 다중 상속처럼 활용한 예
mixin MyMixin {    // &#39;mixin&#39; 키워드로 믹스인 선언
int mixinData = 10; 
void mixInFun() {
 print (&#39;MyMixin...mixInFun()...&#39;); 
}
}
</code></pre>
</li>
</ul>
<p>class MySuper {
 int superData = 20;
 void superFun() {
   print(&#39;MySuper... superFun()&#39;);
 }
}</p>
<p>// 다중 상속처럼 선언
class MyClass extends MySuper with MyMixin {   // &#39;with&#39; 키워드로 믹스인 멤버 사용 선언
 void sayHello() {
   print(&#39;class data : $superData， mixin data : $mixinData&#39;);
   mixInFun();
   superFun();
 }
}</p>
<p>main() {
 var obj = MyClass();
 obj.sayHello();
}</p>
<pre><code></code></pre><p>// 실행 결과
class data : 20, mixin data : 10
MyMixin... mixInFun()...
MySuper...superFun()
```</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] 첫 기획 단계부터 호흡 곤란 😵 (Week 5)]]></title>
            <link>https://velog.io/@_jhkim/study-retrospect-week-5</link>
            <guid>https://velog.io/@_jhkim/study-retrospect-week-5</guid>
            <pubDate>Wed, 17 Jan 2024 10:33:08 GMT</pubDate>
            <description><![CDATA[<h3 id="🔖-요약">🔖 요약</h3>
<ol>
<li>기간: 24.01.08 ~ 24.01.14</li>
<li>이번 주 타이틀: 기획의 시작과 끝은 어디인가.</li>
<li>한 줄 평: 막연한 생각들을 간단한 기획 문서로 정리해야하는데 쉽지 않다..</li>
</ol>
<hr>
<h3 id="📌-목표">📌 목표</h3>
<ol>
<li>Toy Project 기획 진행 (~01.21)</li>
<li>Flutter 도서 공부(~2차시)</li>
</ol>
<table>
<thead>
<tr>
<th align="left">목표</th>
<th align="left">완료율</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1.</td>
<td align="left">30%</td>
<td align="left">필수 기능 정리 / Flowchart / 화면 설계서 필요</td>
</tr>
<tr>
<td align="left">2.</td>
<td align="left">100%</td>
<td align="left"></td>
</tr>
</tbody></table>
<hr>
<h3 id="📈-good">📈 Good</h3>
<ol>
<li>출퇴근 시간에도 공부한 것</li>
<li>여가 시간에 IT 관련 자료 찾아보는 것</li>
</ol>
<h3 id="📉-bad">📉 Bad</h3>
<ol>
<li>문서로의 정리가 더딘 것</li>
<li>여전히 으른인것.. 게으른.</li>
</ol>
<hr>
<h3 id="📝-주요-스터디-내용">📝 주요 스터디 내용</h3>
<ul>
<li><h2 id="toy-project">Toy Project</h2>
<p>지난 주에 찾았던 필수 기능들을 우선 순위에 따라 추려야하고,
그에 따라 Flowchart를 그려보아야 가닥이 좀 잡힐 것 같다.</p>
<p>그 후에는 Figma &amp; Figjam 조합으로 UI/UX 디자인을 정의해서 얼추 동작하는 프로토타입을 만들어볼 계획이다.</p>
<p>기능에 따라 필요한 기술 스펙은 위의 내용들이 정리되면 정할 수 있을 것 같다.</p>
<p>찾아보면 정석적인 앱 개발 프로세스는 제품 포지셔닝, 타겟 사용자 설정, 수익 모델 등의 비지니스 분석이 제일 우선이라고 하는 데, Toy Project이니 그 단계는 스킵하려 한다.
(사실 어떻게 하는 건지도 모르겠..읍읍)</p>
</li>
<li><h2 id="flutter-도서-공부">Flutter 도서 공부</h2>
<p>이번 차시의 내용은 개발 환경 세팅과 Dart 언어 내용으로,
이전에 몰랐던 혹은 기억하고픈 내용들만 간단히 작성해본다.</p>
<ul>
<li><h3 id="library-만들기">Library 만들기</h3>
<p>다수의 .dart 파일로 이루어진 라이브러리를 하나의 .dart로 묶어 편리하게 import 할 수 있도록 구성.
<code>part of</code>, <code>library</code>, <code>part</code> 키워드 사용.</p>
<pre><code class="language-dart">// a.dart
part of my_lib;  // &#39;part of&#39;로 특정 라이브러리에 포함 선언
int aData = 10;</code></pre>
<pre><code class="language-dart">// b.dart
part of my_lib;  // &#39;part of&#39;로 특정 라이브러리에 포함 선언
int bData = 20;</code></pre>
<pre><code class="language-dart">// my_lib.dart
library my_lib;  // &#39;library&#39;로 라이브러리 선언
part &#39;a.dart&#39;;   // &#39;part&#39;로 라이브러리에 파일 등록
part &#39;b.dart&#39;;   // &#39;part&#39;로 라이브러리에 파일 등록</code></pre>
</li>
<li><h3 id="명시적-형-변환-연산자-as">명시적 형 변환 연산자 <code>as</code></h3>
</li>
<li><h3 id="함수-타입-인수">함수 타입 인수</h3>
<p>Dart에서는 모든 데이터가 객체 → 따라서 함수도 객체(<code>Function</code> 타입)
함수의 매개변수로 함수 객체를 대입 가능.</p>
<pre><code class="language-dart">// 함수 객체 활용 예
int plus(int no) {
return no + 10;
}
int multiply(int no) {
return no * 10;
}
</code></pre>
</li>
</ul>
<p>Function testFun(Function argFun) {
print(&#39;argFun : ${argFun(20)}&#39;);
return multiply;
}</p>
<p>main(List<String> args) {
var result = testFun(plus); // result는 multiple() 함수 반환
print(&#39;result : ${result(20)}&#39;); 
}</p>
<pre><code></code></pre><p>// 실행 결과
argFun: 30
result: 200</p>
<pre><code>
* ### try~on~finally 예외 처리
try 예외 발생 → on 실행(종류따라) → finally 실행(무조건)

```dart
// 예외 객체 가져오기
some() {
throw FormatException (&#39;my exception&#39;);
}

main(List&lt;String&gt; args) {
try {
  print(&#39;step1...&#39;);
  some();
  print(&#39;step2...&#39;);
}
on ForwatException catch(e) {
  print(&#39;step3...$e&#39;);
} 
on Exception catch(e) {
  print(&#39;step4...$e&#39;);
} 
finally {
  print(&#39;step5...&#39;);
}
print(&#39;step6...&#39;);
}</code></pre><pre><code>// 실행결과
step1...
step3...FormatException: my exception
step5...
step6...</code></pre></li>
</ul>
<hr>
<h3 id="💭-이모저모">💭 이모저모</h3>
<p>회사 선임님께서 맥북 Pro를 한참 고민하시다 결국 22개월 무이자 할부로 사셨다는 소식을 들었다💻
...
..
곧 내 신용도도 써먹을 때가 올 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dart] Conding Convention ]]></title>
            <link>https://velog.io/@_jhkim/Dart-Conding-Convention</link>
            <guid>https://velog.io/@_jhkim/Dart-Conding-Convention</guid>
            <pubDate>Mon, 15 Jan 2024 10:59:52 GMT</pubDate>
            <description><![CDATA[<p>Dart 관련 내용을 찾아보던 중 재밌고 유익한 글이 있어 번역본을 올려보려 한다.
예시들은 조금 추가하였으니 도움이 되면 좋겠다.
(p.s 첨부된 사진의 원문 제목부터 느껴지듯 작성자 분이 꽤나 거칠다. 그 마저도 느낌을 대충 살려보고 싶었다..)</p>
<br>

<hr>
<br>

<p>다른 프로젝트들을 살펴보는 동안, 항상 거슬리는 게 있었어.
그건 대부분이 Dart 문법 규칙을 제대로 지키지 않는다는 거야.</p>
<p>넌 아마 다른 언어들을 써왔겠지만 지금은 Dart를 쓰고 있고, 또 Dart에서는 몇 가지를 좀 다르게 처리하거든.</p>
<p>사실 Dart 문서가 모든 걸 깔끔하게 설명해주지만 우리 대부분은 문서를 다 읽는 걸 너무 귀찮아하잖아.
그래서 난 이런 게으른 놈들을 위해 요약본을 만들기로 했어.</p>
<p>도움이 되길 바랄게!</p>
<ul>
<li><h2 id="foldersfiles-span-stylecolor006c6blower_snake_casespan">folders/files (<span style="color:#006C6B">lower_snake_case</span>)</h2>
<pre><code class="language-dart">my_widgets
ㄴ my_fancy_widget.dart
ㄴ my_hot_widget.dart</code></pre>
</li>
<li><h2 id="classes-span-stylecolor006c6buppercamelcasespan">classes (<span style="color:#006C6B">UpperCamelCase</span>)</h2>
<pre><code class="language-dart">class MyFancyClass { ... }</code></pre>
</li>
<li><h2 id="extensions-span-stylecolor006c6buppercamelcasespan">extensions (<span style="color:#006C6B">UpperCamelCase</span>)</h2>
<pre><code class="language-dart">extension MyFancyList&lt;T&gt; on List&lt;T&gt; { ... }</code></pre>
</li>
<li><h2 id="mixins-span-stylecolor006c6buppercamelcasespan">mixins (<span style="color:#006C6B">UpperCamelCase</span>)</h2>
<pre><code class="language-dart">mixin MyCoolMixin { ... }</code></pre>
</li>
<li><h2 id="functions-span-stylecolor006c6blowercamelcasespan">functions (<span style="color:#006C6B">lowerCamelCase</span>)</h2>
<pre><code class="language-dart">void MyGorgeousFunc() { ... }</code></pre>
</li>
<li><h2 id="variables-span-stylecolor006c6blowercamelcasespan">variables (<span style="color:#006C6B">lowerCamelCase</span>)</h2>
<pre><code class="language-dart">var myPrettyVar</code></pre>
</li>
<li><h2 id="constants-span-stylecolor006c6blowercamelcasespan">constants (<span style="color:#006C6B">lowerCamelCase</span>)</h2>
<pre><code class="language-dart">const CAPITALIZE_EVERY_DAMN_LETTER // NO
const goodConstant // yes</code></pre>
</li>
<li><h2 id="enums-span-stylecolor006c6blowercamelcasespan">enums (<span style="color:#006C6B">lowerCamelCase</span>)</h2>
<pre><code class="language-dart">enum Name { FIRST_NAME, LAST_NAME } // WRONG!!
enum Name { firtName, lastName }    // RIGHT!!</code></pre>
</li>
<li><h3 id="사용하지-않는-콜백-파라미터는-_-__-등으로-기입해라">사용하지 않는 콜백 파라미터는 <code>_</code>, <code>__</code> 등으로 기입해라.</h3>
<pre><code class="language-dart">// IF YOU WON&#39;T USE DON&#39;T MENTION IT
futureOfVoid.then((unusedParameter) =&gt; print(&#39;Operation complete.&#39;));
futureOfVoid.then((_) =&gt; print(&#39;Operation complete.&#39;));</code></pre>
</li>
<li><h3 id="문자열과-값들을-구성할-땐-interpolation을-선호해라">문자열과 값들을 구성할 땐, interpolation을 선호해라.</h3>
<pre><code class="language-dart">// GOOD BOY
&#39;Hello, $name! You are ${year - birth} years old.&#39;;
// BAD BOY
&#39;Hello, &#39; + name + &#39;! You are &#39; + (year - birth).toString() + &#39; y...&#39;;</code></pre>
</li>
<li><h3 id="불필요한-gettersetter를-피하라">불필요한 getter/setter를 피하라.</h3>
<pre><code class="language-dart">// GOOD
class Box {
var contents;
}
// BAD
class Box {
var _contents;
get contents =&gt; _contents;
set contents(value) {
  _contents = value;
}
}</code></pre>
</li>
<li><h3 id="젠장할-모든-타입을-어디든-적어라">젠장할 모든 타입을 어디든 적어라.</h3>
<pre><code class="language-dart">add(a,b) =&gt; a + b; // DAMN WRONG
int add(int a, int b) =&gt; a + b;  // HELL YEAH
final List&lt;String&gt; users = &lt;String&gt;[];  // THAT&#39;S OVERKILL
final List&lt;String&gt; users = []; // GREAT
final users = &lt;String&gt;[]; // WONDERFUL</code></pre>
</li>
<li><h3 id="선사시대적-new-키워드-좀-제발-그만-사용해라">선사시대적 &#39;new&#39; 키워드 좀 제발 그만 사용해라.</h3>
<pre><code class="language-dart">// I&#39;m old dude
new Container();
// I&#39;m a brand new energetic open-minded sexy young dude
Container();</code></pre>
<br>

</li>
</ul>
<p>좀 공격적이라면 미안하지만, 당장 코드 안 고치면 내가 너 찾아간다. 그리고 새로운 난장판들이 계속 보이면 내용을 더 추가할 생각이니까 조심해.
<br></p>
<hr>
<br>

<blockquote>
<h3 id="💡-reference">💡 Reference</h3>
<p>medium post: <a href="https://itnext.io/fix-your-dart-damn-syntax-b3d3474373bd">Fix your Dart DAMN Syntax</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] Toy Project 레츠고 🤓 (Week 4)]]></title>
            <link>https://velog.io/@_jhkim/study-retrospect-week-4</link>
            <guid>https://velog.io/@_jhkim/study-retrospect-week-4</guid>
            <pubDate>Sun, 14 Jan 2024 13:36:52 GMT</pubDate>
            <description><![CDATA[<h3 id="🔖-요약">🔖 요약</h3>
<ol>
<li>기간: 24.01.01 ~ 24.01.07</li>
<li>이번 주 타이틀: Flutter로 Toy Project 준비 시작!</li>
<li>한 줄 평: 지금까지의 맛보기 공부로는 택도 없을 것 같지만.. 그래도 해보자!</li>
</ol>
<hr>
<h3 id="📌-목표">📌 목표</h3>
<ol>
<li>Toy Project 컨셉 정하기</li>
<li>Flutter 추가 공부 자료 선정</li>
</ol>
<table>
<thead>
<tr>
<th align="left">목표</th>
<th align="left">완료율</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1.</td>
<td align="left">100%</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">2.</td>
<td align="left">100%</td>
<td align="left"></td>
</tr>
</tbody></table>
<hr>
<h3 id="📈-good">📈 Good</h3>
<ol>
<li>출퇴근 시간에도 공부한 것</li>
<li>여가 시간에 IT 관련 자료 찾아보는 것 (이제야 열정 주입 중)</li>
</ol>
<h3 id="📉-bad">📉 Bad</h3>
<ol>
<li>딱히 결과물이 없는 것..</li>
</ol>
<hr>
<h3 id="📝-주요-스터디-내용">📝 주요 스터디 내용</h3>
<ul>
<li><h2 id="toy-project">Toy Project</h2>
<p>Flutter를 이용한 App을 만들어보고 싶은데 뭐가 있을까 고민하던 중..
토이 프로젝트는 자신이 흥미있는 걸로 도전하라고 했던가! <del>(출처: 모름)</del>
하루도 빠짐없이 매일 사용하고 또 좋아라하는 <strong>음악 스트리밍 앱</strong>을 만들기로 정했다!</p>
<p>그래서 음악 앱이 갖춰야 할 기능들을 살펴보며 공통적인 것들을 추려보았고,
이와 더불어 내가 생각하는 유니크 기능을 추가해 개발해보고 싶다.
다음 주에 상세 기획을 진행하여 포스팅 할 예정!</p>
<h3 id="✅-음악-앱-필수-기능">✅ 음악 앱 필수 기능</h3>
<ul>
<li><h4 id="오디오-스트리밍">오디오 스트리밍</h4>
<p>사용자가 원하는 음악을 언제 어디서든 실시간으로 즐길 수 있다.</p>
</li>
<li><h4 id="음악-검색">음악 검색</h4>
<p>사용자가 검색어를 통해 원하는 음악을 쉽고 빠르게 찾을 수 있다.</p>
</li>
<li><h4 id="음악-플레이어">음악 플레이어</h4>
<p>사용자가 재생/일시정지/다음 곡으로 넘기기 등 자유롭게 음악을 제어한다.</p>
</li>
<li><h4 id="가사-표시">가사 표시</h4>
<p>사용자는 재생 중인 음악의 가사를 확인할 수 있다. (음악 플레이어에 포함)</p>
</li>
<li><h4 id="ai-추천">AI 추천</h4>
<p>사용자의 음악 청취 패턴에 따라 개인화된 음악 추천을 제공한다.</p>
</li>
<li><h4 id="플레이리스트">플레이리스트</h4>
<p>사용자가 자신만의 플레이리스트를 만들고 관리할 수 있다.</p>
</li>
<li><h4 id="다운로드">다운로드</h4>
<p>사용자가 원하는 음악을 다운로드하여 오프라인에서도 들을 수 있다.</p>
</li>
<li><h4 id="팟캐스트와-라디오">팟캐스트와 라디오</h4>
<p>사용자가 음악 외에도 팟캐스트나 라디오를 들을 수 있다. (이 기능은 글쎄.. 후순위로!)</p>
</li>
</ul>
<blockquote>
<h4 id="💡-how-to-make-a-music-app-">💡 How to make a Music app ?</h4>
<p>음악 앱 관련 시장 현황, 필수 기능 등을 상세히 정리해 놓은 좋은 자료들이 생각보다 많아 그 중 일부를 첨부한다.<br>
[참고]
post: <a href="https://www.purrweb.com/blog/how-to-make-a-music-app-like-spotify/">How to Start a Music App Like Spotify</a>
post: <a href="https://www.cleveroad.com/blog/how-to-create-a-music-streaming-app/">How to Make a Music Streaming App</a></p>
</blockquote>
</li>
</ul>
<br>

<ul>
<li><h2 id="flutter-공부-자료">Flutter 공부 자료</h2>
<h3 id="1-도서">1. 도서</h3>
<p>짝궁과 놀러간 조용한 도서관에서 딱 한 권 있던 Flutter 관련 도서를 발견했는데,
내가 공부하고 싶었던 상태 관리 라이브러리와 Firebase 활용이 담겨있었다.
도서관 방문 이후 다른 Flutter 서적들도 찾아보았지만,
Provider / GetX / BLoC 라이브러리를 모두 다룬 책이 없어 이 녀석으로 확정! </p>
<a href="https://product.kyobobook.co.kr/detail/S000200832185">
 <img src="https://velog.velcdn.com/images/_jhkim/post/218fe3b5-6fdd-4694-af73-a5de659c0156/image.jpg" width=400/>
</a>

<blockquote>
<h4 id="💡-flutter-상태-관리-라이브러리-">💡 Flutter 상태 관리 라이브러리 ?</h4>
<p>Flutter는 선언형 UI로써 각 위젯들이 나타낼 자신의 상태를 가지고 있기 때문에 
App의 규모가 커짐에 따라 상태 관리 또한 매우 중요해진다.
이러한 상태 관리를 위한 라이브러리들을 비교해놓은 좋은 글들이 있어 첨부한다.<br>
<strong>[참고]</strong>
post: <a href="https://seosh817.tistory.com/63">[Flutter] 상태 관리(State Management) 정리</a>
post: <a href="https://engineering.linecorp.com/ko/blog/flutter-architecture-getx-bloc-provider">Flutter 인기 아키텍처 라이브러리 3종 비교 분석 - GetX vs BLoC vs Provider</a>
post: <a href="https://kkangsnote.tistory.com/247">플러터, 상태관리 프레임워크(Bloc, Provider, GetX) 어떤 것을 이용할 것인가?</a>
post: <a href="https://velog.io/@osung/Flutter-Bloc">[Flutter] 왜 상태 관리에 Bloc을 쓸까? (feat.GetX)</a></p>
</blockquote>
<br> 

<h3 id="2-인터넷-강의">2. 인터넷 강의</h3>
<p>요즘 Flutter 관련 내용들을 계속 찾다보니 귀신같은 우리의 알고리즘 선생께서
SNS에 광고마저 개발 관련 내용들로 추천해주신다.</p>
<p>그 중 눈에 들어온 강의는 &quot;<a href="https://fastcampus.co.kr/dev_online_flutternative"><em>대규모 앱 개발부터 Native 앱 도입까지:Flutter의 모든 것</em></a> &quot; 이 녀석이다.
이 강의에서는 Flutter의 부분 도입을 위한 *Add-to-app 내용부터 CI/CD까지 커리큘럼에 포함되어 있어 궁금했던 내용들을 배울 수 있을 것 같다.</p>
<blockquote>
<h4 id="💡-add-to-app-">💡 Add-to-app ?</h4>
<p>Native 앱에 Flutter가 모듈이나 라이브러리 형태로 포함되는 방식으로, 
기존에 존재하던 앱 위에 새로운 페이지를 빠르게 추가/변경하고자 할 때 OS별로 따로 개발하지 않고 빠르게 동시 적용한다.<br>
<strong>[참고]</strong>
Flutter Docs: <a href="https://docs.flutter.dev/add-to-app">Add Flutter to an existing app</a></p>
</blockquote>
</li>
</ul>
<hr>
<h3 id="💭-이모저모">💭 이모저모</h3>
<img src="https://velog.velcdn.com/images/_jhkim/post/3837510c-a29d-4164-b8ee-f48a41610410/image.png" width=400/>
(↑ 지난 주에 적은 이모저모..)

<p><em><strong>연초</strong></em> 라 쉬엄쉬엄 공부한 건 사실이다..^^
하지만, 유명하신 분의 어록을 되새기며 마음을 다잡았다.
<code>늦었다고 생각할 땐 진짜 너무 늦었으니, 지금 당장 시작해라</code></p>
<h5 id="ps-절대-귀찮아서-한-주-뒤에-회고록을-남긴-것은-아니다-어흑ㅠ">(p.s 절대 귀찮아서 한 주 뒤에 회고록을 남긴 것은 아니다.. 어흑ㅠ)</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C++] 실수 타입의 Round-trip conversion]]></title>
            <link>https://velog.io/@_jhkim/cpp-float-round-trip</link>
            <guid>https://velog.io/@_jhkim/cpp-float-round-trip</guid>
            <pubDate>Sat, 13 Jan 2024 14:37:10 GMT</pubDate>
            <description><![CDATA[<h2 id="💡-round-trip-conversion">💡 Round-trip conversion</h2>
<p>포맷 A의 데이터를 포맷 B로 변환 후, 다시 본래 포맷 A로 돌아오는 과정 (Ex. double -&gt; text -&gt; double)</p>
<hr>
<p>C++에서는 <em><strong>실수 → Text → 실수</strong></em> Round-trip에서 값 손실을 막기 위해, 
<code>std::numeric_limits</code> 클래스 멤버 상수를 활용할 수 있다.</p>
<ul>
<li><h4 id="stdnumeric_limitsspan-stylecolore17070tspanspan-stylecolore17070max_digits10span">std::numeric_limits&lt;<strong><span style="color:#E17070">T</span></strong>&gt;::<strong><span style="color:#E17070">max_digits10</span></strong></h4>
<ul>
<li><p>부동 소수점 수를 10진수 문자열로 변환했다가 다시 부동 소수점 수로 변환했을 때, 원래의 부동 소수점 수와 동일하게 유지되는 최소 자릿수.</p>
</li>
<li><p>Ex) std::numeric_limits&lt;<strong><span style="color:#E17070">double</span></strong>&gt;::max_digits10은 <strong><span style="color:#E17070">17</span></strong>인데, 
이는 double 타입의 부동 소수점 수를 10진수 문자열로 변환했다가 
다시 double로 변환했을 때, 원래의 수와 동일하게 유지되기 위해 필요한 최소 자릿수가 <strong><span style="color:#E17070">17</span></strong>자리라는 의미. (float는 9자리)</p>
<br>

</li>
</ul>
</li>
</ul>
<blockquote>
<h3 id="reference">Reference</h3>
</blockquote>
<ul>
<li><a href="https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10">std::numeric_limits&lt;T&gt;::max_digits10 - cppreference</a></li>
<li><a href="https://stackoverflow.com/questions/22458355/what-is-the-purpose-of-max-digits10-and-how-is-it-different-from-digits10/22458961#22458961">digits10 vs max_digits10 - stackoverflow</a></li>
<li><a href="https://neurowhai.tistory.com/365">[C++] digits10, max_digits10 - blog post</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] 기본 Flutter 강의 수강 완료! 🎉 (Week 3)]]></title>
            <link>https://velog.io/@_jhkim/study-retrospect-week-3</link>
            <guid>https://velog.io/@_jhkim/study-retrospect-week-3</guid>
            <pubDate>Wed, 03 Jan 2024 16:15:48 GMT</pubDate>
            <description><![CDATA[<h3 id="🔖-요약">🔖 요약</h3>
<ol>
<li>기간: 23.12.25 ~ 23.12.31</li>
<li>이번 주 타이틀: Flutter 수강 완료! (BUT, 아직 할 줄 아는 게 없는)</li>
<li>한 줄 평: 갈 길이 멀다.. 실무에도 쓰이는 기술들을 적용한 토이 프로젝트를 해봐야겠어!</li>
</ol>
<hr>
<h3 id="📌-목표">📌 목표</h3>
<ol>
<li>Flutter 강의 수강 완료하기 (feat. <em><a href="https://nomadcoders.co/flutter-for-beginners/lobby">Nomad Coder Flutter lect</a></em>)</li>
</ol>
<table>
<thead>
<tr>
<th align="left">목표</th>
<th align="left">완료율</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1.</td>
<td align="left">100%</td>
<td align="left"></td>
</tr>
</tbody></table>
<hr>
<h3 id="📈-good">📈 Good</h3>
<ol>
<li>연휴 후에 정신줄 다시 붙잡은 것</li>
<li>출퇴근 시간에도 공부한 것</li>
</ol>
<h3 id="📉-bad">📉 Bad</h3>
<ol>
<li>강의 벼락치기 학습한 것..</li>
</ol>
<hr>
<h3 id="📝-주요-스터디-내용">📝 주요 스터디 내용</h3>
<ul>
<li><h3 id="simple-app-제작">Simple APP 제작</h3>
<p>Flutter를 이용해 간단한 기능의 App을 제작 (git repo: <a href="https://github.com/qndls42/flutter_study.git">flutter_study</a>)</p>
<h4 id="1-toonflix-app-웹툰-조회-app">1. TOONFLIX App (웹툰 조회 App)</h4>
<pre><code>- http package(http 통신을 지원하는 package - api 호출 활용)
 - url_launcher package(웹 브라우저, 메일, 전화 등을 열어주는 package)
 - shared_preferences package(해당 플랫폼에 data를 저장하는 package)
 - Hero widget(tag 값을 주어 위젯을 다른 screen에도 사용할 수 있도록 연결)</code></pre><img width=300, src="https://github.com/qndls42/flutter_study/blob/develop/resources/TOONFLIX.gif?raw=true"/>

</li>
</ul>
<br>

<ul>
<li><h3 id="future-클래스-멤버-활용">Future 클래스 멤버 활용</h3>
<p>비동기 처리의 결과인 Future를 widget class의 멤버로 사용 시,
조건에 따라 사용 형태가 달라질 수 있다.</p>
<ul>
<li><p>Ex. HomeScreen에서 받은 API response 데이터가 DetailScreen에서 필요한 경우</p>
<h4 id="1-homescreen-futrue-멤버-webtoons">1. HomeScreen Futrue 멤버 (webtoons)</h4>
<p>API에 대한 인자없이 처음 호출하기 때문에, StatelessWidget으로 단순 클래스 멤버처럼 사용 가능.</p>
<img width=500, src="https://velog.velcdn.com/images/_jhkim/post/8ae42fcb-c08c-41ed-8e9e-875af66dfddf/image.png"/>
<br>

<h4 id="2-detailscreen-futrue-멤버-webtoon-episodes">2. DetailScreen Futrue 멤버 (webtoon, episodes)</h4>
<p>HomeScreen에서 받은 id값을 전달받아 추가 API의 인자로 넣어야 하기때문에, StatefulWidget으로 initState()에서 클래스 멤버들을 늦게 초기화.</p>
<img width=500, src="https://velog.velcdn.com/images/_jhkim/post/d4c29554-c1a5-49c1-ba46-7dc72a38d922/image.png"/>


</li>
</ul>
</li>
</ul>
<blockquote>
<h4 id="💡-statefulwidget-lifecycle">💡 StatefulWidget LifeCycle</h4>
<p>  State의 개념부터 StatefulWidget의 생명주기를 잘 정리해주신 글이 있어 첨부한다.
  [참고]
      - blog post: <a href="https://velog.io/@realryankim/Flutter-LifeCycle%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0">[Flutter] LifeCycle(생명주기)</a></p>
</blockquote>
<br>

<hr>
<h3 id="💭-이모저모">💭 이모저모</h3>
<p>연말이라 쉬엄쉬엄 공부한 건 사실이다..
하지만,
새해 시작인 만큼 Flutter로 더 크고 재미난 일들을 꾸며볼테야🎶🎵</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] 챌린지 완주..!🤕 (Week 2)]]></title>
            <link>https://velog.io/@_jhkim/study-retrospect-week-2</link>
            <guid>https://velog.io/@_jhkim/study-retrospect-week-2</guid>
            <pubDate>Mon, 01 Jan 2024 12:01:10 GMT</pubDate>
            <description><![CDATA[<h3 id="🔖-요약">🔖 요약</h3>
<ol>
<li>기간: 23.12.18 ~ 23.12.24</li>
<li>이번 주 타이틀: Flutter 챌린지 끝! (feat. 선생님 말씀을 잘 듣자)</li>
<li>한 줄 평: 기초 예습없이 진행한 챌린지는 너무 힘들었다.. 그래도 유익했던 시간!</li>
</ol>
<hr>
<h3 id="📌-목표">📌 목표</h3>
<ol>
<li>Flutter 강의 수강 완료하기 (feat. <em><a href="https://nomadcoders.co/flutter-for-beginners/lobby">Nomad Coder Flutter lect</a></em>)</li>
<li>Flutter 2주 챌린지 완주 하기 (feat. <em><a href="https://nomadcoders.co/flutter-challenge">Nomad Coder Flutter Challenge</a></em>)</li>
</ol>
<table>
<thead>
<tr>
<th align="left">목표</th>
<th align="left">완료율</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1.</td>
<td align="left">82%</td>
<td align="left">챌린지에 필요한 강의 위주로 우선 수강</td>
</tr>
<tr>
<td align="left">2.</td>
<td align="left">100%</td>
<td align="left"></td>
</tr>
</tbody></table>
<hr>
<h3 id="📈-good">📈 Good</h3>
<ol>
<li>크리스마스에도 챌린지 과제 완료한 것</li>
<li>출퇴근 시간에도 공부한 것</li>
</ol>
<h3 id="📉-bad">📉 Bad</h3>
<ol>
<li>과제 및 공부 코드 커밋 관리를 못한 것</li>
<li>기초 강의 모두 예습하지 않고 챌린지 진행한 것</li>
</ol>
<hr>
<h3 id="📝-주요-스터디-내용">📝 주요 스터디 내용</h3>
<ul>
<li><h3 id="ui-클론">UI 클론</h3>
Flutter를 이용해 아래 Planner App의 UI를 비슷하게 제작 (git repo: <a href="https://github.com/qndls42/flutter_study.git">flutter_study</a>)<img width=400, src="https://github.com/qndls42/flutter_study/assets/14909063/aba0985f-9e1f-4311-9a9d-0d580f51cb91"/>

</li>
</ul>
<br>

<ul>
<li><h3 id="simple-app-제작">Simple APP 제작</h3>
<p>Flutter를 이용해 간단한 기능의 App들을 제작 (git repo: <a href="https://github.com/qndls42/flutter_study.git">flutter_study</a>)</p>
<h4 id="1-pomodoro-app-타이머-app">1. POMODORO App (타이머 App)</h4>
<pre><code>- Stateful/Stateless widget 사용</code></pre><img width=300, src="https://github.com/qndls42/flutter_study/assets/14909063/e3e6da12-dadb-47bf-9ba4-55f3992a15a0"/>

<h4 id="2-movieflix-app-영화-정보-조회-app">2. MOVIEFLIX App (영화 정보 조회 App)</h4>
<pre><code>- IMDB API 사용
 - Multiple Screen 구성</code></pre><img width=300, src="https://github.com/qndls42/flutter_study/blob/develop/resources/MOVIEFLIX.gif?raw=true"/>
<br>
</li>
<li><h3 id="statefulwidget"><a href="https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html">StatefulWidget</a></h3>
<p>State(상태)를 갖는 widget으로, 데이터의 변경 상태를 UI에 실시간 반영한다.</p>
<blockquote>
<h4 id="💡-stateless-widget-vs-stateful-widget-">💡 Stateless widget vs Stateful widget ?</h4>
<p>[참고]</p>
<pre><code>- blog post: [StatelessWidget, StatefulWidget📱](https://velog.io/@dosilv/Flutter-StatelessWidget-StatefulWidget)</code></pre></blockquote>
</li>
</ul>
<br>

<ul>
<li><h3 id="futurebuilder-widget"><a href="https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html">FutureBuilder</a> widget</h3>
비동기 처리 결과인 Future를 다루는 widget으로, 예를 들면 아래와 같은 상황에서 사용된다.<ul>
<li>ex) API request 후,<ul>
<li>데이터가 로딩되는 동안 Progress Indicator 표기</li>
<li>API response 데이터에 따른 UI 화면 구성</li>
<li>error 발생에 따른 UI 화면 구성</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<h4 id="💡-future-futurebuilder">💡 Future? FutureBuilder?</h4>
<p>  [참고] 
      - blog post: <a href="https://eory96study.tistory.com/21">비동기를 위한 FutureBuilder</a></p>
</blockquote>
<br>

<ul>
<li><h3 id="navigator-widget"><a href="https://api.flutter.dev/flutter/widgets/Navigator-class.html">Navigator</a> widget</h3>
<p>App을 구성하는 스크린(홈 화면, 세부 화면 등)들의 전환을 담당하는 widget</p>
<blockquote>
<h4 id="💡-navigator-스크린-이동">💡 Navigator 스크린 이동</h4>
<p>[참고] </p>
<pre><code>- blog post: [Navigator 페이지 이동 정리](https://calvinjmkim.tistory.com/67)</code></pre></blockquote>
</li>
</ul>
<br>

<ul>
<li><h3 id="gesturedetactor-widget"><a href="https://api.flutter.dev/flutter/widgets/GestureDetector-class.html">GestureDetactor</a> widget</h3>
클릭, 스와이프, 드래그, 확대/축소 등의 다양한 제스처를 인식하는 widget<br>

</li>
</ul>
<hr>
<h3 id="💭-이모저모">💭 이모저모</h3>
<img width=700, src="https://velog.velcdn.com/images/_jhkim/post/4d051e29-6430-4893-9a1c-4d958dc769df/image.png"/>

<p>Flutter Challenge의 FAQ 중 하나인데 이 답변이 정확했다...
강의는 다 못 들었지만 일단 신청했으니 가보자! 했는데 호되게 당했다.
역시 선생님 말씀을 잘 들어야 한다.
<br></p>
<img width=300, src="https://velog.velcdn.com/images/_jhkim/post/768a3982-8c9c-4afb-ae63-244fdddd16fd/image.png"/>

<p>뚜들겨 맞았지만.. 그래도 완주했다 이 말이야..!🤕</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] Flutter 시이작!(Week 1)]]></title>
            <link>https://velog.io/@_jhkim/study-retrospect-week-1</link>
            <guid>https://velog.io/@_jhkim/study-retrospect-week-1</guid>
            <pubDate>Sun, 17 Dec 2023 15:57:45 GMT</pubDate>
            <description><![CDATA[<h3 id="🔖-요약">🔖 요약</h3>
<ol>
<li>기간: 23.12.10 ~ 23.12.17</li>
<li>이번 주 타이틀: Flutter 스터디 시작 (+ 기초 UI와 친해지기)</li>
<li>한 줄 평: C/C++만 해오던 나에게 Flutter는 신세계.. 더 빨리 친해지고 싶다!</li>
</ol>
<hr>
<h3 id="📌-목표">📌 목표</h3>
<ol>
<li>Flutter 강의 수강 완료하기 (feat. <em><a href="https://nomadcoders.co/flutter-for-beginners/lobby">Nomad Coder lect</a></em>)</li>
<li>Flutter 2주 챌린지 누락 안 하기 (feat. Nomad Coder 10기)</li>
<li>python 기초 100제 완료하기 (feat. <a href="https://codeup.kr/problemsetsol.php?psid=33">CodeUp 문제집</a>)</li>
</ol>
<hr>
<h3 id="📈-good">📈 Good</h3>
<ol>
<li>매일 진행되는 챌린지 과제를 누락하지 않은 것</li>
<li>출퇴근 시간에도 공부한 것</li>
</ol>
<h3 id="📉-bad">📉 Bad</h3>
<ol>
<li>모든 목표를 완료하지 못한 것</li>
<li>과욕. 과욕. 과욕. (목표 설정 적당히 하기..)</li>
</ol>
<table>
<thead>
<tr>
<th align="left">목표</th>
<th align="left">완료율</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1.</td>
<td align="left">44%</td>
<td align="left">강의 관련 내용 조사 시간이 예상보다 많이 필요</td>
</tr>
<tr>
<td align="left">2.</td>
<td align="left">100%</td>
<td align="left">커리큘럼 중 50% 완료<br>이후 진행될 코드 챌린지는 시간이 더 많이 소요될 것으로 예상</td>
</tr>
<tr>
<td align="left">3.</td>
<td align="left">60%</td>
<td align="left">flutter 우선 / python 천천히 진행</td>
</tr>
</tbody></table>
<hr>
<h3 id="📝-주요-스터디-내용">📝 주요 스터디 내용</h3>
<ul>
<li><h3 id="ui-클론">UI 클론</h3>
Flutter를 이용해 아래 Financial App의 UI를 비슷하게 제작 (git repo: <a href="https://github.com/qndls42/flutter_study.git">flutter_study</a>)
<a href="https://dribbble.com/shots/19858341-Finnancial-Mobile-IOS-App"><img src="https://velog.velcdn.com/images/_jhkim/post/44b7220c-3e7c-4f2f-a858-d6deee4b723c/image.png" alt="Finnancial Mobile IOS App"></a></li>
</ul>
<ul>
<li><h3 id="flutter-widgets">Flutter Widgets</h3>
Text, Row, Column, Container 등의 주요 widgets 사용
(참고: <a href="https://parkjh7764.tistory.com/168">[Flutter] 위젯(widget) 종류, child children 매개변수</a>)</li>
</ul>
<hr>
<h3 id="🔍-부가-스터디-내용">🔍 부가 스터디 내용</h3>
<ul>
<li><h3 id="vs-code-extensions--settings">VS Code extensions &amp; settings</h3>
<p>스터디하며 알게된 유용한 VSCode 관련 항목들을 따로 간단히 정리
(작고 소중한 나의 포스트: <a href="https://velog.io/@_jhkim/VS-Code-Useful-VS-Code-Extentions-Settings">[VS Code] 유용한 VS Code Extentions &amp; Settings</a>)</p>
<br>
</li>
<li><h3 id="widget-inspector">Widget Inspector</h3>
<p>App을 구성하는 모든 widget을 계층 구조로 보여주는 tool (레이아웃 확인에 유용👍)</p>
<br>
</li>
<li><h3 id="code-actions-코드-옆-💡-버튼-or-⌘-단축키">Code Actions (코드 옆 💡 버튼 or ⌘<strong>.</strong> 단축키)</h3>
<p>작성한 widget의 wrap/swap/move/remove/extract 등의 기능을 제공 (신세계..⭐️)</p>
<br>
</li>
<li><h3 id="widget-buildbuildcontext-context-method"><code>Widget build(BuildContext context)</code> Method</h3>
<p>모든 widget은 렌더링되기 위해 자신만의 build 함수 정의 필요</p>
<blockquote>
<h4 id="💡-buildcontext-context-">💡 BuildContext context ?</h4>
<p>widget tree상에서 자신의 위치 정보를 담고 있는 객체로써,
주로 자신의 부모 widget에 접근하여 상호 작용한다.
(참고: <a href="https://velog.io/@rokwon_k/Flutter-Widget%EC%9D%98-%ED%83%80%EC%9E%85%EA%B3%BC-BuildContext">Flutter - Widget의 build메서드와 BuildContext</a>)</p>
</blockquote>
</li>
</ul>
<hr>
<h3 id="💭-이모저모">💭 이모저모</h3>
<p><img src="https://velog.velcdn.com/images/_jhkim/post/19f2089a-0bf3-48de-80ac-4d91c2b85f16/image.png" alt="뚱냥이 님 회고록"></p>
<p>위와 같은 <a href="https://velog.io/@ttungnyang2">뚱냥이</a> 님의 회고록에 감동받아 작성을 시작해본다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[VS Code] 유용한 VS Code Extentions & Settings]]></title>
            <link>https://velog.io/@_jhkim/VS-Code-Useful-VS-Code-Extentions-Settings</link>
            <guid>https://velog.io/@_jhkim/VS-Code-Useful-VS-Code-Extentions-Settings</guid>
            <pubDate>Sun, 17 Dec 2023 15:31:39 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>💡 이 글은 VS Code로 Flutter를 공부하며 알게된
Extention과 Setting을 정리한 글입니다. 
(a.k.a 큰 기능은 아니지만 없으면 허전한..)</p>
</blockquote>
<br>

<h2 id="extentions">Extentions</h2>
<ul>
<li><h3 id="better-comments">Better Comments</h3>
주석 종류에 따라 다른 서식을 적용하여 직관적으로 보여주는 Extension
<a href="https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments"><img src="https://velog.velcdn.com/images/_jhkim/post/2e444b5d-4e20-466b-8409-3ab84b7527f3/image.png" alt="Better Comments"></a></li>
</ul>
<br>

<ul>
<li><h3 id="error-lens">Error Lens</h3>
코드의 error를 명확히 확인 가능하도록 도와주는 Extension
<a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens"><img src="https://velog.velcdn.com/images/_jhkim/post/3498ba7f-1a74-4fa9-a10e-17e1c5abf3da/image.png" alt="Error Lens"></a></li>
</ul>
<br>

<ul>
<li><h3 id="material-icon-theme">Material Icon Theme</h3>
Explorer에 가독성 좋은 Icon을 적용하는 Extension
<img src="https://velog.velcdn.com/images/_jhkim/post/007e5209-5f82-4410-a8bd-f14af99f44f2/image.png" alt="Material Icon Theme"></li>
</ul>
<hr>
<h2 id="settings">Settings</h2>
<ul>
<li><h3 id="settingsjson">settings.json</h3>
Command Palette(⇧⌘P) -&gt; Open User Settings (JSON) -&gt; 하기 코드 추가<pre><code class="language-js">&quot;[dart]&quot;: {
&quot;editor.formatOnSave&quot;: true,  // 저장 시, 코드 자동 formatting
 ...
},
&quot;dart.previewFlutterUiGuides&quot;: true,  // widget의 부모/자식 관계 가이드라인 표시 (vscode 재시작 필요)
&quot;editor.codeActionsOnSave&quot;: {
  &quot;source.fixAll&quot;: true  // 저장 시, 코드 자동 fix
},</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dart] 기본 개념 정리🎯]]></title>
            <link>https://velog.io/@_jhkim/Dart-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@_jhkim/Dart-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 03 Dec 2023 15:58:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>💡 이 글은 _<strong>노마드코더</strong>_의 <a href="https://nomadcoders.co/dart-for-beginners/lobby">Dart 시작하기</a> 강의 내용을 토대로 정리한 글입니다.</p>
</blockquote>
<h5 id="dart만이-가진-최소한의-개념-및-문법을-정리하였으며-저를-포함한-dart-입문자에게-조금이나마-도움이-되었으면-합니다-피드백도-언제나-환영입니다🫰">Dart만이 가진 최소한의 개념 및 문법을 정리하였으며, 저를 포함한 Dart 입문자에게 조금이나마 도움이 되었으면 합니다. (피드백도 언제나 환영입니다!🫰)</h5>
<h6 id="강의-후기-필수-개념을-간단하고-쉽게-전달하는-무료-강의-영어로-진행되기-때문에-언어-공부까지-일석이조br물론-난-한글-자막-켜놓고-봤지만">강의 후기: 필수 개념을 간단하고 쉽게 전달하는 무료 강의! 영어로 진행되기 때문에 언어 공부까지 일석이조!<br>(물론 난 한글 자막 켜놓고 봤지만..)</h6>
<br>

<h1 id="1-variables">1. Variables</h1>
<table>
<thead>
<tr>
<th align="left">Keyword</th>
<th align="left">의미</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">var</td>
<td align="left">타입 미지정 및<br> 타입 변경 불가</td>
<td align="left">주로 함수 내 지역 변수로 사용</td>
</tr>
<tr>
<td align="left">dynamic</td>
<td align="left">타입 미지정 및<br> 타입 변경 가능</td>
<td align="left">되도록 쓰지 않는 것을 권장</td>
</tr>
<tr>
<td align="left">type + ?</td>
<td align="left">nullable 변수로 선언</td>
<td align="left"><em>&quot;Nullable variable&quot;</em> 설명 참고</td>
</tr>
<tr>
<td align="left">final</td>
<td align="left">데이터 변경 불가</td>
<td align="left">run-time에 값 지정</td>
</tr>
<tr>
<td align="left">const</td>
<td align="left">데이터 변경 불가</td>
<td align="left">compile-time에 값 지정</td>
</tr>
<tr>
<td align="left">late</td>
<td align="left">늦은 초기화 선언</td>
<td align="left">final이나 var 앞에 사용</td>
</tr>
</tbody></table>
<blockquote>
<h3 id="💡-nullable-variable-">💡 Nullable variable ?</h3>
<p>Dart의 모든 변수는 기본적으로 null값을 가질 수 없는 &quot;non-nullable&quot;이다.
이는 null값 참조로 인한 런타임 에러가 발생하지 않도록 하는 안전 장치가 된다.
하지만 경우에 따라 개발 시에 필요한 순간이 있을 것!
이 때 변수를 nullable하도록 선언하는 것이 “?” 키워드이다.</p>
</blockquote>
<hr>
<h4 id="예시-코드">예시 코드</h4>
<pre><code class="language-dart">String? name = &quot;developer&quot;;
name = null;  // null 대입 가능
name.length;  // null 참조 위험으로 error 발생
name?.length; // name이 null이 아니면 length 반환!</code></pre>
<br>

<h1 id="2-data-types">2. Data Types</h1>
<table>
<thead>
<tr>
<th align="left">Keyword</th>
<th align="left">의미</th>
<th align="left">메모</th>
</tr>
</thead>
<tbody><tr>
<td align="left">num</td>
<td align="left">int or double</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">List&lt; type &gt;</td>
<td align="left">데이터 컬렉션</td>
<td align="left">[ ]형태, 중복 가능</td>
</tr>
<tr>
<td align="left">Set&lt; type &gt;</td>
<td align="left">데이터 컬렉션</td>
<td align="left">{ }형태, 중복 불가능</td>
</tr>
<tr>
<td align="left">Map&lt; type, type &gt;</td>
<td align="left">{key:val}쌍의 데이터 컬렉션</td>
<td align="left">value의 type을 다양하게 사용 가능<br>(int, string, etc..)</td>
</tr>
</tbody></table>
<br>
<br>

<h1 id="3-functions">3. Functions</h1>
<ul>
<li><h4 id="-syntax">&quot;=&gt;&quot; syntax</h4>
<p>한 줄 짜리 함수라면 &quot;=&gt;&quot;를 통해 간결히 작성 가능하다.</p>
<pre><code class="language-dart">// 아래 두 함수는 동일한 의미
int add(int a + int b) { return a + b; }
int add(int a + int b) =&gt; a + b;</code></pre>
</li>
<li><h4 id="named-parameters">Named parameters</h4>
<p>함수 param을 선언한 이름에 따라 기입하는 방식이다.
(💡 <em>required: 함수 호출 시, 반드시 기입해야하는 매개변수로 지정하는 modifier</em>)</p>
<pre><code class="language-dart">void sayHello({required String name, required int age})
{
 print(&quot;Hello, my name is $name and I&#39;m $age.&quot;);
}

void main()
{
   sayHello(
     name: &quot;kim&quot;,
     age: 97
   );
}</code></pre>
<pre><code>&gt;&gt; Hello, my name is kim and I&#39;m 97.</code></pre></li>
<li><h4 id="qq-operator">QQ operator</h4>
<ol>
<li>left &quot;??&quot; right : left가 null이라면 right를, 아니라면 left를 반환</li>
<li>left &quot;??=&quot; right: left가 null이라면 right을 left에 대입<pre><code class="language-dart">// 1. ?? 
// name이 null이면 &quot;anonymous&quot;를,
// 아니면 대문자로 변환된 값을 반환
String capitalizeName(String? name) =&gt; name?.toUpperCase() ?? &quot;anonymous&quot;</code></pre>
<pre><code class="language-dart">// 2. ??= 
void main()
{
String? name;
name ??= &#39;kim&#39;;
name ??= &#39;another&#39;;    // null이 아니므로 대입 불가
print(name);
}</code></pre>
<pre><code>&gt;&gt; kim</code></pre></li>
</ol>
</li>
</ul>
<br>

<h1 id="4-classes">4. Classes</h1>
<ul>
<li><h4 id="constructor-positional">Constructor (Positional)</h4>
<pre><code class="language-dart">class Player
{
final String name;
int hp;

Player(this.name, this.hp);    // 생성자를 해당 형식으로 간단히 작성 가능
}

void main()
{
Player player = Player(&#39;kim&#39;, 100);
}</code></pre>
</li>
<li><h4 id="constructor-named">Constructor (Named)</h4>
<pre><code class="language-dart">class Player
{
final String name;
int hp;
String team;
int age;

// named parameter 적용
Player({
  required this.name,
  required this.hp,
  required this.team,
  required this.age
});

// team, hp는 기본값 지정
Player.createBluePlayer({required String name, required int age}) 
  : this.name = name, this.age = age, this.team = &#39;blue&#39;, this.hp = 0;
}

void main()
{
 Player player = Player(name: &#39;kim&#39;, hp: 100, team: &#39;red&#39;, age: 97);

 Player bluePlayer = Player.createBluePlayer(
   name: &#39;park&#39;,
   age: 98
);
}</code></pre>
</li>
<li><h4 id="cascade-notation-">Cascade Notation (&quot;..&quot;)</h4>
<pre><code class="language-dart">// class Player는 상단에 작성한 것으로 가정.
void main()
{
 Player player = Player(name: &#39;kim&#39;, hp: 100, team: &#39;one&#39;, age: 97)
 ..name = &#39;new&#39;    // player.name과 동일
 ..hp = 120000     // player.hp와 동일
 ..team = &#39;two&#39;;   // player.team과 동일. ;은 맨 마지막 라인에만 작성
}</code></pre>
</li>
<li><h4 id="enum">Enum</h4>
<pre><code class="language-dart">enum Team
{
red,
blue
}

class Player
{
final String name;
int hp;
Team team;   // String대신 enum 적용
int age;

...
}

void main()
{
 Player player = Player(
   name: &#39;kim&#39;, 
   hp: 100, 
   team: Team.red,    // &#39;red&#39;대신 enum 적용
   age: 97
 );
}</code></pre>
<ul>
<li><h4 id="abstract-class추상-클래스">Abstract class(추상 클래스)</h4>
<pre><code class="language-dart">abstract class Human
{
void walk();  // * C++의 순수 가상 함수 느낌
}
</code></pre>
</li>
</ul>
<p>class Player extends Human
{
void walk() { print(&quot;player is walking&quot;); }   // * 추상 클래스의 함수를 반드시 정의
}</p>
<pre><code></code></pre></li>
<li><h4 id="inheritance상속">Inheritance(상속)</h4>
<pre><code class="language-dart">abstract class Human
{
final String name;
Human({required this.name});

void sayHello() { print(&#39;Hello my name is $name&#39;); }
}

class Player extends Human  // &quot;extends&quot; 키워드로 상속
{
final Team team;
...

Player({required this.team, this.name}) 
  : super(name: name);  // * super(~)로 부모 클래스 생성자에 param 전달

@override
void sayHello() 
{ 
  super.sayHello();  // * super.으로 함수 접근 가능
  print(&quot;and I play for $team&quot;); 
}
}</code></pre>
</li>
<li><h4 id="mixins">Mixins</h4>
<p>Mixin은 생성자가 없는 클래스로, 다른 클래스에서 Mixin의 프로퍼티나 메소드를 가져와 사용할 수 있다. (상속은 ❌)</p>
<pre><code class="language-dart">class Strong
{
 const double strength = 96.129;
}

class Fast
{
 const double speed = 99.828;
}

class Player with Strong, Fast  // &quot;with&quot; 키워드로 선언
{
...
}
</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] 2023 Roadmap]]></title>
            <link>https://velog.io/@_jhkim/Flutter-Roadmap</link>
            <guid>https://velog.io/@_jhkim/Flutter-Roadmap</guid>
            <pubDate>Tue, 28 Nov 2023 14:54:08 GMT</pubDate>
            <description><![CDATA[<h4 id="✏️-personal-recommendation와-must-have를-기준으로-우선-진행해보기">✏️ &quot;Personal Recommendation&quot;와 &quot;Must have&quot;를 기준으로 우선 진행해보기</h4>
<h4 id="✏️-roadmapsh에서는-skill-완료-시-done-처리하여-진행률을-쉽게-파악하기">✏️ roadmap.sh에서는 skill 완료 시, Done 처리하여 진행률을 쉽게 파악하기</h4>
<hr>
<h3 id="roadmapsh">Roadmap.sh</h3>
<p><a href="https://roadmap.sh/flutter" title="2023 Flutter Roadmap_roadmap.sh"><img src="https://velog.velcdn.com/images/_jhkim/post/5fb944b2-ab3a-4970-a551-336c109af7e1/image.jpg" alt="2023 Flutter Roadmap from roadmap.sh"></a></p>
<br>

<hr>
<h3 id="oleksandr">Oleksandr</h3>
<p><a href="https://github.com/olexale/flutter_roadmap" title="2023 Flutter Roadmap_oleksandr"><img src="https://velog.velcdn.com/images/_jhkim/post/95f78230-309c-4e77-bbaf-3b7bf010f7db/image.png" alt="2023 Flutter Roadmap from Oleksandr"></a></p>
<blockquote>
<h3 id="reference">Reference</h3>
<p>개별 이미지 클릭 시 해당 링크로 이동</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>