<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>JUNE BEOM LEE</title>
        <link>https://velog.io/</link>
        <description>Javascript(Typescript), JAVA(Kotlin), Python, Dart</description>
        <lastBuildDate>Mon, 13 Feb 2023 00:54:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. JUNE BEOM LEE. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/creat_bliv" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[프리온보딩
프론트엔드 인턴십]]></title>
            <link>https://velog.io/@creat_bliv/pre-onboarding-frontend-internship</link>
            <guid>https://velog.io/@creat_bliv/pre-onboarding-frontend-internship</guid>
            <pubDate>Mon, 13 Feb 2023 00:54:36 GMT</pubDate>
            <description><![CDATA[<h3 id="지원하고-싶은-참가-기업은-어디인지"><strong>지원하고 싶은 참가 기업은 어디인지</strong></h3>
<p>문제 해결 능력에 관점에서 개발 뿐만이 아니라 UI/UX 디자인에도 흥미를 느끼고 있어서 미디어 콘텐츠와 관련된 기업에 참여하고 싶습니다. 다른 분야의 분들과 협업하면서 좋은 결과를 제공하기 위해서 백엔드와 디자인의 요소들 까지 고려하고 배우고 있습니다.</p>
<h3 id="프리온보딩-인턴십에서-본인이-얻고-싶은-것"><strong>프리온보딩 인턴십에서 본인이 얻고 싶은 것</strong></h3>
<p>클린 코드는 기능을 구현하는 앞의 20%의 단계가 나머지 80%의 단계를 좌우한다고 합니다. 프로젝트를 시작하기 앞서 CRM 마켓팅의 원리에 따라 소비자가 원하는 기능이 무엇인지 파악하여 목적에 맞게 코드를 작성하는 가장 효율적인 디자인 패턴과 아키텍처에 대해서 배우고 싶습니다. 선별 과제에서도 단순히 기능을 구현하는 것만이 아니라 이후에 새로운 기능을 추가하거나 수정해야하는 사항이 필요할 때를 고려하여 단일 책임의 원칙을 지켜 작성하려고 노력했습니다. 이를 위해서 앞으로 리액트의 심화적인 동작 원리를 알고 최적화에 대해서도 배우고 싶습니다.</p>
<h3 id="최종-합격까지-몇-개-이상의-이력서-작성-및-제출할-건지-각오"><strong>최종 합격까지 몇 개 이상의 이력서 작성 및 제출할 건지 각오</strong></h3>
<p>프론트엔드 분야 뿐만이 아니라 회사의 전반적인 시스템과 새로운 배움에 대해서 항상 열린 태도로 배우고 있습니다. 회사를 지원하기 위해서 개인 역량의 향상과 다양한 능력 개발를 체계화시키는 과정을 진행하고 있습니다. 다양하게 배우는 이유는 관련 없어 보이는 모든 지식들도 지식의 확장을 통해서 유용하게 적용될 수 있다고 생각하기 때문입니다. 이런 마음 가짐으로 계속 지원하겠습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[다트 문법 마스터]]></title>
            <link>https://velog.io/@creat_bliv/%EB%8B%A4%ED%8A%B8-%EB%AC%B8%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0-01</link>
            <guid>https://velog.io/@creat_bliv/%EB%8B%A4%ED%8A%B8-%EB%AC%B8%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0-01</guid>
            <pubDate>Wed, 25 Jan 2023 00:01:41 GMT</pubDate>
            <description><![CDATA[<h3 id="define-function">define function</h3>
<pre><code class="language-dart">void printInteger(int number) {
    print(&#39;the number is $number&#39;);
}</code></pre>
<h4 id="string-interpolation">string interpolation</h4>
<p>문자열 보간법은 $variableName 또는 ${expression} 으로 진행한다.</p>
<h4 id="main">main</h4>
<p>다트의 top-level-funtion은 main에서 시작된다.</p>
<h4 id="oopobject-orient-programing">OOP(object-orient-programing)</h4>
<p>다트의 fucntions, numbers, null 까지 모두 객체이다.</p>
<h4 id="변수-선언">변수 선언</h4>
<pre><code class="language-dart">    var name = &quot;bob&quot;;
    String name = &quot;bob&quot;;</code></pre>
<p>다트는 동적 할당을 할 경우 <strong>var</strong>을 사용하며, 정적 할당 변수 또한 모두 존재한다. </p>
<pre><code class="language-dart">late String description;</code></pre>
<p>값을 선언하지 않는 경우 <strong>Late variable</strong> 로 미리 선언해둘 수도 있다.</p>
<h4 id="상수">상수</h4>
<p>상수의 경우 <strong>final</strong>과 <strong>const</strong>가 존재한다. 둘 다 한번 선언하면 값을 변경할 수 없지만 const는 컴파일 타임에 상수가 된다. 그래서 인스턴스의 변수로 사용할 수 없다.</p>
<h4 id="built-in-type">built-in type</h4>
<p>Numbers, String, Booleans, Lists, Sets, Maps, Runes, Symbols 등이 있다.</p>
<h4 id="lists">Lists</h4>
<ul>
<li>spread operator를 제공한다.<pre><code class="language-dart">var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);</code></pre>
assert는 debug 중에서만 동작하며 배포  코드에서는 프로그램에 영향을 주지 않는다.
조건이 거짓인 경우 실행이 중단된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[코딩 테스트 이론 및 문제]]></title>
            <link>https://velog.io/@creat_bliv/%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9D%B4%EB%A1%A0-%EB%B0%8F-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@creat_bliv/%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9D%B4%EB%A1%A0-%EB%B0%8F-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Tue, 10 Jan 2023 15:14:32 GMT</pubDate>
            <description><![CDATA[<h4 id="서론">서론</h4>
<p>코딩 테스트는 보통 파이썬을 활용하는 경우가 많다.
자바스크립트나 파이썬을 사용하는 것이 좋아보이고 다른 언어를 사용하는 경우도 보았지만
보일러플레이트가 심해서 코딩 테스트로 활용하기에는 적합해보이지 않는다.
또한 절차 지향 패러다임으로 구성되는 것이 기본 단계이기로 적합해보인다.</p>
<h4 id="복잡도">복잡도</h4>
<p>시간 복잡도</p>
<ul>
<li>알고리즘을 위해 필요한 연산의 횟수</li>
<li>O(N)으로 표기한다.</li>
<li>상수 시간, 로그시간, 선형시간, 이차 시간 등이 있다.</li>
</ul>
<p>공간 복잡도</p>
<ul>
<li>알고리즘을 위해 필요한 메모리의 양</li>
<li>메모리 사용량(MB)</li>
</ul>
<p>유형 분석</p>
<ul>
<li>이진 탐색</li>
<li>정렬</li>
<li>그리디</li>
<li>구현</li>
<li>DFS/BFS</li>
<li>최단 경로</li>
<li>다이나믹 프로그래밍</li>
<li>기타 그래프 이론</li>
</ul>
<h3 id="오늘의-문제">오늘의 문제</h3>
<p> 카펫</p>
<p>Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.</p>
<p><img src="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/b1ebb809-f333-4df2-bc81-02682900dc2d/carpet.png" alt="https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/b1ebb809-f333-4df2-bc81-02682900dc2d/carpet.png"></p>
<p>Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.</p>
<p>Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>
<p>나의 풀이</p>
<pre><code class="language-javascript">// 브라운은 테두리니까 갯수는 대각선의 4개를 제외하면 노란색의 가로 x 2 와 새로 x 2 로 구성된다.
// 4 + 2 + 4 = 10 
// 2 + 2 + 4 = 8
// 24가 6 x 4 일 때, 12 + 8 + 4 = 24
// 24로 만들 수 있는 경우는 1*24, 2*12, 4*6 6*4 8*3
function solution(brown, yellow) {
    let [cal, row] = [0, 0]
    while(1) {
        if(yellow % cal == 0) {
            row = yellow / cal
            if(brown == row * 2 + cal * 2 + 4)
                return [row + 2, cal + 2]
        }
        cal += 1
    }
}</code></pre>
<ul>
<li>노란색의 타일의 가로와 세로의 각각의 두배의 크기 + 대각선 4개의 블록이 브라운 타일임을 통해서 찾은 해법이다.</li>
<li>가장 인기 있던 풀이의 경우 근의 공식과 수학적인 개념을 이해해서 위의 문제를 풀어냈다.</li>
<li>수학과 과학에 관련된 지식도 공부가 필요할 것으로 보인다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[주간 정리] 코딩 문제 4가지]]></title>
            <link>https://velog.io/@creat_bliv/%EC%A3%BC%EA%B0%84-%EC%A0%95%EB%A6%AC-%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C-2%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@creat_bliv/%EC%A3%BC%EA%B0%84-%EC%A0%95%EB%A6%AC-%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C-2%EA%B0%80%EC%A7%80</guid>
            <pubDate>Sat, 07 Jan 2023 06:43:11 GMT</pubDate>
            <description><![CDATA[<h1 id="안전지대">안전지대</h1>
<p>2차원 배열에 대한 익숙함이 필요</p>
<p>배열 내장 함수</p>
<ul>
<li><p>map, filter, forEach, reduce</p>
</li>
<li><p>indexOf, findIndex, find, …</p>
</li>
<li><p>forEach</p>
</li>
</ul>
<pre><code class="language-jsx">[1, 2, 3].forEach(
(number, index) =&gt; console.log(&#39;index: &#39; + index + &#39;number: &#39; + number)</code></pre>
<ul>
<li><p>index는 0부터 시작하여 배열의 위치값을 number는 배열의 값을 가져올 수 있다.</p>
</li>
<li><p>세번째 인자는 배열 자체를 가져올 수 있다.</p>
</li>
<li><p>every, some : 특정 조건을 만족하는 지 배열을 순회하며 검사한다.</p>
<ul>
<li>every는 조건을 만족하지 않는 값이 발견되면 순회를 중단한다.</li>
<li>some은 조건을 만족하는 값이 발견되면 순회를 중단한다.</li>
</ul>
</li>
</ul>
<p>한칸마다 주변에 폭탄이 있으면 위험지대로 인식하여 총 개수(n*n)에서 감산하는 방법이다.</p>
<ul>
<li>중첩 반복문을 나가는 break를 쓴다는 문제점이 있다.(break는 클린코드에서 추천하지 않는 방법이다.)</li>
<li>9번과 11번이 통과되지 않았었다.<ul>
<li>배열이 n칸이면 0부터 n-1까지 가능하다는 점에서 [x, y] 값이 max보다 작을 때로 처리하자 해결됬다.</li>
</ul>
</li>
<li>for…in 구문이 연산자와 쓰일 때 문자로 인식되어 Number로 감싸줘야하는 문제가 있었다.</li>
</ul>
<pre><code class="language-jsx">function solution(board) {
    // 보드는 n * n 배열이다.
    let [min, max] = [0, board.length]
    let [y, x] = [0, 0]
    let blanks = max * max
    let dangerArea = 0
    for(row in board)
    for(blank in board[row])
            outer:
            for(var i = -1; i &lt; 2; i ++)
            for(var j = -1; j &lt; 2; j ++) {
                y = Number(row) + i
                x = Number(blank) + j
                    if(y &gt;= min &amp;&amp; y &lt; max &amp;&amp; x &gt;= min &amp;&amp; x &lt; max)
                    if(board[y][x] == 1) {
                        dangerArea += 1
                        break outer
                    }
            }         
    return blanks - dangerArea
}</code></pre>
<ul>
<li><p>다른 풀이들은 대각선을 포함한 상하좌우를 direction으로 배열로 직접 적는 방식을 사용했지만, 나는 중첩 반복문을 이용하여 깔끔하게 해결했다. 하지만 직관적으로 보기 좋은 방법은 아닌 것 같다.</p>
</li>
<li><p>처음에는 주변에 폭탄이 있으면 X로 변경하는 어려운 방법을 구현하려고 했다. 구현하기 전에 어떻게 하는 것이 가장 깔끔할 지 문제를 제대로 파악하는 것이 더 좋은 답을 내는 좋은 방법으로 보인다.</p>
</li>
<li><p>상하좌우 비교를 위해서 for…in 구문을 이용하여 번호를 받는 방식을 선택했지만 더 좋은 방법은 없었을까? 하나의 풀이는 단순하게 for문으로 처리하기도 했지만 직관성이 떨어져보인다. 하지만 나의 경우에서 Number가 의미 없이 쓰이는 문제가 있다.</p>
</li>
<li><p>some은 어떤 조건을 만족하면 배열 순회를 멈춘다. 이를 통해 나의 break문 없이 해결</p>
</li>
<li><p>위처럼 outside가 있다면 만약 문제에서 폭탄 검사위치가 변경되는 경우에도 위의 방법이 적용되는 효과를 가진다.</p>
</li>
<li><p>내가 한 것과 유사하나 이것은 safezone을 변수로 삼았고 함수형으로 더 간결하게 작성되었다.</p>
</li>
</ul>
<h1 id="마법의-엘리베이터">마법의 엘리베이터</h1>
<h3 id="문제-설명">문<strong>제 설명</strong></h3>
<p>마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특별합니다. 마법의 엘리베이터에는 -1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10c (c ≥ 0 인 정수) 형태인 정수들이 적힌 버튼이 있습니다. 마법의 엘리베이터의 버튼을 누르면 현재 층 수에 버튼에 적혀 있는 값을 더한 층으로 이동하게 됩니다. 단, 엘리베이터가 위치해 있는 층과 버튼의 값을 더한 결과가 0보다 작으면 엘리베이터는 움직이지 않습니다. 민수의 세계에서는 0층이 가장 아래층이며 엘리베이터는 현재 민수가 있는 층에 있습니다.</p>
<p>마법의 엘리베이터를 움직이기 위해서 버튼 한 번당 마법의 돌 한 개를 사용하게 됩니다.예를 들어, 16층에 있는 민수가 0층으로 가려면 -1이 적힌 버튼을 6번, -10이 적힌 버튼을 1번 눌러 마법의 돌 7개를 소모하여 0층으로 갈 수 있습니다. 하지만, +1이 적힌 버튼을 4번, -10이 적힌 버튼 2번을 누르면 마법의 돌 6개를 소모하여 0층으로 갈 수 있습니다.</p>
<p>마법의 돌을 아끼기 위해 민수는 항상 최소한의 버튼을 눌러서 이동하려고 합니다. 민수가 어떤 층에서 엘리베이터를 타고 0층으로 내려가는데 필요한 마법의 돌의 최소 개수를 알고 싶습니다. 민수와 마법의 엘리베이터가 있는 층을 나타내는 정수 <code>storey</code> 가 주어졌을 때, 0층으로 가기 위해 필요한 마법의 돌의 최소값을 return 하도록 solution 함수를 완성하세요.</p>
<ul>
<li>이 문제의 포인트 중의 하나는 5가 분기점이라는 것이다. 45면 5를 내리는 것이 좋고 65면 5를 올리는 게 좋다.</li>
</ul>
<pre><code class="language-jsx">// 각 자리수를 숫자 배열로 받는다.
// 5보다 클 때 10에서 뺀 값을 가지만 문제는 앞의 수가 올라가는 것을 생각해야 한다.
function solution(storey) {
    let total = 0
    let sequential = Array.from(String(storey), Number)
    sequential.map(number =&gt; number &lt;= 5 ? 
                   total += number : total += (11 - number))
    return total
}</code></pre>
<ul>
<li>간단하게 11로 처리하려고 했지만 앞의 수가 올라가는 매커니즘이 정확한 결과라 오류가 났다.</li>
</ul>
<pre><code class="language-jsx">function solution(storey) {
    return Array
        .from(String(storey), Number)
        .reverse()
        .reduce((total, number, index, array) =&gt; {
            if(number &gt; 5 &amp;&amp; index + 1 &lt;= array.length) {
                array[index + 1] += 1
                number = 10 - number
            }
            return total + number
        }, 0)
}</code></pre>
<ul>
<li>함수형으로 해보려고 했지만 실패</li>
</ul>
<pre><code class="language-jsx">// 각 자리수를 숫자 배열로 받는다.
// 5보다 클 때 10에서 뺀 값을 가지만 문제는 앞의 수가 올라가는 것을 생각해야 한다.
function solution(storey) {
    let layer = 0
    let total = 0
    let next = 0

   while(storey != 0) {
       layer = storey % 10
       if(layer &lt; 5) {
           storey -= layer
           total += layer
       } else if(layer &gt; 5) {
           storey += (10 - layer)
           total += (10 - layer) 
       } else if (layer == 5) {
           next = parseInt(storey / 10) % 10
           if(next &lt; 5) {
               storey -= 5
               total += 5
           } else {
               storey += 5
               total += 5
           }
       }
       storey = parseInt(storey / 10)
   }
    return total
}</code></pre>
<ul>
<li>숫자를 그대로 이용해야했다. 괜히 깔끔한 코드를 만들려다 못 풀뻔했다. 99과 같은 숫자는 2번이면 끝나기 때문이다.</li>
<li>중간에 next가 5보다 작은 경우에서 5와 같은 경우까지 조건에 포함하여 문제가 발생했다. 5는 상관없다고 생각했지만, 만약 55라면 5를 더해서 100으로 만드는 편이 빠르다.</li>
<li>나의 경우는 굉장히 노골적으로 푼 경우.</li>
<li>나의 경우에서 storey에 감산과 가산하는 부분을 보면 그냥 storey = parseInt(storey/ 10) 하면 된다는 것을 알 수 있다.</li>
</ul>
<p>어떤 분의 풀이</p>
<ul>
<li>재귀함수를 이용한 방법. 굉장히 깔끔하다.</li>
<li>Math.min으로 아래로 가는 지 위로 가능 지 비교한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[0723 : 객체 지향 스타일링]]></title>
            <link>https://velog.io/@creat_bliv/0723-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A7%81</link>
            <guid>https://velog.io/@creat_bliv/0723-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A7%81</guid>
            <pubDate>Fri, 23 Jul 2021 11:05:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><em>지금까지 이런 스타일은 없었다. 이것은 CSS인가 JAVA인가.</em></p>
</blockquote>
<p> 별건 아닙니다.. 어느 날과 같이 CSS가 안되서 javascript는 시작도 못하던 중이었습니다.
안 그래도 객체 지향에 대한 이해를 향상하기 위하여 <code>디자인 패턴</code>을 공부하고 있었습니다.</p>
<p>그러다 문득 SCSS의 extends와 mixin을 이용해서 일명 객체 지향 CSS, OOC(오우씨..) 설계를
구상해보는 것 어떨까 아이디어가 떠올랐습니다.</p>
<p>그렇습니다. 거창한 시작과 달리 별 볼일 없는 SCSS 사용하는 이야깁니다.
CSS의 하나의 <strong>블록 스코프</strong>가 <strong>클래스</strong>가 되는 것입니다.
(그래서 class attribute에 넣었던 것인가..)</p>
<p><em>부족하지만 성장하려고 노력하는 모습을 좋게 봐주셨으면 좋겠습니다.</em></p>
<blockquote>
<h2 id="object-css">Object CSS</h2>
</blockquote>
<p>일단 레이아웃과 관련된 flex와 grid를 설계합니다.
안타깝게도 grid가 익숙하지 않아 flex부터 시작해봅시다.</p>
<p>.flex-row { display: flex; flex-direction: row; }
.flex-col { display: ....
component.scss는 기본 component와 extends들이 작성됩니다.
( 버튼, 빨간 버튼, 애니메이션 버튼 ... )</p>
<p>페이지마다 CSS 모듈을 작성합니다. 각 컴포넌트들은 무조건 하나의 클래스만 받으며,
예를 들어 헤더를 만들 경우 
<code>&lt;div cassName=&quot;header&quot;/&gt;</code></p>
<p>.header{
@include flex(align,justify..)
@include textStyle(...
}</p>
<p>빌더 패턴에서 빌더 클래스가 상위 클래스에서 빌딩되는 클래스가 상속을 받자 깔끔해진 것처럼
컴포넌트들은 미디어쿼리를 상속받는 느낌으로 작성합니다.</p>
<p>이 방법의 장점은 직관적이고 낮은 결합에 높은 응집도를 가진다고 생각합니다.
한 가지 문제는 CSS 파일이 너무 길어져버릴 수 있다는 건데요.
이러한 이유로 몇 가지 방법을 떠올렸습니다.</p>
<ol>
<li>인라인 스타일을 활용한다.</li>
<li>CSS-in-JS의 믹스인을 활용한다.</li>
<li>자바스크립트로 직접 구현하다.</li>
</ol>
<blockquote>
<p><code>위에 대한 저의 생각은 ..</code></p>
</blockquote>
<p> <em>1 : 인라인 스타일은 리액트에서 권장하지 않습니다. <code>&lt;style&gt;</code> 태그 가 아닌 인라인으로
변환되기 때문에 좋은 방법이 아닙니다.</em></p>
<p> <em>2 : 믹스인을 클래스에 넣는 방법은 한 가지 문제가 파라미터를 줄 수 없습니다.
  또한 Styled-components는 attribute가 태그를 길어지게 하는 것이 가독성이 좋지 않다고
  생각했습니다. spread attibute를 활용하면 되지만 해당 컴포넌트가 가지고 있는
  props를 확인하는 방법이 없어서 코드가 길어지면 그 부분이 아쉬울 것 같았습니다.</em></p>
<p> <em>3 : 직접 javascript function으로 제작 방법이 있어보이나 거의 하나의 라이브러리를
 만들어야할 거 같고, 그러기 위해선 먼저 위의 방법의 불편한 점부터 파악한 뒤 리팩토링하는
 게 좋아 보입니다.</em></p>
<p> 위와 같은 결론으로 일단 SCSS로 프로젝트를 진행해보겠습니다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바 스크립트와 디자인 패턴 : 생성 패턴 - 빌더 패턴]]></title>
            <link>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4-%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4-%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Thu, 22 Jul 2021 11:46:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="빌더-패턴">빌더 패턴</h2>
<p><em>빌더 패턴은 생성 인자가 많을 시, 빌더 객체를 통해 구체적인 객체를 생성</em></p>
</blockquote>
<p>자바 클래스 오버로팅 생성자에서 아래 같은 형식을 본 적이 있을 것이다.</p>
<pre><code class="language-java">public class Person{
    private String name;
    private int age;
    private int height;

    public Person(String name){
    this.name = name;
    }
    public Person(String name, int age){
    this.name = name;
    this.age = age;
    }
    public Person(String name, int age, int height){
    this.name = name;
    this.age = age;
    this.height = height;
    }
} </code></pre>
<p>위와 같은 방법은 원하는 신상 정보만 등록할 수 있다. 하지만 문제가 있다.</p>
<ol>
<li>이름(name)과 키(height)만 입력하려는 경우</li>
<li>인자가 너무 많아져서 구분하기 어려워질 경우</li>
<li>새로운 인자를 추가할때마다 새로운 생성자를 생성해야 하는 경우</li>
</ol>
<p>이를 위한 빌더 클래스를 아래와 같이 작성할 것이다.</p>
<pre><code class="language-java">public  class PersonBuild{
    private String name;
    private int age;
    private int height;

    public PersonBuild name(String name){this.name = name; return this;}
    public PersonBuild age(String age){this.age = age; return this;}
    public PersonBuild height(String height){this.height = height; return this;}
    public Person build(){
        Person thisPerson = new Person(name,age,height);
        return thisPerson
    }
}</code></pre>
<p>빌더 클래스가 완성된 후에 생성자를 부를 때 아래와 같이 작성할 수 있다.</p>
<pre><code class="language-java">PersonBuild personbuild = new Personbuild();
Pesron person = psersonbuild
    .name(&quot;tatiana&quot;)
    .age(&quot;26&quot;)
    .height(&quot;165&quot;)
    .build();</code></pre>
<ol>
<li>불필요한 생성자를 만들지 않는다.</li>
<li>인자들의 가독성이 좋아진다.</li>
<li>인자들의 순서가 섞여도 상관 없다.</li>
</ol>
<p>여기서 멈출 수 없다. Javascript로 빌더 패턴에 들어가자!</p>
<pre><code class="language-javascript">class Person {
  constructor(build) {
    if (build) {
      this.id = build.id;
      this.name = build.name;
      this.age = build.age;
    }
  }

  static get Build() {
    class Build {
      name(name) {
        this.name = name;
        return this;
      }
      age(age) {
        this.age = age;
        return this;
      }
      height(height) {
        this.height = height;
        return this;
      }
      build() {
        return new Person(this);
      }
    }
    return new Build();
  }
}</code></pre>
<p>아래와 같이 사용할 수 있다.</p>
<pre><code class="language-javascript">const personBuilder1 = person.build;
const person1 = personBuilder1.name(&quot;tatiana&quot;).age(26);
const personBuilder2 = person.build;
const person2 = personBuilder2.name(&quot;James&quot;).age(50);</code></pre>
<p>아직 깔끔하지 않다.
여기서 어제 배운 객체 지향 패러다임을 본다면 클래스란 개념이다.
빌더 역시 객체가 아닌 클래스 개념이다.
때문에 빌더가 상위 클래스가 되서 빌더가 되는 클래스에게 상속한다면
getter &amp; setter의 중복도 제거하고, 클린 코드도 가능하다.
위와 같은 방법은 어떻게 해야할까?
다음 시간에 알아보도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바 스크립트와 디자인 패턴 : 객체 지향부터 알고 가기.]]></title>
            <link>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5%EB%B6%80%ED%84%B0-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0</link>
            <guid>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5%EB%B6%80%ED%84%B0-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0</guid>
            <pubDate>Wed, 21 Jul 2021 11:32:56 GMT</pubDate>
            <description><![CDATA[<p> 개인적인 생각이론 프로그래밍은 결국 반복과 중복을 줄이는 것이다. 그래서 절차 지향 문법에서 for나 if와 같은 분기문으로 세 번 작성할 것을 두 번으로 줄이는 것이다.</p>
<p> 객체 지향도 마찬가지이다. 한 장에 작성할 변수와 함수를 묶어서 인스턴스화를 통해 전제적인 관리를 하는 것이고 함수형 프로그래밍은 함수를 값으로 보고 결국 값을 도출하는 방법으로</p>
<p> 결국 <code>중복과 반복을 줄이면서 결합을 최소화(응집도는 최대화)</code> 하는 방향을 찾고 있는 것이다.</p>
<p> 물론 이것은 개인적으로 접하면서 내린 결론이다. 빠른 성장을 위해서 공부를 시작해보자.</p>
<blockquote>
<p>*&quot;객체는 붕어빵이 아니다 !&quot;*</p>
</blockquote>
<p> 객체가 붕어빵이라는 비유에는 모순이 있다.
 책에서는 객체 지향을 이렇게 설명한다.
 <code>클래스는 개념이고 객체는 실체이다.</code></p>
<p>학생이나 선생이나 같은 사람이다. 결국 개념이란 <code>공통된 특성을 내열해두는 일</code>인 것이다.
<em>아직까지 공통된 점을 묶는다는 나의 생각과 비슷하다.</em></p>
<blockquote>
<p>*&quot;상속은 부모님과 자식이 아니다!&quot;*</p>
</blockquote>
<p>상속을 역시 처음 배울 때 부모님의 DNA나 재산과 같은 비유가 많다.
하지만 상속의 키워드는 extends 즉 <code>확장</code> 이다.
즉 기존의 개념을 가지는 더 구체적인 개념을 생성하는 것이다.
예를 들어, 강아지나 고양이는 동물이다.
Dog extends Animal. Cat extends Animal</p>
<p>클래스와 상속은 우리가 아는 내용이지만 이러한 오해를 고치고 개념을 바로 잡아가는 것들이
개발자가 설계 단계에 있을 때 구상하는 능력을 키울 수 있다고 생각한다.</p>
<blockquote>
<p>&quot;인터페이스는 able to .. &quot;</p>
</blockquote>
<p>  인터페이스는 우리가 알 듯 클래스에 레고처럼 추가할 수 있는 부분이다.</p>
<blockquote>
<p>SOLID 원칙</p>
</blockquote>
<p>  솔리드는 객체 지향의 5대 원칙이다.</p>
<p>  SRP : 단일 책임 원칙
  OCP : 개방 폐쇄 원칙
  LSP : 리스코브 치환 원칙
  ISP : 인터페이스 분리 원칙
  DIP : 의존 역전 원칙</p>
<p>  아래의 내용은 다음에 살펴보도록 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트와 디자인 패턴 : 생성 - 팩토리 메서드 패턴]]></title>
            <link>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Tue, 20 Jul 2021 12:18:26 GMT</pubDate>
            <description><![CDATA[<h2 id="열공하자">열공하자..</h2>
<h4 id="경고">경고</h4>
<p>&quot;아직 부족한 저는 제가 이해한 대로 최대한 쉽게 적고 있습니다.&quot;</p>
<blockquote>
<h2 id="생성-패턴">생성 패턴</h2>
</blockquote>
<p> 디자인 패턴은 생성, 구조, 행위로 나뉩니다.
 그 중에서 *<em>생성 패턴 *</em> 을 알아보고 있습니다..</p>
<p> <code>생성 패턴</code>이란 <u>클래스가 인스턴스를 생성하는 과정</u>을 디자인한 패턴 입니다.</p>
<p>오늘의 두 번째 패턴은 <code>팩토리 메서드 패턴</code> 입니다.</p>
<blockquote>
<h2 id="팩토리-메서드-패턴">팩토리 메서드 패턴</h2>
<p> 자식 클래스들의 생성자들을 묶어서 생성하는 클래스와 인스턴스  </p>
</blockquote>
<p> (싱글톤 패턴 다음으로 팩토리 패턴을 선택한 것은 실수다.
 이해하는 데 시간이 조금 걸렸다...)
 <code>이미 작성된 포스트들도 꾸준히 리뉴얼할수 있도록 하겠습니다!</code></p>
<p>팩토리 메서드 패턴은 constructor 생성가 아닌
&quot; 생성하는 방법을 담당하는 &quot; 클래스를 제작하는 것이다.</p>
<pre><code class="language-javascript">
class Button {
  constructor(content){
    this.content = content,
    this.action = () =&gt; console.log(&quot;The button was pressed.&quot;)
  }
}
class Text {
    constructor(content){
    this.content = content,
    this.action = () =&gt; console.log(&quot;Please enter your text&quot;)
    }
}
class Component {
    constructor(type,content){
    if(type == &quot;button&quot;)
      return new Button(content)
    if(type == &quot;text&quot;)
      return new Text(content)
    }
}

const LogInButton = new Component(&quot;button&quot;,&quot;Login&quot;)
const titleText = new Component(&quot;text&quot;,&quot;myTitle&quot;)</code></pre>
<p>아래의 두 줄과 같이 생성하는 과정이 깔끔해지는 것을 직관적으로 알 수 있게 작성하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트와 디자인 패턴 : 생성 - 싱글톤 패턴]]></title>
            <link>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@creat_bliv/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Mon, 19 Jul 2021 14:56:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="디자인-패턴">디자인 패턴</h3>
</blockquote>
<p>프로그래밍 설계 단계에서 나타나는 효과적인 패턴</p>
<h3 id="디자인-패턴의-종류">디자인 패턴의 종류</h3>
<ul>
<li>생성</li>
<li>구조</li>
<li>행위</li>
</ul>
<hr>
<blockquote>
<h3 id="생성-패턴">생성 패턴</h3>
</blockquote>
<p>클래스가 생성자와 NEW 연산으로 인스턴스를 생성할 때
유연성(재사용을 높이고 결합도를 낮추는)이 강한 패턴</p>
<h3 id="싱글톤-패턴">싱글톤 패턴</h3>
<p>싱글톤 클래스가 클래스 내부에 하나의 인스턴스를 생성하여
다른 인스턴스 생성시 새로운 인스턴스를 부여하는 것이 아닌
기존의 내부 인스턴스를 공유하는 방법</p>
<pre><code class="language-javascript">// ES7
class SingleTon {
  static instance
  constructor(){
      if(instance) return instance
      instance = this
    }
}
var first = new SingleTon()
var second = new SingleTon()
console.log(first == second) // true</code></pre>
<h4 id="장점">장점</h4>
<ul>
<li>전역으로 어디서나 접근</li>
<li>메모리 사용량 감소<h4 id="단점">단점</h4>
</li>
<li>객체 지향 패러다임과 거리가 먼 방법<h4 id="예시">예시</h4>
</li>
<li>다크 모드에서 전역으로 동일한 색상 값 전달</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>