<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lazy_youn.log</title>
        <link>https://velog.io/</link>
        <description>리액트를 좋아하는 개발자입니다.</description>
        <lastBuildDate>Sat, 13 Feb 2021 02:39:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. lazy_youn.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lazy_youn" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[프로그래머스 코딩테스트 level1 - 3진법 뒤집기]]></title>
            <link>https://velog.io/@lazy_youn/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-level1-3%EC%A7%84%EB%B2%95-%EB%92%A4%EC%A7%91%EA%B8%B0</link>
            <guid>https://velog.io/@lazy_youn/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-level1-3%EC%A7%84%EB%B2%95-%EB%92%A4%EC%A7%91%EA%B8%B0</guid>
            <pubDate>Sat, 13 Feb 2021 02:39:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lazy_youn/post/e1e2291a-9785-40e4-a8ad-2bddff0f7fe9/image.png" alt=""></p>
<h3 id="문제-푼-방식">문제 푼 방식</h3>
<ol>
<li><p>매개변수로 받아온 수를 먼저 3진법으로 변환</p>
</li>
<li><p>뒤집는다는 부분에서 배열의 reverse() 메소드를 사용해야겠다고 생각, 
문자열을 배열로 만들기 위한 split() 메소드 사용</p>
</li>
<li><p>배열원소 순서를 뒤집기 위한 reverse() 메소드 사용</p>
</li>
<li><p>join() 메소드를 사용하여 배열객체를 문자열형태로 변환</p>
</li>
<li><p>최종적으로 Number 타입으로 리턴해야 하기 때문에, String 타입을 Number타입으로 변환시키기 위하여 parseInt()메서드 사용.</p>
</li>
</ol>
<h4 id="사용한-메서드">사용한 메서드</h4>
<ol>
<li><p>toString() : 3진법으로 변환시 사용</p>
</li>
<li><p>split() : 문자열을 배열로 만들기 위해서 사용</p>
</li>
<li><p>reverse() : 배열원소 순서를 바꾸기 위하여 사용</p>
</li>
<li><p>join() : 배열을 문자열로 변환하기 위해 사용</p>
</li>
<li><p>parseInt() : String타입을 Number 타입으로 변환하기 위해 사용</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래밍언어분석 12주차]]></title>
            <link>https://velog.io/@lazy_youn/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4%EB%B6%84%EC%84%9D-12%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@lazy_youn/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4%EB%B6%84%EC%84%9D-12%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sat, 12 Dec 2020 06:30:44 GMT</pubDate>
            <description><![CDATA[<h1 id="식과-배정문">식과 배정문</h1>
<p>언어는 연산자 평가 순서를 명세한다</p>
<ul>
<li><p>연산자 우선순위 p. 344 ~ 345</p>
</li>
<li><p>결합규칙 ( 좌결합이냐, 우결합이냐 )</p>
</li>
<li><p>괄호 </p>
</li>
</ul>
<h3 id="피연산자-평가-순서">피연산자 평가 순서</h3>
<ul>
<li>피연산자 유형</li>
</ul>
<ol>
<li>변수</li>
<li>상수 </li>
<li>괄호에 포함된 식</li>
<li>함수 호출</li>
</ol>
<ul>
<li>연산자의 모든 피연산자가 부작용을 갖지 않으면, 피연산자의 평가 순서는 무관하다.</li>
</ul>
<h3 id="함수의-부작용">함수의 부작용</h3>
<p>: 함수가 양방향 매개변수나 전역변수 변경시 발생
p.350</p>
<p>함수의 부작용 문제</p>
<ul>
<li>피연산자 평가 순서에 영향을 미침</li>
</ul>
<h3 id="해결책">해결책</h3>
<h3 id="참조-투명성">참조 투명성</h3>
<ul>
<li>프로그램에서 동일한 값을 갖는 임의 2개 식이 프로그램의 행동에 영향을 미치지 않으면서 프 로그램의 임의 위치에서 서로 대체 가능하면, 프로그램은 참조 투명성의 특징을 갖는다고 말한다.</li>
</ul>
<h3 id="타입-변환">타입 변환</h3>
<ul>
<li><p>축소 변환 : 원래 타입에 속한 모든 값들의 근사치마저도 저장할 수 없는 타입으로 변환</p>
</li>
<li><p>확장 변환 : 적어도 원래 타입의 모든 값들의 근사치를 포함할 수 있는 타입으로 변환</p>
</li>
<li><p>혼합형 식 : 한 연산자가 다른 타입을 갖는 피연산자들을 갖는 식이며, 이를 허용하는 언어는 묵시적 피연산자 타입 변환을 허용 (확장 변환으로) 
=&gt; 묵시적 타입 변환은 컴파일러에 의해서 수행되는 타입 강제변환</p>
</li>
</ul>
<p>단축회로 평가 : 식에 포함된 모든 연산자나 피연산자가 평가되지 않고서 식의 값이 결정
p364</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[.prettierrc]]></title>
            <link>https://velog.io/@lazy_youn/.prettierrc</link>
            <guid>https://velog.io/@lazy_youn/.prettierrc</guid>
            <pubDate>Sun, 11 Oct 2020 01:17:29 GMT</pubDate>
            <description><![CDATA[<p>Visual Studio Code Extention 으로 정해진 규칙에 따라 자동으로 코드 스타일을 정리 해주는 도구입니다.</p>
<p>여러 규칙들을 쉽게 커스터마이징 할 수도 있습니다.</p>
<p><strong>왜 사용하는지?</strong>
코드를 저장 시 정해놓은 규칙에 맞게 자동으로 정렬해서 가독성을 높이고 코드 스타일을 통일할 수 있습니다.</p>
<pre><code>{
  &quot;singleQuote&quot;: true,     // 따옴표 고정
  &quot;semi&quot;: true,            // 코드 끝에 ; 설정
  &quot;useTabs&quot;: false,        // Tap 사용여부
  &quot;tabWidth&quot;: 2,           // Tap 크기
  &quot;trailingComma&quot;: &quot;all&quot;,  // 객체 끝 부분에도 Comma 추가
  &quot;printWidth&quot;: 100        // 줄 당 max length
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[typescript setting]]></title>
            <link>https://velog.io/@lazy_youn/typescript-setting</link>
            <guid>https://velog.io/@lazy_youn/typescript-setting</guid>
            <pubDate>Sun, 04 Oct 2020 13:54:13 GMT</pubDate>
            <description><![CDATA[<ol>
<li>yarn init으로 package.json 만들기</li>
<li>tsconfig.json 파일 생성 - TypeScript에게 어떻게 JavaScript로 변환하는지 알려주면서 몇몇 옵션울 주기 위해</li>
</ol>
<p><em>tsconfig.json</em></p>
<pre><code>{
  &quot;compilerOptions&quot;: {
    &quot;module&quot;: &quot;commonjs&quot;, // node.js를 평범하게 사용하고 다양한걸 import하거나 export 할 수 있게 만드는거
    &quot;target&quot;: &quot;ES2015&quot;, // 어떤 버전의 JavaScript로 컴파일 되고 싶은지 적는거
    &quot;sourceMap&quot;: true // 소스맵 처리를 하고 싶은지
  },
  &quot;include&quot;: [&quot;index.ts&quot;], // 어떤 파일들이 컴파일 과정에 포함되는지 알려주는것
  &quot;exclude&quot;: [&quot;node_modules&quot;] // 제외
}
</code></pre><p>명령어
tsc - ts파일에 있는 이 코드를 컴파일 해서 index.js랑 index.js.map을 만들어 줌</p>
<p>tsc명령어를 사용하는 대신 yarn start를 사용하기 위해</p>
<p>pakage.json에 추가</p>
<pre><code>&quot;scripts&quot;: {
    &quot;start&quot;: &quot;node index.js&quot;,
    &quot;prestart&quot;: &quot;tsc&quot;
  },</code></pre><p>Node.js는 TypeScript를 이해하지 못하기 때문에 일반적인 JavaScript 코드로 컴파일하는 작업이 필요하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고 있으면 유용한 자바스크립트 문법]]></title>
            <link>https://velog.io/@lazy_youn/%EC%95%8C%EA%B3%A0-%EC%9E%88%EC%9C%BC%EB%A9%B4-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@lazy_youn/%EC%95%8C%EA%B3%A0-%EC%9E%88%EC%9C%BC%EB%A9%B4-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sat, 03 Oct 2020 04:55:06 GMT</pubDate>
            <description><![CDATA[<p>삼항 연산자의 사용법은 다음과 같습니다.</p>
<blockquote>
<p>조건 ? true일때 : false일때</p>
</blockquote>
<p>함수의 기본 파라미터</p>
<p>ES6 에선 다음과 같이 할 수 있게 되었습니다.</p>
<pre><code>function calculateCircleArea(r = 1) {
  return Math.PI * r * r;
}

const area = calculateCircleArea();
console.log(area); // 3.141592653589793</code></pre><p>훨씬 깔끔하죠?</p>
<p>함수의 기본 파라미터 문법은 화살표 함수에서도 사용 할 수 있습니다.</p>
<pre><code>const calculateCircleArea = (r = 1) =&gt; Math.PI * r * r;

const area = calculateCircleArea();
console.log(area); // 3.141592653589793</code></pre><h3 id="05-조건문-더-스마트하게-쓰기">05. 조건문 더 스마트하게 쓰기</h3>
<p>이번에는 조건문을 조금 더 스마트하게 쓰는 방법에 대해서 알아보겠습니다.</p>
<p>특정 값이 여러 값중 하나인지 확인해야 할 때</p>
<blockquote>
<p>만약, 여러분이 특정 값이 여러 값 중 하나인지 확인을 해야 하는 상황이 생겼다고 해봅시다.</p>
</blockquote>
<p>그러면, 이러한 시도를 할 수도 있을 것입니다.</p>
<pre><code>function isAnimal(text) {
  return (
    text === &#39;고양이&#39; || text === &#39;개&#39; || text === &#39;거북이&#39; || text === &#39;너구리&#39;
  );
}

console.log(isAnimal(&#39;개&#39;)); // true
console.log(isAnimal(&#39;노트북&#39;)); // false</code></pre><p>비교해야 할 값이 많아질 수록 코드는 길어집니다.</p>
<blockquote>
<p>이러한 코드를 간단하게 해결 할 수 있는방법은, 배열을 만들고 배열의 includes 함수를 사용하는 것 입니다.</p>
</blockquote>
<pre><code>function isAnimal(name) {
  const animals = [&#39;고양이&#39;, &#39;개&#39;, &#39;거북이&#39;, &#39;너구리&#39;];
  return animals.includes(name);
}

console.log(isAnimal(&#39;개&#39;)); // true
console.log(isAnimal(&#39;노트북&#39;)); // false</code></pre><p>어떤가요? 훨씬 깔끔하죠?</p>
<p>원한다면, animals 배열을 선언하는 것도 생략하고, 화살표 함수로 작성할 수도 있습니다.</p>
<pre><code>const isAnimal = name =&gt; [&#39;고양이&#39;, &#39;개&#39;, &#39;거북이&#39;, &#39;너구리&#39;].includes(name);

console.log(isAnimal(&#39;개&#39;)); // true
console.log(isAnimal(&#39;노트북&#39;)); // false</code></pre><p>물론, 코드가 짧다고 해서 무조건 좋은것은 아닙니다. 단, 코드가 짧으면서도 읽었을 때 어떤 역할을 하는지 잘 이해가 될 수 있어야 비로소 좋은 코드 입니다.</p>
<h3 id="값에-따라-다른-결과물을-반환-해야-할-때">값에 따라 다른 결과물을 반환 해야 할 때</h3>
<p>이번에는 주어진 값에 따라 다른 결과물을 반환해야 할 때 사용 할 수 있는 유용한 팁을 알아보겠습니다.</p>
<p>예를 들어서, 동물 이름을 받아오면, 동물의 소리를 반환하는 함수를 만들고 싶다고 가정해보겠습니다.</p>
<pre><code>function getSound(animal) {
  if (animal === &#39;개&#39;) return &#39;멍멍!&#39;;
  if (animal === &#39;고양이&#39;) return &#39;야옹~&#39;;
  if (animal === &#39;참새&#39;) return &#39;짹짹&#39;;
  if (animal === &#39;비둘기&#39;) return &#39;구구 구 구&#39;;
  return &#39;...?&#39;;
}

console.log(getSound(&#39;개&#39;)); // 멍멍!
console.log(getSound(&#39;비둘기&#39;)); // 구구 구 구</code></pre><p><em>if 문의 코드 블록이 한줄짜리라면 { } 를 생략 할 수도 있습니다.</em></p>
<p>만약 여기서 우리가 배운 switch case 문을 사용하여 다음과 같이 구현 할 수도 있습니다.</p>
<pre><code>function getSound(animal) {
  switch (animal) {
    case &#39;개&#39;:
      return &#39;멍멍!&#39;;
    case &#39;고양이&#39;:
      return &#39;야옹~&#39;;
    case &#39;참새&#39;:
      return &#39;짹짹&#39;;
    case &#39;비둘기&#39;:
      return &#39;구구 구 구&#39;;
    default:
      return &#39;...?&#39;;
  }
}

console.log(getSound(&#39;개&#39;)); // 멍멍!
console.log(getSound(&#39;비둘기&#39;)); // 구구 구 구</code></pre><p><em>참고로 switch 문에서 return 을 할 때에는 break 를 생략해도 됩니다.</em></p>
<p>우리가 방금 구현한 코드는 큰 문제는 없지만, 이걸 깔끔하게 해결 할 방법을 알고 나면 좀 맘에 들지 않는 코드의 형태입니다.</p>
<p>이 코드를 더욱 깔끔하게 작성하는 방법을 알려드리겠습니다.</p>
<pre><code>function getSound(animal) {
  const sounds = {
    개: &#39;멍멍!&#39;,
    고양이: &#39;야옹~&#39;,
    참새: &#39;짹짹&#39;,
    비둘기: &#39;구구 구 구&#39;
  };
  return sounds[animal] || &#39;...?&#39;;
}

console.log(getSound(&#39;개&#39;)); // 멍멍!
console.log(getSound(&#39;비둘기&#39;)); // 구구 구 구</code></pre><p>훨씬 더 간략하고 가독성도 좋지요? 이렇게 특정 값에 따라 반환해야 하는 값이 다른 조건이 여러가지 있을 때는 객체를 활용하면 좋습니다.</p>
<h3 id="06-비구조화-할당-구조분해-문법">06. 비구조화 할당 (구조분해) 문법</h3>
<p>이번에는 1장 섹션 6 에서도 배웠던 비구조화 할당 문법을 잘 활용하는 방법에 대해서 알아보겠습니다.</p>
<p>이전에 배웠던것을 복습해보자면, 비구조화 할당 문법을 사용하면 다음과 같이 객체 안에 있는 값을 추출해서 변수 혹은 상수로 바로 선언해 줄 수있었죠?</p>
<pre><code>const object = { a: 1, b: 2 };

const { a, b } = object;

console.log(a); // 1
console.log(b); // 2</code></pre><p>그리고, 함수의 파라미터에서도 비구조화 할당을 할 수 있는것도 배웠습니다.</p>
<pre><code>const object = { a: 1, b: 2 };

function print({ a, b }) {
  console.log(a);
  console.log(b);
}

print(object);</code></pre><p>그런데 여기서 만약 b 값이 주어지지 않았다고 가정해봅시다.</p>
<pre><code>const object = { a: 1 };

function print({ a, b }) {
  console.log(a);
  console.log(b);
}

print(object);
// 1
// undefined</code></pre><p>두번째 출력에서 undefined가 나타날 것입니다.</p>
<h4 id="비구조화-할당시-기본값-설정">비구조화 할당시 기본값 설정</h4>
<p>이러한 상황에 b 값에 기본 값을 주고 싶다면 이렇게 해줄 수 있습니다.</p>
<pre><code>const object = { a: 1 };

function print({ a, b = 2 }) {
  console.log(a);
  console.log(b);
}

print(object);
// 1
// 2</code></pre><p>이는 꼭 함수의 파라미터에서만 할 수 있는 것은 아닙니다.</p>
<pre><code>const object = { a: 1 };

const { a, b = 2 } = object;

console.log(a); // 1
console.log(b); // 2</code></pre><h4 id="비구조화-할당시-이름-바꾸기">비구조화 할당시 이름 바꾸기</h4>
<p>이번에는, 비구조화 할당을 하는 과정에서 선언 할 값의 이름을 바꾸는 방법을 알아보겠습니다.</p>
<p>예를 들어서 다음과 같은 코드가 있다고 가정해봅시다.</p>
<pre><code>const animal = {
  name: &#39;멍멍이&#39;,
  type: &#39;개&#39;
};

const nickname = animal.name;

console.log(nickname); // 멍멍이</code></pre><p>위 코드에서는 animal.name 값을 nickname 값에 담고 있는데요, 이름이 같다면 그냥 우리가 이전에 배웠던 대로 비구조화 할당을 쓰면 되는데 지금은 이름이 서로 다릅니다.</p>
<p>이러한 상황에서는 : 문자를 사용해서 이름을 바꿔줄 수 있습니다.</p>
<pre><code>const animal = {
  name: &#39;멍멍이&#39;,
  type: &#39;개&#39;
};

const { name: nickname } = animal
console.log(nickname);</code></pre><p>위 코드는 &#39;animal 객체 안에 있는 name 을 nickname 이라고 선언하겠다.&#39; 라는 의미입니다.</p>
<h4 id="배열-비구조화-할당">배열 비구조화 할당</h4>
<p>비구조화 할당은 객체에만 할 수 있는 것이 아닙니다. 배열에서 할 수 있어요.</p>
<p>예시 코드를 봅시다.</p>
<pre><code>const array = [1, 2];
const [one, two] = array;

console.log(one);
console.log(two);</code></pre><p>이 문법은 배열 안에 있는 원소를 다른 이름으로 새로 선언해주고 싶을 때 사용하면 매우 유용합니다.</p>
<p>객체 비구조화 할당과 마찬가지로, 기본값 지정이 가능합니다.</p>
<pre><code>const array = [1];
const [one, two = 2] = array;</code></pre><pre><code>
console.log(one);
console.log(two);</code></pre><h4 id="깊은-값-비구조화-할당">깊은 값 비구조화 할당</h4>
<p>객체의 깊숙한 곳에 들어있는 값을 꺼내는 방법을 알아봅시다.</p>
<p>예를들어서 다음과 같은 객체가 있다고 가정해봅시다.</p>
<pre><code>const deepObject = {
  state: {
    information: {
      name: &#39;velopert&#39;,
      languages: [&#39;korean&#39;, &#39;english&#39;, &#39;chinese&#39;]
    }
  },
  value: 5
};</code></pre><p>여기서, name, languages, value 값들을 밖으로 꺼내주고 싶다면 어떻게 해야 할까요? 이럴땐 두가지 해결 방법이 있는데요, 첫번째는 비구조화 할당 문법을 두번 사용하는 것입니다.</p>
<pre><code>const deepObject = {
  state: {
    information: {
      name: &#39;velopert&#39;,
      languages: [&#39;korean&#39;, &#39;english&#39;, &#39;chinese&#39;]
    }
  },
  value: 5
};

const { name, languages } = deepObject.state.information;
const { value } = deepObject;

const extracted = {
  name,
  languages,
  value
};

console.log(extracted); // {name: &quot;velopert&quot;, languages: Array[3], value: 5}</code></pre><p>그런데 잠깐! 지금 extracted 객체를 선언 할 때 이런식으로 했는데요</p>
<pre><code>
const extracted = {
  name,
  languages,
  value
}</code></pre><p>이 코드는 다음 코드와 똑같습니다.</p>
<pre><code>
const extracted = {
  name: name,
  languages: languages,
  value: value
}</code></pre><p>만약에 key 이름으로 선언된 값이 존재하다면, 바로 매칭시켜주는 문법입니다. 이 문법은 ES6 의 object-shorthand 문법이라고 부릅니다. (이름은 굳이 알아둘 필요는 없습니다..!)</p>
<p>다시 본론으로 돌아와서, 아까 deepObject 객체에서 names, languages, value 를 추출하는 과정에서 비구조화 할당을 두번 했었죠?</p>
<p>이번엔 두번째 방법, 한번에 모두 추출하는 방법을 알아보겠습니다.</p>
<pre><code>const deepObject = {
  state: {
    information: {
      name: &#39;velopert&#39;,
      languages: [&#39;korean&#39;, &#39;english&#39;, &#39;chinese&#39;]
    }
  },
  value: 5
};

const {
  state: {
    information: { name, languages }
  },
  value
} = deepObject;

const extracted = {
  name,
  languages,
  value
};

console.log(extracted);</code></pre><p>이렇게 하면 깊숙히 안에 들어있는 값도 객체에서 바로 추출 할 수 있답니다.</p>
<p>위 이미지에서 주황색으로 나타난 값들이 추출 된 것입니다. 반면, 빨간색으로 나타난 값들은 따로 추출되지 않으니 참고하세요.</p>
<p>이렇게 깊숙한 객체안에 있는 값을 추출하는 방법을 알아보았는데요, 사람들마다 성향이 다르겠지만, 저는 개인적으로 한번에 다 추출하는 것 보다는 여러번에 걸쳐서 추출하는 것이 더욱 코드가 깔끔하다고 생각합니다. 정해진 답은 없으니 여러분이 편한 방식을 택해서 하세요.</p>
<h3 id="07-spread-와-rest">07. spread 와 rest</h3>
<p>이번에는 ES6 에서 도입된 spread 와 rest 문법에 대해서 알아보겠습니다. 서로 완전히 다른 문법인데요, 은근히 좀 비슷합니다.</p>
<p>spread
일단 spread 문법부터 알아봅시다. spread 라는 단어가 가지고 있는 의미는 펼치다, 퍼뜨리다 입니다. 이 문법을 사용하면, 객체 혹은 배열을 펼칠수있습니다.</p>
<p>예를 들어서 다음과 같은 객체들이 있다고 가정해봅시다.</p>
<pre><code>
const slime = {
  name: &#39;슬라임&#39;
};

const cuteSlime = {
  name: &#39;슬라임&#39;,
  attribute: &#39;cute&#39;
};

const purpleCuteSlime = {
  name: &#39;슬라임&#39;,
  attribute: &#39;cute&#39;,
  color: &#39;purple&#39;
};

console.log(slime);
console.log(cuteSlime);
console.log(purpleCuteSlime);</code></pre><p>이 코드에서는 먼저 slime 이라는 객체를 선언했습니다. 그리고 cuteSlime 이라는 객체를 만들었는데요, 기존에 선언한 slime 을 건들이지 않고 새로운 객체를 만들어서 slime 이 가지고 있는 값을 그대로 사용하였습니다.</p>
<p>그 다음에는 purpleCuteSlime 이라는 객체를 만들었는데요, 이 객체는 cuteSlime 이 가지고 있는 속성을 그대로 사용하면서 추가적으로 color 가 추가되었습니다.</p>
<p>위 코드에서의 핵심은, 기존의 것을 건들이지 않고, 새로운 객체를 만든다는 것 인데요, 이러한 상황에 사용 할 수 있는 유용한 문법이 spread 입니다.</p>
<p>아까 코드는 spread 문법을 사용하면 다음과 같이 작성 할 수 있습니다.</p>
<pre><code>const slime = {
  name: &#39;슬라임&#39;
};

const cuteSlime = {
  ...slime,
  attribute: &#39;cute&#39;
};

const purpleCuteSlime = {
  ...cuteSlime,
  color: &#39;purple&#39;
};

console.log(slime);
console.log(cuteSlime);
console.log(purpleCuteSlime);
여기서 사용한 ... 문자가 바로 spread 연산자입니다.

spread 연산자는 배열에서도 사용 할 수 있습니다.

const animals = [&#39;개&#39;, &#39;고양이&#39;, &#39;참새&#39;];
const anotherAnimals = [...animals, &#39;비둘기&#39;];
console.log(animals);
console.log(anotherAnimals);</code></pre><p>기존의 animals 는 건드리지 않으면서, 새로운 anotherAnimals 배열에 animals 가 가지고 있는 내용을 모두 집어넣고, &#39;비둘기&#39; 라는 항목을 추가적으로 넣었습니다.</p>
<p>배열에서 spread 연산자를 여러번 사용 할 수도 있습니다.</p>
<pre><code>const numbers = [1, 2, 3, 4, 5];

const spreadNumbers = [...numbers, 1000, ...numbers];
console.log(spreadNumbers); // [1, 2, 3, 4, 5, 1000, 1, 2, 3, 4, 5]</code></pre><h4 id="rest">rest</h4>
<p>rest는 생김새는 spread 랑 비슷한데, 역할이 매우 다릅니다.</p>
<p>rest는 객체, 배열, 그리고 함수의 파라미터에서 사용이 가능합니다.</p>
<p>객체에서의 rest
우선 객체에서의 예시를 알아볼까요?</p>
<pre><code>const purpleCuteSlime = {
  name: &#39;슬라임&#39;,
  attribute: &#39;cute&#39;,
  color: &#39;purple&#39;
};

const { color, ...rest } = purpleCuteSlime;
console.log(color);
console.log(rest);</code></pre><p>rest 안에 name 값을 제외한 값이 들어있습니다.</p>
<p>rest 는 객체와 배열에서 사용 할 때는 이렇게 비구조화 할당 문법과 함께 사용됩니다. 주로 사용 할때는 위와 같이 rest 라는 키워드를 사용하게 되는데요, 추출한 값의 이름이 꼭 rest 일 필요는 없습니다.</p>
<pre><code>const purpleCuteSlime = {
  name: &#39;슬라임&#39;,
  attribute: &#39;cute&#39;,
  color: &#39;purple&#39;
};

const { color, ...cuteSlime } = purpleCuteSlime;
console.log(color);
console.log(cuteSlime);</code></pre><p>이렇게 해도 무방합니다.</p>
<p>이어서, attribute 까지 없앤 새로운 객체를 만들고 싶다면 이렇게 해주면 되겠죠.</p>
<pre><code>const purpleCuteSlime = {
  name: &#39;슬라임&#39;,
  attribute: &#39;cute&#39;,
  color: &#39;purple&#39;
};

const { color, ...cuteSlime } = purpleCuteSlime;
console.log(color);
console.log(cuteSlime);

const { attribute, ...slime } = cuteSlime;
console.log(attribute);
console.log(slime);

</code></pre><h4 id="배열에서의-rest">배열에서의 rest</h4>
<p>다음, 배열에서의 사용 예시를 알아봅시다.</p>
<pre><code>const numbers = [0, 1, 2, 3, 4, 5, 6];

const [one, ...rest] = numbers;

console.log(one);
console.log(rest);</code></pre><p>배열 비구조화 할당을 통하여 원하는 값을 밖으로 꺼내고, 나머지 값을 rest 안에 넣었습니다.</p>
<p>반면 이렇게 할 수는 없답니다.</p>
<pre><code>const numbers = [0, 1, 2, 3, 4, 5, 6];

const [..rest, last] = numbers;</code></pre><h4 id="함수-파라미터에서의-rest">함수 파라미터에서의 rest</h4>
<p>rest 를 함수파라미터에서 사용 할 수도 있습니다. 예를 들어서 우리가 파라미터로 넣어준 모든 값들을 합해주는 함수를 만들어주고 싶다고 가정해봅시다.</p>
<pre><code>function sum(a, b, c, d, e, f, g) {
  let sum = 0;
  if (a) sum += a;
  if (b) sum += b;
  if (c) sum += c;
  if (d) sum += d;
  if (e) sum += e;
  if (f) sum += f;
  if (g) sum += g;
  return sum;
}

const result = sum(1, 2, 3, 4, 5, 6);
console.log(result);</code></pre><p>위에서의 sum 함수는 7개의 파라미터를 받아오는데, 아래에서 사용 할때에는 6개만 넣어줬습니다. 그러면, g 값이 undefined 가 되기 때문에 sum 에 더하는 과정에서 += undefined 를 하게 되면 결과는 NaN 이 되버립니다. 그렇기 때문에 함수에서 하나하나 유효한 값인지 확인을 해줬지요.</p>
<p>함수의 파라미터가 몇개가 될 지 모르는 상황에서 rest 파라미터를 사용하면 매우 유용합니다. 코드를 다음과 같이 수정해보세요.</p>
<pre><code>function sum(...rest) {
  return rest;
}

const result = sum(1, 2, 3, 4, 5, 6);
console.log(result);</code></pre><p>result 가 가르키고 있는 것은 함수에서 받아온 파라미터들로 이루어진 배열입니다. 우리가 이제 파라미터들이 들어가있는 배열을 받았으니, 그냥 모두 더해주면 되겠죠?</p>
<pre><code>function sum(...rest) {
  return rest.reduce((acc, current) =&gt; acc + current, 0);
}</code></pre><pre><code>const result = sum(1, 2, 3, 4, 5, 6);
console.log(result); // 21</code></pre><p>여기서 reduce 함수가 사용 됐는데, reduce 를 잘 모르겠으면 1장 섹션 9를 복습하고 오세요.</p>
<h4 id="함수-인자와-spread">함수 인자와 spread</h4>
<p>이번에는, 다시 아까 배웠던 spread 로 돌아와서 한가지를 더 가르쳐드리겠습니다. 바로 함수의 인자와 spread 인데요, 만약 프로그래밍을 처음 배우신다면 파라미터와 인자가 좀 헷갈릴 수 있습니다. 이에 대해서 간단하게 설명 드려볼게요.</p>
<pre><code>const myFunction(a) { // 여기서 a 는 파라미터
  console.log(a); // 여기서 a 는 인자
}</code></pre><pre><code>myFunction(&#39;hello world&#39;); // 여기서 &#39;hello world&#39; 는 인자</code></pre><p>함수에서 값을 읽을때, 그 값들은 파라미터라고 부릅니다. 그리고 함수에서 값을 넣어줄 때, 그 값들은 인자라고 부릅니다.</p>
<p>인자가 무엇인지 이해를 하셨다면 이제 함수인자와 spread 문법을 사용하는 것에 대하여 알아볼게요.</p>
<p>우리가 방금 함수파라미터와 rest 를 사용한 것과 비슷한데, 반대의 역할입니다. 예를 들어서, 우리가 배열 안에 있는 원소들을 모두 파라미터로 넣어주고 싶다고 가정해보겠습니다.</p>
<pre><code>function sum(...rest) {
  return rest.reduce((acc, current) =&gt; acc + current, 0);
}

const numbers = [1, 2, 3, 4, 5, 6];
const result = sum(
  numbers[0],
  numbers[1],
  numbers[2],
  numbers[3],
  numbers[4],
  numbers[5]
);
console.log(result);</code></pre><p>굉장히 불편하죠? 만약에 sum함수를 사용 할 때 인자 부분에서 spread 를 사용하면 다음과 같이 표현이 가능합니다.</p>
<pre><code>function sum(...rest) {
  return rest.reduce((acc, current) =&gt; acc + current, 0);
}

const numbers = [1, 2, 3, 4, 5, 6];
const result = sum(...numbers);
console.log(result);</code></pre><p>어떤가요? 정말 편하죠?</p>
<p>이렇게, spread 와 rest 를 잘 사용하면 앞으로 보기 깔끔한 코드를 작성하는 것에 큰 도움을 줄 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ajax란?]]></title>
            <link>https://velog.io/@lazy_youn/Ajax%EB%9E%80</link>
            <guid>https://velog.io/@lazy_youn/Ajax%EB%9E%80</guid>
            <pubDate>Sat, 28 Mar 2020 02:31:58 GMT</pubDate>
            <description><![CDATA[<p>▶ Ajax란? </p>
<p>Ajax는 JavaScript의 라이브러리중 하나이며 Asynchronous Javascript And Xml(비동기식 자바스크립트와 xml)의 약자입니다. 브라우저가 가지고있는 XMLHttpRequest 객체를 이용해서 전체 페이지를 새로 고치지 않고도 페이지의 일부만을 위한 데이터를 로드하는 기법 이며 Ajax를 한마디로 정의하자면 JavaScript를 사용한 비동기 통신, 클라이언트와 서버간에 XML 데이터를 주고받는 기술이라고 할 수 있겠습니다.</p>
<p>Ajax</p>
<p>※ 비동기(async)방식이란?</p>
<p>비동기 방식은 웹페이지를 리로드하지 않고 데이터를 불러오는 방식입니다. 이 방식의 장점은 페이지 리로드의 경우 전체 리소스를 다시 불러와야하는데 이미지, 스크립트 , 기타 코드등을 모두 재요청할 경우 불필요한 리소스 낭비가 발생하게 되지만 비동기식 방식을 이용할 경우 필요한 부분만 불러와 사용할 수 있으므로 매우 큰 장점이 있습니다.</p>
<p>▶ 왜 사용하는가? </p>
<p>기본적으로 HTTP프로토콜은 클라이언트쪽에서 Request를 보내고 Server쪽에서 Response를 받으면 이어졌던 연결이 끊기게 되어있습니다. 그래서 화면의 내용을 갱신하기 위해서는 다시 request를 하고 response를 하면서 페이지 전체를 갱신하게 됩니다. 하지만 이렇게 할 경우 페이지의 일부분만 갱신할 경우에도 페이지 전체를 다시 로드해야하는데 엄청난 자원낭비와 시간낭비를 초래하고 말것입니다. 하지만 ajax는 html 페이지 전체가아닌 일부분만 갱신할수 있도록 XML HttpRequest객체를 통해 서버에 request를 합니다. 이 경우 Json이나 xml형태로 필요한 데이터만 받아 갱신하기 때문에 그만큼의 자원과 시간을 아낄 수 있습니다. 요새 웹페이지에서 가장 중요한것은 속도가 아닐까싶습니다. 이 이유하나만으로도 Ajax를 사용해야 하는 이유로써 충분합니다.</p>
<p>▶Ajax의 장단점  </p>
<p>Ajax의 장점</p>
<ol>
<li><p>웹페이지의 속도향상</p>
</li>
<li><p>서버의 처리가 완료 될때까지 기다리지 않고 처리 가능하다.</p>
</li>
<li><p>서버에서 Data만 전송해면 되므로 전체적인 코딩의 양이 줄어든다.</p>
</li>
<li><p>기존 웹에서는 불가능했던 다양한 UI를 가능하게 해준다. 사진공유 사이트 Flickr의 경우 사진의 제목이나 태그를 페이지 리로드 없이 수정할 수 있다.</p>
</li>
</ol>
<p> Ajax 의 단점</p>
<ol>
<li><p>히스토리 관리가 안 된다. (보안에 좀 더 신경을 써야한다.)</p>
</li>
<li><p>연속으로 데이터를 요청하면 서버 부하가 증가할 수 있다.</p>
</li>
<li><p>XMLHttpRequest를 통해 통신을 하는 경우사용자에게 아무런 진행 정보가 주어지지 않는다. 그래서 아직 요청이 완료되지 않았는데 사용자가 페이지를 떠나거나 오작동할 우려가 발생하게 된다. </p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[보일러 플레이트란?]]></title>
            <link>https://velog.io/@lazy_youn/%EB%B3%B4%EC%9D%BC%EB%9F%AC-%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@lazy_youn/%EB%B3%B4%EC%9D%BC%EB%9F%AC-%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Sat, 28 Mar 2020 02:26:54 GMT</pubDate>
            <description><![CDATA[<p>보일러플레이트는 프로그래밍에서 상용구 코드를 말합니다. 어떤일을 하기위해서 꼭 작성해야 하는 코드로 자바에서는 클래스의 getter, setter 메소드를 말합니다.</p>
<p>자바에서 getter, setter는 꼭 필요하지만 코드의 길이를 길어지게 하고 개발자에게 의미없는 노동을 강요하게 됩니다. 이부분이 자바의 단점 중 하나입니다. 그래서 스칼라에서는 케이스 클래스를 통해 컴파일러에서 자동으로 작업을 처리할 수 있게 도와줍니다. 자바에서도 롬복을 이용하여 이부분을 자동으로 생성하게 할 수 있습니다. </p>
<p>출처: <a href="https://118k.tistory.com/755">https://118k.tistory.com/755</a> [개발자로 살아남기]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴파일, 빌드, 배포의 개념과 차이]]></title>
            <link>https://velog.io/@lazy_youn/%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EB%B9%8C%EB%93%9C-%EB%B0%B0%ED%8F%AC%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@lazy_youn/%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EB%B9%8C%EB%93%9C-%EB%B0%B0%ED%8F%AC%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Sat, 28 Mar 2020 02:21:25 GMT</pubDate>
            <description><![CDATA[<p>본인이 번역가라고 생각해보자.</p>
<p>이번에 출판사로부터 일을 하나 받았는데,</p>
<p>영문으로된 글을 한글로 번역하는 일이다.</p>
<p>번역된 글은 출판사에서 적절히 페이지를 나누어 책으로 엮을 것이며,</p>
<p>완성된 책은 출판이 되어 서점에 진열될 것이다.</p>
<p>우리는 방금 컴파일, 빌드, 배포의 모든 과정을 훑어보았다.</p>
<ol>
<li><p>영문으로된 글을 한글로 번역하는 것은 컴파일이다.</p>
</li>
<li><p>번역한 글을 책으로 엮는 것은 빌드이다.</p>
</li>
<li><p>완성된 책을 고객들이 읽을 수 있도록 서점에 진열하는 것은 배포이다.</p>
</li>
<li><p>1~2번 과정을 하나로 묶어 &#39;빌드 한다&#39;고 하기도 한다.
벽돌과 시멘트등 여러 재료를 사용해 무엇인가를 짓는(build)것의 결과물이 사람이 살 수 있는 집이 되는 것처럼,</p>
</li>
</ol>
<p>코드와 컴파일러등 여러 도구를 사용해 무엇인가를 만드는(build) 것의 결과물은 동작하는 소프트웨어가 된다고 이해하면 좀 더 쉬우려나?</p>
<p>즉, 순서대로 보자면 컴파일 - 빌드 - 배포 의 순서이지만,</p>
<p>보통 컴파일을 포함한 배포하기 직전까지의 모든 과정을 ‘빌드 한다’ 라고 표현하기도 한다.</p>
<p>사실 용어를 정확하게 정의해두고 사용하는게 좋겠지만,</p>
<p>실제로 회사나 프로젝트 팀마다 용어를 조금씩 다르게 사용하는 경우가 있으니 참고해두자.</p>
<p>심지어는 코드가 완성된 직후, 컴파일부터 배포하는 모든 과정을 ‘빌드 한다’고 표현하는 경우도 봤다.</p>
<p>어쨌든 이를 좀 더 프로그래밍적 관점에서 보자면,</p>
<ol>
<li><p>컴파일: 사용자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 번역하는 일</p>
</li>
<li><p>빌드: 컴파일된 코드를 실제 실행할 수 있는 상태로 만드는 일</p>
</li>
<li><p>배포: 빌드가 완성된 실행 가능한 파일을 사용자가 접근할 수 있는 환경에 배치시키는 일</p>
</li>
<li><p>혹은 컴파일을 포함해 war, jar 등의 실행 가능한 파일을 뽑아내기까지의 과정을 빌드한다고도 함.</p>
</li>
</ol>
<p>이클립스에서 JAVA로 코딩을 한다고 생각해보자.</p>
<p>코드를 짜고나서 Run 버튼을 눌러 코드를 실행시킨다 (컴파일 + 실행)</p>
<p>정상적으로 실행되면 이것을 war 파일로 뽑아서(빌드) 웹서버에 올리거나(배포)</p>
<p>JSmooth 등을 사용해 exe, jar 파일로 뽑아(빌드) 사용자에게 주면 된다(배포)</p>
<p>참고로, 웹이 아닌 exe 파일로 배포하는 경우는 보통 ‘deploy’보다는 ‘distribution’ 한다고 표현하는 것 같다.</p>
<p>둘다 똑같은 ‘배포’이긴 하지만, deploy는 일반적으로 웹개발 영역에서 주로 사용되는 용어로 보인다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3rd party란?]]></title>
            <link>https://velog.io/@lazy_youn/3rd-party%EB%9E%80</link>
            <guid>https://velog.io/@lazy_youn/3rd-party%EB%9E%80</guid>
            <pubDate>Sat, 28 Mar 2020 02:01:21 GMT</pubDate>
            <description><![CDATA[<p>3rd party, 써드파티
프로그래밍에서의 서드파티란 프로그래밍을 도와주는 plug_in 이나 library 등을 만드는 회사를 말한다.</p>
<p>개인 개발자나 프로젝트 팀, 혹은 업체등에서 개발하는 라이브러리</p>
<p>즉 제 3자 라이브러리 .</p>
<p>제작사에서 만든것이 아니라 다른 업체에서 만든 해당 툴 지원 라이브러리</p>
<p>제조사와 사용자 이외 외부의 생산자를 가리키는 뜻으로 쓰인다. - 위키</p>
<p>편하고 효율적인 개발을 위해, 플러그인이나 라이브러리 또는 프레임워크등을 사용하게 된다.</p>
<p>예로 프로그래밍 개발과 개발자 사이에 플러그인,라이브러리,프레임워크를 서드파티로 볼 수 있다.</p>
<p>...</p>
<p>이처럼 제 3자로써 중간다리 역할을 하는 것을 서드파티라고 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모듈이란?]]></title>
            <link>https://velog.io/@lazy_youn/%EB%AA%A8%EB%93%88%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@lazy_youn/%EB%AA%A8%EB%93%88%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Sat, 28 Mar 2020 01:59:29 GMT</pubDate>
            <description><![CDATA[<p>프로그램을 구성하는 구성요소의 일부이며 관련된 데이터와 함수들이 묶여서 모듈을 형성한다.  보통 파일단위로 나누이지며 모듈이라는 것은 크기를 이야기 할 순 없지만 보통은 기능별로 나누어지는 프로그램을 가르켜 모듈이라 하며    그 기능은 클 수도 있고 작을 수도 있다.</p>
]]></description>
        </item>
    </channel>
</rss>