<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>now-0o.log</title>
        <link>https://velog.io/</link>
        <description>게으른 사람 중에 제일 부지런하게 사는 사람이 꿈</description>
        <lastBuildDate>Fri, 11 Oct 2024 13:53:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>now-0o.log</title>
            <url>https://velog.velcdn.com/images/now-0o/profile/bac7d4df-fa9b-43f6-8ea7-c2b7efcf440e/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. now-0o.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/now-0o" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[flutter 첫 개발]]></title>
            <link>https://velog.io/@now-0o/flutter-%EC%B2%AB-%EA%B0%9C%EB%B0%9C</link>
            <guid>https://velog.io/@now-0o/flutter-%EC%B2%AB-%EA%B0%9C%EB%B0%9C</guid>
            <pubDate>Fri, 11 Oct 2024 13:53:54 GMT</pubDate>
            <description><![CDATA[<h2 id="첫-개발">첫 개발</h2>
<p>노마드 코더의 강의를 보며 환전 앱 메인 화면을 개발해 보았다.</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/fcc959b2-77e3-42b1-ad54-571823e4623c/image.png" alt=""></p>
<ul>
<li>Columns와 Rows의 구조</li>
<li>위젯의 개념</li>
<li>커스텀 위젯</li>
</ul>
<p>같은 개념을 익혔는데 이후에 따로 정리함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Hello Flutter]]></title>
            <link>https://velog.io/@now-0o/Hello-Flutter</link>
            <guid>https://velog.io/@now-0o/Hello-Flutter</guid>
            <pubDate>Tue, 08 Oct 2024 13:27:18 GMT</pubDate>
            <description><![CDATA[<h2 id="flutter">Flutter</h2>
<p>flutter는 native 코드와 다르게 직접 운영체제가 코드를 실행하지 않는다.</p>
<p>운영체제는 내가 짠 dart 코드를 컴파일하는 C#언어의 엔진을 실행한다.</p>
<p>그 엔진이 flutter의 dart 코드를 실행한다.</p>
<p>이러한 구조로 인해 flutter에서 만들어지는 ui들은 운영체제가 만들어낸 것이 아닌
flutter가 그려낸 가짜 ui이다.</p>
<p>그러므로 native에서 제공하는 ui의 디자인과는 다르지만 모든 픽셀에 접근할 수 있으며 다양한 애니메이션을 사용할 수 있는 것도 이 덕분이다.</p>
<h2 id="hello-flutter">Hello Flutter</h2>
<p>flutter는 모든 구조가 위젯으로 되어있고 어떤 것을 만들어도 위젯으로 만든다.
기본 구조로는 main과 App 위젯이 root라고 할 수 있다.</p>
<p>위젯은 class로 만들 수 있으며 SDK에 있는 4가지 위젯 중 하나를 상속 받고 build를 추가해야 위젯이 된다.
App 위젯에서는 build 후 <code>MaterialApp</code>(구글 디자인)과 <code>CupertinoApp</code>(ios 디자인) 중 하나를 리턴해야한다.</p>
<p>또한 home 안에 Scaffold로 구조를 잡아주어야한다.</p>
<pre><code class="language-dart">import &#39;package:flutter/material.dart&#39;;

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(&quot;Hello Flutter&quot;),
        ),
        body: Center(
          child: Text(&quot;Hello World!&quot;),
        ),
      ),
    );
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart class2]]></title>
            <link>https://velog.io/@now-0o/Dart-class2</link>
            <guid>https://velog.io/@now-0o/Dart-class2</guid>
            <pubDate>Mon, 07 Oct 2024 13:14:55 GMT</pubDate>
            <description><![CDATA[<h2 id="cascade-notation">Cascade Notation</h2>
<p>기본적으로 class property 변경하려면 아래와 같이 작성해야한다.</p>
<pre><code class="language-dart">class Player {
  String name;  // &#39;final&#39;을 제거
  int age;
  String country;

  Player({
    required this.name,
    required this.age,
    required this.country,
  });
}

void main() {
  var player1 = Player(name: &#39;jinjin&#39;, age: 25, country: &#39;seoul&#39;)

  player.name = &#39;geegee&#39;;
  player.age = 12;
}</code></pre>
<p>하지만 dart의 cascade notation을 사용하면 간단하게 접근하여 변경할 수 있다.</p>
<pre><code class="language-dart">class Player {
  String name;  // &#39;final&#39;을 제거
  int age;
  String country;

  Player({
    required this.name,
    required this.age,
    required this.country,
  });
}

void main() {
  var player1 = Player(name: &#39;jinjin&#39;, age: 25, country: &#39;seoul&#39;)
    ..name = &quot;jin&quot;    // 이제 &#39;name&#39;을 변경 가능
    ..age = 12
    ..country = &quot;jui&quot;;

  print(player1.name); // 출력: jin

  player1
    ..name = &quot;123&quot;;
}
</code></pre>
<h2 id="enum">Enum</h2>
<p>enum은 개발자가 코드를 실수하지 않도록 규정해주는 역할을 한다.</p>
<pre><code class="language-dart">enum Country { seoul, daegu } // 따옴표는 사용하지 않음

class Player {
  String name;  // &#39;final&#39;을 제거
  int age;
  Country country; // 타입은 String이 아닌 enum으로

  Player({
    required this.name,
    required this.age,
    required this.country,
  });
}

void main() {
  var player1 = Player(name: &#39;jinjin&#39;, age: 25, country: Country.daegu) // enum의 속성으로 설정
    ..name = &quot;jin&quot;    // 이제 &#39;name&#39;을 변경 가능
    ..age = 12
    ..country = &quot;jui&quot;;

  print(player1.name); // 출력: jin

  player1
    ..name = &quot;123&quot;;
}
</code></pre>
<h2 id="abstract-classes">Abstract Classes</h2>
<p>추상화 클래스는 직접 사용할 수 없고 내용이 없는 매서드를 구현하여 하위 클래스들이 해당 매서드를 반드시 구현하도록 강요한다.</p>
<pre><code class="language-dart">abstract class Animal {
  void makeSound(); // 추상 메서드: 소리를 내는 방법은 정해지지 않았음
}

class Dog extends Animal {
  @override
  void makeSound() {
    print(&#39;Bark&#39;); // Dog 클래스에서 소리를 내는 방법을 정의함
  }
}

class Cat extends Animal {
  @override
  void makeSound() {
    print(&#39;meow&#39;); // Cat의 소리
  }
}

void main() {
  var dog = Dog();
  dog.makeSound(); // 출력: Bark

  var cat = Cat();
  cat.makeSound(); // 출력: Meow
}</code></pre>
<h2 id="inheritance">Inheritance</h2>
<p>상속의 클래스에서 가장 중요한 개념으로 상속 받은 자식 클래스는 부모 클래스에 접근할 수 있게 된다.</p>
<pre><code class="language-dart">// 부모 클래스 정의
class Animal {
  String name;

  // 부모 클래스 생성자
  Animal(this.name) {
    print(&#39;Animal created: $name&#39;);
  }

  void makeSound() {
    print(&#39;$name makes a generic animal sound&#39;);
  }
}

// 자식 클래스 정의, Animal 클래스를 상속받음
class Dog extends Animal {
  int age;

  // 자식 클래스 생성자
  Dog(String name, this.age) : super(name) {
    print(&#39;Dog created: $name, Age: $age&#39;);
  }

  @override
  void makeSound() {
    super.makeSound();
    print(&#39;$name barks&#39;);
  }
}

void main() {
  var dog = Dog(&#39;Buddy&#39;, 3);
  dog.makeSound();  // 출력: Buddy barks
}</code></pre>
<p>이렇게 상속을 받아 같은 코드를 줄일수도, 부모 클래스의 기능을 확장하거나 변경할 수도 있다.</p>
<h2 id="mixin">mixin</h2>
<p>mixin은 dart의 기능 중 하나로, 다른 여러 클래스를 참조 할 수 있다.
mixin은 상속과 다른 개념으로 부모와 자식의 참조 관계가 아닌 단순히 mixin의 매서드를 가져온다는 개념으로 생각해야한다.</p>
<pre><code class="language-dart">// Mixin으로 사용할 클래스 정의
class CanFly {
  void fly() {
    print(&quot;I can fly!&quot;);
  }
}

// 다른 클래스에서 mixin 사용
class Bird with CanFly {
  void chirp() {
    print(&quot;Chirp chirp!&quot;);
  }
}

class Plane with CanFly {
  void engineSound() {
    print(&quot;Vroom vroom!&quot;);
  }
}

void main() {
  var bird = Bird();
  bird.chirp();       // 출력: Chirp chirp!
  bird.fly();         // 출력: I can fly!

  var plane = Plane();
  plane.engineSound(); // 출력: Vroom vroom!
  plane.fly();         // 출력: I can fly!
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart class1]]></title>
            <link>https://velog.io/@now-0o/Dart-class1</link>
            <guid>https://velog.io/@now-0o/Dart-class1</guid>
            <pubDate>Sun, 06 Oct 2024 12:42:09 GMT</pubDate>
            <description><![CDATA[<h2 id="class">Class</h2>
<p>일단 dart로 간단한 class를 만들어본다.</p>
<pre><code class="language-dart">class Player {
    final String name = &#39;jinjin&#39;;
    int age = 25;
    String country = &#39;seoul&#39;;
}

void main(){
    var player1 = Player();

    print(player1.name); // jinjin
}</code></pre>
<p>간단하게 player를 만들어주는 class를 만들었지만 모든 player가 같은 정보를 갖고 있을 것이다.</p>
<h2 id="constructors">Constructors</h2>
<p>이번엔 각각 다른 player가 될 수 있도록 생성자를 추가해본다.</p>
<pre><code class="language-dart">class Player {
    late final String name; // 변수의 값을 생성자로 나중에 할당하기 때문에 late를 사용
    late int age;
    late String country;

    Player(String name, int age, String country){
        this.name = name;
        this.age = age;
        this.country = country;
    }
}

void main(){
    var player1 = Player(&#39;jinjin&#39;, 25, &#39;seoul&#39;); // 생성자가 생겼기에 매개변수를 추가해준다.

    print(player1.name); // jinjin
}</code></pre>
<p>이렇게 생성자를 추가하여 각각 다른 정보의 player를 만들 수 있게 되었다.</p>
<p>dart는 여기서 조금 더 간결하게 작성할 수 있다.</p>
<pre><code class="language-dart">class Player {
    final String name;
    int age;
    String country;

    Player(this.name, this.age, this.country,);

}

void main(){
    var player1 = Player(&#39;jinjin&#39;, 25, &#39;seoul&#39;);

    print(player1.name); // jinjin
}</code></pre>
<p>이렇게 사용하면 late도 필요 없어지고 생성자도 간결해진다.</p>
<h2 id="named-constructor-parameters">Named Constructor Parameters</h2>
<pre><code class="language-dart">class Player {
    final String name;
    int age;
    String country;

    Player(this.name, this.age, this.country,);

}

void main(){
    var player1 = Player(&#39;jinjin&#39;, 25, &#39;seoul&#39;);

    print(player1.name); // jinjin
}</code></pre>
<p><code>var player1 = Player(&#39;jinjin&#39;, 25, &#39;seoul&#39;);</code>을 보면 매개변수로 받고 있는 값이 무엇을 뜻하는지 알기 힘들다.</p>
<p>이런 경우 함수와 똑같이 named 해주는 방법이 있다.</p>
<pre><code class="language-dart">class Player {
    final String name;
    int age;
    String country;

    Player({required this.name, required this.age, required this.country,});
    // null-safety를 위해 required 또는 defalut value를 명시해야한다.
}

void main(){
    var player1 = Player(name: &#39;jinjin&#39;, age: 25, country: &#39;seoul&#39;);
    // 매개변수마다 항목에 대한 명칭을 알 수 있다.
    print(player1.name); // jinjin
}</code></pre>
<h2 id="named-constructors">Named Constructors</h2>
<p>이번엔 대구사람을 생성하는 생성자를 만들어본다.</p>
<pre><code class="language-dart">class Player {
  final String name;
  int age;
  String country;

  Player({
    required this.name,
    required this.age,
    required this.country,
  });

  Player.makeDaegu({
    required String name,
    required int age,
  })  : this.name = name,
        this.age = age,
        this.country = &quot;deagu&quot;; // country를 매개변수로 초기화 하지 않는다.
}

void main() {
  // 명명된 매개변수로 전달
  var player1 = Player.makeDaegu(name: &#39;jinjin&#39;, age: 25);

  print(player1.name);  // 출력: jinjin
}</code></pre>
<p>매개변수로 초기화 하지 않기 때문에 makeDaegu 매서드에서는 <code>:</code> 을 사용해 초기화를 해주어야한다.</p>
<p>dart에서는 <code>:</code>을 사용하면 속성이 일괄 초기화 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart 함수2]]></title>
            <link>https://velog.io/@now-0o/Dart-%ED%95%A8%EC%88%982</link>
            <guid>https://velog.io/@now-0o/Dart-%ED%95%A8%EC%88%982</guid>
            <pubDate>Sun, 06 Oct 2024 11:29:53 GMT</pubDate>
            <description><![CDATA[<h2 id="optional-positional-parameters">Optional Positional Parameters</h2>
<p>dart의 함수에서 사용할 수 있는 또다른 기능이지만 주로 사용하지는 않는다.</p>
<p>매개변수에 대괄호로 감싸주면 되는데, 매개변수를 optional하게 지정해준다.</p>
<pre><code class="language-dart">String Hi (
    [name = &#39;jinjin&#39;];
) =&gt; &#39;Hello $name&#39;;

void main() {
    print(Hi()); // Hello jinjin
}</code></pre>
<p>defalut value와 다른 점은, 매개변수를 key: value 형식으로 입력하지 않아도 된다는 점</p>
<blockquote>
<p>defalut value &gt; Hi(name: &#39;jinjin&#39;);
Optional Positional Parameters &gt; Hi(&#39;jinjin&#39;);</p>
</blockquote>
<h2 id="-qq-operator">?? (QQ Operator)</h2>
<p>dart에서 null 값을 더 간결하게 비교해주는 오퍼레이터이다.</p>
<pre><code class="language-dart">String up(String? name) =&gt; name != null ? name.toUpperCase() : &#39;ANON&#39;;
// 이런 삼항 연산자를 아래와 같이 바꿀 수 있다.
String up(String? name) =&gt; name?.toUpperCase() ?? &#39;ANON&#39;;
// 좌항의 값이 null을 return 할 경우 우항을 return 한다.</code></pre>
<h2 id="-qq-equals">??= (QQ equals)</h2>
<p>변수의 값이 null일 경우에만 값을 할당하는 기능이다.</p>
<pre><code class="language-dart">void main(){
    String name;
    name ??= &#39;jinjin&#39;;
    name ??= &#39;jinjinjin&#39;;

    print(name); // jinjin;
}</code></pre>
<h2 id="typedef">typedef</h2>
<p>타입에 대한 명칭을 매핑한다라고 생각한다.</p>
<pre><code class="language-dart">List&lt;int&gt; reverseList(List&lt;int&gt; list) {
    var reversed = list.reversed;
    return reversed;
}

void main(){
  print(reverseList([1,2,3,4]));
}</code></pre>
<p>위와 같은 함수에 typedef를 사용하면 </p>
<pre><code class="language-dart">typedef IntList = List&lt;int&gt;;

IntList reverseList(IntList list) {
    var reversed = list.reversed;
    return reversed.toList();
}

void main(){
  print(reverseList([1,2,3,4]));
}</code></pre>
<p>이렇게 List<int>에 대한 명칭을 매핑하여 변경해줄 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart 함수]]></title>
            <link>https://velog.io/@now-0o/Dart-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@now-0o/Dart-%ED%95%A8%EC%88%98</guid>
            <pubDate>Fri, 04 Oct 2024 14:56:44 GMT</pubDate>
            <description><![CDATA[<h2 id="dart-함수">Dart 함수</h2>
<p>dart에서 함수 구조</p>
<pre><code class="language-dart">반환타입 함수명(파라미터){
 //함수내용
}</code></pre>
<p>함수가 한 줄 뿐이면 <code>fat arrow function</code>으로 간결하게 작성할 수도 있다.</p>
<pre><code class="language-dart">String func1(name) =&gt; &quot;my name is $name&quot;;</code></pre>
<h2 id="named-parameter">named parameter</h2>
<p>dart의 함수는 <strong>named parameter</strong>를 사용할 수 있다.</p>
<pre><code class="language-dart">String introduce(String name, int age, String country){
    return &quot;my name is $name, I&#39;m $age years old. I&#39;m from $country&quot;;
}</code></pre>
<p>라는 함수가 있다고 할 때, 사용자는 파라미터의 종류와 순서를 계속 기억하고 있어야 한다.</p>
<p>이런 불편함을 해결하기 위하여 named parameter를 사용한다.</p>
<pre><code class="language-dart">String introduce({String name, int age, String country}){
    return &quot;my name is $name, I&#39;m $age years old. I&#39;m from $country&quot;;
}

void main(){
    print(introduce(
        name : &quot;jinjin&quot;,
        age : 25,
        country : &quot;seoul&quot;,
    )); // 이렇게 named parameter를 사용하여 매개변수의 사용성을 높일 수 있다.
}</code></pre>
<p>하지만 dart는 null-safety가 적용되어 있어서 사용자가 파라미터를 작성하지 않았을수도 있음에 에러를 표시한다.</p>
<p>이를 해결하기 위해서는 두가지 방법이 존재한다.</p>
<h3 id="defalut-value">defalut-value</h3>
<p>첫번째는 매개변수의 기본 값을 지정하는 것이다.</p>
<pre><code class="language-dart">String introduce({
    String name = &quot;jinjin&quot;, 
    int age = 25,
    String country = &quot;seoul&quot;,
}){
    return &quot;my name is $name, I&#39;m $age years old. I&#39;m from $country&quot;;
}

void main(){
    print(introduce()); // 기본 값을 지정해두면 매개변수가 없어도 에러가 나지 않는다
    // my name is jinjin, I&#39;m 25 years old. I&#39;m from seoul
}</code></pre>
<h3 id="required">required</h3>
<p>두번째는 매개변수의 필수 값 지정을 하는 것이다.</p>
<pre><code class="language-dart">String introduce({
    required String name, 
    required int age,
    required String country,
}){
    return &quot;my name is $name, I&#39;m $age years old. I&#39;m from $country&quot;;
}

void main(){
    print(introduce()); // 필수 매개변수를 입력하지 않은 함수 사용은 에러를 발생한다.
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart 기초2]]></title>
            <link>https://velog.io/@now-0o/Dart-%EA%B8%B0%EC%B4%882</link>
            <guid>https://velog.io/@now-0o/Dart-%EA%B8%B0%EC%B4%882</guid>
            <pubDate>Fri, 04 Oct 2024 13:51:37 GMT</pubDate>
            <description><![CDATA[<h2 id="dart의-데이터-타입">Dart의 데이터 타입</h2>
<ul>
<li>String : &quot;안녕하세요&quot;</li>
<li>int : 123</li>
<li>double : 1.232</li>
<li>boolean : true/false</li>
<li>List : [1, 2, 3, 4]</li>
<li>Map : {key : value, key2 : value2}</li>
<li>Set  : {1, 2, 3, 4}</li>
</ul>
<p><strong>Dart</strong>의 데이터  타입은 모두 class로 이루어져 있어서 데이터 타입에 따라 Method를 자유롭게 사용할 수 있다.</p>
<h3 id="string">String</h3>
<p>문자열 타입.</p>
<pre><code class="language-dart">void main(){
    String a = &quot;hello&quot;;
}</code></pre>
<h3 id="int">int</h3>
<p>정수 타입.
소수점 불가능</p>
<pre><code class="language-dart">void main(){
    int a = 123;
}</code></pre>
<h3 id="double">double</h3>
<p>실수 타입.</p>
<pre><code class="language-dart">void main(){
    double a = 1.125424;
}</code></pre>
<h4 id="num">num</h4>
<p>int와 double 클래스를 살펴보면 둘 다 num을 참조하고 있다는 사실을 알 수 있다.</p>
<p>num은 int와 double의 부모 class로 int와 double 값을 모두 가질 수 있으나 잘 사용하지 않는다.</p>
<pre><code class="language-dart">void main(){
    num a = 12;
    a = 12.3232;
}</code></pre>
<h3 id="boolean">boolean</h3>
<p>논리 타입.</p>
<pre><code class="language-dart">void main(){
    boolean a = true;
    a = false;

    a = !a;
}</code></pre>
<h3 id="list">List</h3>
<p>리스트 형식으로 값을 담는다.</p>
<pre><code class="language-dart">void main(){
    List&lt;int&gt; numbers = [1, 2, 3, 4];
}</code></pre>
<p><code>List&lt;타입&gt; 리스트 = [값, 값]</code> 또는 <code>var 리스트 = [값, 값]</code> 으로 선언하며
여러타입을 넣고 싶다면 <strong>object</strong> 타입을 넣으면 된다.</p>
<p>리스트의 마지막 값에도 <code>,</code>를 넣으면 dart가 알아서 정렬을 해준다.</p>
<pre><code class="language-dart">void main(){
    List&lt;int&gt; a = [1, 2, 3, 4]; // 정렬 안됨
    List&lt;int&gt; b = [
        1,
        2,
        3,
        4,
    ];
}</code></pre>
<p><strong>collection if</strong> 라는 기능으로 조건문으로 list에 값을 넣을 수 있다.</p>
<pre><code class="language-dart">void main(){
    boolean chk = true;
    List&lt;int&gt; a = [
        1,
        2,
        3,
        4,
        if(chk) 5,
    ];
    print(a); // [1, 2, 3, 4, 5];

    boolean chk = true;
    List&lt;int&gt; b = [
        1,
        2,
        3,
        4,
        chk ? 6 : 5,
    ];
    print(b); // [1, 2, 3, 4, 6]; // 삼항 연산자도 잘 적용된다.
}</code></pre>
<p><strong>collection for</strong> 라는 기능으로 list 재가공도 간편하게 할 수 있다.</p>
<pre><code class="language-dart">void main(){
    List&lt;int&gt; a = [1, 2, 3, 4]; // 정렬 안됨
    List&lt;int&gt; b = [
        1,
        2,
        3,
        4,
        for(var num in a) a
    ];

    print(b); // [1, 2, 3, 4, 1, 2, 3, 4]
}</code></pre>
<p><strong>String Interpolation</strong> 라는 기능을 사용하여 문자열 사이에 변수를 넣을 수 있다.
<code>$+변수</code>으로 넣으면 된다.</p>
<p><code>${변수}</code> 구조로 변수를 재가공할 수도 있다.</p>
<pre><code class="language-dart">void main(){
    String name = &quot;jinjin&quot;;

    print(&quot;hello! my name is $name&quot;); // hello! my name is jinjin

    int num = 1;

    print(&quot;one plus one equals ${num+1}&quot;); // one plus one equals 2
}</code></pre>
<h3 id="map">Map</h3>
<p>key와 value로 이루어진 타입.</p>
<pre><code class="language-dart">void main(){
    Map&lt;int, boolean&gt; temp = {1: true, 2: false};
}</code></pre>
<h3 id="set">Set</h3>
<p>List와 구조는 동일하지만 Set의 값들은 유니크하다.</p>
<pre><code class="language-dart">void main(){
    Set&lt;int&gt; temp = {1, 2, 3};

    temp.add(1);
    temp.add(2);

    print(temp); // 1, 2, 3, 1, 2가 아닌 1, 2, 3이 출력된다.
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dart 기초1]]></title>
            <link>https://velog.io/@now-0o/Dart-%EA%B8%B0%EC%B4%881</link>
            <guid>https://velog.io/@now-0o/Dart-%EA%B8%B0%EC%B4%881</guid>
            <pubDate>Wed, 02 Oct 2024 13:48:33 GMT</pubDate>
            <description><![CDATA[<h2 id="변수-선언">변수 선언</h2>
<p>Dart에서는 두가지로 변수를 선언할 수 있다.</p>
<pre><code class="language-dart">void main(){
    String name = &#39;jinjin&#39;;
    var age = 12;
}</code></pre>
<p><code>타입 + 변수명</code> 으로 선언할 수도 있으며
<code>var + 변수명</code> 으로 선언할 수도 있다.</p>
<p>Dart의 스타일 가이드에 따르면 <strong>메소드나 함수내의 지역변수</strong>는 var를 사용하는걸 권장하며
<strong>class나 properties</strong>엔 타입명으로 선언하는 게 좋다.</p>
<p>Dart는 타입을 추론할 수 있으며 한번 선언한 타입외의 변수값으로 재지정할 수는 없다.</p>
<pre><code class="language-dart">void main(){
    String name = &#39;jinjin&#39;;
    name = &#39;dongdong&#39;; // 가능

    var age = 12;  // dart가 알아서 int 타입을 추론해준다.
    age = true; // int 타입에서 boolean 타입으로 변환 시 에러가 발생한다.
}</code></pre>
<h2 id="dynamic-타입">dynamic 타입</h2>
<p>Dart에서는 타입을 지정하지 않아도 되는 <strong>dynamic</strong> 타입으로 변수를 선언할 수 있다.
이 dynamic 타입은 정말 필요할때만 사용이 권장되며 웬만해선 사용하지 않는 것이 좋다.</p>
<pre><code class="language-dart">void main(){
    var name; // var로 변수를 선언할 때 값을 지정하지 않으면 dynamic으로 지정가능
    dynamic time = 12; // dynamic으로 변수 선언

    name = &#39;jinjin&#39;;
    name = 123;
    name = true;
    time = &quot;12시 30분&quot;;
    //어떤 타입으로 설정해도 오류가 나지 않는다.

    if(name is String){
        // 이렇게 if문으로 dynamic변수의 타입을 잡아주면 dart가 해당 타입의 속성을 잡아준다 (name.length 등)
    }
}</code></pre>
<h2 id="null-safety">null safety</h2>
<p>Dart의 변수들은 기본적으로 <strong>nullable</strong>이 아니다. 즉, null값을 허용하지 않는다.</p>
<pre><code class="language-dart">void main(){
    String name = null; // 에러발생
}</code></pre>
<p>하지만 타입뒤에 ?를 붙힌다면 Dart는 해당변수가 null일 수도 있다는 즉 <strong>nullable</strong>이 허용된다.</p>
<pre><code class="language-dart">void main(){
    String? name = null;
}</code></pre>
<p>또한 Dart가 해당 변수는 null일 수 있음을 알기에 컴파일러가 에러를 미리 찾아준다.</p>
<pre><code class="language-dart">void main(){
    int count(String word) =&gt; word.length;

    count(null); // 컴파일러가 에러를 잡아내진 못하고, null값에 length를 접근하니 런타임 에러가 발생한다.
}</code></pre>
<pre><code class="language-dart">void main(){
    int count(String? word) =&gt; word.length; // null일 수 있는 값에 length를 구하니 에러가 발생한다.

    count(null);
}</code></pre>
<p>변수를 nullable로 허용한 뒤에는 null이 아닐 때를 구분하여 속성에 접근해야한다.</p>
<pre><code class="language-dart">void main(){
    String? a = null;

    if(a != null){
        print(a.length);
    }
    // 또는
    print(a?.length); // a가 null이 아닐때만 length를 구하는 축약어
}</code></pre>
<h2 id="final">final</h2>
<p><strong>final</strong>은 javascript나 typescript로 따졌을 때,  <strong>const</strong>와 비슷한 상수이다.
const와 마찬가지로 값을 재 할당이 불가능하다.</p>
<pre><code class="language-dart">void main(){
    final a = &quot;1&quot;;
    a = &quot;2&quot;; // 같은 타입으로 재 할당하더라도 에러 발생
}</code></pre>
<h2 id="const">const</h2>
<p><strong>const</strong> 역시 상수지만, javascript나 typescript와는 다른 특징을 가진다.
<code>compile-time constant</code>로서 컴파일 시 값을 알고 있어야 하는 상수이다.</p>
<p>컴파일 이후 api를 받아오는 경우나 사용자의 입력 값을 지정하는 경우엔 const대신 final을 사용해야한다.</p>
<h2 id="late">late</h2>
<p>var, final, const에는 late를 붙힐 수 있는데, late를 사용하면 값을 나중에 할당해도 된다.
물론 값은 한번만 할당이 가능하다.</p>
<pre><code class="language-dart">void main(){
    late final a;
    a = &quot;2&quot;; // 에러 발생 안함
}</code></pre>
<p>late final은 api를 호출하여 값을 받아올 때 가장 유용하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter란]]></title>
            <link>https://velog.io/@now-0o/Flutter%EB%9E%80</link>
            <guid>https://velog.io/@now-0o/Flutter%EB%9E%80</guid>
            <pubDate>Tue, 01 Oct 2024 14:08:01 GMT</pubDate>
            <description><![CDATA[<h2 id="flutter란">Flutter란?</h2>
<p><strong>Flutter</strong>는 구글에서 개발한 <strong>크로스 플랫폼 모바일 앱 개발 프레임 워크</strong>이다.
Flutter를 사용하여 고품질, 고성능의 ios, Android의 앱이나 웹을 하나의 단일 코드로 개발할 수 있다.</p>
<p>크로스 플랫폼을 이용하면 ios와 Android를 개발하는 개발자를 별도로 두지 않아도 되며,
유지보수 또한 간편해진다.</p>
<p>현재 크로스 플랫폼을 이용한 모바일 프레임 워크로는 구글의 <strong>Flutter</strong>와 페이스북의 <strong>react native</strong>가 있다.</p>
<h2 id="dart">Dart</h2>
<p><strong>Flutter</strong>는 다른 언어와 다르게 <strong>Dart</strong>라는 언어를 사용하여 개발한다.
C#, Java, TypeScript와 흡사하여 기존에 하나라도 숙지한 언어가 있다면 쉽게 접근이 가능하다.</p>
<h2 id="flutter의-장점">Flutter의 장점</h2>
<h4 id="1-핫-리로드">1. 핫 리로드</h4>
<p>코드 수정 후 어플을 다시 실행하지 않아도 수정사항이 바로 반영되어 확인이 가능하다.</p>
<h4 id="2-크로스-플랫폼">2. 크로스 플랫폼</h4>
<p>하나의 코드로 안드로이드와 ios 모두 개발이 가능하다.</p>
<h4 id="3-디자인">3. 디자인</h4>
<p>안드로이드와 ios의 기본적인 디자인을 제공하기 때문에 각 플랫폼 디자인 가이드에 맞는 화면을 그릴 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[달디 프로젝트2]]></title>
            <link>https://velog.io/@now-0o/%EB%8B%AC%EB%94%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82</link>
            <guid>https://velog.io/@now-0o/%EB%8B%AC%EB%94%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82</guid>
            <pubDate>Thu, 04 Apr 2024 15:39:15 GMT</pubDate>
            <description><![CDATA[<h3 id="변경사항들">변경사항들</h3>
<p>목요일 밤 피곤한 몸을 이끌고 많은 오류들과 싸운 나를 위해 패치노트식으로 작성하게씀,,</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/7a87c3cb-ff28-4901-9157-e9b8520fe582/image.png" alt=""></p>
<ol>
<li>사용자 요구사항에 맞춰 탭 추가.</li>
<li>삭제 시 선택 모드 해제되도록 편의성 추가</li>
<li>사용하지 않는 필터버튼 삭제</li>
<li>삭제 시 입력 폼 초기화 되도록 편의성 개선</li>
<li><strong>테마 색 변경 기능 추가</strong><blockquote>
<p>이스터 에그로 테마색 변경 기능을 추가하였다.
단 한명만 사용할 수 있도록..
<img src="https://velog.velcdn.com/images/now-0o/post/6f805854-e8e3-4e6c-a3f7-c01d1e0c9321/image.png" alt="">
일정 조건이 충족된 후 로고를 클릭하면 테마색 변경이 가능한 colorPicker를 추가했다.
선택한 색상 값은 rgba로 데이터베이스에 저장되어 반영된다.</p>
</blockquote>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[달디 프로젝트]]></title>
            <link>https://velog.io/@now-0o/%EB%8B%AC%EB%94%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@now-0o/%EB%8B%AC%EB%94%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Mon, 18 Mar 2024 08:05:30 GMT</pubDate>
            <description><![CDATA[<h3 id="달디">달디</h3>
<blockquote>
<p>( 출근 &gt; 회사에서 개발 &gt; 퇴근 &gt; 집에서 개발 ) ;;</p>
</blockquote>
<p>프론트는 React를 사용했고 백엔드는 Node를, DB는 mysql를 사용하여 혼자 설계부터 개발 후 배포까지 해보았다..</p>
<p>혼자 급하게 만들다 보니 프론트에서 state를 여러 컴포넌트에서 정신없이 선언한 점, 백엔드에서
라우트 파일을 나누지 않고 app.js에 몰아쓴 점 등 리팩토리해야할 부분이 아직 많다.</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/ea037b2b-786f-4714-b5ae-62de92510191/image.png" alt=""></p>
<h3 id="달디가-뭔데">달디가 뭔데</h3>
<p>사실 거창한 서비스는 아니고 그냥 기본적인 CRUD를 사용해 게시판을 입맛에 맞게 제작한 것 뿐이긴 하다. 그래도 나름 완성한 기념으로 별거 아닌 기능을 나열해보자면</p>
<ul>
<li>게시글 등록 기능</li>
<li>게시글 수정 기능</li>
<li>게시글 삭제 기능</li>
<li>탭 구분 기능</li>
<li>상태별 태그 기능</li>
<li>선택, 일괄 삭제 기능</li>
<li>키워드 검색 기능</li>
</ul>
<p>요정도 게시판 알차게 구성해보았다.</p>
<h3 id="배포">배포..!</h3>
<p>사실 개발 자체는 늘 하던 일이기에 그렇게 어렵진 않았지만 실제로 배포를 해보는 건 처음이였다..
백엔드와 데이터베이스는 <strong>AWS EC2</strong>를 이용하고 <strong>탄력적 IP</strong>도 한번 적용해 보았다 ㅎ
공부한 걸 직접 프로젝트에 적용해보니 또 다른 재미와 성취감이 느껴짐</p>
<p>프론트는 나름의 도메인을 적용하여 사용자가 접속하기 편하게 만들려고 <strong>netlify</strong>를 사용하여 배포했다.
그런데..</p>
<h3 id="배포중-생긴-이슈">배포중 생긴 이슈</h3>
<p>EC2로 배포한 서버로 로컬에서 API 요청을 보내면 응답이 잘 왔는데 싱글벙글 프론트 배포 후 netlify 링크로 접속하니 API 응답이 없는 것이 아닌가..</p>
<p>무슨 문제인지 찾아내고 대체법을 찾아내기까지 구글에 나오는 각종 사이트를 전부 조회했다.</p>
<blockquote>
<p>아마 이 날 구글 사용량에 순위에 내가 있지 않을까..</p>
</blockquote>
<h3 id="그리고-해결">그리고 해결</h3>
<p>API 요청이 실패한 이유는 바로 netlify는 <strong>HTTPS</strong>를, EC2는 <strong>HTTP</strong>를 사용하기 때문..
이 방법을 해결하기 위해 다양한 방법을 찾아봤는데 다행히 같은 상황을 겪은 한분이 블로그에 해결법을 적어주셨다. </p>
<p><a href="https://velog.io/@jiheon788/Netlify%EC%97%90%EC%84%9C-HTTPS-HTTP-%ED%86%B5%EC%8B%A0-%ED%95%B4%EA%B2%B0-%EA%B3%BC%EC%A0%95"><strong>해결법을 주신 분의 벨로그. 다시한번 감사의 말씀을</strong></a></p>
<blockquote>
<p><strong>&quot;리다이렉트 경로를 설정하여 모든 요청을 브라우저에서 추가로 연결하지 않고, CDN서버에서 바로 프록시 시키는 방식을 사용해 서버와 통신을 가능하게 하는 것입니다.&quot;</strong></p>
</blockquote>
<p>라고 작성해주셨는데 정확히 이해하지는 못했다. 후에 실제로 어떻게 작동하는 것인지도 찾아봐야겠음</p>
<hr>
<p>이렇게 작은 프로젝트 하나를 직접 해보았는데 부족함을 많이 느끼고 간다..
다음은 협업 프로젝트에 참여하여 많은 이슈 만나보려고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240304 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240304-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240304-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Mon, 04 Mar 2024 12:54:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/4ea37161-20d7-41c4-af15-58a1322d4aac/image.png" alt=""></p>
<p>공부 시작</p>
<blockquote>
<p>오늘은 잠을 거의 못자고 일하고 온 상태라 최대한 컨디션이 되는만큼 공부해봄..</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/456bf201-d0a9-4c4a-89ae-0e8591b8729a/image.png" alt=""></p>
<p>공부 끝</p>
<blockquote>
<p>타입스크립트로 마이그레이션 해볼려고 시도중인데 잘되지 않음..</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240303 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240303-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240303-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Sun, 03 Mar 2024 05:27:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/b8ae0f62-8c3e-43bc-ab6a-b16bd48a7295/image.png" alt=""></p>
<p>공부 시작</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/3619f25f-9009-4ef5-ab5f-064adc3c9632/image.png" alt=""></p>
<p>중간 휴식</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/b2d53b7d-0425-4dc2-a94b-eefed1393f97/image.png" alt="">
매칭 불러오기 시 5건 이상이면 5건까지만 보여주며 <code>더보기</code> 추가
추가사항 : <code>더보기</code> 클릭 시 남은 매칭 기록까지 보여주기, 가독성 향상을 위해 시간 제거/챔피언 이미지로 보여주기, 게임 승패도 추가하기</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/0719d4a1-39e3-4c11-9bff-acb329e4a412/image.png" alt=""></p>
<p>다시 시작</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/69e56257-b975-481a-9ff0-4fce5880777a/image.png" alt="">
매칭 불러오기 가독성 향상을 위해 channel에 send하는 구조 변경, 이미지 추가, 승패 추가</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/996a7452-e5b4-48b2-bfc3-638c7b1047dd/image.png" alt=""></p>
<p>공부 끝</p>
<hr>
<p>더보기 기능 좀 만들면서 이제 타입스크립트로 변환해봐야된다..
연휴에 좀 해볼려했는데 너무 놀기만한 내가 밉다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[캡슐화]]></title>
            <link>https://velog.io/@now-0o/%EC%BA%A1%EC%8A%90%ED%99%94</link>
            <guid>https://velog.io/@now-0o/%EC%BA%A1%EC%8A%90%ED%99%94</guid>
            <pubDate>Fri, 01 Mar 2024 12:32:41 GMT</pubDate>
            <description><![CDATA[<h3 id="캡슐화">캡슐화?</h3>
<p>캡슐화는 객체와 메서드는 한곳에 묶어서 외부에서 직접적으로 접근하지 못하도록 막는 것.</p>
<blockquote>
<p>전에 공부한 getter와 setter도 캡슐화의 일부가 아닐까 싶다.</p>
</blockquote>
<p><strong>캡슐화를 하는 이유?</strong>
위에 말한 것처럼 외부에서 객체의 값에 직접적으로 접근하지 못하여 정보 은닉에 도움을 주고, 코드의 유지보수와 재사용성을 향상시키기 위해서이다.</p>
<blockquote>
<p><strong>왜 유지보수와 재사용성이 향상되나?</strong>
보안에 도움이 되는 것은 알겟지만 왜 유지보수와 재사용성이 향상되는지는 한번에 이해가 되지 않았는데 직접 코드와 연관지어 생각해보니 이해가 쉽다.</p>
</blockquote>
<pre><code class="language-typescript">export class Account {
  private readonly accountNum: string;
  private readonly accountHolder: string;
  private balance: number = 0;
  constructor(accountNum: string, accountHolder: string) {
    this.accountNum = accountNum;
    this.accountHolder = accountHolder;
  }
  public getAccountNum(): string {
    return this.accountNum;
  }
  public deposit(money: number): void {
    this.balance += money;
  }
  public withdraw(money: number): void {
    this.balance -= money;
  }
  public getAccountNumber(): string {
    return this.accountNum;
  }
  public getBalance(): number {
    return this.balance;
  }
}
const account = new Account(&quot;1234567891234&quot;, &quot;wooje&quot;);
// 3만원 입금
account.deposit(30000);
// 1만원 인출
account.withdraw(10000);
// 잔액 조회하기
console.log(`잔액 : ${account.getBalance()}`);</code></pre>
<p>위의 코드를 보면 Account 클래스의 계좌번호나 예금주, 잔액에 외부에서 직접적으로 접근을 못하기 때문에 내부 속성이 바뀔일은 없다. 그렇기때문에 다른 코드에서도 Account 클래스에서 선언한 메서드를 코드를 수정할 필요없이 재사용할 수 있으면 유지보수가 간편하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240301 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240301-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240301-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Fri, 01 Mar 2024 06:52:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/de1efcc8-90ef-4556-955e-e264b9ff3138/image.png" alt=""></p>
<p>공부 시작</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/62ce3f9e-6a8c-4362-a784-1e0f5084d424/image.png" alt=""></p>
<p>중간 휴식</p>
<blockquote>
<p>getter와 setter 공부 및 정리
이따가 캡슐화 공부 예정</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/3a200e5b-ce42-42e3-9b42-2ebd2458b49c/image.png" alt=""></p>
<p>다시 시작</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/9873e634-e515-4bd3-970b-6064fd527dd9/image.png" alt=""></p>
<p>공부 끝</p>
<blockquote>
<p>캡슐화 정리 완료!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[getter와 setter 메서드]]></title>
            <link>https://velog.io/@now-0o/getter%EC%99%80-setter-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@now-0o/getter%EC%99%80-setter-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Fri, 01 Mar 2024 06:40:59 GMT</pubDate>
            <description><![CDATA[<h3 id="getter와-setter">getter와 setter</h3>
<p>하나의 메서드로서 <strong>getter</strong>는 객체의 속성을 반환하고, <strong>setter</strong>는 객체의 속성을 설정하거나 변경한다.</p>
<pre><code class="language-javascript">const me = {
 age : 26,
 name : &quot;now_0o&quot;
}

console.log(me.name); // &quot;now_0o&quot;
me.name = &quot;wooje&quot;;</code></pre>
<p><strong>getter</strong>와 <strong>setter</strong>를 사용하면 이렇게 객체에 대해 직접적으로 접근하지 않고 get과 set 메서드를 통해 해당되는 속성에만 접근하도록 제한을 할 수 있다.</p>
<pre><code class="language-javascript">const me = {
 age : 26,
 name : &quot;now_0o&quot;,

 getName(){
   return me.name;
 },

 setName(newName){
     me.name = newName;
 }
}

console.log(getName()); // &quot;now_0o&quot;
setName(&quot;wooje&quot;);</code></pre>
<hr>
<h3 id="getter와-setter를-사용하는-이유">getter와 setter를 사용하는 이유</h3>
<p>처음으로 예를 든 코드와 getter와 setter를 사용한 코드가 작동과정도 똑같고 오히려 메서드를 선언하는 과정에서 코드가 늘어나보이는데 도대체 왜 사용하는 것일까?</p>
<p>첫번째로 getter와 setter를 사용하여 객체에 직접적으로 접근을 하지않아 필요한 정보만 보여줄 수 있다. 즉 다른 정보를 숨길 수 있어 <code>보안</code>을 강화할 수 있다.
두번째로 원하지 않는 값이 담기는 것을 방지 할 수 있다.</p>
<pre><code class="language-javascript">const me = {
 age : 26,
 name : &quot;now_0o&quot;,

 getName(){
   return me.name;
 },

 setName(newName){
       if(typeof newName !== &#39;string&#39;){
      console.log(&quot;이름은 문자만 설정 가능합니다.&quot;);
      return;
    }
     me.name = newName;
 }
}</code></pre>
<p>위와 같이 이름에 문자열이 아닌 다른 타입의 데이터가 들어가는 것을 막을 수 있다.</p>
<hr>
<h3 id="get과-set">get과 set</h3>
<p>ES6부터는 get과 set을 이용해 getter와 setter를 더 간단하게 선언할 수 있다.
get과 set을 이용해 선언한 메서드는 접근 시 기존 속성에 접근할 때와 같은 방식으로 접근하는데
직접적으로 속성에 접근하는 것이 아닌 가상의 프로퍼티는 생성하여 접근하는 방식이다.</p>
<pre><code class="language-javascript">const me = {
 age : 26,
 name : &quot;now_0o&quot;,

 get myName(){
   return me.name;
 },

 set myName(newName){
       if(typeof newName !== &#39;string&#39;){
      console.log(&quot;이름은 문자만 설정 가능합니다.&quot;);
      return;
    }
     me.name = newName;
 }
}

console.log(myName()); // X
console.log(me.myName); // O
me.Myname = &quot;wooje&quot;;</code></pre>
<hr>
<h3 id="주의">주의</h3>
<p>setter의 데이터 프로퍼티와 접근자 프로퍼티의 값이 동일하면 무한루프에 빠지게 되니 주의.</p>
<pre><code class="language-javascript">const me = {
 age : 26,
 name : &quot;now_0o&quot;, // 데이터 프로퍼티

 get myName(){
   return me.name;
 },

 set name(newName){ // 접근자 프로퍼티
       if(typeof newName !== &#39;string&#39;){
      console.log(&quot;이름은 문자만 설정 가능합니다.&quot;);
      return;
    }
     me.name = newName;
 }
}

me.name = &quot;wooje&quot;; // 무한루프</code></pre>
<p><img src="https://velog.velcdn.com/images/now-0o/post/848160fe-fcf6-4bf2-88e2-820164f9b292/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240229 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240229-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240229-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Thu, 29 Feb 2024 10:53:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/2a813be2-dd8c-49f2-9574-3238a42d4b8e/image.png" alt=""></p>
<p>공부 시작</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/66abeb85-cc43-40c1-86d7-612496817f68/image.png" alt=""></p>
<p>중간 휴식</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/223f740d-bc52-4cda-b296-08bf9344c5c0/image.png" alt="">
매칭기록 슬래시 커맨드 사용 시 시간, 게임타입, KDA, 챔피언 불러오기.
추가사항 : 현재 최근 5개까지만 조회하는데 더보기 클릭 시 다음 기록 조회하도록 추가</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240228 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240228-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240228-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Wed, 28 Feb 2024 11:03:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/a074b3d9-4b29-4f52-9362-5eebf4f32650/image.png" alt=""></p>
<p>공부 시작</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/298ef8fe-67df-4c59-a76b-35a44663c7f5/image.png" alt=""></p>
<p>공부 휴식</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/8801da24-4d88-4e66-95a5-6365ffc182ef/image.png" alt=""></p>
<p>추가 공부</p>
<blockquote>
<p>오늘 좀 피곤해서 멍도 많이 떄리고 시간 대비 뭘 많이하진 못했다..
매칭기록 조회 시 game테이블와 player테이블 include해서 데이터 조회
이제 embed로 조합해서 뿌리기만 남음</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240227 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240227-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240227-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Tue, 27 Feb 2024 11:03:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/593abacc-cbb0-4291-b9ef-1c186347f6d7/image.png" alt=""></p>
<p>공부 시작</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/2cde01ce-4270-4d3a-81ee-9371713ea466/image.png" alt=""></p>
<p>공부 휴식</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/4064ef47-cadf-48d4-8639-7b81243cd087/image.png" alt="">
매칭불러오기 시 API 최대 요청횟수에 걸리지 않도록 2분의 쿨타임 적용
(캡쳐본은 테스트를 위해 3분으로 측정함)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/e55cd8e8-8900-4837-8e04-0718463dee9f/image.png" alt=""></p>
<p>또 시작 공부시간 캡쳐 못함..</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/b5ff84a8-319c-46b8-af00-583d9d00885e/image.png" alt="">
매칭기록 슬래시 커맨드 사용 시 기본 틀까지 제작
추가사항 : 테이블 조회해서 같이 게임 수, 각 게임의 종류와 승패, 해당 유저의 kda까지 조회</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[20240226 공부기록]]></title>
            <link>https://velog.io/@now-0o/20240226-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</link>
            <guid>https://velog.io/@now-0o/20240226-%EA%B3%B5%EB%B6%80%EA%B8%B0%EB%A1%9D</guid>
            <pubDate>Mon, 26 Feb 2024 11:08:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/now-0o/post/0bbc3331-d26e-44cb-b42a-20e060da04a8/image.png" alt=""></p>
<p>공부기록</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/a0104615-e1c6-45f3-a1a9-907d804a7a49/image.png" alt=""></p>
<p>공부 끝은 아니고 잠깐 정지</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/b728253b-c69a-4482-8807-ed2ca8f65a00/image.png" alt="">
추가 공부 더 했는데 시간 캡쳐를 안했네</p>
<p><img src="https://velog.velcdn.com/images/now-0o/post/0f228943-1a51-48e8-97b9-574962bf130a/image.png" alt=""></p>
<p>공부 끝</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/now-0o/post/f8126d01-abb7-4ac7-960f-cbbbf93d1249/image.png" alt="">
<img src="https://velog.velcdn.com/images/now-0o/post/cefd366b-60d7-4af5-88f5-930c92c71486/image.png" alt="">
/매칭업데이트로 게임 정보 저장. 등록 건수 10건당 1초 대기. (데이터베이스에 존재하는 건은 제외) 10건마다 진행 상황 확인 가능
<br>추가사항 : 3분에 한번만 불러올 수 있도록 추가, 저장한 데이터로 매칭기록 조회 커맨드 추가</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>