<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>minj9_6.log</title>
        <link>https://velog.io/</link>
        <description>자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.  </description>
        <lastBuildDate>Fri, 16 Feb 2024 00:28:13 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>minj9_6.log</title>
            <url>https://images.velog.io/images/minj9_6/profile/f8889f8f-fa44-4ef3-984c-616c55410ad5/P20200203_225352227_66B88E27-7A21-4EC5-987F-0B0457A4AA0C.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. minj9_6.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minj9_6" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[빅오로 코드 속도 올리기]]></title>
            <link>https://velog.io/@minj9_6/%EB%B9%85%EC%98%A4%EB%A1%9C-%EC%BD%94%EB%93%9C-%EC%86%8D%EB%8F%84-%EC%98%AC%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@minj9_6/%EB%B9%85%EC%98%A4%EB%A1%9C-%EC%BD%94%EB%93%9C-%EC%86%8D%EB%8F%84-%EC%98%AC%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Fri, 16 Feb 2024 00:28:13 GMT</pubDate>
            <description><![CDATA[<ul>
<li>빅오 사용 시 내가 만든 알고리즘과 세상에 존재하는 범용 알고리즘을 비교할 기회가 생김</li>
</ul>
<h1 id="버블-정렬">버블 정렬</h1>
<p>정렬 알고리즘, 정렬되지 않은 배열이 주어졌을 때 어떻게 오름차순으로 정렬?
순서&gt; </p>
<ol>
<li>베열 내 연속되 두항목 가리켜, 첫 번째 항목과 두 번쨰 항목 비교</li>
<li>두 항목 비교해 왼쪽이 오른쪽 값보다 크면 두 항목 교환하고 순서 올바르면 그대로</li>
<li>포인를 오른쪽으로 한 셀씩 옮김</li>
<li>배열 끝까지 또는 이미 정렬된 값까지 1-3단계 반복해 배열 첫 패스스루 끝내기</li>
<li>두 포인터 다시 배열 처음 두 값으로 옮겨 1-4 단계 다시 실행해 교환 일어나지 않으면 정렬되어 문제 해결</li>
</ol>
<ul>
<li>버블 정렬이라 부르는 까닭은 각 패스스루마다 정렬되지 않은 값 중 가장 큰 값, 즉 버블이 올바른 위치로 가기 때문(즉 한 번 패스스루를 수행하면 마지막 항목은 비교하지 않아도 됌)<h1 id="버블-정렬-적용">버블 정렬 적용</h1>
</li>
</ul>
<pre><code class="language-js">function bububbleSort(list){
  let unsortedUntilIdx = list.length - 1;
  let isSorted = false;

  while(!isSorted){
    isSorted = true;
    for(let i = 0; i &lt; list.length; i ++){
        if(list[i] &gt; list[i+1]){
          [list[i], list[i+1]] = [list[i+1], list[i]];
          isSorted = false;
          unsortedUntilIdx -= -1;
        }    
      }
  }
  return list
}

bububbleSort([4,2,7,1,3])</code></pre>
<ul>
<li>unsortedUntilIdx, 정렬되지 않은 배열 가장 오른쪽 인덱스 기록
알고리즘 시작 시 전체 배열 정렬되지 않은 상태이므로 배열 마지막 인덱스로 변수 초기화</li>
<li>isSorted, 배열 정렬 여부 기록하는 변수로 처음엔 정렬되지 않으므로 false</li>
<li>배열 정열 될때까지 while 루프 시작해 루프 한 번 실행이 배열의 한 패스스루</li>
<li>각 패스스루 안에 교환 일어나기 전까지 배열 정렬되어 있다 가정해 값 교환 시 변수 다시 false로 바꿈 &gt; 전체 패스스루 통과 시 isSorted가 true로 남아 배열 완전 정렬된 상태임</li>
<li>while 루프 내 for 루프 시작해 루프 안 배열 내 모든 값 쌍 가리켜 변수 i를 포인터로 배열 첫 인덱스부터 정렬되지 않은 인덱스까지 수행</li>
<li>for 루프 내 모든 인접 값 쌍 비교해 순서 뒤바뀌어 있으면 교환하고 교환되면 isSorted를 false로 바꿈</li>
<li>각 패스스루 끝나면 오른쪽 올려준 버블 값 올바른 위치에 있으므로 기존 가리키던 unsortedUntilIdx 인덱스가 정렬된 상태니 값을 1 감소</li>
<li>isSorted가 true 되면 배열 완전 정렬되어 while 문 종료 후 정렬된 배열 반환</li>
</ul>
<h1 id="버블-정렬-효율성">버블 정렬 효율성</h1>
<ul>
<li>두 가지 중요한 단계 포함
1&gt; 비교 2&gt; 교환</li>
<li>버블 정렬은 원소 수 증가할수록 단계수 기하급수적으로 늘어남</li>
<li>값이 N인 경우 N2 단계, 이차 시간이 소요</li>
</ul>
<h1 id="이차-문제">이차 문제</h1>
<ul>
<li>느린 알고리즘, N2 빠른 알고리즘 N으로 대체</li>
<li>보통 배열 n개 값 있을 때 함수 n2번 빅 수행하는데 순회마다 안쪽 루프는 n 번 다시 순회해야하기 때문임</li>
</ul>
<h1 id="선형-해결법">선형 해결법</h1>
<ul>
<li>데이터 원소 n개 있을 때 비교 n번만 하되 배열에 삽입을 하여 비교하는 제약이 있긴함</li>
<li>속도 향상은 보장되었으나 메모리 소비 하는 부분 고려</li>
</ul>
<h1 id="마무리">마무리</h1>
<ul>
<li>빅오 표기법 명확하게 이해 시 느린 코드 식별해 두 경쟁 알고리즘 중 빠른 알고리즘 고를 수 있음</li>
</ul>
<h1 id="연습문제">연습문제</h1>
<p>다음 함수 배열 가장 큰 수 하나 찾아내지만 효율성 n2 이를 n이 되도록 함수 다시 작성
O(N)2 코드</p>
<pre><code class="language-js">function greatestNum(arr){
  for(let i=0; i&lt;arr.length; i++){
    let isValGreatest = true
      for(let j=0; j&lt;arr.length; j++){
          if(arr[j]&gt;arr[i]) isValGreatest = false
      }
      if(isValGreatest) return arr[i]

  }
}

greatestNum([1,23,4,35,3,23,5])</code></pre>
<p>O(N) 코드</p>
<pre><code class="language-js">function upgradeGreatestNum(arr){
  let greatestNum = arr[0]
  for(let i=1; i&lt;arr.length; i++){
     greatestNum = greatestNum &lt; arr[i] ? arr[i] : greatestNum
  }
  return greatestNum
}

upgradeGreatestNum([1,23,4,35,3,26,52,123,3,4,2,3,52,2,35])</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[클린 코드 - 경계다루기]]></title>
            <link>https://velog.io/@minj9_6/%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C-%EA%B2%BD%EA%B3%84%EB%8B%A4%EB%A3%A8%EA%B8%B0</link>
            <guid>https://velog.io/@minj9_6/%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C-%EA%B2%BD%EA%B3%84%EB%8B%A4%EB%A3%A8%EA%B8%B0</guid>
            <pubDate>Thu, 01 Feb 2024 08:10:25 GMT</pubDate>
            <description><![CDATA[<p>undefined나 null 값이 없거나(명시적 표현) 정의되지 않은</p>
<p>null은 숫자로 표현할 시 0 타입으로 표현시 Object
undefined는 Nan, 타입으로 표현시 undefined는</p>
<hr>
<p>동등연산자 &gt; 타입캐스팅 발생
엄격한 연산자</p>
<p>동등 비교 연산자 일치 비교 연산자</p>
<p>형변환 ex Number, valueAsNumber같이 해서 완전하게 비교하기</p>
<p>eslint에 eqeqeq를 강제할 수 있는 방법도 있음</p>
<hr>
<p>느슨한 검사 &gt; 암묵적 형변환
이것보단 명시적 형변환을 하자
사용자 &gt; 명시적 형변환 타입
JS &gt; 암묵적 형변환 타입 </p>
<hr>
<p>isNaN 느슨한 검사
Number.isNaN 엄격한 검사</p>
<hr>
<p>경계를 다룰 시 min max</p>
<ol>
<li>최소값과 최대값을 다룬다</li>
<li>최소값과 최대값 포함 여부를 결정해야한다 (이상 - 초과 / 이하-미만)</li>
<li>혹은 네이밍에 최소값과 최대값 포함 여부를 표현</li>
</ol>
<hr>
<p>매개변수 순서가 경계</p>
<p>호출하는 함수 네이밍과 인자 순서 연관성 고려</p>
<ol>
<li>매개변수 2개 넘지 않도록 함수 만들기</li>
<li>arguments, rest param</li>
<li>랩핑하는 함수</li>
<li>매개변수 객체로 남아 넘기기</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 교과서 - 1,2,]]></title>
            <link>https://velog.io/@minj9_6/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B5%90%EA%B3%BC%EC%84%9C-12</link>
            <guid>https://velog.io/@minj9_6/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B5%90%EA%B3%BC%EC%84%9C-12</guid>
            <pubDate>Fri, 17 Nov 2023 14:52:26 GMT</pubDate>
            <description><![CDATA[<h1 id="1-타입스크립트-시작">1. 타입스크립트 시작</h1>
<h4 id="들어가기">들어가기</h4>
<ul>
<li>타입스크립트 무엇, 왜 사용하는지</li>
<li>학습 때 도움되는 자료</li>
</ul>
<h4 id="11-타입스크립트-공부-시-알아야할-한-가지">1.1. 타입스크립트 공부 시 알아야할 한 가지</h4>
<ul>
<li>타입스크립트는 타입을 위한 구문이 있는 자바스크립트</li>
<li>타입을 위한 구문은 변수나 매개변수, 반환값 같은 값에 타입을 부여<ul>
<li>타입은 데이터 형태 의미하며 데이터 형태란 문자열, 숫자, 객체 등 자료형</li>
</ul>
</li>
<li>타입스크립트, 데이터 타입 명시적 표시 할 수 있게된 자바스크립트</li>
</ul>
<h4 id="12-공식문서와-플레이그라운드">1.2 공식문서와 플레이그라운드</h4>
<ul>
<li>타입스크립트 공부 시 공식 사이트 참고</li>
</ul>
<h4 id="13-왜-타입-필요">1.3 왜 타입 필요</h4>
<ul>
<li>타입스크립트 목표는 자바스크립트 프로그램 정적 타입 검사자, 코드 실행 전에 실행(정적)하고 프로그램 타입이 정확한지 확인한는 도구(타입검사)</li>
<li>타입스크립트는 타입관련 오류와 오타를 코드 실행 전 잡아주므로 실제 코드 실행 시 오류 나는 경우를 줄임</li>
<li>자바스크립트 오류는 3가지로, 문법에러, 타입에러, 그 외 기타 에러</li>
<li>타입스크립트는 타입에러를 사전에 방지하는 데 탁월</li>
</ul>
<p>타입스크립트가 타입에러를 잡는 예 2가지
1&gt; 사소한 오타 있는 경우
2&gt; 타입 관련 오류 있는 경우</p>
<ul>
<li>타입에러를 사전에 차단하면 서비스 안정성 높아짐</li>
<li>타입스크립트는 자바스크립트 코드에 대한 설명서 역할</li>
</ul>
<h1 id="2-기본-문법-익히기">2. 기본 문법 익히기</h1>
<h4 id="21-변수-매개변수-반환값에-타입-붙이기">2.1 변수, 매개변수, 반환값에 타입 붙이기</h4>
<ul>
<li>타입스크립트 사용 시 어떤 값에 타입 부여할지 알고 있어야 함</li>
<li>변수와 함수의 매개변수, 반환값에 타입 부여하고 이를 타이핑이라 표현</li>
</ul>
<h4 id="22-타입-추론-적극-활용">2.2 타입 추론 적극 활용</h4>
<p>타입 추론 원칙</p>
<ul>
<li>타입스크립트 어느 정도 변수와 반환값의 타입을 스스로 추론, 다만 매개변수에는 타입을 부여해야 함</li>
<li>타입스크립트가 타입 제대로 추론하면 그대로 쓰고, 틀리게 추론할 때만 올바른 타입을 표기</li>
</ul>
<p>첫째, 타입 표기 시 hello,123,false 같은 정확한 값 입력할 수 있으며 이를 리터럴 타입이라 부름
둘째, 타입 표기 시 더 넓은 타입으로 표기해도 문제 없음
참고로 let, const 다르게 타입 추론하는데 let은 타입 넒게 추론하여 타입 넓히기를 함
null, undefined는 let 변수에 대입 시 any 추론</p>
<h4 id="23-값-자체가-타입인-리터럴-타입-있음">2.3 값 자체가 타입인 리터럴 타입 있음</h4>
<ul>
<li>주로 const에 사용 let은 보통 자료형 타입<pre><code class="language-ts">const func : (a:number, b:string) =&gt; string = (a,b) =&gt; a+b;</code></pre>
</li>
<li>값이 변하지 않는 것이 확실하다면 as const라는 특별 접미사 붙이면 readonly가 됌</li>
</ul>
<h4 id="24-배열-말고-튜플">2.4 배열 말고 튜플</h4>
<ul>
<li>타입[] 또는 Array&lt;타입&gt; 타이핑, &lt;&gt; 제네릭이라 부름</li>
<li>배열 추론 시 요소들 타입 토대로 추론 하는데 빈 배열은 any[]로 추론되므로 주의</li>
<li>타입스크립트 배열엔 자유도가 제한, 배열엔 대부분 같은 타입 값들어가나 다른 타입 값 들어가는 경우 보통 배열 길이 짧거나 고정</li>
<li>각 요소 자리에 타입 고정된 배열 특별히 튜플이라 부르는데 튜플 타이핑은 다음과 같음<pre><code class="language-ts">const tuple:readonly [number, boolean, string] = [1,false,&#39;h1&#39;];
tuple[0] = 3;
tuple[2] = 5;
tuple[3] = &#39;no&#39;
tuple.push(&#39;yes&#39;)
const strNumBools: [string, number, ...boolean[]] = [&#39;hi&#39;, 1, false, true];
const [a, ...rest] = [&#39;hi&#39;, 1, false, true];
// 명시적 타이핑
const [b, ...rest2] : [string, ...number[]] = [&#39;hi&#39;, 1,2,3];
const tuple2: [number, boolean?, string?] = [1,false,&#39;h1&#39;];</code></pre>
</li>
<li>[]안에 정확한 타입 하나씩 입력하고 표시하지 않으면 undefined 타입 됌</li>
<li>push, pop, unshift, shift 메서드 통해 배열 요소 추가 및 제거 막지 않는데 push 까지 막으려면 readonly 수식어 붙이면 됌</li>
<li>...타입[] 표기 통해 특정 타입 연달아 나올 수 있음을 알려 ...은 전개 문법으로 특정 자리에 특정 타입 연달아 나옴 표시하며 타입 뿐만 아니라 전개 문법 사용해도 타입스크립트 타입 추론</li>
<li>구조분해 할당에선 나머지 속성 문법 사용가능해 역시 타입스크립트 타입 추론 </li>
<li>타입 뒤에 ? 붙어 있음 옵셔널 수식어로 해당 자리에 값 있어도 그만 없어도 그만 의미하며 undefined 들어갈 수 있음</li>
</ul>
<h4 id="25-타입으로-쓸-수-있는-것-구분">2.5 타입으로 쓸 수 있는 것 구분</h4>
<ul>
<li>타입 배우다 보면 값과 타입 헷갈리는데 값은 일반적으로 자바스크립트에서 사용하는 값 가리키고 타입은 타입을 위한 구문 사용하는 타입 가리킴</li>
<li>결론, 타입을 값으로 사용 못하는데 타입으로 사용할 수 있는 값과 타입으로 사용할 수 없는 값만 구분</li>
<li>대부분 리터럴 값 타입으로 사용, 반대로 변수 이름 타입을 사용 못하지만 Date, Math, Error, String, Object, Number, Boolean 같은 내장 객체는 타입으로 사용 가능<pre><code class="language-ts">const date:Date = new Date();
function add(x: number, y: number): number { return x + y }
const add2  :typeof add = (x:number, y:number) =&gt; x+y</code></pre>
</li>
<li>String, Object, Number, Boolean, Symbol 타입 사용하는 것 권장하지 않음 대신 일반 타입 사용 권장</li>
<li>변수에는 typeof 앞에 붙여 타입으로 사용 가능</li>
<li>클래스 이름은 typeof 없이도 타입 사용 가능</li>
</ul>
<h4 id="26-유니언-타입으로-or-관계-표현">2.6 유니언 타입으로 OR 관계 표현</h4>
<ul>
<li>타입스크립트엔 타입 위한 연산자, 유니언 타입과 유니언 타입 표기 위한 파이프연산자</li>
<li>유니언 타입은 하나 변수가 여러 타입 가질 수 있는 가능성 표시<pre><code class="language-Ts">let strOrNum : string | number  = &#39;hi&#39;
const arr: (string| number)[] = [&#39;3&#39;,1,2] 
function returnNumber(value: string | number): number {
  if (typeof value === &#39;string&#39;) { //타입좁히기
      return parseInt(value, 10);
  } else {
      return value;
  }
}
type Union1 =
| string
| boolean</code></pre>
</li>
<li>유니언 타입으로 정확한 타입 찾아내느 기법, 타입 좁히기라 부름</li>
<li>타입 사이에만 | 쓰는게 아니라 타입 앞에도 쓸 수 있음</li>
</ul>
<h4 id="27-타입스크립트에만-있는-타입-배우자">2.7 타입스크립트에만 있는 타입 배우자</h4>
<ul>
<li>any외 unknown, void {}, never 등</li>
</ul>
<h4 id="271-any">2.7.1 any</h4>
<ul>
<li>타입스크립트 지양해야할 타입으로 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 디자인 패턴 바이블 - 1. Node.js 플랫폼]]></title>
            <link>https://velog.io/@minj9_6/Node.js-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EB%B0%94%EC%9D%B4%EB%B8%94-1.-Node.js-%ED%94%8C%EB%9E%AB%ED%8F%BC</link>
            <guid>https://velog.io/@minj9_6/Node.js-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EB%B0%94%EC%9D%B4%EB%B8%94-1.-Node.js-%ED%94%8C%EB%9E%AB%ED%8F%BC</guid>
            <pubDate>Thu, 16 Nov 2023 13:11:49 GMT</pubDate>
            <description><![CDATA[<h3 id="🔐study-keyword-">*🔐Study Keyword :</h3>
<blockquote>
<p>keyword thema</p>
</blockquote>
<ul>
<li>Node.js 철학</li>
<li>Reactor 패턴 - Node.js 비동기 이벤트 주도 아키텍처 핵심 메커니즘</li>
<li>브라우저와 다르게 서버에서 동작하는 JavaScript 의미</li>
</ul>
<h1 id="--11-nodejs-철학">- 1.1 Node.js 철학</h1>
<p>모든 프로그래밍 플랫폼 자신들만 철학, 커뮤니티에서 따르게 되는 일련 원칙과 지침, 플랫폼 진화와 애플리케이션 개발 및 디자인에 영향을 주는 이데올로기를 지님</p>
<ul>
<li><p><strong>WHAT IS❓</strong> 1.1.1 경량 코어</p>
<blockquote>
<ul>
<li>Node.js 코어 몇 가지 원칙들 기반으로 기초 구성
기능 세트를 가지고 코어 바깥 부분에 유저랜드 혹은 유저스페이스라 불리는 사용자 전용 모듈 생태계를 두는 것</li>
</ul>
</blockquote>
</li>
<li><p><strong>WHAT IS❓</strong> 1.1.2 경량 모듈</p>
<blockquote>
<ul>
<li>Node.js 프로그램 코드 구성하는 기본 수단으로 모듈 개념 사용
애플리케이션 재사용 가능한 라이브러리 만들기 위한 구성 요소
코드 양뿐 아니라 범위 측면에서 작은 모듈 디자인하는 것이 통용되는 원칙</li>
</ul>
</blockquote>
</li>
</ul>
<p>작은 모듈의 장점</p>
<ul>
<li><p>이해와 사용이 쉬움</p>
</li>
<li><p>테스트 및 유지보수 쉬움</p>
</li>
<li><p>사이즈 작아 브라우저에 사용하기 완벽</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.1.3 작은 외부 인터페이스</p>
</li>
<li><p>Node.js 모듈 장점은 작은 사이즈, 범위, 최소한 기능 노출</p>
</li>
<li><p>Node.js 모듈 정의 일반적 패턴, 단일 진입점 제공 위해 단 하나의 함수나 클래스 노출</p>
</li>
<li><p>Node.js 모듈 특징 중 하나는 확장보단 사용되기 위해 만들어졌다는 것인데 유스케이스 줄이고 구현 단순화, 유지관리 용이하고 가용성 높이는 장점 가짐</p>
</li>
<li><p>따라서 내부 외부에 노출시키지 않기 위해 클래스 보단 함수 노출을 선호</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.1.4 간결함과 실용주의</p>
</li>
<li><p>완벽하고 모든 기능 갖춘 소프트웨어와 반대로 단순하게 설계하는 것이 좋은 실천</p>
</li>
<li><p>구현 위해 적은 노력, 가벼워 빨리 보급 가능, 유지보수 쉽고 빠른 이해 가능</p>
</li>
<li><p>이러한 요인 커뮤니티 기여 용이하게 하고 소프트웨어 자체 성장 향상 도움</p>
</li>
<li><p>해당 원칙 채택되는 것 큰 영향 준 것이 실용적인 자바스크립트 언어, 복잡한 클래스 계층 대체 위한 간단한 클래스나 함수, 클로저 사용의 예</p>
</li>
</ul>
<h1 id="--12-nodejs-어떻게-작동">- 1.2 Node.js 어떻게 작동</h1>
<ul>
<li><p>Node.js 내부적 어떻게 동작하는지 이해 및 비동기의 핵심인 리액터 패턴 소개</p>
</li>
<li><p>단일 스레드 아키텍처와 논 블로킹 I/O 주요 개념</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.2.1 I/O는 느리다</p>
</li>
<li><p>I/O 컴퓨터 기본적 동작들 중 가장 느린데, I/O 속도와 빈도는 기술적 측면에만 의존하지 않으며 디스크나 네트워크 보다 느릴 수 있음</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.2.2 블로킹 I/O</p>
</li>
<li><p>전통적 블로킹 I/O 프로그래밍 I/O 요쳥하는 함수 호출은 작업 완료될 때까지 스레드 실행 차단</p>
</li>
<li><p>스레드 시스템 리소스 측면에서 비용이 저렴하지 않아 메모리 소모 및 컨텍스트 전환 유발하여 대부분 시간 동안 사용하지 않는 장시간 실행 스레드를 가져 메모리와 CPU 사이클 낭비</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.2.3 논 블로킹 I/O</p>
</li>
<li><p>해당 운영모드에선 시스템 호출은 데이터가 읽혀지거나 쓰여지기를 기다리지 않고 항상 즉시 반환</p>
</li>
<li><p>논 블로킹 I/O 다루는 가장 기본적 패턴은 실제 데이터 반환될 때까지 루프 내 리소스 적극적을 폴링하는 것, 이것을 바쁜 대기라 함</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.2.4 이벤트 디멀티플렉싱</p>
</li>
<li><p>바쁜 대기는 논 블로킹 리소스 처리위한 이상적 기법 아님</p>
</li>
<li><p>효율적으로 처리하기 위한 동기 이벤트 디멀티프렉터(이벤트 통지 인터페이스) 메커니즘 제공</p>
</li>
<li><p>멀리플렉싱, 여러 신호 하나로 합성해 제한된 수용 범위 내 매개체 통해 쉽게 전달하는 방법 나타냄</p>
</li>
<li><p>디멀티 플렉싱, 신호 원래 구성요소로 다시 분할되는 작업</p>
</li>
<li><p>동기 이벤트 디멀티플렉서, 여러 리소스 관찰하고 이 리소스 중 읽기 또는 쓰기 연산 실행 완료시 새로운 이벤트 반환</p>
</li>
<li><p>이점은 동기 이벤트 디멀티플렉서가 처리 위한 새로운 이벤트가 있을 때까지 블로킹된다는 것</p>
</li>
<li><p>해당 패턴 이용 시 바쁜 대기 기술 이용하지 않고 여러 I/O 작업 단일 스레드 내 다룰 수 있어 여러 리소스를 단일 스레드를 사용하여 다룸</p>
</li>
<li><p>단일 스레드 사용이 동시적 다중 I/O 사용 작업에 나쁜 영향 미치치 않고 작업은 시간에 다라 분산되어 전체 유휴시간 최소화하는데 이점</p>
</li>
<li><p>하나 스레드만 가지는 건 프로그래머가 동시성에 접근하는 방식에 이로운 영향 미침</p>
</li>
<li><p>경쟁 상태 발생 문제, 다중 스레드 동기화 문제 없는게 더 간단한 동시성 전략 사용하게 해줄 수 있는지  볼 수 있음</p>
</li>
</ul>
<ul>
<li><p><strong>WHAT IS❓</strong> 1.2.5 리액터 패턴</p>
</li>
<li><p>리액터 패턴 이면 주된 아이디어 각 I/O 작업에 연관된 핸들러 갖는 것, 이는 콜백함수에 해당</p>
</li>
<li><p>콜백함수는 이벤트 생성되고 이벤트 루프의해 처리되는 직시 호출</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.2.6 Libuv, Node.js I/O 엔진</p>
</li>
<li><p>각 운영체제는 이벤트 디멀티플렉서 위한 자체 인터페이스 가짐, </p>
</li>
<li><p>Node.js 주요 운영체제 호환하게 해주며 서로 다른 리소스 유형 논 블로킹 동작 표준화를 위해 libuv 불리는 C 라이브러리 생성</p>
</li>
<li><p>libuv는 기본 시스템 호출 추상화하는 것 외에 리액터 패턴 구현, 이벤트 루프 생성, 이벤트 큐 관리, 비동기 I/O 작업 실행 및 다른 유형 작업 큐에 담기위한 API 제공</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.2.7 Node.js 위한 구성</p>
</li>
<li><p>리액터 패턴과 libuv, Node.js 기본 구성 요소
전체 플랫폼 구축 위해선 3개 구성 더 필요, 
libub와 다른 저수준 기능 랩핑하고 표출 시키기 위한 바인딩 세트
V8, 크롬 브러우저 위해 구글 개발한 자바스크립트 엔진
고수준 Node.js API 구현하고 있는 코어 자바스크립트 라이브러리</p>
</li>
</ul>
<p>이것들이 Node.js 구성 요소 </p>
<h1 id="--13-nodejs에서-자바스크립트">- 1.3 Node.js에서 자바스크립트</h1>
<ul>
<li><p>노드에서 사용하는 자바스크립트는 브라우저 사용하는 자바스크립트와 다소 다름</p>
<ul>
<li>DOM, window, document 없음</li>
<li>운영체제 기본적으로 제공하는 서비스 접근 가능</li>
</ul>
</li>
<li><p><strong>WHAT IS❓</strong> 1.3.1 최신 자바스크립트 실행</p>
</li>
<li><p><strong>WHAT IS❓</strong> 1.3.3 모듈 시스템</p>
</li>
</ul>
<p>--</p>
<ol>
<li>Node.js 철학: Node.js는 &#39;non-blocking&#39;, &#39;event-driven&#39;을 기반으로 한 아키텍처를 갖고 있습니다. 이는 I/O 작업이 블로킹(blocking) 되지 않도록 하여 애플리케이션의 효율성과 성능을 향상시키는데 중점을 두고 있습니다. 이를 위해 Node.js는 &#39;event loop&#39;와 &#39;callback&#39; 함수를 사용하여 비동기적으로 작동합니다.</li>
<li>Reactor 패턴: 이는 Node.js의 비동기 이벤트 주도 아키텍처의 핵심 메커니즘이며, 애플리케이션의 성능을 향상시키는 주요 구성 요소입니다. 이 패턴에서, 이벤트는 &quot;reactor&quot;에 의해 감지되고 적절한 &quot;handler&quot;로 전달됩니다. Node.js에서는 이벤트 루프가 reactor의 역할을 하며, callback 함수가 handler의 역할을 합니다.</li>
<li>서버에서 동작하는 JavaScript: 웹 브라우저에서 동작하는 JavaScript와 달리, Node.js는 서버에서 동작하는 JavaScript입니다. 이는 Node.js가 파일 시스템에 액세스하고, 네트워크를 통해 데이터를 전송하고, HTTP 또는 TCP 서버를 생성할 수 있다는 것을 의미합니다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Node.js 디자인 패턴 바이블 - 0]]></title>
            <link>https://velog.io/@minj9_6/Node.js-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EB%B0%94%EC%9D%B4%EB%B8%94-0</link>
            <guid>https://velog.io/@minj9_6/Node.js-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EB%B0%94%EC%9D%B4%EB%B8%94-0</guid>
            <pubDate>Thu, 16 Nov 2023 11:13:06 GMT</pubDate>
            <description><![CDATA[<h3 id="🔐study-keyword-">*🔐Study Keyword :</h3>
<blockquote>
<p>keyword thema
✅: keyword word(🔑, 🗝️), point words: 🔓</p>
</blockquote>
<h1 id="--nodejs">- Node.js</h1>
<p>Q) 왜 Node.js가 웹 개발 분야에 혁신으로 떠오른걸까?
A) 기술적인 능력 + 웹 개발과 소프트웨어 개발 생태계에 도입한 새로운 패러다임으로 인하여!</p>
<h4 id="why--whne-use❔❕">WHY &amp; WHNE USE❔❕**</h4>
<h4 id="1-nodejs-애플리케이션은-웹에서-가장-많이-쓰는-언어이며-모든-웹-브라우저에-지원되는-javascript로-작성">1. Node.js 애플리케이션은 웹에서 가장 많이 쓰는 언어이며 모든 웹 브라우저에 지원되는 Javascript로 작성</h4>
<blockquote>
<pre><code>- 단일 언어 애플리케이션 스택 및 서버-클라이언트 간 코드 공유 가능</code></pre></blockquote>
<pre><code>-&gt; 이로 인해 프론트-백엔드 격차 줄이는데 도움, 개발자의 프론트-백엔드 프로그래밍의 접근을 쉽고 직관적이게 함
-&gt; 따라서 Node.js 및 Javascript에 익숙해지면 플랫폼 및 컨텍스트를 위한 소프트웨어 쉽게 빌드 가능
=&gt; 노드가 실용성, 유연성, 이벤트기반, 접근방식 그리고 객체지향 프로그래밍과 함수 프로그래밍의 중간인 하이브리드적 특성을 담은 자바스크립트 언어의 발전에 기여</code></pre><h4 id="2-nodejs의-혁신적인-단일-스레드-프로그래밍-모델과-비동기-아키텍쳐">2. Node.js의 혁신적인 단일 스레드 프로그래밍 모델과 비동기 아키텍쳐</h4>
<blockquote>
<pre><code>- 성능 및 확장성 관점에서의 장점 외에도 개발자가 동시성 및 병렬 처리에 접근하는 방식에 변화</code></pre></blockquote>
<pre><code>- 뮤텍스는 대기열, 스레드는 콜백, 동기화는 인과관계로 대체되어 이러한 추상화가 일상적인 문제를 해결하는데 생산성을 높임</code></pre><h4 id="3-nodejs의-중요한-측면은-생태계에-있으므로-극도의-모듈성을-강조하는-문화를-갖춤">3. Node.js의 중요한 측면은 생태계에 있으므로 극도의 모듈성을 강조하는 문화를 갖춤</h4>
<blockquote>
<pre><code>- NPM 패키지 관리자, 지속적으로 성장하는 모듈 데이터베이스와 유용한 커뮤니티로 인해 단순성, 실용성을 갖춤</code></pre></blockquote>
<p>그렇다면 이러한 특성을 갖춘 Node.js의 패러다임의 디자인과 코딩문제를 효과적으로 해결하기 위해 다음과 같은 질문에 주목해야한다.</p>
<ul>
<li>어떻게 코드를 구조화 할 것인가?</li>
<li>이것을 디자인하는 좋은 방법은 무엇일까?</li>
<li>애플리케이션을 모듈화하려면 어떻게 해야하는가?</li>
<li>일련의 비동기 호출을 효과적으로 처리하는 방법이 있는가?</li>
<li>애플리케이션이 커지면서 문제가 발생하지 않도록 하려면 어떻게 해야할까?</li>
</ul>
<p>이 책을 통해 디자인 패턴, 입증된 코딩 기법을 통해 검증된 솔루션을 보여주며 이를 특정 문제에 대한 솔루션으로 만들기 위한 출발점으로 사용하는 방법을 알려줄 것이다.</p>
<h3 id="💡conclusion">*💡conclusion</h3>
<blockquote>
<h4 id="앞으로-배우게-될-내용들">앞으로 배우게 될 내용들</h4>
<p><code>Node way</code> - 올바른 관점을 사용하는 방법
EX&gt; 전통적인 디장인 패턴이 어떻게 보이는지 또는 한가지만 수행하는 모듈을 디자인하는 방법
<code>일반적인 Node.js 설계 및 코딩 문제를 해결하기 위한 일련의 패턴들</code> - 일상적인 개발 및 디자인 문제를 효율적으로 해결하기 위해 사용할 수 있는 패턴
<code>확장가능하고 효율적인 Node.js 애플리케이션 작성하는 방법</code> - 기본 컴포넌트들과 그 원리를 이해하고 기존 패턴의 범위에 포함되지 않는 새로운 문제에 원칙 적용
<code>모던 JavaScript 코드</code> - 클래스 구문, 프라미스, 제너레이터 함수와 async/await같은 최신 기능을 활용하여 사용자에게 적합한 최신 환경 제공</p>
</blockquote>
<h3 id="📑study-source">#📑Study Source</h3>
<blockquote>
<p>Node.js 디자인 패턴 바이블 중 머리말과 들어가기 전 부분</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[scss thema화]]></title>
            <link>https://velog.io/@minj9_6/scss-thema%ED%99%94</link>
            <guid>https://velog.io/@minj9_6/scss-thema%ED%99%94</guid>
            <pubDate>Tue, 31 Oct 2023 11:17:27 GMT</pubDate>
            <description><![CDATA[<p>상황: 소속 팀에 키오스크의 장애인 차별 금지법 적용으로 인해 현재 키오스크의 일반 모드와 접근 모드로 나누는 모듈이 필요</p>
<p>목적 : scss를 테마화하여 저시력모드와 일반모드를 나누어 적용</p>
<p>과정 : 하여 sfc(싱글 파일 컴포넌트)되어있는 vue의 scss관련 스크립트를 걷어낼 목적</p>
<p>모두 별개의 폴더 내 별도의 scss로 분리하여 변수화 시켜 테마를 적용</p>
<hr>
<h4 id="1-확인사항">1. 확인사항</h4>
<blockquote>
</blockquote>
<ul>
<li>테마를 몇 개로 지정하는 지 <ul>
<li>일반 테마와 저시력 테마로 나뉨</li>
</ul>
</li>
<li>사용자가 선택 할 수 있어야하는지<ul>
<li>사용자가 키오스크에 접근하여 직접 테마를 변경할 수 있어야함<ul>
<li>최상단 html에 클래스 부여 시 테마 맞춰 일괄 변경 가능</li>
</ul>
</li>
</ul>
</li>
<li>테마화 하려는 단위가 무엇이 있는지<ul>
<li>기본 컬러, 타이포 그래피, 이미지(svg로 되어있는 아이콘 등), 컴포넌트(인풋, 탭, 버튼 등)
<a href="https://velog.io/@ohmy0418/SCSS-%ED%8E%98%EC%9D%B4%EC%A7%80-%ED%85%8C%EB%A7%88%ED%99%94">테마화 참고 자료</a></li>
</ul>
</li>
</ul>
<h4 id="2-mozila-css-속성-순서-컨벤션">2. Mozila CSS 속성 순서 컨벤션</h4>
<blockquote>
</blockquote>
<p>  display
  list-style
  position
  float
  clear
  width / height
  padding / margin
  border / background
  color / font
  text-decoration
  text-align / vertical-align
  white-space
  other text
  content</p>
<h4 id="3-진행-과정">3. 진행 과정</h4>
<ol>
<li>테마화 시 적용할 단위를 나눈다</li>
<li>가령 컬러 별 테마화를 한다면 현재 UI에 적용된 컬러들을 변수화 시켜 scss에 별도 저장</li>
<li>utils 폴더내 변수화 및 mixin으로 묶을 사항들을 나열한다</li>
<li>layout &gt; view &gt; component 처럼 레이아웃부터 상위 컴포넌트에서 하위 컴포넌트까지 SFC 내에 정의된 style sheet를 별도의 scss로 분리</li>
</ol>
<hr>
<p><img src="https://velog.velcdn.com/images/minj9_6/post/5f19b646-2006-4cf3-8f5e-8957a3ded598/image.png" alt=""></p>
<p>아래와 같이 src 내 scss 폴더에 각각 용도별 scss 스타일 그리고 변수 정의</p>
<ul>
<li>common : 공통된 스타일 정의, ex&gt; body, font-face등</li>
<li>layouts : 최상위 레이아웃 스타일 관리하는 스타일 스크립트 scss 정의, ex&gt; home, loot 레이아웃 scss 등</li>
<li>pages : 각 페이지 별 view 화면 해당하는 스타일 스크립트 scss 정의, ex&gt; main, fail 페이지 등</li>
<li>componenets : 각 컴포넌트 별로 해당하는 스타일 스크립트 scss 정의, ex&gt; card 컴포넌트, common내 input 컴포넌트 등</li>
<li>themes : 스타일을 적용할 각 테마별 scss 변수를 재정의하는 파일로 모드 별 적용할 변수를 재정의하여 덮어씌어 줌, ex&gt; low-vision, basic 등 
<img src="https://velog.velcdn.com/images/minj9_6/post/419d41c8-4a2d-431d-a4fe-1a9af2eb6c8a/image.png" alt=""></li>
<li>utils: 공통으로 쓰이는 변수 공통 색상, 폰트, mixins 이나 레이아웃, 페이지, 컴포넌트 별 정의한 변수를 관리하는 디렉토리</li>
<li>main.scss : 분리한 scss를 모두 import하는 최종 스타일 시트 파일</li>
</ul>
<ol start="5">
<li>모든 스타일 시트 분리 및 변수 작성을 마치면 main.ts에서 특정 이벤트, 여기선 모드 버튼을 pinia로 만들어서 관리하도록 하여 액션에 따라 전역 변수 상태를 관찰하여 동적으로 스타일을 추가하고 제거해주는 코드 작성</li>
</ol>
<p>-main.ts 일부</p>
<pre><code class="language-js">const mode = useModeStore();

mode.$subscribe((mutation) =&gt; {
  const isLowVision = mutation.events.target.isLowVision as boolean;
  const head = document.querySelector(&quot;head&quot;) as HTMLHeadElement;
  const existingLink = document.querySelector(
    &quot;[rel=stylesheet][href*=&#39;low-vision&#39;]&quot;
  ) as HTMLLinkElement;

  if (isLowVision) {
    if (!existingLink) {
      const link = document.createElement(&quot;link&quot;);
      link.setAttribute(&quot;rel&quot;, &quot;stylesheet&quot;);
      link.setAttribute(&quot;type&quot;, &quot;text/css&quot;);
      link.setAttribute(&quot;href&quot;, &quot;src/scss/themes/low-vision.scss&quot;);
      head.appendChild(link);
    }
  } else {
    if (existingLink) {
      head.removeChild(existingLink);
    }
  }
});</code></pre>
<p>해당 액션에 따라 스타일을 동적으로 관리하여 모드 별 스타일 테마를 달리 적용하도록 할 수 있음</p>
<p>끝</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 숫자]]></title>
            <link>https://velog.io/@minj9_6/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%88%AB%EC%9E%90</link>
            <guid>https://velog.io/@minj9_6/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%88%AB%EC%9E%90</guid>
            <pubDate>Wed, 19 Apr 2023 13:50:55 GMT</pubDate>
            <description><![CDATA[<ul>
<li>자바스크립트 숫자 연산과 숫자 표현, Number 객체, 일반적인 숫자 알고리즘, 무작위 숫자 생성</li>
<li>프로그래밍 언어에서 숫자 연산 덕분에 숫자 값 계산 가능, 자바스크립트 숫자 연산 목록은 아래와 같음<ul>
<li><ul>
<li>: 덧셈</li>
</ul>
</li>
<li><ul>
<li>: 뺄셈</li>
</ul>
</li>
<li>/ : 나눗셈</li>
<li><ul>
<li>: 곱셈</li>
</ul>
</li>
<li>% : 나머지 연산</li>
</ul>
</li>
</ul>
<h1 id="1-숫자-체계">1. 숫자 체계</h1>
<p><img src="https://velog.velcdn.com/images/minj9_6/post/615d5645-7276-450d-b7e7-e793f0bdda7e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/minj9_6/post/7d1cc422-f2a0-4868-82e6-829457f11a3e/image.png" alt=""></p>
<blockquote>
<ul>
<li>그림과 같이 숫자에 대해 64비트 부동 소수점 표현 사용 </li>
</ul>
</blockquote>
<ul>
<li>다음 예에서 값은 40으로 부호 비트가 1이면 해당 숫자가 음수 다음 여덞개의 비트는 지수 값 e를 나타내며 마지막으로 나머지 52비트가 분수 값을 나타냄</li>
<li>십진분수로 인해 자바스크립트에서 부동소수점 체계가 반오림 오류를 일으킬 수 있는데 0.1과 0.2를 정확히 표현할 수 없어 0.1 + 0.2 === 0.3의 결과는 false임
```js</li>
</ul>
<p>0.1 + 0.2 === 0.3; // &#39;false&#39;</p>
<pre><code>
&gt;- 0.1을 64비트 부동수소점 숫자로 제대로 표현할 수 없는 이유 이해를 위해 이진 표기법을 이해해야함
- 이진 표기법으로 십진 수를  표현할 때 문한 개의 수가 필요한 경우 가 많아 이로 인해 이진주사 2^n으로 표현(n은 정수)
- 0.1을 계산하려 할 시 긴 나눗셈이 끝나지않고 계속되어 이진수로 1010은 10인데 0.1(1/10)을 계산하려면 소수점 아래 수가 무한히 생김

# 2. 자바스크립트 숫자 객체
- 자바스크립에는 위 같은 문제 해결 위해 도움되는 Number 객체의 내장된 속성이 있 음

#### 2_1. 정수 반올림
&gt;- 자바스크립트가 모든 숫자를 나타낼 때 부동소수점을 사용하기에 정수 나눗셈은 소용없음
- 예를 들어 자바에선 정수 나눗셈의 결과는 해당 나누기의 몫으로 5/4는 1이 몫이기에 결과는 1이지만 자바스크립트에선 5/4의 결과는 부동소수점인 1.25이다
- 자바에선 명시적으로 정수를 정수형으로 선언해야하기에 결과가 부동소수점이 될 수 없어 정수 나눗셈을 원하면 다음중 하나를 사용
```js
Math.floor(0.9); // 0 - 가장 가까운 정수로 내림
Math.floor(1.1); // 1
Math.round(0.49); // 0 - 가장 가까운 정수로 반올림
Math.round(0.5); // 1
Math.round(2.9); // 3
Math.ceil(0.1); // 1 - 가장 가까운 정수로 올림
Math.ceil(0.9); // 1
Math.ceil(21); // 21
Math.ceil(21.01); // 22</code></pre><h4 id="2_2-numberepslion">2_2. Number.EPSLION</h4>
<blockquote>
<ul>
<li>Number.EPSLION은 두 개의 표현 가능한 숫자 사이의 가장 작은 간격을 반환해 이는 부동소수점 근사치르 활용해 분수가 제대로 표현되지 않는 문제를 해결하는데 유용</li>
</ul>
</blockquote>
<pre><code class="language-js">function numberEquals(x, y) {
    return Math.abs(x - y) &lt; Number.EPSILON;
}
0.1 + 0.2 == 0.3 // false due to little difference in floating point
numberEquals(0.1 + 0.2, 0.3); // true</code></pre>
<ul>
<li>위 함수는 두 수의 차이가 Number.EPSLION보다 작은지 검사해 작으면 true를 반환</li>
<li>Number.EPSLION이 두 개의 표현 가능한 숫자 사이의 최소 차이라는 것을 기억 즉, 0.1+0.2와 0.3의 차이는 Number.EPSLION보다 작음</li>
</ul>
<h4 id="2_3-최대치">2_3. 최대치</h4>
<blockquote>
<ul>
<li>Number.MAX_SAFE_INTEGER는 가장 큰 정수 반환</li>
</ul>
</blockquote>
<pre><code class="language-js">Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true
Number.MAX_SAFE_INTEGER + 1.111 === Number.MAX_SAFE_INTEGER + 2.022; // false</code></pre>
<ul>
<li>두 수는 더 이상 커질 수 없기에 true를 반환하지만 부동소수점에 사용하면 제대로 동작하지 않아 false를 반환</li>
</ul>
<blockquote>
<ul>
<li>Number.MAX_VALUE는 가능한 가장 큰 부동 소수점을 반환</li>
</ul>
</blockquote>
<pre><code class="language-js">Number.MAX_VALUE + 1.111 === Number.MAX_VALUE + 2.022; // true</code></pre>
<ul>
<li>Number.MAX_SAFE_INTEGER와 달리 위 코드는 배정밀도 부동소수점 표현을 사용하고 부동소수점에 대해서도 잘 동작</li>
</ul>
<h4 id="2_4-최소치">2_4. 최소치</h4>
<blockquote>
<ul>
<li>Number.MIN_SAFE_INTEGER는 가장 작은 정수를 반환</li>
</ul>
</blockquote>
<pre><code class="language-js">Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2; // true
Number.MIN_SAFE_INTEGER - 1.111 === Number.MIN_SAFE_INTEGER - 2.022; // false</code></pre>
<ul>
<li>두 수가 더이상 작아질 수 없기에 true를 반환하지만 부동소수점과 함께 사용하면 제대로 동작하지 않음</li>
</ul>
<blockquote>
<ul>
<li>Number.MIN_VALUE는 가장 작은 부동소수점 수를 반환</li>
</ul>
</blockquote>
<ul>
<li>Number.MIN_VALUE가 가능한 가장 작은 부동소수점이기 때문에 음수가 아니라 실제로 Number.MIN_VALUE는 Number.MIN_SAFE_INTEGER보다 크며 Number.MIN_VALUE는 0에 가장 가까운 부동소수점이기에 다음과 같은 코드가 가능<pre><code class="language-js">Number.MIN_VALUE - 1 == -1; // true</code></pre>
</li>
<li>위 코드가 true인 이유도 0 - 1 === -1과 비슷하기 때문</li>
</ul>
<h4 id="2_5-무한">2_5. 무한</h4>
<blockquote>
<ul>
<li>Number.MAX_VALUE보다 큰 유일한 건 Infinity고 Number.MIN_SAFE_INTEGER보다 작은 유일한 것은 -Infinity </li>
</ul>
</blockquote>
<pre><code class="language-js">Infinity &gt; Number.MAX_SAFE_INTEGER; // true
-Infinity &lt; Number.MAX_SAFE_INTEGER // true
-Infinity -32323323 == -Infinity -1; // true</code></pre>
<ul>
<li>true로 평가되는 이유는 -Infinity보다 작아질 수 없기 때문</li>
</ul>
<h4 id="2_6-크기-순서">2_6. 크기 순서</h4>
<blockquote>
<ul>
<li>자바스크립트 숫자의 크기를 가장 작은 것부터 큰 것 순으로 요약하면 다음과 같음</li>
</ul>
</blockquote>
<pre><code class="language-js">-Infinity &lt; Number.MIN_SAFE_INTEGER &lt; Number.MIN_VALUE &lt; 0 &lt; Number.MAX_SAFE_INTEGER &lt; Number.MAX_VALUE &lt; Infinity</code></pre>
<h4 id="2_7-숫자-알고리즘">2_7. 숫자 알고리즘</h4>
<ul>
<li>숫자가 소수, 소인수분해인지 판단하는 알고리즘은 숫자와 관련된 가장 많이 논의되는 알고리즘 중 하나</li>
</ul>
<h4 id="2_7_1-소수-테스트">2_7_1. 소수 테스트</h4>
<blockquote>
<ul>
<li>숫자가 소수인지 알아보는 방법은 n을 2부터 n-1까지 수로 나눠 나머지가 0인지 확인</li>
</ul>
</blockquote>
<pre><code class="language-js">function isPrime(n) {
    if (n &lt;= 1) {
        return false
    } 
    for (let i = 2; i &lt; n; i++) {
        if (n % i==0) {
            return false
        }
    }
    return true
}</code></pre>
<ul>
<li>위 코드에 시간 복잡도는 O(n)으로 위 알고리즘은 0부터 n까지 모든 수 확인하기 때문</li>
</ul>
<blockquote>
<ul>
<li>허나 위 알고리즘은 쉽게 개선 가능한 예로 메소드가 2부터 n까지 어떤 식으로 순회되는 생각해보면 알고리즘 수행 방식에서 패턴을 찾아 더 빠르게 만들 수 있음<ul>
<li>2의 배수는 무시가능하며 최적화 가능한 부분이 더 있음</li>
<li>소수 나열 2,3,5,7,11,13,17,19,23 ...<ul>
<li>2와 3을 제외한 모든 소스는 6k+-1(k정수) 형태를 지님</li>
<li>n이 소수인지 알아보기 위해 반복문은 n의 제곱근까지만 확인 가능하는데 n의 제곱근이 소수가 아니면 n은 수학 정의에 의해 소수가 아님</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<pre><code class="language-js">function isPrime(n) {
    if (n &lt;= 1) return false
    if (n &lt;= 3) return true
    // 입력된 수가 2또는 3인 경우 아래 반복문에서 다섯개 숫자 건너 띔
    if(n % 2 ==0 || n % 3 ==0) return false
    for (let i = 5; i*i &lt;= n; i=i+6) {
        if (n % i==0 || n % (i+2) ==0) {
            return false
        }
    }
    return true
}
isPrime(123)
// 6k+-1 optimisation
function is_prime (n) {
  if (n &lt; 3) return n &gt; 1;
  else if (n % 2 === 0 || n % 3 === 0) return false;
  else if (n &lt; 25) return true;
  let i = 5;
  while (i * i &lt;= n ) {
    if (n % i === 0 || n % (i + 2) === 0) return false;
    i += 6;
    //5,7,11,13,17,19,23,25,29,31 ...
  }
  return true;
}</code></pre>
<ul>
<li>개선 된 알고리즘은 시간복잡도를 상당히 줄여 O(sqrt(n))까지 줄여줌</li>
<li>참고) 제곱근 관련, <a href="https://developerjun2.tistory.com/127">https://developerjun2.tistory.com/127</a></li>
</ul>
<h4 id="2_7_2-소인수분해">2_7_2. 소인수분해</h4>
<blockquote>
<ul>
<li>어떤 숫자의 소인수분해를 구하는 알고리즘 역시 유용</li>
</ul>
</blockquote>
<ul>
<li>소수는 암호화와 해싱의 기반이 되며 소인 수 분해는 주어진 숫자를 만들기 위해 어떤 소수들이 곱해져야 하는지 구하는 과정<pre><code class="language-js">function primeFactors(n) {
  // n이 2로 나눠진다면 나눠질 수 있는 수만큼 2가 출력
  while (n % 2 == 0) {
      console.log(2);
      n = n / 2;
  }
  // n은 이 지점에서 홀수가 확실, 따라서 수를 2개씩 증가 시킬 수 있음
  for (var i = 3; i * i &lt;= n; i = i + 2) {
      // i가 n을 나눌 수 있는 한 계속해서 i가 출력되고 n을 i로 나눔
      while (n % i == 0) {
          console.log(i);
          n = n / i;
      }
  }
  // 다음 조건문은 n이 2보다 큰 소수를 처리
  if (n &gt; 2) {
      console.log(n);
  }
}
primeFactors(10); // prints &#39;5&#39; and &#39;2&#39;</code></pre>
</li>
<li>위 알고리즘은 i로 나머지가 없이 나눌 수 있는 모든 수를 출력해 소수가 함수의 입력 값으로 전달된 경우 아무 수도 출력되지 않다가 마지막 조건문에서 n이 2보다 큰지 확인 후 큰 경우 n이 출력</li>
</ul>
<h4 id="2_7_3-무작위-수-생성기">2_7_3. 무작위 수 생성기</h4>
<blockquote>
<ul>
<li>무작위 수 생성은 어떤 조건이 어떤 식으로 동작하는지 확인하는 데 있어 중요</li>
</ul>
</blockquote>
<ul>
<li>자바스크립트는 숫자 생성을 위한 내장 함수인 Math.random() 존재</li>
<li>Math.random()은 0과 1 사이 부동소수점 반환하며 1보다 큰 수를 얻기 위해 Math.random()에 범위를 곱하고 나서 곱한 값에 어떤 수를 더하거나 빼서 기준 범위를 만들면 됌<pre><code class="language-js">Math.random() * 100; // 부동 소수점 0 부터 100
Math.random() * 25 + 5; // 부동 소수점 between 5 부터 30
Math.random() * 10 - 100; // 부동 소수점 between -100 부터 -90</code></pre>
</li>
</ul>
<blockquote>
<ul>
<li>무작위 정수 얻기 위해선 Math.floor()와 Math.round(), Math.ceil()을 사용해 부동소수점을 정수로 만들면 됌</li>
</ul>
</blockquote>
<pre><code class="language-js">Math.floor(Math.random()) * 100; // integer between 0 and 99
Math.round(Math.random()) * 25 + 5; // integer between 5 and 30
Math.ceil(Math.random()) * 10 - 100; // integer between -100 and -90</code></pre>
<h4 id="연습문제-1번">연습문제 1번</h4>
<blockquote>
<ul>
<li>x와 y,p 세개 숫자에 대해 (x^y) % p 계산 (= 모듈러 제곱거듭)</li>
</ul>
</blockquote>
<ul>
<li>여기서 x는 기저, y는 지수, p는 모듈러로 모듈러 제곱 거든은 모듈러에 대해 수행하는 종류의 제곱 거듭</li>
<li>컴퓨터 과학에 유용하며 공개 키 알고리즘 분야에 사용<pre><code class="language-js">function modularExponentiation(base, exponent, modulus) {
  return Math.pow(base, exponent) % modulus;
}
modularExponentiation(4,3,5); // 4</code></pre>
</li>
<li>위 코드는 큰 지수를 다룰 수 없으며 암호화 알고리즘에 사용된다는 점을 기억 시 강력한 암호의 경우 대개 기저가 최소 256비트(78개 수)</li>
<li>가령 기저가 6x10^77이고 지수가 27 모듈러가 497이면 ((6x10)^77)^27은 매우 큰 수로 32비트 부동소수점에 저장할 수 없어 수학을 좀 더 심도있기 활용한 접근법을 사용해야 함</li>
</ul>
<blockquote>
<ul>
<li>임의의 a와 b에 대해 다음 속성 성립</li>
</ul>
</blockquote>
<ul>
<li>위 수학적 속성 활용해 1부터 지수까지 순회하며 현재 모듈러 마지막 모듈러와 곱함으로써 매번 재계산 가능</li>
<li>기저 4, 지수 3, 모듈러 5인 경우
c % m = (a b) % m
c % m = [(a % m) (b % m)] % m
4 ^ 3 &amp; 5 = 64 % 5 = 4
value = (lastValue x base) % module:
value = (1 x 4) % 5 = 4 % 5 = 4
value = (4 x 4) % 5 = 16 % 5 = 1
value = (1 x 4) % 5 = 4 % 5 = 4</li>
<li>최종 코드는 아래와 같으며 시간복잡도는 O(n)으로 n은 지수값과 동일<pre><code class="language-js">function modularExponentiation(base, exponent, modulus) {
  if (modulus == 1) return 0;
  var value = 1;
  for (var i = 0; i &lt; exponent; i++) {
      value = (value * base) % modulus;
  }
  return value;
}</code></pre>
</li>
</ul>
<h4 id="연습문제-2번---소수-출력">연습문제 2번 - 소수 출력</h4>
<blockquote>
<ul>
<li>n보다 작은 모든 소수 출력 0부터 n까지 순회하면서 isPrime()이 true 평가되는 모든 소수 출력</li>
</ul>
</blockquote>
<pre><code class="language-js">function allPrimesLessThanN(n) {
    for (var i = 0; i &lt; n; i++) {
        if (isPrime(i)) {
            console.log(i);
        }
    }
}
allPrimesLessThanN(15);</code></pre>
<h4 id="연습문제-3번---소인수-집합-확인">연습문제 3번 - 소인수 집합 확인</h4>
<blockquote>
<ul>
<li>소인수가 2 또는 3 또는 5뿐인 숫자를 못생긴 숫자라 정의 시 (11개 못생긴 숫자는 1,2,3,4,5,6,8,9,10,12,15 이며 1이 관례상 포함) n개의 못생긴 숫자 찾기</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>숫자가 나머지 없이 나눠질 수 없을 때까지 숫자를 제수(2,3,5)로 나눠보고 숫자가 모든 제수에 의해 나눠질 수 있다면 나눗셈이 끝난 다음 1이 돼야 함</li>
</ul>
</blockquote>
<pre><code class="language-js">function maxDivide(number, divisor) {
    while (number % divisor == 0) {
        number /= divisor;
    }
    return number;
}
function isUgly(number) {
    number = maxDivide(number, 2);
    number = maxDivide(number, 3);
    number = maxDivide(number, 5);
    return number === 1;
}</code></pre>
<ul>
<li>n에 대해 이를 반복하면 못생긴 숫자 목록 반환<pre><code class="language-js">function arrayNUglyNumbers(n) {
  var counter = 0,
      currentNumber = 1,
      uglyNumbers = [];
  while (counter != n) {
      if (isUgly(currentNumber)) {
          counter++;
          uglyNumbers.push(currentNumber);
      }
      currentNumber++;
  }
  return uglyNumbers;
}
arrayNUglyNumbers(12); // [ 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16 ]</code></pre>
</li>
</ul>
<h4 id="요약">요약</h4>
<blockquote>
<ul>
<li>자바스크립트 모든 숫자는 64비트 부동소수점 형태</li>
</ul>
</blockquote>
<ul>
<li>가장 작은 부동소수점 증가 얻기 위해선 Number.EPSLION을 사용</li>
<li>자바스크립트 가장 큰수와 작은 수는 다음 등식과 같이 요약
   <code>jsInfinity &lt; Number.MIN_SAFE_INTEGER &lt; Number.MIN_VALUE &lt; 0 &lt; Number.MAX_SAFE_INTEGER &lt; Number.MAX_VALUE &lt; Infinity</code></li>
<li>소수 검증과 소인수분해는 암호화 같이 다양한 컴퓨터 과학 분야에 사용되는 개념</li>
<li>무작위 수 생성 위해 Math.random()사용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[클린 코드]]></title>
            <link>https://velog.io/@minj9_6/%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@minj9_6/%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Mon, 17 Apr 2023 09:14:33 GMT</pubDate>
            <description><![CDATA[<ol>
<li>클린 코드에 대해 고민하기 ?</li>
</ol>
<p>타인이 정의한 답을 의심합니다.</p>
<p>배움에 열린 태도를 가집니다.</p>
<p>직접 생각하고 또 고민합니다.</p>
<p>클린 코드가 무엇인지를 자바스크립트를 통해 학습합니다.</p>
<p>흔히 알려진 자바스크립트 코드 스타일에 대한 견해를 탐구합니다.</p>
<ol start="2">
<li>JavaScript 특성 파악하기</li>
</ol>
<p>언어의 특성을 파악하여 실수를 예방합니다.</p>
<p>언어의 예상 실행 결과를 탐구하며 안전한 코드를 작성합니다.</p>
<ol start="3">
<li>사례를 통해 파악하기</li>
</ol>
<p>Bad Case와 Better Case로 구체적인 코드를 파악해봅니다.</p>
<ol start="4">
<li>좋은 코드 작성을 위한 의식적인 수련</li>
</ol>
<p>의식적인 수련을 유도하여 좋은 습관으로 개선합니다.</p>
<p>코드 리뷰 교육 플랫폼 NEXTSTEP에 참여하시면 배운 내용을 실제로 적용하며 피드백을 받을 수 있습니다.</p>
<p>배울 내용
자바스크립트로 코드를 작성하는 방법에 대해 고민해봅니다.
코드를 작성할 때 위험을 예방하고 관리합니다.
JavaScript의 특성을 파악합니다.
흔히 알려진 JavaScript 코드 스타일에 대한 견해를 탐구합니다.
클린 코드가 무엇인지를 JavaScript를 통해 학습합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트의 독특한 특징]]></title>
            <link>https://velog.io/@minj9_6/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8F%85%ED%8A%B9%ED%95%9C-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@minj9_6/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8F%85%ED%8A%B9%ED%95%9C-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Wed, 12 Apr 2023 14:32:45 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>구문과 동작 방식에 있어 자바스크립트 만이 지니는 예외적 사례와 특징</p>
</li>
<li><p>자바스크립트는 동적 인터프리터 프로그래밍 언어이므로 다른 전통적 객체지향 프로그래밍 언어들과 구문이 다름</p>
</li>
<li><p>시간 및 알고리즘 공간 복잡도 분석을 위한 빅오 표기법 개념</p>
</li>
<li><p>시간(실행시간)과 공간(사용된 메모리) 관점에서 알고리즘 구현을 분석하는 법 이해</p>
</li>
</ul>
<hr>
<h2 id="1-자바스크립트-범위">1. 자바스크립트 범위</h2>
<blockquote>
<ul>
<li>범위(scope)는 자바스크립트 변수에 대한 접근 권한을 정의</li>
</ul>
</blockquote>
<ul>
<li><p>자바스크립트에서 변수는 전역범위 또는 지역 범위에 속함</p>
</li>
<li><p>전역 변수는 전역 범위에 속하는 변수로 어디에서나 해당 변수에 접근 가능</p>
<h4 id="1_1-전역-선언--전역-범위">1_1 전역 선언 : 전역 범위</h4>
<blockquote>
<ul>
<li>자바스크립트에서 연산자 없이 변수를 선언 가능</li>
</ul>
</blockquote>
<pre><code class="language-js">test = &quot;sss&quot;;
console.log(test); // prints &quot;sss&quot;</code></pre>
</li>
<li><p>위와 코드는 전역 변수를 생성하지만 위 선언 방식은 가장 안좋은 사용법 중 하나</p>
</li>
<li><p>var, let을 사용해 변수를 선언, 수정하지 않는 변수 선언 시 const로 선언</p>
</li>
</ul>
<h4 id="1_2-var를-사용해-선언-함수-범위">1_2 var를 사용해 선언: 함수 범위</h4>
<blockquote>
<ul>
<li>var는 변수 선언하는데 사용되는 키워드로 어디에서 선언하든 변수 선언이 함수의 맨 앞으로 이동하는데 이를 <strong>호이스팅</strong>이라도 함</li>
</ul>
</blockquote>
<ul>
<li>스크립트 실행 시 변수가 스크립트 가장 마지막에 선언되어도 선언 코드가 가장 마지막에 실행되는 게 아님<pre><code class="language-js">function scope1(){
  var top = &quot;top&quot;;
  bottom = &quot;bottom&quot;;
  console.log(bottom);
  var bottom;
}
scope1(); // prints &quot;bottom&quot; - no error
// 실제 동작하는 방식
function scope1(){
  var top = &quot;top&quot;;
  var bottom;
  bottom = &quot;bottom&quot;;
  console.log(bottom);
}
scope1(); // prints &quot;bottom&quot; - no error</code></pre>
</li>
<li>scope1() 함수 가장 마지막 줄 위치한 bottom 변수 선언이 맨 앞으로 이동해 변수 출력은 오류 없이 수행</li>
<li>즉 var 키워드는 변수 범위가 가장 가까운 함수 범위라는 것을 의미한다</li>
</ul>
<blockquote>
<pre><code class="language-js">function scope2(print) {
    if (print) {
        var insideIf = &#39;12&#39;;
    }
    console.log(insideIf);
}
scope2(true); // prints &#39;12&#39; - no error
// 실제 동작하는 방식
function scope2(print) {
    var insideIf;
    if (print) {
        insideIf = &#39;12&#39;;
    }
    console.log(insideIf);
}
scope2(true); // prints &#39;12&#39; - no error</code></pre>
</blockquote>
<pre><code>- scope2 함수는 insideIf 변수와 가장 가까운 함수 범위
- 자바에선 위 구문은 오류를 일으키는데 insideIf 변수가 if문 블록 내에서만 사용 가능하고 if문 블록 외부에선 사용할 수 없기 때문

&gt;```js
var a = 1
function four() {
    if (true) {
        var a = 4;
    }
    console.log(a); // prints &#39;4&#39;
}
four();</code></pre><ul>
<li>전역변수 값인 1이 아닌 4가 출력되는 건 a 변수가 four 함수 내 재선언되어 사용 가능하기 때문</li>
</ul>
<h4 id="1_3-let을-사용해-선언-블록-범위">1_3 let을 사용해 선언: 블록 범위</h4>
<ul>
<li>변수 선언 시 let을 사용 해 선언하면 선언된 변수는 가장 가까운 블록 범위를 갖는다 (즉, 변수가 선언 된 {}내에서 유효)</li>
</ul>
<blockquote>
<pre><code class="language-js">function scope3(print) {
    if (print) {
        let insideIf = &#39;12&#39;;
    }
    console.log(insideIf);
}
scope3(true); // prints &#39;&#39;</code></pre>
</blockquote>
<pre><code>- 콘솔에 아무것도 출력되지 않는 이유는 insideIf 변수가 if문 블록 내에서만 사용 가능하기에

-- 

## 2. 등가와 형
- 자바스크립트엔 자바와 같은 전통적인 언어와 다른 자료형이 있는데 이런 점이 등가 비교와 같은 것들에 어떤식으로 영향을 미치는지 알아보자

#### 2_1. 변수형
&gt;- 자바스크립트엔 boolean, number, string, undefined, object, function, symbol과 같은 7개의 기본 자료형 존재
- 특이한 점은 선언만 되고 값이 할당되지 않은 변수엔 undefined가 할당 된다는 
```js
var is20 = false; // boolean
typeof is20; // boolean
var age = 19;
typeof age; // number
var lastName = &quot;Bae&quot;;
typeof lastName; // string
var fruits = [&quot;Apple&quot;, &quot;Banana&quot;, &quot;Kiwi&quot;];
typeof fruits; // object
var me = {firstName:&quot;Sammie&quot;, lastName:&quot;Bae&quot;};
typeof me; // object
var nullVar = null;
typeof nullVar; // object
var function1 = function(){
    console.log(1);
}
typeof function1 // function
var blank;
typeof blank; // undefined</code></pre><h4 id="2_2-참거짓-확인">2_2. 참/거짓 확인</h4>
<blockquote>
<ul>
<li>if문 내에 참/거짓 확인 사용되는데 많은 언어의 경우 if()함수 내 매개변수는 boolean 형이어야하지만 자바스크립트는 더 유연하다</li>
</ul>
</blockquote>
<pre><code class="language-js">if (node) {
}</code></pre>
<ul>
<li>node는 변수로 변수가 비거나 null 또는 undefined면 해당 변수는 false로 평가</li>
<li>다음은 false로 평가되는 경우<ul>
<li>false</li>
<li>0</li>
<li>빈 문자열</li>
<li>NaN</li>
<li>undefined</li>
<li>null</li>
</ul>
</li>
<li>다음은 true로 평가되는 경우    <ul>
<li>true</li>
<li>0이 아닌 다른 숫자</li>
<li>비어있지 않은 문자열</li>
<li>비어있지 않은 객체<pre><code class="language-js">var printIfTrue = &#39;&#39;;
if (printIfTrue) {
console.log(&#39;truthy&#39;);
} else {
console.log(&#39;falsey&#39;); // prints &#39;falsey&#39;
}</code></pre>
</li>
</ul>
</li>
</ul>
<h4 id="2_3-대-">2_3. ===대 ==</h4>
<blockquote>
<ul>
<li>자바스크립트는 스크립트 언어로 변수 선언 시 변수에 형이 할당되지 않고 대신 코드가 실행 될 때 해당 변수의 형이 해석</li>
</ul>
</blockquote>
<ul>
<li>따라서 ===는 ==보다 등가(양쪽이 같은지 여부)를 더 엄격히 확인</li>
<li>==가 값만 확인하는 반면 ===는 형과 값 모두 확인<pre><code class="language-js">&quot;5&quot; == 5 // returns true
&quot;5&quot; === 5 // returns false</code></pre>
</li>
<li>&quot;5&quot; == 5 는 true를 반환하는데 &quot;5&quot;가 비교 전 숫자로 강제 변환 되기 때문이고 반면 &quot;5&quot; == 5는 문자열과 숫자 타입까지 비교해 false를 반환</li>
</ul>
<h4 id="2_4-객체">2_4. 객체</h4>
<blockquote>
<ul>
<li>자바와 같은 강 자료형 언어는 isEquals()를 사용해 두 객체가 동일한지 확인하나 자바스크립트에선 두 객체가 동일한지 확인하고자 == 연산자를 써도 true로 평가되지 않는다</li>
</ul>
</blockquote>
<pre><code class="language-js">var o1 = {};
var o2 = {};
o1 == o2 // returns false
o1 === o2 // returns false</code></pre>
<ul>
<li>위 객체는 동일(동일한 속성과 값을 지님)함에도 두 객체는 동일하지 않은데 두 변수의 메모리상 주소가 다르기 때문</li>
<li>이것이 자바스크립트 애플리케이션 lodash나 underscore와 같은 유틸리티 라이브러리를 사용하는 이유로 두 라이브러리엔 두 객체 혹은 두 값을 정확히 확인할 수 있는 isEqual 함수가 존재</li>
<li>isEqual 함수가 속성 기반 등가 비교 방식으로 구현되어 객체의 각 속성을 비교<pre><code class="language-js">function isEquivalent(a, b) {
  // arrays of property names
  var aProps = Object.getOwnPropertyNames(a);
  var bProps = Object.getOwnPropertyNames(b);
  // If their property lengths are different, they&#39;re different objects 
  if (aProps.length != bProps.length) {
      return false;
  }
  for (var i = 0; i &lt; aProps.length; i++) {
      var propName = aProps[i];
      // If the values of the property are different, not equal
      if (a[propName] !== b[propName]) {
          return false;
      }
  }
  // If everything matched, correct
  return true;
}
isEquivalent({&#39;hi&#39;:12},{&#39;hi&#39;:12}); // returns true</code></pre>
</li>
<li>isEquivalent 함수는 문자열이나 숫자 하나만을 속성으로 갖는 객체에 대해서 도 잘 동작<pre><code class="language-js">var obj1 = {&#39;prop1&#39;: &#39;test&#39;,&#39;prop2&#39;: function (){} };
var obj2 = {&#39;prop1&#39;: &#39;test&#39;,&#39;prop2&#39;: function (){} };
isEquivalent(obj1,obj2); // returns false</code></pre>
</li>
<li>위 처럼 isEquivalent 함수가 잘 동작하는 이유는 함수와 배열이 등가 비교를 위해 단순히 == 연산자를 사용하는 것이 아니기 때문<pre><code class="language-js">var function1 = function(){console.log(2)};
var function2 = function(){console.log(2)};
console.log(function1 == function2); // prints &#39;false&#39;</code></pre>
</li>
<li>두 함수가 동일한 연산을 수행하지만 두 함수의 메모리상 주소는 다르기에 등가 연산자는 false를 반환 </li>
<li>기본 등가 확인 연산자인 ==와 ===는 문자열과 숫자에만 사용 가능하며 객체에 대한 등가 확인을 구현 하려면 객체의 각 속성 확인해야함</li>
</ul>
<h4 id="요약">요약</h4>
<blockquote>
<ul>
<li>자바스크립트엔 대부분 프로그래밍 언어들이 사용하지 않는 다른 방식의 변수 선언 방식 존재<ul>
<li>var는 함수 범위 내 변수 선언</li>
<li>let은 블록 범위에서 변수 선언하고 아무 연산자 없이 변수 선언하면 해당 변수는 전역 범위에서 선언 됌(전역 범위로 변수 선언하는 것은 피해야함)</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li>형 확인 위해 typeof를 사용해 원하는 형이 맞는지 검증 가능</li>
<li>등가 확인 위해 값에 대해선 == 사용 값과 형 모두 같은지 확인하기 위해 === 사용하나 ==와 ===는 숫자, 문자열, 불리언 같은 비객체형만 사용 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅오 표기법]]></title>
            <link>https://velog.io/@minj9_6/%EB%B9%85%EC%98%A4-%ED%91%9C%EA%B8%B0%EB%B2%95</link>
            <guid>https://velog.io/@minj9_6/%EB%B9%85%EC%98%A4-%ED%91%9C%EA%B8%B0%EB%B2%95</guid>
            <pubDate>Tue, 11 Apr 2023 14:43:08 GMT</pubDate>
            <description><![CDATA[<ul>
<li>시간 및 알고리즘 공간 복잡도 분석을 위한 빅오 표기법 개념</li>
<li>시간(실행시간)과 공간(사용된 메모리) 관점에서 알고리즘 구현을 분석하는 법 이해</li>
</ul>
<hr>
<h2 id="1-빅오-표기법-기초">1. 빅오 표기법 기초</h2>
<h4 id="빅오-표기법">빅오 표기법</h4>
<blockquote>
<ul>
<li>알고리즘 최악의 경우 복잡도를 측정</li>
</ul>
</blockquote>
<ul>
<li>n은 입력의 개수를 나타냄</li>
<li>알고리즘 구현 시 빅오 표기법이 해당 알고리즘이 얼마나 효과적인지 나타내기에 빅오 표기법이 중요
<img src="https://velog.velcdn.com/images/minj9_6/post/5d432f14-937a-4d79-a069-1669504ddfcc/image.png" alt=""></li>
</ul>
<h4 id="일반적인-예시">일반적인 예시</h4>
<h4 id="1-o1">1. O(1)</h4>
<blockquote>
<ul>
<li>O(1)은 입력 공간에 대해 변하지 않아 상수 시간이라 부름</li>
</ul>
</blockquote>
<ul>
<li>배열에 있는 항목 인덱스 사용해 접근하는 경우가 그 예시</li>
</ul>
<h4 id="2-on">2. O(n)</h4>
<blockquote>
<ul>
<li>선형 시간이며 최악의 경우 n번의 연산을 수행해야하는 알고리즘에 적용</li>
</ul>
</blockquote>
<ul>
<li>0부터 n-1까지 숫자 출력하는 경우가 그 예시<pre><code class="language-js">function exampleLinear(n) {
  for (var i = 0; i &lt; n; i++) {
      console.log(i);
  }
}</code></pre>
</li>
</ul>
<h4 id="3-onm">3. O(n^m)</h4>
<blockquote>
<ul>
<li>m에 2면 2차 사긴이고 3이면 3차 시간</li>
</ul>
</blockquote>
<pre><code class="language-js">function exampleQuadratic(n) {
    for (var i = 0; i &lt; n; i++) {
        console.log(i);
        for (var j = i; j &lt; n; j++) {
            console.log(j);
        }
    }
}
function exampleCubic(n) {
    for (var i = 0; i &lt; n; i++) {
        console.log(i);
        for (var j = i; j &lt; n; j++) {
            console.log(j);
            for (var k = j; k &lt; n; k++) {
                console.log(k);
            }
        }
    }
}</code></pre>
<h4 id="4-olog-n">4. O(log n)</h4>
<blockquote>
<ul>
<li>로그 시간 복잡도를 지닌 알고리즘 예는 2의 2승부터 n승까지 항목 출력 시</li>
</ul>
</blockquote>
<ul>
<li>로그 시간 복잡도 효율은 백만 개의 항목과 같이 큰 입력이 있는 경우에 분명하여 n이 백만이여도 단 19개의 항목만 출력<pre><code class="language-js">function exampleLogarithmic(n) {
  for (var i = 1; i &lt; n; i=i*2) {
      console.log(i);
  }
}
exampleLogarithmic(10)
// 2,4,8,16,32,64</code></pre>
</li>
</ul>
<hr>
<h2 id="2-빅오-표기법-규칙">2. 빅오 표기법 규칙</h2>
<ul>
<li>알고리즘의 시간 복잡도를 f(n)이라고 표현하면 n은 입력의 개수, f(n)은 필요한 시간, f(n)space는 필요한 공간(추가적인 메모리)를 나타냄</li>
<li>알고리즘 분석 목표는 f(n)을 계산함으로써 알고리즘 효율성 이해</li>
</ul>
<h4 id="fn을-계산하는데-도움되는-규칙">f(n)을 계산하는데 도움되는 규칙</h4>
<h4 id="1_1-계수-법칙">1_1. 계수 법칙</h4>
<blockquote>
<ul>
<li>상수 k가 0보다 클 때, f(n)이 O(g(n))이면 kf(n)은 O(g(n))이며 이를 계수 법칙이라 함</li>
</ul>
</blockquote>
<ul>
<li>입력 크기 n과 관련되지 않은 계수 제거하고 n이 무한으로 가까워지는 경우 다른 계수는 무시</li>
</ul>
<h4 id="1_2-상수-제거하라">1_2. &quot;상수 제거하라&quot;</h4>
<blockquote>
<ul>
<li>입력 크기와 연관되지 않은 상수를 전부 무시</li>
</ul>
</blockquote>
<ul>
<li>빅오에서 입력 크기가 클 시 계수를 무시하여 가장 중요한 법칙 중 하나</li>
<li>즉 5f(n)과 f(n) 모두 동일한 O(f(n))이라는 빅오 표기법 지님</li>
</ul>
<blockquote>
<pre><code class="language-js">function a(n){
    var count =0;
    for (var i=0;i&lt;n;i++){
        count+=1;
    }
    return count</code></pre>
</blockquote>
<pre><code>- 위 코드는 f(n)=n으로 count에 숫자를 n번 더하기에 함수의 시간 복잡도는 O(n)
```js
function a(n){
    var count =0;
    for (var i=0;i&lt;5*n;i++){
        count+=1;
    }
    return count;
}</code></pre><ul>
<li>위 코드는 f(n)=5n으로 0부터 5n까지 실행되지만 위 두 코드 예시 모두 O(n) 빅오 표기법 지님</li>
<li>n이 무한대 또는 아주 큰 수에 가까워질 때 네 개의 연산이 추가적으로 존재한다 해서 달라지는 것은 없기 때문</li>
<li>n이 충분히 클 때 위 코드가 n번 수행되며 빅오 표기법에서 모든 상수는 무시 가능<pre><code class="language-js">function a(n){
  var count =0;
  for (var i=0;i&lt;n;i++){
      count+=1;
  }
  count+=3;
  return count;
}</code></pre>
</li>
<li>위 코드는 f(n)=n+1으로 마지막 연산 count+=3으로 인해 +1이 추가되었지만 여전히 O(n)의 빅오 표기법</li>
<li>추가된 연산이 입력 n에 영향 받지 않고 n이 무한대로 가까워질수록 추가된 연산 무시</li>
</ul>
<h4 id="2_1-합의-법칙">2_1. 합의 법칙</h4>
<blockquote>
<ul>
<li>f(n)이 O(h(n))이면 g(n)은 O(p(n))이면 f(n)+g(n)은 O(h(n)+p(n))임</li>
</ul>
</blockquote>
<ul>
<li>결과값인 시간복잡도가 두 개의 다른 시간 복잡도의 합이라면 결과값인 빅오 표기법 역시 두 개의 다른 표기법 합을 의미</li>
</ul>
<h4 id="2_2-빅오를-더하라">2_2. &quot;빅오를 더하라&quot;</h4>
<blockquote>
<ul>
<li>시간 복잡도를 더할 수 있는 것으로 두 개의 다른 알고리즘을 포함하는 상위 알고리즘이 있다면 해당 상위 알고리즘의 빅오 표기법은 해당 상위 알고리즘에 포함되는 두개의 알고리즘의 합</li>
</ul>
</blockquote>
<ul>
<li>단, 합의 법칙을 적용한 다음 계수 법칙이 적용된다</li>
</ul>
<blockquote>
<pre><code class="language-js">function a(n){
    var count =0;
    for (var i=0;i&lt;n;i++){
        count+=1;
    }
    for (var i=0;i&lt;5*n;i++){
        count+=1;
    }
    return count;
}</code></pre>
</blockquote>
<pre><code>- 각 루프의 시간 복잡도는 개별적으로 계산된 다음 더해져 f(n)=n, f(n)=5n을 더해 결과값은 6n지만 여기에 계수 법칙을 적용하면 최종적 결과는 O(n)=n

#### 3_1. 곱의 법칙
&gt;- f(n)이 O(h(n))이면 g(n)은 O(p(n))이면 f(n)g(n)은 O(h(n)p(n))임
- 두 개의 다른 시간 복잡도를 곱할 때 빅오 표기법 역시 곱해지는 것을 의미

#### 3_2. &quot;빅오를 곱하라&quot;
&gt;- 빅오가 어떤 식으로 곱해지는지에 관한 것
```js
function (n){
    var count =0;
    for (var i=0;i&lt;n;i++){
        count+=1;
        for (var i=0;i&lt;5*n;i++){
            count+=1;
        }
    }
    return count;
}</code></pre><ul>
<li>두 개의 중첩 for 루프를 포함하여 해당 중첩 for 루프에 곱의 법칙이 적용되어 f(n)= n*5n으로 내부 루프에 의해 5n번 실행되고 내부 루프가 외루 루프에 의해 n번 실행되므로 결과는 5n^2번 연산이 일어나고 계수 법칙이 적용되어 O(n)=n^2</li>
</ul>
<h4 id="4-전이-법칙">4. 전이 법칙</h4>
<blockquote>
<ul>
<li>f(n)이 O(g(n))이면 g(n)은 O(h(n))이면 f(n)은 O(h(n))임</li>
</ul>
</blockquote>
<ul>
<li>동일한 시간 복잡도는 동일한 빅오 표기법을 지님을 타나내기 위한 방법</li>
</ul>
<h4 id="5_1-다항-법칙">5_1. 다항 법칙</h4>
<blockquote>
<ul>
<li>f(n)이 k차 다항식이면 f(n)은 O(n^k)임</li>
</ul>
</blockquote>
<ul>
<li>직관적으로 다항 법칙은 다항 시간 복잡도가 동일한 다항 차수의 빅표기법을 지님</li>
</ul>
<h4 id="5_2-빅오의-k승">5_2. &quot;빅오의 k승&quot;</h4>
<blockquote>
<ul>
<li>다항 시간 복잡도가 동일한 다항 차수를 지닌 빅오 표기법을 지님을 나타냄</li>
</ul>
</blockquote>
<pre><code class="language-js">function a(n){
    var count =0;
    for (var i=0;i&lt;n*n;i++){
        count+=1;
    }
    return count;
}</code></pre>
<ul>
<li>2차 시간 복잡도를 지닌 for 루프 존재 시 n*n회 실행되기 때문인데 f(n)=n^2이 된다.</li>
</ul>
<h4 id="요약">요약</h4>
<blockquote>
<ul>
<li>빅오는 알고리즘 효율을 분석 및 비교 시 중요</li>
</ul>
</blockquote>
<ul>
<li>빅오 분석 위해서 코드를 살펴보고 빅오 표기법을 단순화하고자 다음 규칙(법칙) 적용<ul>
<li>계수/상수 제거(계수 법칙)</li>
<li>빅오 더하기(합의 법칙)</li>
<li>빅오 곱하기(곱의 법칙)</li>
<li>루프 조사해 빅오 표기법 다항 결정(다항 법칙)</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[5. 문제 해결 패턴]]></title>
            <link>https://velog.io/@minj9_6/5.-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@minj9_6/5.-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Tue, 21 Feb 2023 19:01:13 GMT</pubDate>
            <description><![CDATA[<h1 id="1-문제-해결-패턴-소개">1. 문제 해결 패턴 소개</h1>
<p><img src="https://velog.velcdn.com/images/minj9_6/post/453d79b5-1270-4a01-8440-9ce0ca59b8c4/image.png" alt=""></p>
<h2 id="2-빈도-수-세기-패턴-frequency-counter">2. 빈도 수 세기 패턴 (Frequency Counter)</h2>
<ul>
<li>자바스크립트 객체 사용해 다양한 값과 빈도를 수집할 쓰이는 패턴 </li>
<li>여러 데이터와 입력값이 서로 비슷한 값으로 구성되어 있는지 값이 다른 값에 포함되는지 여부를 비교할 때 등</li>
</ul>
<h4 id="예시---2개의-배열을-허용하는-same-함수-작성-배열의-모든-값이-두-번째-배열에-해당하는-값을-가지면-true-반환">예시 - 2개의 배열을 허용하는 same 함수 작성, 배열의 모든 값이 두 번째 배열에 해당하는 값을 가지면 true 반환</h4>
<pre><code class="language-js">//same([1,2,3] , [4,1,9])true
//same([1,2,3] , [1,9])fale
//same([1,2,1] , [4,4,1])true</code></pre>
<h4 id="단순-접근법">단순 접근법</h4>
<pre><code class="language-js">function same(arr1, arr2){
  // 두개의 배열을 받는데 2번째 배열이 첫 번째 인자의 값에 제곱 값이 되면 true 반환
  let answer = false
  if(arr1.length !== arr2.length) return answer
  for(let i=0; i&lt;arr2.length; i++){
    if(arr1.some(el =&gt; el*el===arr2[i])) answer = true
    else answer = false
    // 다른 풀이
    /*
    let correctIndex = arr2.indexOf(arr[i]**2)
    if(correctIndex === -1){
        return false
    }
    arr2.splice(correctIndex,1)
    */
  }
  return answer
}

same([1,2,3] , [4,1,9])
// true
same([1,2,3] , [1,9])
// fale
same([1,2,1] , [4,1,1])
// false</code></pre>
<ul>
<li>이러한 접근법은 O(N^2), 제곱시간이 사용되어 순진한 접근법으로 가능한 않는게 좋다</li>
</ul>
<h4 id="빈도-카운터-패턴-접근법">빈도 카운터 패턴 접근법</h4>
<ul>
<li>loop를 두개로 나눠 중첩된 개별 루프가 아닌 선형시간인 O(N)으로 수정되도록 하기</li>
</ul>
<pre><code class="language-js">function sameForFrequency(arr1, arr2){
  // 두개의 배열을 받는데 2번째 배열이 첫 번째 인자의 값에 제곱 값이 되면 true 반환
  let frequencyCounter1 ={}
  let frequencyCounter2 ={}
  for(let val of arr1){
      frequencyCounter1[val] = (frequencyCounter1[val] || 0)   + 1
  }
 for(let val of arr2){
      frequencyCounter2[val] = (frequencyCounter2[val] || 0)   + 1
 }
             console.log(frequencyCounter1)
           console.log(frequencyCounter2)
  for(let key in frequencyCounter1){
    console.log(key)
         if(!(key ** 2 in frequencyCounter2)){
           // key 제곱이 frequencyCounter2의 키 값인지 확인
           return false
         }
     // if(frequencyCounter2[key ** 2]!==frequencyCounter1[key]){
     //       return false
     //     }
   } 


  return true
}
sameForFrequency([1,2,3,2,5],[9,1,4,4,25])</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[지도 서비스로 길을 알아보자]]></title>
            <link>https://velog.io/@minj9_6/%EC%A7%80%EB%8F%84-%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A1%9C-%EA%B8%B8%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@minj9_6/%EC%A7%80%EB%8F%84-%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A1%9C-%EA%B8%B8%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Mon, 06 Feb 2023 23:09:19 GMT</pubDate>
            <description><![CDATA[<ul>
<li>지도 서비스 역시 경로 검색 알고리즘을 사용한다</li>
<li>지도 서비스를 이용하면 출발지에서 목적지까지의 경로를 바로 알아볼 수 있지만 서비스의 따라서 같은 조건으로 검색해도 경로가 다른 것을 알려주는데 이는 서비스 마다 경로 검색 알고리즘이 다르기 때문이다.</li>
</ul>
<h2 id="1-사람에겐-쉽고-기계는-어려운-경로-알고리즘">1. 사람에겐 쉽고 기계는 어려운 &#39;경로 알고리즘&#39;</h2>
<h4 id="경로-검색이란"><strong>경로 검색</strong>이란</h4>
<ul>
<li>출발 지점에서 도착 지점에 도달하기 까지의 경로(루트나 길)를 발견하는 처리를 의미</li>
<li>경로 여러개 있을 땐 조건에 맞는 경로를 찾아야 하며 다양한 상황에서 활용 된다</li>
<li>가장 비용이 적은 경로를 최단 경로라 하며 이때 비용은 시간, 거리, 횟수, 에너지 등의 물리량 의미</li>
<li>여러개 비용이 관련되거나 비용이 시간에 따라 변할 때 최단 거리 경로 구하는 알고리즘 복잡해짐</li>
<li>뿐만 아니라 비용이 두 번째, 세 번째인 경로를 검색하는 것도 매우 수준 높은 알고리즘 필요</li>
</ul>
<h4 id="경로-검색-돕는-그래프-이론">경로 검색 돕는 그래프 이론</h4>
<ul>
<li>그래프는 노드 집합과 엣지 집합을 말하며 결합 구조를 표현하는 모델이므로 노드를 두는 장소 또는 엣지가 직선이지 곡선인지는 고려하지 않음</li>
<li>엣지에서 방향성이 있는 그래프를 유향 그래프, 없는 그래프를 무향 그래프라 부르며 방향성 그래프에서 방향을 나타내는 엣지를 화살표로 표현</li>
<li>이웃한 노드를 연결한 선은 경로로 경로 검색에서 그래프로 해결한다는 건 출발 지점에서 도착 지점까지 가장 비용이 적은 경로 발견하겠다는 뜻</li>
</ul>
<h4 id="경로-검색-방법">경로 검색 방법</h4>
<ul>
<li>경로 검색 시 시작 노드에서 도착 노드까지 가는 경로의 경우의 수를 다 구하는 방법이 있지만 여기에 엣지 자체에 할당된 비용을 고려해서 가장 적게되는 경로를 골라야한다.</li>
</ul>
<h4 id="노드나-엣지의-갯수-증가">노드나 엣지의 갯수 증가</h4>
<ul>
<li>노드나 엣지 개수 증가 시 경로 개수 함께 증가</li>
</ul>
<h4 id="최단-경로-구하는-데이크스트라-알고리즘">최단 경로 구하는 데이크스트라 알고리즘</h4>
<ul>
<li>가까운 문제부터 해결하고 해결된 결과를 바탕으로 다음 문제를 해결한ㄴ다는 생각으로 최단 거리(최소 비용)와 경로를 찾아 나감</li>
</ul>
<h4 id="데이크스트라-사고-방식">데이크스트라 사고 방식</h4>
<blockquote>
<p>1&gt; 시작 노드에서 시작 노드로 가는 최단 경로 조사로 시작
 2&gt; 시작 노드와 인접한 노드를 조사하는데 최소 비용이 할당된 노드까지로 향하는 최소 비용을 확정 지음
 3&gt; 마찬 가지로 같은 작업이 반복</p>
</blockquote>
<h4 id="-정리하면-데이크스트라-알고리즘은-다음과-같은-작업을-반복해-최단-경로를-구함">=&gt; 정리하면 데이크스트라 알고리즘은 다음과 같은 작업을 반복해 최단 경로를 구함</h4>
<ol>
<li>시작 노드 0으로 정의</li>
<li>정의 하지 않은 노드 중 비용이 가장 적게 드는 노드를 찾아 비용을 확정</li>
<li>비용 확정한 노드의 경로 체크, 확정 노드까지 비용 엣지 비용을 합친 결곽가 현재 노드 값보다 작으면 갱신</li>
</ol>
<h2 id="2-알고리즘의-난적-조합적-확산">2. 알고리즘의 난적 &#39;조합적 확산&#39;</h2>
<h4 id="조합적-확산이란">조합적 확산이란</h4>
<p>-경로 검색 같은 알고리즘 설계 시 주의해야할 점이 조합적 확산</p>
<ul>
<li>노드의 수가 많은 경우 단순하게 해결하려다 입력 조합 개수 뿐만 아니라 출력 조합의 개수도 커지는 문제가 발생하여 현실적인 시간 내 끝내기 어려워질 수 있다.</li>
<li>효율적인 알고리즘을 찾아낼 수 만 이다면 모든 문제를 열거 했을 때 조합적 확산이 일어날 가능성이 있는 문제도 바로 해결 가능한데 그 예로 도널드 커누스가 개발한 Simple Path 알고리즘이 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 - set을 통한 이중 배열 중복 값 제거]]></title>
            <link>https://velog.io/@minj9_6/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-set%EC%9D%84-%ED%86%B5%ED%95%9C-%EC%9D%B4%EC%A4%91-%EB%B0%B0%EC%97%B4-%EC%A4%91%EB%B3%B5-%EA%B0%92-%EC%A0%9C%EA%B1%B0</link>
            <guid>https://velog.io/@minj9_6/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-set%EC%9D%84-%ED%86%B5%ED%95%9C-%EC%9D%B4%EC%A4%91-%EB%B0%B0%EC%97%B4-%EC%A4%91%EB%B3%B5-%EA%B0%92-%EC%A0%9C%EA%B1%B0</guid>
            <pubDate>Mon, 06 Feb 2023 12:24:36 GMT</pubDate>
            <description><![CDATA[<ul>
<li>다차원 배열은 set 형태로 만들어도 그대로이므로 문자열 형태의 1차원 배열로 만든 다음 set으로 만들어서 중복을 제거하고 다시 2차원 배열의 형태로 돌리기<pre><code class="language-js">var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
unique = Array.from(new Set(array.map(a =&gt; JSON.stringify(a))), json =&gt; JSON.parse(json));</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[검색 알고리즘을 체험해보자]]></title>
            <link>https://velog.io/@minj9_6/%EA%B2%80%EC%83%89-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%84-%EC%B2%B4%ED%97%98%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@minj9_6/%EA%B2%80%EC%83%89-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%84-%EC%B2%B4%ED%97%98%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Sun, 05 Feb 2023 23:15:53 GMT</pubDate>
            <description><![CDATA[<h2 id="1-검색-알고리즘">1. 검색 알고리즘</h2>
<ul>
<li>일상에 있는 다양한 알고리즘 중 대표적인 것 중 하나 </li>
</ul>
<h4 id="처리-속도와-하드웨어의-관계">처리 속도와 하드웨어의 관계</h4>
<ul>
<li>입력받은 데이터를 알고리즘에 따라 유익한 정보로 변화 및 출력하는 것을 데이터 프로세싱이라하는데 컴퓨터가 프로그램으로 구현된 알고리즘에 따라 데이터를 처리하는 데이터 프로세싱 머신이다.</li>
<li>알고리즘의 유한성을 만족하려면 효율적인 알고리즘 만들거나 하드웨어의 성능을 더 좋게 해야함</li>
</ul>
<h4 id="무어의-법칙이-예언하는-미래">무어의 법칙이 예언하는 미래</h4>
<ul>
<li>무어의 법칙은 반도체의 집적도가 18개월 마다 두배가 된다하여 이를 CPU의 속도와 메모리의 용량에도 적용 가능</li>
</ul>
<h4 id="빅데이터를-위한-처리-성능">빅데이터를 위한 처리 성능</h4>
<blockquote>
<ul>
<li>빅데이터를 효율적으로 처리하기 위해 컴퓨터는 스케일 업 / 아웃으로 처리 성능 높임<ul>
<li>스케일 업은 컴퓨터 한대의 CPU나 메모리 보강해 처리 성능 올리는 것, 단 CPU 속도 높이고 메모리 높이는데 물리적 제한 존재    </li>
<li>스케일 아웃은 컴퓨터 자체의 대수를 늘려 처리 성능을 높이닌 기법, 물리적 제한 없음</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li>스케일 아웃에는 클러스터링 기술 사용되는데 이는 파이버 채널 같은 고속네트워크로 여러대의 컴퓨터를 연결하여 마치 한 대의 컴퓨터처럼 사용하면서 빠르게 처리하는 기술<ul>
<li>처리 속도 향상은 물론 가용성 향상에도 기여</li>
</ul>
</li>
</ul>
<h4 id="맵리듀스를-통한-분사처리">맵리듀스를 통한 분사처리</h4>
<ul>
<li>빅테이터를 처리하는 시스템, 맵리듀스는 클러스터링된 컴퓨터로 대량의 데이터를 분산 처리하고자 고안한 프로그래밍 모델</li>
<li>클러스터링된 컴퓨터를 병렬로 동작시켜 데이터베이스나 파일에 저장돼 있는 빅데이터 처리<ul>
<li>입력받은 데이터를 맵 페이즈에서 작은 단위로 쪼개 필요한 정보를 모음 =&gt; 결과를 리듀스 페이즈에 묶어 처리 결과를 출력</li>
<li>맵과 리듀스 페이즈는 병렬 처리 가능해 클러스터링한 컴퓨터로 분산시켜 병렬로 실행해 빠른 처리 가능</li>
</ul>
</li>
</ul>
<h2 id="2-단순한-검색-알고리즘">2. 단순한 검색 알고리즘</h2>
<h3 id="1-선형-검색">1. 선형 검색</h3>
<ul>
<li>데이터 여러개에서 데이터가 나올 때까지 처음부터 차례로 검색하는 알고리즘, 리니어 서치라고도 함</li>
<li>단점은 데이터 양이 많아질수록 원하는 데이터를 찾기 까지 시간이 걸림</li>
<li>선형 검색에서 최악의 경우의 수(끝까지 발견 안되는 경우) 최대 검색 횟수라고 하는데 최대 검색 횟수를 N회로하면 평균 검색 횟수는 n/2회 검색량은 O(n)이 된다.</li>
</ul>
<h3 id="2-이진-검색">2. 이진 검색</h3>
<ul>
<li>바이너리 서치라고 부르며, 검색 범위를 반으로 나누어 원하는 데이터를 찾을 때까지 계속 검색</li>
<li>데이터는 어떤 기준에 따라 오름차순이나 내림차순으로 정렬되어 있어야 함</li>
<li>원하는 데이터를 찾을 때까지 검색할 데이터 범위를 반씩 줄여가며 찾는 알고리즘으로 선형 검색보다 효율적이ㅣ만 대소 관꼐를 이용하기에 정렬되지 않은 데이터는 검색 불가</li>
<li>이진 검색 최대 검색 횟수는 log2n + 1 회 평균 검색 횟수는 log2n회</li>
</ul>
<h2 id="3-더욱-수준-높은-검색과-자료-구조">3. 더욱 수준 높은 검색과 자료 구조</h2>
<h4 id="처리속도를-좌우하는-자료구조">처리속도를 좌우하는 자료구조</h4>
<ul>
<li>선형 검색과 이진 검색이라 기본 검색 알고리즘을 알아보았며, 처리를 하려면 데이터를 저장하는 방법도 중요</li>
<li>데이터를 다루기 위해 일정한 형식에 맞춰 체계적으로 저장<ul>
<li>어떻게 데이터 저장하는지에 따라 처리 시 효율성이 크게 달라지기 때문</li>
<li>이러한 데이터 저장 형식을 자료구조라 부름</li>
</ul>
</li>
</ul>
<h3 id="3_1-트리구조">3_1. 트리구조</h3>
<ul>
<li>나무 구조라고도 부르며 데이터가 나뭇가지처럼 서로 연결되어있는 구조</li>
<li>트리 구조 구성하는 요소는 노드라고 부르면 노드끼리 부모 자식 관계를 갖는다.<ul>
<li>부모 노드가 없는 맨 위 노드를 루트 노드, 자식 노드가 없는 가장 아래의 노드를 리프 도르가 부름</li>
<li>부모 자식 관계에 있는 노드는 선으로 열결되며이 선을 엣지라고 하며 루트 노드부터 리프 노드까지 계층을 트리 높이라고 </li>
</ul>
</li>
<li>트리 구조는 루트 노드에서 여러 개의 엣지를 거쳐 노드를 경유하면서 리프 노드에 도달하는 자료 구조</li>
</ul>
<h4 id="트리-구조-종류">트리 구조 종류</h4>
<ul>
<li>자식 노드의 개수가 2개로 제한된 트리 구조는 <strong>이진 트리</strong>, 자식 노드가 N개 이상인 트리 구조는 <strong>N항 트리</strong>라 부름</li>
<li>그리고 자식 노드가 3개 이상인 트리 구조를 총칭해서 <strong>다중 트리</strong>라고 부름</li>
</ul>
<h4 id="이진-트리-검색의-메커니즘">이진 트리 검색의 메커니즘</h4>
<ul>
<li>트리 구조가 검색에 어떻게 도움이 되는 지</li>
<li>이진 트리 중 왼쪽 자식 노드 값이 부모 노드 값 보다 작고, 오른쪽 자식 노드 값이 부모 노드 값 보다 크게 성 된 트리 구조를 가리켜 <strong>이진 탐색 트리</strong>라고 부름</li>
<li>이진 탐색 트리는 데이터를 크기에 따라 나눈 구조를 가져 이 형식을 활용하면 간단한 절차로 이진 검색 가능<blockquote>
<ol>
<li>루트 노드를 비교 대상으 노드로 정하고 검색 시작</li>
</ol>
</blockquote>
</li>
</ul>
<ol start="2">
<li>비교 대상 노드가 없으면 종료</li>
<li>비교 대상 노드와 검색하려는 데이터 비교하여 값이 같으면 종료(발견)</li>
<li>검색하고자 하는 데이터보다 비교 대상 노드 값이 크면 비교 대상 노드를 왼쪽 자식 노드로 지정하고 그렇지 않으면 비교 대상 노드를 오른쪽 노드로 지정</li>
<li>다시 2로 돌아감</li>
</ol>
<h4 id="avl-트리의-메커니즘">AVL 트리의 메커니즘</h4>
<ul>
<li>트리 구조 고안 시 주의해야 하는 사항 있는데 트리 구조 높이에 따라 효율이 달라진다는 점</li>
<li>실제 현장에서 트리 구조에 데이터 추가하거나 삭제해야 하는 상황이 자주 발생하는데 맹목적으로 데이터를 추가하거나 삭제하면 효율이 매우 나빠짐</li>
<li>높이가 일정하면 스텝의 개수는 줄지만 일정하지 않은 경우 선형을 이루게 되면서 스텝의 개수는 선형 검색과 같은 개수가 되어 효율이 매우 나빠짐</li>
<li>따라서 AVL (adelson-velskii and landis&#39; tres)라는 자료구조를 기억해야하는데 <strong>AVL 트리</strong>는 한 노드를 중심으로 좌우 부분 트리의 높이 차가 1 이하인 이진 탐색 트리로 이진 탐색 트리의 성질을 해치지 않으며 데이터 추가 시 트리 높이가 변경되면 AVL 트리의 조건에 따라 트리를 다시 구성해 트리의 높이를 일정하게 유지 가능</li>
<li>이렇게 이진 탐색 트리의 조건을 해치지 않으면서 트리를 변형시키는 작업을 가리켜 <strong>트리 회전</strong>이라 부름</li>
</ul>
<h4 id="균형-트리와-b트리">균형 트리와 B트리</h4>
<ul>
<li>루트 노드에서 가장 아래 있는 리프 노드까지 높이가 일정하도록 만들어진 트리 구조를 <strong>균형 트리</strong>라고 부름</li>
<li>AVL 트리도 평균 트리며 이진 탐색 트리이기도 하므로 일종의 균형 이진 탐색 트리</li>
<li><strong>B 트리</strong>는 다중 트리이면서 균형 트리 구조를 가진 트리 구조로 노드 하나가 자식 노드(다중 트리) 3개 이상 가질 수 있으며 어떤 리프 노드에서도 트리의 높이가 거의 같다(평균 트리)는 특징 가짐</li>
<li>노드의 대소 관계는 이진 트리와 같아 왼쪽 자식 노드 값은 부모 노드 값보다 작고 오른쪽 자식 노드 값은 부모 노드 값보다 큼</li>
</ul>
<h4 id="데이터-개수가-늘어날수록-빨라지는-b트리">데이터 개수가 늘어날수록 빨라지는 B트리</h4>
<ul>
<li>B 트리의 또 다른 특징으로 데이터 개수가 늘어날수록 빨라진다는 점</li>
<li>저장하는 데이터 개수 m으로 하면 오더가 O(logmN)이 되어 B트리는 빠르게 검색할 수 있으므로 데이터베이스나 파일 시스템에 자주 이용</li>
</ul>
<blockquote>
<ul>
<li>참고로 도메인 이름도 트리구조</li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘을 생각해보자]]></title>
            <link>https://velog.io/@minj9_6/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%84-%EC%83%9D%EA%B0%81%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@minj9_6/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%84-%EC%83%9D%EA%B0%81%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Wed, 01 Feb 2023 23:01:09 GMT</pubDate>
            <description><![CDATA[<h4 id="하노이의-탑으로-알고리즘을-생각">하노이의 탑으로 알고리즘을 생각</h4>
<ul>
<li>원반 3장을 최단 경로로 옮기는 알고리즘 생각</li>
</ul>
<h4 id="알고리즘이-만족해야하는-조건">알고리즘이 만족해야하는 조건</h4>
<h4 id="1-범용성-정당성-결정성">1) 범용성, 정당성, 결정성</h4>
<ul>
<li>범용성은 작업자와 상관없이 어떤 환경에서도 같은 결과를 내어야 올바른 알고리즘</li>
<li>정당성은 주어진 과제에 대해 올바른 결과, 출력을 얻을 수 있어야 올바른 알고리즘</li>
<li>같은 입력 시 반드시 같은 결과가 나와야 올바른 알고리즘</li>
</ul>
<h4 id="tip-알고리즘-용어">Tip, 알고리즘 용어</h4>
<blockquote>
<ul>
<li>문제: 알고리즘 해결하려는 내용</li>
</ul>
</blockquote>
<ul>
<li>프로그램 : 알고리즘을 컴퓨터에 실행하기 위해 프로그래밍 언어로 써낸 것</li>
<li>입력 : 알고리즘 처리 대상이 되는 데이터</li>
<li>출력 : 알고리즘을 실행해서 얻은 결과</li>
<li>스텝 : 알고리즘을 구성하는 절차, 복잡하거나 시간 걸리는 알고리즘일 수록 스텝 수 증가</li>
<li>최적화 : 알고리즘의 스텝수나 처리 시간 줄여 효율적 처리하도록 개선</li>
</ul>
<h4 id="2-유한성">2) 유한성</h4>
<ul>
<li>알고리즘은 유한성 역시 만족해야함</li>
<li>무한으로 반복하는 절차는 문제 해결 할 수 없기에</li>
</ul>
<h4 id="3-정지성">3) 정지성</h4>
<ul>
<li>알고리즘은 언제가 정지해야한다. 그러나 정지 여부를 판정하는 알고리즘은 만들 수 없다.</li>
</ul>
<h4 id="알고리즘의-실행-시간">알고리즘의 실행 시간</h4>
<p>알고리즘 실행 시간 판단 위해 &#39;계산량&#39; 지표 사용</p>
<ul>
<li><p>계산량이란 시간 계산량과 공간 계산량으로 나눔</p>
<ul>
<li>시간은 얼마만큼의 처리 시간이 필요한지, 공간은 어느정동의 기억 용량, 즉 메모리가 필요한지를 의미</li>
</ul>
</li>
<li><p>알고리즘의 계산량은 걸리는 시간을 뜻하는 게 아니라 스텝의 개수(명령 갯수)를 기준으로 한다. 환경에 따라 스텝 실행에 따른 시간은 바뀌지만 개수는 바뀌지 않기에</p>
</li>
</ul>
<h4 id="조합적-확산">조합적 확산</h4>
<ul>
<li>처리할 데이터 조합이 방대해져 스텝의 개수가 너무 많아지는 경우</li>
<li>조합적 확산이 일어날 때는 다른 알고리즘 사용해 현실적인 시간 내 문제 해결</li>
</ul>
<h4 id="정리">정리</h4>
<blockquote>
<ul>
<li>알고리즘 문제풀기 위한 절차</li>
</ul>
</blockquote>
<ul>
<li>알고리즘 주어진 입력에 필요한 출력을 얻는 방법을 간단한 조작이나 절차를 조합해서 명확히 정의</li>
<li>프로그램은 프로그래밍 언어로 쓰여진 알고리즘 작업 지시서</li>
<li>알고리즘은 범용성, 정당성, 결정성, 유한성, 정지성 갖춰야함</li>
<li>조합적 확산일어나면 실행 시간이 엄청걸림</li>
<li>알고리즘은 정지해야함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[map으로 해결 및 map의 잘못된 사용]]></title>
            <link>https://velog.io/@minj9_6/map%EC%9C%BC%EB%A1%9C-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@minj9_6/map%EC%9C%BC%EB%A1%9C-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Tue, 31 Jan 2023 23:24:11 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>함수형 프로그래밍은 가능한 한 가지 의미있는 작업을 하는 순수 함수를 만들고 이 함수들을 조합해서 더 큰 프로그램을 만든다.</p>
</li>
<li><p>함수의 재사용성과 합성을 용이하기 위해 함수는 여러가지 일이 아닌 하나의 일만 제대로 처리하는 것이 중요</p>
</li>
</ul>
<h4 id="페이지-기능-단위-쪼개기">페이지 기능 단위 쪼개기</h4>
<ol>
<li>아이템 목록 화면 그리기</li>
</ol>
<ul>
<li>재고 있는 경우</li>
<li>없는 경우</li>
</ul>
<ol start="2">
<li>전체 수량 표시</li>
<li>전체 가격 표시</li>
</ol>
<ul>
<li>상품을 상태별로 그려주는 함수인 stockItem, outOfStockItem으로 나누고
아이템의 재고 상태를 판단해 어떻게 그려줄 건지 판단하는 item 함수로 분리되어 각각 상태 테스트 하기 용이</li>
<li>함수 순수하게 만들고 적절한 크기로 나누기</li>
</ul>
<pre><code class="language-js">const stockItem = (item: Item) :string=&gt; {
  const name =    item.name;
  const price = item.price;
  const quantity = item.quantity;
  return `이름: ${name}, 가격 : ${price}, 수량 ${quantity}` 
}

const outOfStockItem = (item: Item): string =&gt; {
   const name =    item.name;
  const price = item.price;
  const quantity = item.quantity;
  return `이름: ${name} 품절, 가격 : ${price}, 수량 ${quantity}` 
}

const item = (item: Item): string =&gt; {
  if (item.outOfStock) {
    return outOfStockItem(item)
  } else {
    return stockItem(item)
  }
}


const totalCnt = (): string =&gt; {
  let totalCnt = 0;
  for (let i = 0; i &lt; cart.length; i++) {
    if (!cart[i].outOfStock) {
      totalCnt += cart[i].quantity;
    }
  }
  return `전체수량: ${totalCnt}`
}


const totalPrice = (): string =&gt; {
  let totalPrice = 0;
  for (let i = 0; i &lt; cart.length; i++) {
    if (!cart[i].outOfStock) {
    totalPrice += cart[i].price * cart[i].quantity;
    }
  }
  return `전체수량: ${totalCnt}`
}</code></pre>
<ul>
<li><p>그러나 여기까지 만든 item, totalCnt, totalPrice는 순수함수로 보기 어려운데 일종의 전역변수인 cart를 묵시적으로 의존하며 아무런 인자를 받고 있지 않기 때문</p>
</li>
<li><p>각각의 함수에 list인자 받도록 수정 필요, 내부에 for문과 if문 중복되는 부분은 고차함수로 추상화하기</p>
</li>
</ul>
<pre><code class="language-js">
const totalCal = (list: Array&lt;Item&gt;, getValue: (item: Item) =&gt; number) =&gt; {
  // 전체 목록 중 재고가 있는 상품만 getValue를 실행하고 그 값을 모두 더함

  list
  // 1, 재고가 있는 상품만 분류 - filter
  .filter(item =&gt; item.outOfStock ===false)
  // 2. 분류된 상품에 대해 getValue 실행 - map
  .map(getValue)
  // 3. getValue가 실행된 값 모두 더하기 - reduce
  .reduce((total,value)=&gt; total +value, 0) 

  // let total = 0
  // for (let i = 0; i &lt; list.length; i++) {
  //   if (!list[i].outOfStock) {
  //     total += getValue(list[i]);
  //   }
  // }
  // return total
}

const totalCnt = (list:Array&lt;Item&gt;): string =&gt; {
  let totalCnt = totalCal(list, (item)=&gt;item.quantity);
  return `전체수량: ${totalCnt}`
}


const totalPrice = (list:Array&lt;Item&gt;):string =&gt; {
  let totalPrice =  totalCal(list, (item)=&gt;item.price);
  return `전체수량: ${totalCnt}`
}

const list = (list: Array&lt;Item&gt;) =&gt; { 
// 목록에 있는 아이템 태그 변경
  return `
  ${list
  // 태그 목록을 하나 문자열로 연결
    .map(item)
  .reduce((tags,tag)=&gt;tags+tag,&quot;&quot;)
}`
}</code></pre>
<ul>
<li>배열의 메소드 체이닝으로 해결했으나 람다 JS라이브러리를 함수와 함수 합성으로 해결 가능 </li>
</ul>
<h2 id="map-잘못-사용하는-경우">map 잘못 사용하는 경우</h2>
<ul>
<li><p>map 함수 내부에 함수 타입을 익명함수를 쓴 경우, 함수가 값을 반환하라는 오류가 나옴 </p>
<ul>
<li>배열에 메소드 필터, 맵, 폴드 등의 메서드 존재, 콜백함 수내 리턴 문 없으면 실수</li>
<li>만약 리턴문 없다면 대신 ForEach를 쓰라 권장</li>
<li>그러나 forEach는 타입 파라미터를 사용하지 않고 void를 리턴하여 함수 합성이 불가</li>
<li>입력값에 대응되는 의미있는 값을 만들지 못하고 있는 예, 따라서 map이 의미가 없다(부수효과만 있기에)<pre><code class="language-js">const totalCal2 = (list: Array&lt;Item&gt;, getValue: (item: Item) =&gt; number) =&gt; {
// 재고가 있는 상품만 getValue를 실행하기 위해 새로운 변수 result추가
const result:Array&lt;number&gt; = []
list.forEach(function (item) {
if (!item.outOfStock) {
result.push(getValue(item))
}
})
</code></pre>
</li>
</ul>
<p>return result.reduce((total,value)=&gt; total + value)
}</p>
<pre><code></code></pre></li>
</ul>
<h2 id="이중-for문">이중 for문</h2>
<pre><code class="language-js">const suits = [&quot;♠&quot;, &quot;♥&quot;, &quot;♣&quot;, &quot;♦&quot;];
const numbers = [
  &quot;2&quot;,
  &quot;3&quot;,
  &quot;4&quot;,
  &quot;5&quot;,
  &quot;6&quot;,
  &quot;7&quot;,
  &quot;8&quot;,
  &quot;9&quot;,
  &quot;10&quot;,
  &quot;J&quot;,
  &quot;Q&quot;,
  &quot;K&quot;,
  &quot;A&quot;
];



const cards: Array&lt;string&gt; = []
// 중첩된 for 구무
for (const suit of suits) {
  for (const number of numbers) {
    cards.push(suit+number)
  }
}
// 우리가 원하는 작업 정리

// 모든 카드 목록 아래의 작업이 완료
const card2=
// 아래의 작업을 모든 무늬에 적용
  suits.flatMap((suit)=&gt; // 문자열 배열에 리턴된 함수를 다시 map에 적용해 배열이 중첩된 문자열 리턴
  // 아래의 작업을 모든 숫자에 적용
  numbers.map((number)=&gt; // 최종적 리턴은 문자열의 배열
    // 한장의 카드는 무늬외 숫자를 연결한 문자열
    suit + number))
    // 무늬별로 나누어진 카드를 하나로 합침
// .flat()
cards
card2</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[고차 함수와 함수의 타입 다시보기]]></title>
            <link>https://velog.io/@minj9_6/%EA%B3%A0%EC%B0%A8-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@minj9_6/%EA%B3%A0%EC%B0%A8-%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 31 Jan 2023 15:00:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/minj9_6/post/f82b8986-5da3-48e7-aa19-14b5b9d646b5/image.png" alt=""></p>
<h2 id="고차함수">고차함수</h2>
<ul>
<li>하나 이상의 함수를 인자로 취하거나</li>
<li>함수를 반환한다</li>
</ul>
<h4 id="map">map</h4>
<blockquote>
<ul>
<li>array의 map함수는 배열에 있는 요소들의 동일한 함수를 적용한 후 그 결과를 돌려주는 함수</li>
</ul>
</blockquote>
<ul>
<li>실제 map 함수 구현 방식 제네릭으로 작성, 인자로 배열과 함수를 받으며 함수는 배열의 원소를 받아 새로운 값을 담은 배열을 리턴</li>
</ul>
<pre><code class="language-js">const map =&lt;A, B&gt; (array:Array&lt;A&gt;, f:(a:A)=&gt;B): Array&lt;B&gt; =&gt; {
  const result: Array&lt;B&gt; = [];
  for (const value of array) {
    result.push(f(value))
  }  
  return result;
}</code></pre>
<h2 id="함수의-타입-다시보기">함수의 타입 다시보기</h2>
<blockquote>
<ul>
<li>명령형의 경우 값이 반환되지 않는 경우 예외를 처리해줘야한다</li>
</ul>
</blockquote>
<ul>
<li>타입스크립트의 순수함수에는 예외를 표현하는 데이터 타입이 묵시적으로 존재</li>
</ul>
<p><img src="https://velog.velcdn.com/images/minj9_6/post/f471c15b-0285-4b5f-9540-84c4a8a16732/image.png" alt=""></p>
<pre><code class="language-js">type MapType&lt;A, B&gt; = (xs: Array&lt;A&gt;, f: (x: A) =&gt; B) =&gt; Array&lt;B&gt;;
type MapType1 = MapType&lt;number, number&gt;
type Compose&lt;A, B, C&gt; = (g: (y: B) =&gt; C, f: (x: A) =&gt; B) =&gt; (a: A) =&gt; C;
type Compose1 = Compose&lt;string, number, boolean&gt;;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[찾아내기 - find, find_index, some, every]]></title>
            <link>https://velog.io/@minj9_6/%EC%B0%BE%EC%95%84%EB%82%B4%EA%B8%B0-find-findindex-some-every</link>
            <guid>https://velog.io/@minj9_6/%EC%B0%BE%EC%95%84%EB%82%B4%EA%B8%B0-find-findindex-some-every</guid>
            <pubDate>Mon, 30 Jan 2023 14:55:32 GMT</pubDate>
            <description><![CDATA[<h1 id="찾아내기">찾아내기</h1>
<h4 id="find">find</h4>
<ul>
<li>find는 걸러지는 값을 만나면 그 값을 즉시 리턴</li>
<li>원하는 값을 찾으면 배열을 빠져나올 수 있는 최적화 <pre><code class="language-js">function _find(list, predi){
let keys = _keys(list)
for(let i =0, len = keys.length; i&lt;len; i++) {
  var val = list[keys[i]]
  if(predi(val))  return val;
}
}
</code></pre>
</li>
</ul>
<p>_find(users, function(user){
  return user.id === 20
}) </p>
<pre><code>

- find_index는 걸러지는 값을 만나면 그 값의 인덱스를 즉시 리턴

```js
function _find_index(list, predi){
  let keys = _keys(list)
  for(let i =0, len = keys.length; i&lt;len; i++) {
    if(predi(list[keys[i]]))  return i;
  }
  return -1
}
_find_index(users, function(user){
  return user.id === 2
}) </code></pre><ul>
<li>get, go로 응용</li>
</ul>
<pre><code class="language-js">var _find = _curryr(function _find(list, predi){
  let keys = _keys(list)
  for(let i =0, len = keys.length; i&lt;len; i++) {
    var val = list[keys[i]]
    if(predi(val))  return val;
  }
})

_get(
_find(users, function(user){
  return user.id == 2
}), &#39;name&#39;)

_go(users, 
   _find(function(user){
  return user.id == 2
}),
    _get(&#39;name&#39;)
   ) </code></pre>
<h4 id="some">some</h4>
<ul>
<li>하나라도 만족하는 값 나오면 트루 반환</li>
</ul>
<pre><code class="language-js">function _some(data, predi){
  predi = predi || _identity 
  return _find_index(data, predi || _identity) != -1;
}
// 하나라도 만족하는 값 나오면 트루 반환

_some([1,2,5,10,20], function(val){
  return val &gt; 10
})</code></pre>
<pre><code class="language-js">// every - 하나라도 거짓이면 펄스이면 리턴
function _every(data,predi){
  return _find_index(data,_negate(predi || _identity)) == -1
}

_every([1,2,5,10,20], function(val){
  return val &gt; 3
})

// true
_every([1,2,0,10])
// false
_some([null, false, 0])

_some(users, function(user){
      return user.age&gt;20
})</code></pre>
<ul>
<li>함수형 프로그래밍은 이렇게 로직을 조합해나가는 방식</li>
<li>모두 고차함수로 사용, 보조함수를 받음<blockquote>
<p>보조함수를 받아 이 것을 만족하는 것에 대한 값을 찾을 수 있음</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘이란]]></title>
            <link>https://velog.io/@minj9_6/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@minj9_6/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 30 Jan 2023 14:26:35 GMT</pubDate>
            <description><![CDATA[<h1 id="알고리즘">알고리즘</h1>
<h4 id="정의">정의</h4>
<ul>
<li>간단히 말해 문제를 풀기위한 절차</li>
</ul>
<h4 id="알고리즘과-프로그램의-차이">알고리즘과 프로그램의 차이</h4>
<ul>
<li>알고리즘은 프로그램보다 더 추상적인 개념</li>
<li>알고리즘은 문제 해결을 위한 <strong>작업 절차 자체</strong>로 그 절차를 실행하는 수단은 언급 안함</li>
<li>실제로 문제를 풀기 위해 어떤 수단으로 알고리즘을 실행해야하는데 이를 실행할 수 있는 형태로 구현한 것이 프로그램 </li>
</ul>
<h2 id="알고리즘의-역사">알고리즘의 역사</h2>
<h4 id="알고리즘의-발견">알고리즘의 발견</h4>
<ul>
<li>고대 그리스 수학자 유클리드의 저서에 쓰인 알고리즘<h4 id="컴퓨터-이전의-알고리즘">컴퓨터 이전의 알고리즘</h4>
</li>
<li>알고리즘은 처리 절차 그 자체, 고대 그리스 시대 사람의 손으로 알고리즘 실행하는 삼각함수 표 존재</li>
</ul>
<h4 id="컴퓨터-등장과-알고리즘의-발전">컴퓨터 등장과 알고리즘의 발전</h4>
<ul>
<li>컴퓨터의 등장으로 알고리즘 세계는 크게 변하며 현실적인 실행 수단이 없었던 알고리즘이 컴퓨터 프로그램 형태로 실현되어 실행</li>
</ul>
<h4 id="알고리즘-설계와-실행의-차이">알고리즘 설계와 실행의 차이</h4>
<ul>
<li>알고리즘은 실행자가 해석을 넣을 여지가 없는 명쾌한 절차</li>
<li>알고리즘 핵심은 만들어진 알고리즘을 사용하는 주체는 그저 절차를 따르면 된다는 것</li>
<li>즉, 의미는 몰라도 언제가 정답에 도달하는 것이 알고리즘</li>
</ul>
<h3 id="21세기-알고리즘">21세기 알고리즘</h3>
<h4 id="머신러닝">머신러닝</h4>
<ul>
<li>컴퓨터에 지능을 부여, 사람이 학습하듯 컴퓨터에도 데이터를 주고 학습시켜 새로운 지식을 얻는 방법<h4 id="영자식-증명">영자식 증명</h4>
</li>
<li>지캐시, 암호통화는 영지식 증명이라는 알고리즘으로 완전한 익명성 유지<h4 id="유전-알고리즘">유전 알고리즘</h4>
</li>
<li>생물의 진화 과정을 모델로 삼아 이상적인 답을 발견하는 알고리즘</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Array : 여러 개일 수 있는 값]]></title>
            <link>https://velog.io/@minj9_6/Array-%EC%97%AC%EB%9F%AC-%EA%B0%9C%EC%9D%BC-%EC%88%98-%EC%9E%88%EB%8A%94-%EA%B0%92</link>
            <guid>https://velog.io/@minj9_6/Array-%EC%97%AC%EB%9F%AC-%EA%B0%9C%EC%9D%BC-%EC%88%98-%EC%9E%88%EB%8A%94-%EA%B0%92</guid>
            <pubDate>Sat, 28 Jan 2023 04:58:14 GMT</pubDate>
            <description><![CDATA[<h2 id="array에-대해">Array에 대해</h2>
<ul>
<li>여러개의 값을 담을 수 있는 배열, 단 타입스크립에선 임의의 타입 값 배열 지정 안되며 Array 타입의 매개변수에 지정한 타입만 값으로 지정</li>
</ul>
<h4 id="array와-list">Array와 List</h4>
<blockquote>
<ul>
<li>몇개인이 결정할 수 없는 비결정성은 공통이나 Array는 인덱스로 임의 접근 시 최적화되어있고 List는 순차적, 재귀적 구조를 지려 원소들에 대한 순차 처리에 최적화</li>
</ul>
</blockquote>
<h4 id="비결정성">비결정성</h4>
<blockquote>
<ul>
<li>몇개의 값이 입력될지 출력될지 알 수 없고 값이 하나로 결정되지 않는 다는 의미에서 비결정적 </li>
</ul>
</blockquote>
<h2 id="for문으로-해결하기">for문으로 해결하기</h2>
<blockquote>
<ul>
<li>아이템 목록과 전체 수량 및 가격 계산하도록 for문 작성</li>
</ul>
</blockquote>
<pre><code class="language-js">const cart = [
  {
    code: &quot;tomato&quot;,
    outOfStock: false,
    name: &quot;토마토&quot;,
    price: 7000,
    quantity: 2
  },
  {
    code: &quot;orange&quot;,
    outOfStock: true,
    name: &quot;오렌지&quot;,
    price: 15000,
    quantity: 3
  },
  {
    code: &quot;apple&quot;,
    outOfStock: false,
    name: &quot;사과&quot;,
    price: 10000,
    quantity: 1
  }
];

let totalPrice = 0;
let totalCnt = 0;

for(let i =0; i&lt;cart.length;i++){
const name =    cart[i].name;
const price = cart[i].price;
const quantity = cart[i].quantity;
totalPrice += cart[i].price *cart[i].quantity;
 totalCnt += cart[i].quantity;
console.log(`이름: ${name}, 가격 : ${price}, 수량 ${quantity}`);

}
console.log(`전체수량: ${totalCnt} 전체 가격 ${totalPrice}`)</code></pre>
<blockquote>
<ul>
<li>아이템 목록 출력까진 코드내 관심사가 일치했으나 전체수량 및 가격을 계산하는 코드를 작성하면서 관심사가 분리</li>
</ul>
</blockquote>
<ul>
<li>따라서 계산하는 부분 for문 분리하는 리팩토링 필요</li>
</ul>
<pre><code class="language-js">
for(let i =0; i&lt;cart.length;i++){
const name =    cart[i].name;
const price = cart[i].price;
const quantity = cart[i].quantity;
console.log(`이름: ${name}, 가격 : ${price}, 수량 ${quantity}`);
}

let totalCnt = 0;
for(let i =0; i&lt;cart.length;i++){
totalPrice += cart[i].price *cart[i].quantity;
}

let totalPrice = 0;
for(let i =0; i&lt;cart.length;i++){
 totalCnt += cart[i].quantity;
}
console.log(`전체수량: ${totalCnt} 전체 가격 ${totalPrice}`)</code></pre>
<blockquote>
<ul>
<li>관심사 별로 코드를 분리하긴했지만 중복되는 부분이 생겨버림</li>
</ul>
</blockquote>
<ul>
<li>여기에 추가로 품절된 상품은 따로 이름을 표기하고 가격과 수량에도 제외하는 코드를 작성하려면 if문 추가</li>
</ul>
<pre><code class="language-js">for(let i =0; i&lt;cart.length;i++){
 if(!cart[i].outOfStock){
const name =    cart[i].name;
const price = cart[i].price;
const quantity = cart[i].quantity;
console.log(`이름: ${name}, 가격 : ${price}, 수량 ${quantity}`);
 } else {
   const name =    cart[i].name+&#39;{품절}&#39;;
const price = cart[i].price;
const quantity = cart[i].quantity;
   console.log(`이름: ${name}, 가격 : ${price}, 수량 ${quantity}`);

 }
}

let totalCnt = 0;
for(let i =0; i&lt;cart.length;i++){
  if(!cart[i].outOfStock){
  totalCnt += cart[i].quantity;
  }
}

let totalPrice = 0; 
for(let i =0; i&lt;cart.length;i++){
    if(!cart[i].outOfStock){
  totalPrice += cart[i].price * cart[i].quantity;
     }
  }
console.log(`전체수량: ${totalCnt} 전체 가격 ${totalPrice}`)</code></pre>
<blockquote>
<ul>
<li>분기처리 되는 코드가 마찬가지로 반복되며 요구사항 늘어날 때마다 대응해야하는 코드 많아지고 변경되면 동일한 코드를 다 수정해야하여 실수하기 쉬움</li>
</ul>
</blockquote>
<ul>
<li>이렇게 명령적으로 작성한 코드를 함수형 프로그래밍에선 반복된 부분을 추상화함으로서 동일한 작업을 선언적 방식으로 작성할 수 있게 된다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>