<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꾸르빅 블로그</title>
    <link>https://kkureubik.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 6 Apr 2026 08:06:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>꾸르빅</managingEditor>
    <item>
      <title>[디자인 패턴 바이블] 4장. 콜백을 사용한 비동기 제어 흐름 패턴</title>
      <link>https://kkureubik.tistory.com/39</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4-1. 비동기 프로그래밍의 어려움&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Javascript는 클로저와 익명 함수로 인해 개발자가 코드베이스 지점을 옮겨다니지 않고 원할한 프로그래밍을 할 수 있게 해준다. 따라서 비동기 코드 작성 시 제어를 놓치는 일이 흔하게 발생한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;4-1-1. 콜백 지옥&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 많은 클로저와 in-place 콜백 정의가 코드의 가독성을 떨어뜨리고 관리할수 없는 덩어리 형태로 만드는 것을 콜백 지옥이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백 지옥의 문제점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 가독성 하락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 스코프에서 사용되는 변수 이름 중복(ex. err). 어떤 이들은 각 스코프의 객체를 구분(err, err1, err2, error)하려고 하고, 어떤 이들은 항상 같은 이름(err)을 사용하려고 하는 등 코드컨벤션을 맞추기 어려워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 성능 하락(클로저는 성능 및 메모리를 많이 점유한다) 및 메모리 누수 가능성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bICkkW/btsF1z9vac8/u0WYe4JqAbHYkVpsCk5lC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bICkkW/btsF1z9vac8/u0WYe4JqAbHYkVpsCk5lC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bICkkW/btsF1z9vac8/u0WYe4JqAbHYkVpsCk5lC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbICkkW%2FbtsF1z9vac8%2Fu0WYe4JqAbHYkVpsCk5lC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;204&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;4-2-1. 콜백 규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. 콜백을 정의할 때 in-place 함수 정의를 남용하지 않는다. 가급적 중첩없이 개별적인 함수를 작성한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. 빠른 반환 원칙 : callback 실행 후에도 함수가 계속 동작하기 떄문에 나머지 함수의 실행을 차단하는 return 명령어를 삽입하는것을 잊지 말아야 한다! 자주 발생하는 실수!&lt;/p&gt;
&lt;pre id=&quot;code_1711241742903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 비선호
if (err) {
	cb(err)
} else {

}

// 선호
if (err) {
	return cb(err)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;4-2-3. 순차 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 일련의 작업을 순차적으로 실행한다는 것은 한번에 하나씩 실행한다는 것. 즉, 실행 순서가 중요하고 이를 지켜야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TOnJr/btsF3ntdzV0/jeQwnxqH823P0AeB4vSYW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TOnJr/btsF3ntdzV0/jeQwnxqH823P0AeB4vSYW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TOnJr/btsF3ntdzV0/jeQwnxqH823P0AeB4vSYW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTOnJr%2FbtsF3ntdzV0%2FjeQwnxqH823P0AeB4vSYW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;113&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 직접방식의 블로킹API를 사용하여 구현할때는 비교적 간단하지만, 일반적인 비동기 API를 사용하는 경우 콜백 지옥의 주된 원인이 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 코드를 개발하는 경우 컬렉션을 이용하여 작업 목록을 순차적으로 반복하고, 완료 시 비동기 작업(콜백)을 수행하는 방식으로 개발할 수 있다. = reduce 알고리즘의 기본이 되는 패턴.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTmA3u/btsF2T6XBFW/JQkPKcEjkoGjORMhn6Bsgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTmA3u/btsF2T6XBFW/JQkPKcEjkoGjORMhn6Bsgk/img.png&quot; data-alt=&quot;순차 실행 기본 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTmA3u/btsF2T6XBFW/JQkPKcEjkoGjORMhn6Bsgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTmA3u%2FbtsF2T6XBFW%2FJQkPKcEjkoGjORMhn6Bsgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;251&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순차 실행 기본 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;4-2-4. 무한 병렬 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 비동기 작업들의 실행 순서가 중요하지 않고, 작업의 모든 실행이 끝났을 때 알림을 받으면 되는 작업&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Node.js의 블로킹 성질(내부적으로 동시 처리) 덕분에 단일 스레드임에도 불구하고 동시성을 달성할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3WOK/btsF1DKPDyc/We71fAhRK76phEDzLN7tQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3WOK/btsF1DKPDyc/We71fAhRK76phEDzLN7tQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3WOK/btsF1DKPDyc/We71fAhRK76phEDzLN7tQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3WOK%2FbtsF1DKPDyc%2FWe71fAhRK76phEDzLN7tQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;188&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 각 작업이 완료되면 결과를 컬렉션에 모으거나, 배열에 매핑 후 완료되었다는 finish() 콜백을 호출하는 방식으로 구현할 수 있다. 이때&amp;nbsp; 경쟁(competitive race)를 주의해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 병렬에서 다중 작업이 실행되고 있을 때, 외부 리소스에 대한 접근에 대한 경쟁 상태(race condition)을 가질 수 있기 떄문!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Node.js는 단일 스레드에서 실행되고 병렬화를 일반적인 방법으로 사용하기 떄문에, 다중 스레드 프로그래밍에서&amp;nbsp; 사용하는 동기화 메커니즘(lock, 뮤텍스, 세마포어) 같은 구조를 사용하지 않아도 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWoSv/btsF1AtNIUs/5YQTOGVfpzqlKqVb9G7wBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWoSv/btsF1AtNIUs/5YQTOGVfpzqlKqVb9G7wBk/img.png&quot; data-alt=&quot;무한 병렬 실행 기본 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWoSv/btsF1AtNIUs/5YQTOGVfpzqlKqVb9G7wBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWoSv%2FbtsF1AtNIUs%2F5YQTOGVfpzqlKqVb9G7wBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;193&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무한 병렬 실행 기본 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;4-2-5. 제한된 병렬 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 무한 병렬 수행은 Dos(Denial-of-service) 공격에 취약하기 때문에 병렬 작업의 수를 제한하는 것이 복원력있는 애플리케이션을 만드는데 도움이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Usrph/btsF3CKwpP5/vY5XTBLKeQzh6e2iSJM0b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Usrph/btsF3CKwpP5/vY5XTBLKeQzh6e2iSJM0b1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Usrph/btsF3CKwpP5/vY5XTBLKeQzh6e2iSJM0b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUsrph%2FbtsF3CKwpP5%2FvY5XTBLKeQzh6e2iSJM0b1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;147&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 한번에 수행하는 동시성을 제한하는 방식으로 간단하게 구현할 수 있다(순차실행 + 병렬실행의 혼합). 이경우 작업 순서를 지정할 수도 있으며, 동시에 실행하는 수만 지정하고자 하는 경우 큐(Queue)를 사용하는 메커니즘으로 구현하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 큐 + EventEmitter를 혼합하여 관찰자 패턴을 조합하면, 에러가 발생한 경우에도 큐가 정상적으로 동작하며, 큐 기반 시스템에서 작업이 정지되지 않고 에러 발생 시 재시도 및 복구전략을 수립할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;4-3. 비동기 라이브러리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- nodejs에서 주로 사용하는 async 라이브러리가 이와 같은 방식이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 컬렉션으로 비동기 함수 수행(순차적/제한된 동시성과 함께 병렬 수행)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 모든 함수의 출력이 다음 함수의 입력이 되는 비동기 함수 체인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) Queue 추상화 사용.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>도서/Node.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/39</guid>
      <comments>https://kkureubik.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 24 Mar 2024 10:30:28 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴 바이블] 3장. 콜백과 이벤트 (2)</title>
      <link>https://kkureubik.tistory.com/38</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-1. 관찰자 패턴&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 관찰자 패턴이란? Node.js의 반응적(reactive) 특성을 모델링하고 콜백을 완벽하게 보완하는 이상적인 해결책.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상태 변화가 일어날 때, 관찰자(또는 Listener)에게 통지할 수 있는 객체를 정의하는 것&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백 패턴과의 차이 : 콜백은 일반적으로 하나의 리스너에게 결과를 전달하는 반면, 관찰자 패턴은 주체가 실질적으로 여러 관찰자에게 통지를 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-2-1. EventEmitter 클래스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Kl20/btsF1tuKgSZ/wfDuhwFk8OU6i8c9H44qn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Kl20/btsF1tuKgSZ/wfDuhwFk8OU6i8c9H44qn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Kl20/btsF1tuKgSZ/wfDuhwFk8OU6i8c9H44qn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Kl20%2FbtsF1tuKgSZ%2FwfDuhwFk8OU6i8c9H44qn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;254&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Node.js에서의 관찰자 패턴은 이미 코어에 내장되어 있으며, EventEmitter 클래스를 통해 사용할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 특정 유형의 이벤트가 발생되면 호출되는 하나 이상의 함수를 리스너로 등록할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1711238910386&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import { EventEmitter } from 'events'
const emitter = new EventEmitter()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-2-2. EventEmitter 생성 및 사용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 필수 method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) on(event, listenr) : 주어진 이벤트 문자열에 대해 새로운 리스너(함수)를 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) once(event, listener) : 첫 이벤트가 전달된 후 제거되는 1회성 리스너 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) emit(event, [arg1], [...]) : 새 이벤트를 생성하고 리스너에게 전달할 추가적인 문자열(인자)를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) removeListenr(event, listenr) : 지정된 이벤트 문자열에 대한 리스너를 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt; &lt;b&gt;3-2-3. 오류 전파&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- EventEmiiter는에러가 발생했을 때, 콜백처럼 예외를 throw 하는 방식이 아니라 error라는 특수한 이벤트를 발생시키고, Error 객체를 인자로 전달하는 방식으로 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 오류 이벤트가 발생하고 이에 연결된 리스너가 없을 경우 자동으로 예외를 throw하고 애플리케이션이 종료되니 오류 리스너를 필수적으로 등록해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-2-5. 메모리 누수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 관찰 가능한 주체들에 대해서 오랜 시간동안 구독을 하고 있을 때, 더이상 구독이 필요하지 않은 경우 구독 해지를 해야 메모리 누수를 예방 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 구독 해지 시, 리스너의 scope에 있는 더이상 사용되지 않는 객체의 메모리 점유를 해제하기 떄문에, 사용하지 않는 리스너는 제거해주는것을 권장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1711239601343&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;emitter.removeListener('an_event', listener)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- emitter 자체에 대한 참조가 더이상 활성되어 있지 않아 도달할 수 없게 되는 경우에만 가비지 컬렉션에 잡혀 메모리 점유를 해지한다. 즉, 코드를 잘못 작성하여 해제되지 않는 영구적인 EventEmiiter를 등록한다면 메모리 누수를 일으키게 되니 주의해야 한다(ex. once 메소드 사용하였는데, 이벤트가 한번도 발생하지 않는 경우)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 리스너의 수가 일정 갯수(default 10)를 초과하면 EventEmitter가 경고를 발생시키는 기능을 활용하면 좋다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: justify;&quot;&gt;(node) warning: possible EventEmitter memory leak detected. 11 listeners added. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: justify;&quot;&gt;Use emitter.setMaxListeners() to increase limit.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-2-6. 동기 및 비동기 이벤트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- EventEmitter는 기본적으로 비동기적 이벤트를 다루는데 사용한다. 이벤트를 동기적으로 발생시키는 것은 EventEmitter가 필요하지 않거나,&amp;nbsp; Zalgo 의 상황(동기와 비동기 이벤트를 혼합하여 사용하는 것)이다.&lt;/p&gt;
&lt;pre id=&quot;code_1711240520119&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// 파일에서 특정 단어를 찾으면 이벤트를 발생시키는 경우
// find()함수에서 readFile(비동기) 사용시 found1, found2 둘다 감지되나, 
// readFileSync(동기) 사용 시 found1만 감지됨
findRegexInstance
   .addFile(...)
   .on('found1', (file,match) =&amp;gt; console.log('match found1'))
   .find()
   .on('found2', (file,match) =&amp;gt; console.log('match found2'))&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이벤트가 비동기적으로 발생할 때, 현재의 스택이 이벤트 루프에 넘어갈 때 까지는 이벤트가 발생한 이후에도 새로운 리스너를 등록할 수 있다. 즉, 이벤트가 이벤트 루프 다음 사이클이 될 때까지 날라가지 않는것이 보장된다. 따라서 어떠한 이벤트도 놓치지 않게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이벤트가 특정 작업에서 동기적으로 발생한다면, 모든 리스너를 이벤트 발생 전에 등록해야 한다. (ex. 파일을 동기적으로 읽는 메소드 readFileSync() 을 사용하는 경우)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-2-7. EventEmitter vs 콜백&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 대체적으로 결과가 비동기적으로 반환되어야 하는 경우에는 콜백을 사용, EventEmitter는 발생한 사건과 연결될 때 사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이외에도 여러가지 판단 근거가 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 가독성 측면 : 콜백은 여러 유형의 결과를 전달하기 어렵기 떄문에, 여러 이벤트를 전달해야되는 경우 EventEmitter를 사용하면 코드가 깔끔하게 작성 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 의미 측면 : EventEmitter는 같은 이벤트가 여러번 발생하거나, 발생하지 않을 수도 있는 경우 사용되어야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;콜백은 작업이 성공/실패 여부와 상관없이 정확히 한번 호출되기 때문에, 반복 가능성이 있거나 발생하지 않을수도 있는 경우는 EventEmitter를 사용하는것이 좋다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) 구현 측면 : 콜백을 사용하는 API는 오직 특정한 콜백 하나만 사용할 수 있고,EventEmitter는 같은 이벤트에 대해 다수의 리스너를 등록할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt; &lt;b&gt;3-2-8. 콜백과 EventEmitter의 결합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- glob 패키지(&lt;a href=&quot;https://www.npmjs.com/package/glob&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/package/glob&lt;/a&gt;) : 콜백을 사용하여 결과를 비동기적으로 전달하고, 동시에 EventEmitter를 반환하여 비동기 처리 상태에 대해 상세한 판단을 제공.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 주어진 패턴과 일치하는 모든 파일 리스트를 가지고 호출된 콜백 함수를 가져온다. 프로세스 상태에 대해서 보다 세분화된 알림을 제공하는 EventEmitter 사용.&lt;/p&gt;
&lt;pre id=&quot;code_1711241125509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const eventEmitter = glob(pattern, [option], callback)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>도서/Node.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/38</guid>
      <comments>https://kkureubik.tistory.com/38#entry38comment</comments>
      <pubDate>Sun, 24 Mar 2024 09:46:21 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴 바이블] 3장. 콜백과 이벤트 (1)</title>
      <link>https://kkureubik.tistory.com/36</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;b&gt;들어가기에 앞서 Key Point&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백 패턴 : 어떻게 동작하며, Node.js에서 어떤 방식으로 자주 사용되는지, 자주 발생하는 위험요소를 어떻게 다룰지&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 관찰자패턴 : Node.js에서 EventEmitter 클래스를 사용하여 구현을 어떻게 할 것인지&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3-1. 콜백 패턴&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백 : 비동기 작업을 처리할 때 필요한 &lt;u&gt;'작업의 결과를 전달하기 위해 호출되는 함수'&lt;/u&gt;로, Javasciprt는 콜백에 이상적인 언어이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 콜백을 구현하는 방법으로는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;함수&lt;/span&gt;(일급 클랙스 객체)와 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;클로저&lt;/span&gt;(생성된 함수의 환경을 참조)가 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;※ 일급 객체(first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.(출처 : 위키백과)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-1-1. 연속 전달 방식&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Javascript에서 콜백은 다른 함수에 인자로 전달되는 방식으로 사용된다. 이러한 방식을 연속전달방식(CPS: Continuation-Passsing Style) 이라고 하며, 이는 단순히 결과를 호출자에게 직접 반환하는 대신 다른 함수(콜백)로 전달하는 것을 의미한다. 반대로, return문을 통해 호출자에게 전달되는 방식을 직접스타일(direct style)이라고 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685806101141&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//Dircet style
fucntion add(a,b) {
	return a+b
}

//CPS
fuction addCps(a, b, callback) {
	callback(a + b)
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685807554537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function additionAsync(a, b, callback) {
	setTimeout(() =&amp;gt; callback(a + b), 100)
}

console.log('before')
additionAsync(1, 2, result =&amp;gt; console.log('result: ${result}'))
console.log('after')
/*
결과
before
after
result: 3
/*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- setTimeout()은 비동기 작업을 실행시키기 때문에 콜백의 실행이 끝날 때까지 기다리지 않는 대신, 즉시 반환되어 additionAsync()로 제어를 돌려주어, 제어가 호출자에게 반환된다. 따라서, 최종 출력은 [ after ] 가 찍힌 후 [ result : 3 ]이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 위의 코드에서 Javascript의 클로저 덕분에 콜백이 다른 시점과 다른 위치에서 호출되더라도, 비동기 함수의 호출자 컨텍스트를 유지한다. 따라서, additionAsync() 함수가 종료되었음에도 이벤트 루프의 다음 사이클에서 콜백함수가 수행될 때, 변수값을 유지한 상태로 결과값이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 클로저(Closer)란, 내부 함수가 참조하는 외부함수의 지역변수가 외부함수가 리턴된 이후에도 유효성이 유지될 때, 이 내부함수를 클로저라고 한다 ( 출저 : &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;초보자를 위한 Node.js 200제)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;- 비 연속 전달(Non-CPS) 콜백 : 콜백 인자가 있는 경우에도 직접적인 방식으로 전달할 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;(ex. 단순 배열 접근을 위한 map 함수의 경우 요소를 반복하는데 사용될 뿐, 비동기적으로 연산 결과를 전달하지 않기 때문에 결과는 직접적인 방식으로 동기적으로 반환됨) &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Non-CPS 콜백과 CPS 콜백은 문법적 차이가 없기 때문에 API 문서에 분명하게 명시해야 한다.&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cagfsw/btsp7IHdzfK/iDvcZ9YYbrqyigIQXOBiYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cagfsw/btsp7IHdzfK/iDvcZ9YYbrqyigIQXOBiYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cagfsw/btsp7IHdzfK/iDvcZ9YYbrqyigIQXOBiYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcagfsw%2Fbtsp7IHdzfK%2FiDvcZ9YYbrqyigIQXOBiYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;787&quot; height=&quot;105&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s73fd/btsp34D8bYn/tTPkKxE73Ow6JPq2J2UsKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s73fd/btsp34D8bYn/tTPkKxE73Ow6JPq2J2UsKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s73fd/btsp34D8bYn/tTPkKxE73Ow6JPq2J2UsKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs73fd%2Fbtsp34D8bYn%2FtTPkKxE73Ow6JPq2J2UsKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;128&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9EAKK/btsqfAabXwC/06SdqV4oIM0510QwAtSnWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9EAKK/btsqfAabXwC/06SdqV4oIM0510QwAtSnWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9EAKK/btsqfAabXwC/06SdqV4oIM0510QwAtSnWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9EAKK%2FbtsqfAabXwC%2F06SdqV4oIM0510QwAtSnWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;168&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685808503235&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const result = [1,5,7].map(element =&amp;gt; element -1)
console.log(result) // [0, 4, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-1-2. 콜백의 위험요소&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; 특정 조건에서 동기적으로 동작하고, 다른 조건에서는 비동기적으로 동작하는 API를 개발하지 말자&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685809359036&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { readFile } from 'fs'

const cache = new Map()

function inconsistentRead(filename, cb) {
	if (cache.has(filename)) {
    	//동기적으로 호출되는 부분에서 콜백 사용
        cb(cache.get(filename))
    } else {
    	//비동기 함수 내에서 콜백 사용
      	readFile(Filename, 'utf8', (err, data) =&amp;gt; {
        	cache.set(filename, data)
        	cb(data)
        })
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1685811024588&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function createFileReader(filename) {
	const listeners = []
    inconsistentRead(filename, value =&amp;gt; {
    	listeners.forEach(listener =&amp;gt; listener(value))
    })
    
    return {
    	onDataReady: listener =&amp;gt; listenenrs.push(listener)
    }
}


const reader1 = createFileReader('data.txt')
reader1.onDataReady(data =&amp;gt; {
	console.log('First call data : ${data}')
    
    //일정 시간 후 같은 파일 다시 읽기 시도
	const reader2 = createFileReader('data.txt')
    reader2.onDataReady(data =&amp;gt; {
	console.log('Second call data : ${data}')
    })
})

/* 결과
First call data : some data
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 파일을 처음 읽을 때는 readFile의 callback함수로 cb가 전달되기 때문에, 파일을 읽고 listener에 data가 전달되는 시간동안 리스너가 생성 및 등록되어 reader1의 onDataReady callback이 수행된다. 그러나 두번째 읽을 때는 동기적으로 수행되기 때문에 reader2.onDataReady의 callback은 수행되지 않을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정방안 1) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;동기 API&lt;/u&gt;를 이용하여 함수가 전체적으로 직접 스타일로 구현되게 수정&lt;/p&gt;
&lt;pre id=&quot;code_1685812512564&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//동기API 사용
import { readFileSync } from 'fs'

const cache = new Map()

function consistentReadSync(filename) {
	if(cache.has(filename)) {
    	return cache.get(filename)
    } else {
    	const data = readFileSync(filename, 'utf8')
        cache.set(filename, data)
        return data
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;nbsp; 비동기 &amp;rarr; 동기로 변경 시 아래 사항들을 고려해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1) 대체할 수 있는 동기API가 있는지 확인한다. (지원하는 API가 없을 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2) 동기API는 이벤트루프를 block하고 동시요청을 보류하기 때문에 전체 애플리케이션 속도를 떨어뜨릴수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정방안 2) &lt;u&gt;process.nextTick()&lt;/u&gt;을 이용하여 실행을 지연시켜 완전한 비동기로 수행되게 수정&lt;/p&gt;
&lt;pre id=&quot;code_1685813296054&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { readFile } from 'fs'

const cache = new Map()

function consistentReadAsync(filename, callback) {
	if (cache.has(file)) {
    	//지연된 콜백 호출
        process.nextTick(() =&amp;gt; callback(cache.get(filename)))
    } else {
    	//비동기 함수 사용
      	readFile(Filename, 'utf8', (err, data) =&amp;gt; {
        	cache.set(filename, data)
        	cb(data)
        })
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;- process.nextTick() : 현재 진행중인 작업의 완료 시점 뒤로 함수의 실행을 지연시킴.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;process.nextTick() &lt;/span&gt;vs&amp;nbsp; setImmediate() vs &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;setTimeout(callback,0)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1. process.nextTick()은 현재 작업이 완료 된 후 바로 실행되어 다른 I/O 이벤트가 발생하기 전 실행됨(마이크로 테스크, 콜백을 인수로 받아 대기중인 I/O 이벤트 대기열의 앞으로 밀어넣고 즉시 반환시키는 형태) . 따라서 특정 I/O가 계속 수행되지 않는 기아 상태에 빠질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2. setImmediate()은 이미 큐에 있는 I/O 이벤트들의 뒤에 넣어 대기하는 형태로 실행됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3.setTimeout(callback,0)은 setImmediate()와 비슷하나 이벤트 루프의 다른 Phase에서 실행된다. setTimeout은 Timer에서, setImmediate는 check에서 실행되기 때문에, I/O 콜백과 연관되어 수행된다면 setImmediate()로 예약된 콜백이 먼저 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;- 이처럼 CPS &amp;harr; 직접 스타일, 비동기&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;harr; 동기 로 변경하게 된다면, 연결된 모든 코드들의 동작방식을 수정해야 되기 때문에 주의가 필요하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;3-1-3. Node.js 콜백 규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;1. 콜백은 맨 마지막에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;- Node.js 코어 함수 표준 규칙에 따라, 콜백을 사용하는 API의 경우 콜백이 마지막 로 전달되어야 한다. 함수 호출의 가독성이 좋아지기 때문!&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. 오류는 맨 처음에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 콜백함수에 오류를 인자로 전달해야되는 경우, 콜백의 첫번째 인자로 전달한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;또한 오류는 항상 Error 타입으로 전달한다(간단한 문자열이나 숫자를 오류 객체로 전달하지 말자)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. 에러 처리 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;- 동기식 직접 스타일 함수 : try/catch문과 throw문을 사용&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;- 비동기식 CPS 함수 : 호출 체인의 콜백으로 전달.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;1) 에러를 다시 밖으로 발생시키거나 리턴하지 않고, 다른 결과처럼 콜백 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;2) 콜백함수 내부 동작 코드는 try/catch문을 이용하여 에러 캐치&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; - 콜백에서 에러 발생 시 콜백을 수행시키는 함수의 에러로 감지되지 않는다. callback -&amp;gt; stack -&amp;gt; event loop -&amp;gt; console로 포착되기 때문에 외부에서 잡을 수 없어 내부에서 try/catch로 에러를 캐치해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691258295715&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try {
 readJSONThrows('invalid_json.json', (err) =&amp;gt; console.error(err))
} catch (err){
//동작하지 않음.
console.log('This will not catch the JSON parsing exception')
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;3) try문 안에서 콜백 호출 지양(콜백이 자체적으로 발생시키는 에러도 잡히기 때문)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685815674200&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { readFile } from 'fs'

function readJSON(filename, callback) {
	readFile(filename, 'utf8', (err, data) =&amp;gt; {
    	if(err){
        //에러를 전파하고 현재의 함수에서 빠져 나옴
        	return callback(err)
        }
        try {
        	//파일 내용 파싱
            parsed = JSON.parse(data)
        } catch (err) {
        	//파싱 에러 캐치
            return callback(err)
        }
        //에러없음. 데이터 전파
        callbcak(null, parsed)
    })
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이벤트 루프별 비동기함수 차이 : &lt;a href=&quot;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84-%F0%9F%94%81-setTimeout-setImmediate-processnextTick#setimmediate_%EC%99%80_settimeout_&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84-%F0%9F%94%81-setTimeout-setImmediate-processnextTick#setimmediate_%EC%99%80_settimeout_&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>도서/Node.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/36</guid>
      <comments>https://kkureubik.tistory.com/36#entry36comment</comments>
      <pubDate>Sun, 4 Jun 2023 00:28:35 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴 바이블] 2장. 모듈 시스템</title>
      <link>https://kkureubik.tistory.com/35</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;들어가기에 앞서 Key Point&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모듈이 왜 필수적이며 Node.js에서 다른 모듈 시스템이 가능한 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Node.js는 두가지 모듈 시스템(CommonJs , ECMAScript module)을 사용하는데 이 두가지 형태가 왜 존재하는지&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-1. 모듈과 모듈 시스템&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모듈 시스템(Module System) : 모듈을 정의하고 사용할 수 있게 해주는 도구이자 문법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 모듈(Module) : 소프트웨어의 실제 유닛&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 좋은 모듈 시스템은 아래와 같은 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 코드베이스 분할 방법 제시 : 구조적으로 관리할 수 있으며 독립적인 기능의 조각으로 개발할 수 있도록 가이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 코드의 재사용 : 기능을 간단하고 구조화하여 다른 프로젝트에서 사용가능하도록 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) 은닉성 : 복잡한 구현을 숨기고 간단한 인터페이스를 노출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4) 종속성 관리 : 모듈 실행 시 필요한 종속성들을 쉽게 import할 수 있도록 관리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-2. Javascript, Node.js에서의 모듈 시스템&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Javascript는 초반에 내장 모듈시스템 없이 코드베이스 분할(1번항목), &amp;lt;script&amp;gt;태그를 통한 쉬운 import(4번항목)가 가능했으나,&amp;nbsp; Javascript 브라우저 애플리케이션이 점점 복잡해지고 여러 프레임워크가 사용되면서 Javascript 프로젝트에 효율적으로 사용될 모듈 시스템 정의가 필요했다. 이에 성공적 결과를 낸 것이 AMD와 UMD이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ※ AMD(Asynchronous Module Definition) : 비동기 모듈에 대한 표준안. 브라우저는 모든 모듈이 다 로딩될 때까지 기다릴 수 없기 때문에 비동기 모듈 로딩 방식으로 구현되어있다. RequireJS에 의해 대중화되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; ※&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;UMD(Universal Module Definition) : CommonJS와 AMD를 통합하기 위한 표준안.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Node.js는 운영체제의 파일 시스템에 직접적으로 접근할 수 있기 때문에, 브라우저가 아닌 환경에서 Javascript 모듈을 제공할 수 있도록 고안된 CommonJS가 탄생하였다. 이후 Browserify와 Webpack과 같은 모듈 번들러 덕분에 브라우저 환경에서도 사용하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이후 2015년도에 ES6의 발표와 함께 표준 모듈 시스템(ESM)의 제안이 나왔다. 이에 따른 구체적인 구현을 제공하지 않았기 때문에 Node.js 13.2 버전부터 ESM에 대한 안정적인 지원을 한다. 따라서 현재는 CommonJS가 주된 모듈 시스템이라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-3. 모듈 시스템과 패턴&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;2-3-1. 노출식 모듈 패턴&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 은닉의 필요성 : Javascript는 네임스페이스가 없어 모든 스크립트가 전역 범위에서 실행된다. 따라서 애플리케이션 코드나 종속성 라이브러리가 노출된다면 스코프가 오염되어 코드 충돌이 날 수 있다. 또한 애플리케이션이 확장됨에 따라 개별적이고 분리된 기능 구현이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 노출식 모듈 패턴(revealing module pattern) : 자기 호출 함수(즉시 실행 함수 표현-IIFE)를 사용하여 private 범위를 만들고 공개될 부분만 내보내는 방식.&lt;/p&gt;
&lt;pre id=&quot;code_1677949534450&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const myModule = (() =&amp;gt; {
	const privateFoo = () =&amp;gt; {}
    const privateBar = []
    
    const exported = {
    	publicFoo: () =&amp;gt; {},
        publicBar: () =&amp;gt; {}
    }
    return exported
})() //괄호 파싱 시 함수 호출&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1677949607082&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(myModule) // publicFoo와 publicBar로 구성된 객체 반환
console.log(myModule.privateFoo, myModule.privateBar) // undefined 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2-4. CommonJS 모듈&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CommonJS 명세의 두가지 주요 개념 요약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) require는 로컬 파일 시스템으로부터 모듈을 import하게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) exports와 module.exports는 특별한 변수로서 현재 모듈에서 공개될 기능들을 내보내기 위해서 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;2-4-1. 직접 만드는 모듈 로더&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 노출식 모듈 패턴을 이용한 Node.js require() 함수 모방&lt;/p&gt;
&lt;pre id=&quot;code_1677950894440&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function loadModule(filename, module, require) {
	const wrappedSrc = 
    	'(function (module, exports, require) {
        	${fs.readFileSync(filename, 'UTF8')}
        })(module, module.exports, require)'  //module.exports 사용 주의
    eval(wrappedSrc)
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1677951259150&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function require(moduleName) {
	const id = require.resolve(moduleName) //모듈 전체 경로 로드
    if(require.cache[id]) { //캐싱되어 있는 경우 캐시값을 가져옴
    	return require.cache[id].exports
    }
    
    //모듈 메타 데이터: 최초 로드를 위해 exports 속성 초기화된 module 객체 생성
    const module = {
    	exports: {}, //로드한 모듈 코드에서의 public API export용
        id
    }
    require.cache[id] = module //캐시 업데이트
    loadModule(id, module, require) //모듈소스코드를 읽어와 module.exports 객체에 public API를 넣음
	
    return module.exports
}
require.cache = {}
require.resolve = (moduleName) =&amp;gt; {
 /* 모듈 이름으로 모듈의 전체 경로를 찾아냄 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;2-4-2. 모듈 정의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- module.export 변수에 할당되지 않다면 비공개&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677951772536&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const dependency = require('./anotherModule')

//private함수
function log() {
	console.log('Well done ${dependency.username}')
}

//공개적으로 사용되기 위해 익스포트되는 API
module.exports.run = () =&amp;gt; {
	log()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;2-4-3. module.exports&amp;nbsp; VS&amp;nbsp; exports&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- module.exports는 require에서 사용되는 return 값이며, exports는 module.exports의 참조값이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;따라서, export의 재할당은 module.exports에 영향을 미치지 않는다. exports 사용 시 새로운 속성(property)을 추가할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1677952496053&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const module = { exports: {} }
const exports = module.exports

exports.hello = () =&amp;gt; {
	console.log('Hello')
}

module.exports = () =&amp;gt; {
	consloe.log('Hello')
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AMD와 UMD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@rlaclgns321/%EB%AA%A8%EB%93%88-%EC%8B%9C%EC%8A%A4%ED%85%9CCommonJS-AMD-UMD-ES6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@rlaclgns321/%EB%AA%A8%EB%93%88-%EC%8B%9C%EC%8A%A4%ED%85%9CCommonJS-AMD-UMD-ES6&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- module.exports 대 export&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cotak.tistory.com/103&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cotak.tistory.com/103&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>도서/Node.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/35</guid>
      <comments>https://kkureubik.tistory.com/35#entry35comment</comments>
      <pubDate>Sun, 5 Mar 2023 03:03:18 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴 바이블] 1장. Node.js 플랫폼</title>
      <link>https://kkureubik.tistory.com/34</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-1. Node.js의 철학&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1-1-1. 경량 코어&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Node.js 코어의 바깥 부분에 유저랜드/유저스페이스라 불리는 사용자 전용 모듈 생태계 구성하여, 코어를 최소한의 기능으로 관리한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 유저랜드(Userland), 유저스페이스(UserSpace) : 커널 공간이 아닌 사용자 메모리 공간에서 실행되는 라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1-1-2. 경량 모듈&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Node.js는 재사용 가능한 라이브러리를 만들기 위한 기본적인 수단으로 Module 개념을 이용한다. 코드의 양과 범위 측면에서 작은 모듈로 디자인 하는것이 Node.js에서 통용되는 원칙이다(1 program - 1 rule)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 작은 모듈을 구성했을때의 장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) 재사용성 &amp;uarr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) 이해하기 쉽고 사용하기 쉽다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3) 테스트 및 유지보수가 쉽다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4) 사이즈가 작아 브라우저에서 사용하기 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- NPM(패키지 관리자)의 도움을 받아 각 패키지가 필요로하는 버전의 종속성 패키지를 가질 수 있다. 충돌 방지 뿐만아니라 많은 수의 작은 종속성을 가질수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;span&gt;&amp;nbsp;DRY(Don't Repeat Yourself) 원칙 : 반복하지 마라!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;1-1-3. 작은 외부 인터페이스&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Node.js 모듈은 단일 진입점을 제공한다(단 하나의 함수나 클래스를 노출시켜 사용하도록 구성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 모듈 내부 접근을 제한하여 확장의 가능성을 낮추지만, 이 점이 오히려 본질적인 기능에 집중하여 활용성을 좋게 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1-1-4. 간결함과 실용주의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- KISS(Keep it Simple, Stupid) 원칙 : 부족하지만 간단한 기능이 소프트웨어를 위해서는 더 좋은 디자인이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- node.js가 javascript 기반인 이유도 javascript가 실용적인 언어이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-2. Node.js 코어 작동 원리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1-2-1. 논블로킹 I/O&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 블로킹 I/O의 경우 멀티 쓰레드를 통해 여러 동시 연결을 처리하나, 메모리 소모 및 컨텍스트 전환으로 인해 낭비되는 자원이 많다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 논블로킹I/O는 즉시 반환되기 때문에 리소스가 읽힐 준비가 된 데이터를 가지고 있지 않다면 오류가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 논블로킹 I/O는 데이터를 처리하는 방식이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 동기 이벤트 디멀티플렉서(이벤트 통지 인터페이스) : 여러 리소스를 관찰하여 읽기/쓰기 연산이 완료되었을 때 새로운 이벤트를 반환하는 방식. 새로운 이벤트가 반환되기 전까지 블로킹된다. 이러한 방식은 단일 쓰레드에서 여러 리소스의 I/O를 다룰 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677940970995&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;watchedList.add(socketA, FOR_READ)
watchedList.add(fileB, FOR_READ)
while(events = demultiplexer.watch(watchedList)){
	for (event of events){
    	data = event.resource.read()
        if(data === RESOURCE_CLOSED) {
        	demultiplexer.unwatch(event.resource)
        } else {
        	consumeData(data)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230304_234647772.jpg&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOogg6/btr1XOX52V2/vfb5JoyrGs6Q8ooXVSfRi1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOogg6/btr1XOX52V2/vfb5JoyrGs6Q8ooXVSfRi1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOogg6/btr1XOX52V2/vfb5JoyrGs6Q8ooXVSfRi1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOogg6%2Fbtr1XOX52V2%2Fvfb5JoyrGs6Q8ooXVSfRi1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;562&quot; data-filename=&quot;KakaoTalk_20230304_234647772.jpg&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1-2-2. 리액터(Reactor) 패턴&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; - 각 I/O 작업에 연관된 핸들러(콜백함수)를 가지고, 리소스가 준비되면 이벤트 루프에서 콜백함수를 호출하며 자원을 가져간다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230305_000045522.jpg&quot; data-origin-width=&quot;1968&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwGnP3/btr1XOKDMMR/K6GN030K8dePR6AXQdBCzK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwGnP3/btr1XOKDMMR/K6GN030K8dePR6AXQdBCzK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwGnP3/btr1XOKDMMR/K6GN030K8dePR6AXQdBCzK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwGnP3%2Fbtr1XOKDMMR%2FK6GN030K8dePR6AXQdBCzK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;360&quot; data-filename=&quot;KakaoTalk_20230305_000045522.jpg&quot; data-origin-width=&quot;1968&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;&amp;nbsp;1-2-3. Libuv ( Node.js의 I/O 엔진 라이브러리)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Linux의 epoll, macOS의 kqueue, Windows IOCP(I/O completion port) API 등 디멀티플렉서를 위한 자체 인터페이스가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- I/O별, OS별로 다르게 동작할 수 있기 때문에 Node.js에서는 OS별 호환성과 서로 다른 리소스 유형의 논블로킹 동작을 표준화하는 Libuv 라이브러리를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 시스템 호출 추상화, 리액트 패턴 구현(이벤트 루프 생성, 이벤트 큐 관리, 비동기 I/O 작업 실행) 등의 기능을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1-3. Node.js의 javascript&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;&lt;b&gt;1-3-1. 운영체제 기능에 대한 모든 접근&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Node.js는 Javascript를 사용하지만 브라우저 영역 안에서 실행되지 않기 때문에, 운영체제에서 기본적으로 제공하는 주된 서비스들에 바인딩할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) fs모듈 - 파일 시스템에 있는 파일 접근 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;net, dram 모듈 : 애플리케이션이 저수준의 TCP,UDP 소켓을 사용할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1-3-2. 네이티브 코드 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Node.js는 N-API 인터페이스를 통해 네이티브 코드에 바인드할 수 있는 사용자측 모듈을 만들수 있다. N-API는 네이티브 코드와 연결되는 공유객체(Addons)를 빌드하기 위한 API로, C 또는 C++를 사용하여 모듈을 작성해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- C/C++ 라이브러리를 가져와 사용할 수 있기 때문에 오픈소스 재사용이 가능해지며, 하드웨어 드라이브/포트와 같은 저수준 특성에 대한 접근을 제공할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>도서/Node.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/34</guid>
      <comments>https://kkureubik.tistory.com/34#entry34comment</comments>
      <pubDate>Sun, 5 Mar 2023 00:35:47 +0900</pubDate>
    </item>
    <item>
      <title>[Vue] Do it! Vue.js 입문 내용 정리</title>
      <link>https://kkureubik.tistory.com/33</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t3yQs/btrThmpD77E/Y57cyqUckAC1uWYO5I8oP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t3yQs/btrThmpD77E/Y57cyqUckAC1uWYO5I8oP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t3yQs/btrThmpD77E/Y57cyqUckAC1uWYO5I8oP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft3yQs%2FbtrThmpD77E%2FY57cyqUckAC1uWYO5I8oP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;169&quot; height=&quot;237&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;&amp;nbsp;- 예제 코드 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/joshua1988/doit-vuejs&quot;&gt;https://github.com/joshua1988/doit-vuejs&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;01. Vue.js 소개&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- Vue.js란?&lt;/b&gt; 2014년도에 공식 배포된 웹페이지 화면을 개발하기 위한 frontend framework.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 화면에 표현할 수 있는 기능(명시적 렌더링) + 라우터, 상태 관리, 테스팅 등을 쉽게 결합할 수 있는 구조(프레임워크의 기능) = 점진적인 프레임워크(progressive framework)라고 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- Vue.js의 장점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 배우기 쉬운 난이도 : 타입스크립트, ES6, jsx, 웹팩 등의 학습이 필요한 리액트/앵귤러에 비해 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) (리액트와 앵귤러에 비해) 우수한 성능 : https://vuejs.org/v2/guide/comparison.html&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 앵귤러(Anbular)의 데이터 바인딩 특성 + 리액트(React)의 가상 돔(virtual DOM) 기반 렌더링 특성 모두 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- Vue.js의 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) MVVM패턴 기반으로 Model - View - ViewModel 구조로 개발하는 방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- View: 사용자에게 보여지는 화면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- DOM : HTML 문서에 들어가는 요소(태그, 클래스, 속성) 정보를 담고 있는 데이터 트리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- DOM Listner : 돔의 변경 내역에 대해 즉각적으로 반응하여 특정 로직을 수행하는 장치(ex. 클릭 이벤트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Model : 서버에서 가져온 데이터를 자바스크립트 객체 형태로 저장.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Data Binding : 뷰에 표시되는 내용과 모델의 데이터를 동기화(ex. 화면 재구성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- ViewModel : 뷰와 모델의 중간 영역(돔 리스터/데이터 바인딩 기능 영역)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20221210_234937980.jpg&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0nWd/btrTk3vwptS/82zXotLnJSdmLz9okx03Ik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0nWd/btrTk3vwptS/82zXotLnJSdmLz9okx03Ik/img.jpg&quot; data-alt=&quot;Vue.js의 MVVM 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0nWd/btrTk3vwptS/82zXotLnJSdmLz9okx03Ik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0nWd%2FbtrTk3vwptS%2F82zXotLnJSdmLz9okx03Ik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1657&quot; height=&quot;682&quot; data-filename=&quot;KakaoTalk_20221210_234937980.jpg&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Vue.js의 MVVM 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 컴포넌트 기반 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 트리 구조처럼 뷰를 구성. 코드를 재사용하기 쉽고 화면의 구조를 직관적으로 파악할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 리액트와 앵귤러의 장점을 모두 가진 프레임워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 앵귤러의 양방향 데이터 바인딩 : 화면의 데이터와 모델의 데이터가 동기화되어 자동으로 변경되는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 리액트의 단방향 데이터 흐름 : 컴포넌트의 root 구조(수직적 구조에서 부모-&amp;gt;자식으로의 흐름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 리액트의 가상 돔 렌더링 방식 : 특정 돔 요소를추가/삭제할 때 전체 렌더링이 아닌 변경된 부분만 가상 DOM을 구성하여 실제 DOM과 비교. 변경된 부분만 UI 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;02. 개발 환경 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;1) 크롬 브라우저&lt;/b&gt; : 구성한 웹 화면 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;2) 텍스트에디터/IDE :&lt;/b&gt; 책에서는 무료 텍스트 에디터인 아톰(Atom) 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;3) Node.js :&lt;/b&gt;서버 자바스크립트 실행 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&amp;nbsp;4) 뷰 개발자 도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd&quot;&gt;https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;03. 인스턴스 &amp;amp; 컴포넌트&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 인스턴스(Instance) :&lt;/b&gt; 뷰의 기본 단위.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 생성자 :&lt;/b&gt; new Vue(); 뷰 라이브러리 로딩 및 접근하도록 뷰 인스턴스를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 인스턴스 옵션 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) el : 뷰 인스터스로 화면을 렌더링 할 때 화면이 그려질 위치의 DOM 요소를 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) data : DOM에서 사용할 수 있는 데이터 값 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) template : html, CSS 등 마크업 요소 정의하는 속성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPlmkZ/btrTgq0wwTL/PBumjm4bbyjRlOncbrIaI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPlmkZ/btrTgq0wwTL/PBumjm4bbyjRlOncbrIaI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPlmkZ/btrTgq0wwTL/PBumjm4bbyjRlOncbrIaI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPlmkZ%2FbtrTgq0wwTL%2FPBumjm4bbyjRlOncbrIaI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;377&quot; height=&quot;164&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 인스턴스 유효범위&lt;/b&gt; : el 속성으로 지정한 DOM 요소 내부에서만 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 인스턴스 라이프사이클 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_KakaoTalk_20221211_004635881.jpg&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjp2AR/btrThOszah5/IxThdoEr2e5Jvi2sDqP4P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjp2AR/btrThOszah5/IxThdoEr2e5Jvi2sDqP4P1/img.png&quot; data-alt=&quot;뷰 인스턴스 라이프 사이클&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjp2AR/btrThOszah5/IxThdoEr2e5Jvi2sDqP4P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjp2AR%2FbtrThOszah5%2FIxThdoEr2e5Jvi2sDqP4P1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;399&quot; data-filename=&quot;edited_KakaoTalk_20221211_004635881.jpg&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뷰 인스턴스 라이프 사이클&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 인스턴스 생성 -&amp;gt; 화면에 부착&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- beforeCreate : data 속성과 method 속성 정의X. DOM 요소 접근X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- created : data 속성과 method 속성 정의O = this.data, this.function() 로직 사용 가능. DOM 요소 접근X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;주로 초기 데이터 셋팅 시 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- beforeMount : 자바스크립트로 DOM 화면을 그리는 render() 함수 호출 전 로직. DOM요소 접근X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- mounted : DOM 요소 접근 O. 화면 제어 로직 수행 시 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;하위 컴포넌트 및 외부 라이브러리 호출 시점 전인 경우 $nextTick() API로 HTML 코드 최종 파싱까지 대기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) 화면에 부착 -&amp;gt; 내용 갱신(데이터가 변경되는 경우에만 사용 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ※&amp;nbsp; 데이터 관찰 : 뷰의 반응성(Reactivity) 제공을 위해 $watch 속성으로 감시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - beforeUpdate : 데이터 관찰 시 가상 DOM 그리기 전 호출되는 단계. 변경 예정 데이터의 값과 관련된 로직 수행 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - updateed : 가상DOM으로 화면을 그린 뒤 호출되는 단계. 데이터 변경으로 인한 화면 요소까지 변경 완료된 상태.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;이 단계에서 데이터 값을 변경하면 무한루프에 빠질 수 있으므로 주의! 데이터보단 DOM 관련 로직 사용 시 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 내용 갱신 -&amp;gt; 인스턴스 소멸(갱신 없을 시 화면에 부착 -&amp;gt; 인스턴스 소멸)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - beforeDestory : 인스턴스 소멸 전 단계로 인스턴스 접근 가능. 사용했던 데이터 삭제 시 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - destroyed : 인스턴스 파괴 후 호출되는 단계로 인스턴스 접근 불가능.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 컴포넌트(Component)&lt;/b&gt; : 화면을 구성하는 영역 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 전역 컴포넌트&lt;/b&gt; : 모든 인스턴스에서 사용 가능한 컴포넌트.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Vue생성자에 .component()를 호출하여 수행. '컴포넌트 이름 , {컴포넌트 내용}' 형태로 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; HTML 사용자 정의 태그 형식으로 사용 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQQA1/btrTgrd4bHH/lf8qnctptXgawrd5kvqm5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQQA1/btrTgrd4bHH/lf8qnctptXgawrd5kvqm5k/img.png&quot; data-alt=&quot;전역 컴포넌트 사용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQQA1/btrTgrd4bHH/lf8qnctptXgawrd5kvqm5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQQA1%2FbtrTgrd4bHH%2Flf8qnctptXgawrd5kvqm5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;316&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전역 컴포넌트 사용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 지역 컴포넌트&lt;/b&gt; : 특정 인스턴스 내에서만 사용 가능한 컴포넌트.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스 내 components 속성에 항목 추가. '컴포넌트 이름: 컴포넌트 내용' 형태로 정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wLR0z/btrTh49MUS8/Xg1L8y2NQHMdfRg5Vh6Ua1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wLR0z/btrTh49MUS8/Xg1L8y2NQHMdfRg5Vh6Ua1/img.png&quot; data-alt=&quot;지역 컴포넌트 사용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wLR0z/btrTh49MUS8/Xg1L8y2NQHMdfRg5Vh6Ua1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwLR0z%2FbtrTh49MUS8%2FXg1L8y2NQHMdfRg5Vh6Ua1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;253&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지역 컴포넌트 사용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp; 컴포넌트 간 유효범위(scope) : &lt;/b&gt;컴포넌트마다 자체의 고유한 유효 범위를 가지기 때문에 같은 웹 페이지라도 컴포넌트 내부 데이터를 공유할 수 없다.(컴포넌트 참조 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 컴포넌트 간 데이터 전달&lt;/b&gt; :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 상위 컴포넌트 -&amp;gt; 하위 컴포넌트 : 호출 시 props 전달.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;상위(b-vind이용) / 하위(props 이용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GfMXO/btrTgIfCLog/l41iBswLQeh6k64ovaRmqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GfMXO/btrTgIfCLog/l41iBswLQeh6k64ovaRmqK/img.png&quot; data-alt=&quot;props 사용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GfMXO/btrTgIfCLog/l41iBswLQeh6k64ovaRmqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGfMXO%2FbtrTgIfCLog%2Fl41iBswLQeh6k64ovaRmqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;196&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;props 사용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 하위 컴포넌트 -&amp;gt; 상위 컴포넌트 : 이벤트 emit 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하위(this.$emit 이용) / 상위(v-on 이용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ※ 뷰의 특성인 단방향 데이터 흐름에 어긋나기 때문에 하위-&amp;gt;상위 데이터 전달은 공식 사이트에서 다루지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/miN8S/btrTmvrOFrt/R2htlbpvvjJFOkXHi3ObWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/miN8S/btrTmvrOFrt/R2htlbpvvjJFOkXHi3ObWK/img.png&quot; data-alt=&quot;emit 사용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/miN8S/btrTmvrOFrt/R2htlbpvvjJFOkXHi3ObWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmiN8S%2FbtrTmvrOFrt%2FR2htlbpvvjJFOkXHi3ObWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;525&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;emit 사용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 같은 레벨 컴포넌트 통신 : 이벤트 버스 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달 컴포넌트(eventBus.$emit) / 수신 컴포넌트(eventBus.$on)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;※ 기본 원리대로라면 하위(전달자) -&amp;gt; 상위 -&amp;gt; 하위(수신자) 방식으로 구현해야 하나, 상위 컴포넌트에 불필요한 데이터를 전달해야하는 수고로움이 있기 때문에 이벤트 버스를 이용하여 통신한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwQ4nV/btrTg4QgNFF/MPNIs412enF24q0DZcKKn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwQ4nV/btrTg4QgNFF/MPNIs412enF24q0DZcKKn0/img.png&quot; data-alt=&quot;event bus 이용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwQ4nV/btrTg4QgNFF/MPNIs412enF24q0DZcKKn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwQ4nV%2FbtrTg4QgNFF%2FMPNIs412enF24q0DZcKKn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;383&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;event bus 이용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 버스의 경우 많아지는 경우 관리가 되지 않기 때문에 이벤트 버스 관리 도구인 뷰엑스(Vuex)를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;04. 라우터 &amp;amp; HTTP 통신&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 라우팅(routing) :&lt;/b&gt; 웹 페이지간의 이동 방법. SPA(Single page Application)에서 사용하는 방식으로 매끄러운 화면 전환 및 빠른 화면 조작에 용이하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ SPA : 미리 페이지를 로딩하고 페이지 이동 시 클라이언트의 라우팅을 이용하여 화면을 갱신하는 패턴의 Application&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- vueRouter&lt;/b&gt;&amp;nbsp;: 뷰에서 라우팅 기능을 구현할 수 있도록 지원하는 공식 라이브러리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;router-link to=&quot;URL값&quot;&amp;gt; : 페이지 이동 태그. 화면에서는 a 태그로 표시되어 클릭 시 to에 지정한 URL로 이동.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;router-view&amp;gt; : 페이시 표시 태그. 변경되는 URL에 따라 컴포넌트를 뿌려주는 영역.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm17NS/btrTifwEoLI/7AuUoRMIc4lrbeOcVOBssK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm17NS/btrTifwEoLI/7AuUoRMIc4lrbeOcVOBssK/img.png&quot; data-alt=&quot;vueRouter 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm17NS/btrTifwEoLI/7AuUoRMIc4lrbeOcVOBssK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm17NS%2FbtrTifwEoLI%2F7AuUoRMIc4lrbeOcVOBssK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;639&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vueRouter 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 네스티드 라우터(Nested Router)&lt;/b&gt; : 한 화면에 상-하위 관계에 있는 2개 이상의 컴포넌트로 라우팅하는 경우 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;router 정의 시 children으로 이동할 하위 컴포넌트를 등록하고 router-view가 이중으로 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byqfb1/btrThd7p3GP/Or7OXQBUTcN7cC8vsdxojK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byqfb1/btrThd7p3GP/Or7OXQBUTcN7cC8vsdxojK/img.png&quot; data-alt=&quot;네이티드 라우터 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byqfb1/btrThd7p3GP/Or7OXQBUTcN7cC8vsdxojK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyqfb1%2FbtrThd7p3GP%2FOr7OXQBUTcN7cC8vsdxojK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;865&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이티드 라우터 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 네임드뷰(Named View) : &lt;/b&gt;한 화면에 같은 레벨의 여러 컴포넌트로 라우팅하는 경우 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;router-view에 name을 붙여줘서 name과 컴포넌트를 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9T99l/btrTgIs9qEl/MF1s0lg6eq7EXmamx0MGNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9T99l/btrTgIs9qEl/MF1s0lg6eq7EXmamx0MGNk/img.png&quot; data-alt=&quot;네임드뷰 사용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9T99l/btrTgIs9qEl/MF1s0lg6eq7EXmamx0MGNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9T99l%2FbtrTgIs9qEl%2FMF1s0lg6eq7EXmamx0MGNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;617&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네임드뷰 사용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- HTTP 통신 방법&lt;/b&gt; : ajax를 지원하는 axios 라이브러리 사용. 반환 데이터가 객체형태로 JSON.parse()를 이용하여 객체로 변환할 필요가 없어 사용성이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ ajax : 서버에서 받아온 데이터를 표시할 때 화면 전체를 갱신하지 않고도 화면의 일부분만 변경할 수 있게 하는 자바스크립트 기법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Promise 기반의 API이므로 정상적인경우 then(), 비정상적인 경우 catch() 로직이 수행될 수 있도록 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) axios.get('url주소') : url 주소로 GET 요청을 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) axios.post('url주소') : url 주소로 POST 요청 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;05. 템플릿 &amp;amp; 프로젝트 구성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 템플릿(Template)&lt;/b&gt; : HTML,CSS 등의 마크업 속성과 뷰 인스턴스에서 정의한 데이터 및 로직을 연결하여 사용자가 브라우저에서 볼 수 있는 형태의 HTML로 변환해주는 속성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 템플릿의 속성과 문법:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 데이터 바인딩 : 뷰 인스턴스의 데이터와 HTML 화면 요소를 연결하는 방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;① {{ }} 콧수염괄호 : 뷰 인스턴스 내 data에 정의된 속성 값을 읽어온다. data가 변경되는 경우 자동으로 갱신되는데, 갱신을 막으려면 v-once 속성을 사용한다. 자바 스크립트 표현식 사용 가능(선언문 불가/분기구문 사용불가. 삼항연산자로 대체 사용/복잡한 연산은 인스턴스에서 수행 후 결과만 표기 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;② v-bind : id, class, style 등의 html 속성 값에 뷰 데이터 값을 연결할때 사용하는 방식. ':'로 간소화하여 약식문법 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 뷰 디렉티브(Directive) : v- 접두사를 가지는 모든 속성들을 의미. 데이터 변경 시 리액티브하게 반응하여 갱신된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;① v-if : 데이터의 진위여부에 따라 HTML 태그의 존재 여부를 정함(false시 태그 완전 삭제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;② v-show : 데이터의 진위여부에 따라 HTML 태그의 표기 유무를 정함(display:none이라는 css 효과 부여) &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;③ v-for : 지정한 뷰 데이터 개수만큼 HTML 태그 반복 출력. 리스트 개발 시 '(item, index) in arrayList' 형식으로 구현&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;④ v-bind : html 태그 속성과 뷰 데이터 속성을 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;⑤ v-on : 화면 요소의 이벤트를 감지하여 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;⑥ v-model: form(input, select, textarea)에 입력한 값을 뷰 인스턴스의 데이터와 즉시 동기화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) 이벤트 처리 : v-on에 method를 연결하여 처리&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnweX3/btrTmYU08HZ/bsWa0OFCK3f41loIKkOuFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnweX3/btrTmYU08HZ/bsWa0OFCK3f41loIKkOuFk/img.png&quot; data-alt=&quot;v-on과 method 연결 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnweX3/btrTmYU08HZ/bsWa0OFCK3f41loIKkOuFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnweX3%2FbtrTmYU08HZ%2FbsWa0OFCK3f41loIKkOuFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;250&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;v-on과 method 연결 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4) 고급 템플릿 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;① computed : 데이터 가공 등의 복잡한 연산이 필요할 경우 사용.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;장점) 연결된 data 속성 값의 변화에 따라 자동으로 다시 연산 수행. 자주 연산하기 때문에 캐싱 기능 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ※ Method는 호출시에만 연산 수행. 따라서 캐싱 기능 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;② watch : 데이터 변화를 감지하여 자동으로 특정 로직 수행.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; computed보다 시간이 상대적으로 더 많이 소요되는 비동기 처리 시 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEfE1p/btrTg3qhw3J/MoFKfkLoiR9IAjk2rx4UEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEfE1p/btrTg3qhw3J/MoFKfkLoiR9IAjk2rx4UEk/img.png&quot; data-alt=&quot;watch 사용 예제 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEfE1p/btrTg3qhw3J/MoFKfkLoiR9IAjk2rx4UEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEfE1p%2FbtrTg3qhw3J%2FMoFKfkLoiR9IAjk2rx4UEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;347&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;watch 사용 예제 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 뷰 프로젝트 구성 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) 싱글 파일 컴포넌트 체계 : 확장자를 .vue로 구성하는 방식. 파일 1개 = 컴포넌트 1개로 따로 vue 생성자를 대체한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;template&amp;gt; &amp;lt;script&amp;gt; &amp;lt;style&amp;gt; 구조로 나뉘어져있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;이 체계를 사용하기 위해서는 .vue 파일을 웹 브라우저가 인식할 수 있는 형태의 파일로 변환해주는 웹팩이나 browserify 같은 도구를 추가로 설치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;※ 웹팩(Webpack) : 웹 앱의 자원들을 자바스크립트 모듈로 변환해 하나로 묶어주는 자바스크립트 모듈 번들러(bundler)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;※ browerify : 웹팩과 유사하나 웹 자원 압축, 빌드자동화 기능 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) 뷰 CLI : 프로젝트 구성을 CLI로 할 수 있게 제공하는 도구. 프로젝트 초기 구성에 필요한 웹팩이나 브라우저리파이를 쉽게 설치할 수 있다(vue init)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) 뷰 로더(Loader) : 웹팩에서 지원하는 라이브러리로 .vue파일의 내용을 웹페이지 형태로 변환해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; test 속성에서 로더가 적용될 대상 파일 지정, loader는 적용할 로더의 종류를 지정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXtwEq/btrTiyJBcpI/18oRrFEO2vTYi6eFKgTRUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXtwEq/btrTiyJBcpI/18oRrFEO2vTYi6eFKgTRUK/img.png&quot; data-alt=&quot;웹팩의 뷰 로더 처리 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXtwEq/btrTiyJBcpI/18oRrFEO2vTYi6eFKgTRUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXtwEq%2FbtrTiyJBcpI%2F18oRrFEO2vTYi6eFKgTRUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;299&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹팩의 뷰 로더 처리 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frontend 추가 필요한 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) CSS 선택자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 네이밍 컨벤션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 7장 Vue.js 고급 개발자 되기 부분 정리&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>도서/Vue</category>
      <category>vue.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/33</guid>
      <comments>https://kkureubik.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 11 Dec 2022 03:55:39 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴 바이블] 0. Design Pattern 공부 시작</title>
      <link>https://kkureubik.tistory.com/32</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Node.js 공부를 하면서 스터디에도 도움이 될만한 강의 주제를 고민하다가&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최근에 학습한 디자인 패턴이 Node.js에서 어떻게 활용되는지에 대해 공유하기로 결정했다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 앞으로 포스팅할 내용은 이 책의 내용 정리 및 서칭을 통한 추가 자료 정리 위주로 될 예정!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkTKBf/btrN4jFcGYZ/XeXu49cvg9CB66jSKpGuwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkTKBf/btrN4jFcGYZ/XeXu49cvg9CB66jSKpGuwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkTKBf/btrN4jFcGYZ/XeXu49cvg9CB66jSKpGuwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkTKBf%2FbtrN4jFcGYZ%2FXeXu49cvg9CB66jSKpGuwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;201&quot; height=&quot;275&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Node.js 디자인 패턴 바이블&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/101686866&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.yes24.com/Product/Goods/101686866&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665251679738&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;book&quot; data-og-title=&quot;Node.js 디자인 패턴 바이블 - YES24&quot; data-og-description=&quot;완벽한 Node.js 애플리케이션 설계를 위한 디자인 패턴 바이블효율적이고 강력한 Node.js 애플리케이션 구축에 필요한 디자인 패턴들을 한 권으로 정리한다. Node.js로 프로그래밍을 하는데 필요한 &quot; data-og-host=&quot;www.yes24.com&quot; data-og-source-url=&quot;http://www.yes24.com/Product/Goods/101686866&quot; data-og-url=&quot;http://www.yes24.com/Product/Goods/101686866&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sW0eA/hyP4Keo4Sb/1I4nrEtmKSHqpIkycn3ovK/img.jpg?width=877&amp;amp;height=1200&amp;amp;face=0_0_877_1200,https://scrap.kakaocdn.net/dn/b3DrN2/hyP4ydYxIM/hajc6yggRPn48b3oFHbeN0/img.jpg?width=877&amp;amp;height=1200&amp;amp;face=0_0_877_1200,https://scrap.kakaocdn.net/dn/HQ89G/hyP4Av5WIo/Bmn73vx59i8KrVRYkuOaQ1/img.jpg?width=877&amp;amp;height=1200&amp;amp;face=0_0_877_1200&quot;&gt;&lt;a href=&quot;http://www.yes24.com/Product/Goods/101686866&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.yes24.com/Product/Goods/101686866&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sW0eA/hyP4Keo4Sb/1I4nrEtmKSHqpIkycn3ovK/img.jpg?width=877&amp;amp;height=1200&amp;amp;face=0_0_877_1200,https://scrap.kakaocdn.net/dn/b3DrN2/hyP4ydYxIM/hajc6yggRPn48b3oFHbeN0/img.jpg?width=877&amp;amp;height=1200&amp;amp;face=0_0_877_1200,https://scrap.kakaocdn.net/dn/HQ89G/hyP4Av5WIo/Bmn73vx59i8KrVRYkuOaQ1/img.jpg?width=877&amp;amp;height=1200&amp;amp;face=0_0_877_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Node.js 디자인 패턴 바이블 - YES24&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;완벽한 Node.js 애플리케이션 설계를 위한 디자인 패턴 바이블효율적이고 강력한 Node.js 애플리케이션 구축에 필요한 디자인 패턴들을 한 권으로 정리한다. Node.js로 프로그래밍을 하는데 필요한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.yes24.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅은 책을 공부하기 전에 &quot;디자인 패턴&quot;이 무엇인지, 책에서 다루는&amp;nbsp; 디자인 패턴들이 어떤 것인지에 대해 가볍게 워밍업하는 내용을 다룰 예정이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;nbsp; - 설계 패턴(Design Pattern)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 분야에 자주 일어나는 설계 문제에 대한 해결책들을 재사용 가능한 패턴으로 정리한 것.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 개발자가 디자인 패턴을 알아두면 좋은 점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1) 디자인 패턴 지식을 기반으로 재사용 가능하고 유연한/확장가능한 프로그램을 개발 &lt;br /&gt;2)&amp;nbsp;개발자들끼리&amp;nbsp;커뮤니케이션을&amp;nbsp;할&amp;nbsp;때&amp;nbsp;어떻게&amp;nbsp;개발할지&amp;nbsp;or&amp;nbsp;개발한&amp;nbsp;코드가&amp;nbsp;어떤&amp;nbsp;구조로&amp;nbsp;되어있는지&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;간결하게&amp;nbsp;말하기&amp;nbsp;가능&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;nbsp;- Levels&amp;nbsp;of&amp;nbsp;Pattern&amp;nbsp;[POSA]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 아키텍처 패턴(Architecture pattern) : &amp;nbsp;시스템 전체에 대한 골격 및 구성/조직에 적용되는 패턴&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 대표적 예시로 MVC 패턴이 있다(전체 시스템을 Model, View, Controller 구조로 구분하여 개발)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처1.JPG&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGA0KA/btrN4aIbpAS/ce5xLKQIeVXWq91YaQOK31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGA0KA/btrN4aIbpAS/ce5xLKQIeVXWq91YaQOK31/img.jpg&quot; data-alt=&quot;출처 : https://medium.com/@joespinelli_6190/mvc-model-view-controller-ef878e2fd6f5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGA0KA/btrN4aIbpAS/ce5xLKQIeVXWq91YaQOK31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGA0KA%2FbtrN4aIbpAS%2Fce5xLKQIeVXWq91YaQOK31%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;385&quot; data-filename=&quot;캡처1.JPG&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://medium.com/@joespinelli_6190/mvc-model-view-controller-ef878e2fd6f5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Model&amp;nbsp;:&amp;nbsp;무엇을&amp;nbsp;할지(데이터&amp;nbsp;구조부분) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Controller&amp;nbsp;:&amp;nbsp;모델이&amp;nbsp;어떻게&amp;nbsp;할지(로직처리&amp;nbsp;부분) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;View&amp;nbsp;:&amp;nbsp;화면에&amp;nbsp;보여주는&amp;nbsp;역할(UI)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;※ Model이 View와 직접적으로 연결되서는 안되고, View가 Model의 데이터를 직접적으로 확인해서는 안되는 특성이 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(non-UI인 Model과 와 UI인 View간의 연결이 약하다)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;2) Design Pattern : 아키텍처 패턴 적용 후 결정된 subsystem들간의 관계를 설계할 때 사용하는 패턴&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아키텍처 패턴보다 작은 규모여서 전체 시스템에 영향을 끼치지 않는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;앞으로 다루는 항목이 이 Design Pattern이며, 개발하는 기능의 특성별(개발 시 주의해야 하는 조건들)에 따라 다른 패턴을 사용한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ex) 전체 시스템에 사용되는 기본 설정값은 시스템 상 딱 하나여야 하기 떄문에 '싱글턴 패턴'을 채택한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3)&amp;nbsp;Coding&amp;nbsp;pattern(Programming&amp;nbsp;idiom)&amp;nbsp;:&amp;nbsp;프로그램&amp;nbsp;언어에&amp;nbsp;적용되는&amp;nbsp;low&amp;nbsp;level&amp;nbsp;패턴.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;설계한 부분을 실제로 구현할 때의 문제점을 해결하는 부분이며 언어의 특성에 의존적인 부분이 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;ex)&amp;nbsp;자바에서는&amp;nbsp;멀티쓰레드이기&amp;nbsp;때문에&amp;nbsp;기본적인&amp;nbsp;싱글턴&amp;nbsp;기법을&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;어려움이&amp;nbsp;있으니&amp;nbsp;static으로&amp;nbsp;&amp;nbsp;쓰자!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LSQ8x/btrOcfgvKKx/xniRvwfVcjTRvUTyT39KN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LSQ8x/btrOcfgvKKx/xniRvwfVcjTRvUTyT39KN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LSQ8x/btrOcfgvKKx/xniRvwfVcjTRvUTyT39KN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLSQ8x%2FbtrOcfgvKKx%2FxniRvwfVcjTRvUTyT39KN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;279&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;1) POSA 구조설명 : &lt;a href=&quot;https://guysheep.tistory.com/entry/D-002-Idiom-Design-Patterns-Architectural-Patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://guysheep.tistory.com/entry/D-002-Idiom-Design-Patterns-Architectural-Patterns&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665253129030&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;D-002. Idiom, Design Patterns, Architectural Patterns&quot; data-og-description=&quot;패턴 소개 우리가 알고 알는 디자인 패턴의 개념이 건축학에서 온 것은 알려진 사실입니다. 패턴은 전파하기 알맞게 포장되어 있다는 점에서 경험을 축적하고 전달하기에 좋다고 봅니다. 긍정&quot; data-og-host=&quot;guysheep.tistory.com&quot; data-og-source-url=&quot;https://guysheep.tistory.com/entry/D-002-Idiom-Design-Patterns-Architectural-Patterns&quot; data-og-url=&quot;https://guysheep.tistory.com/entry/D-002-Idiom-Design-Patterns-Architectural-Patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKtFRe/hyP4z41Yzw/dKhytVck2n6d8wNKCk3ff1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bNu2h9/hyP4JzOL3W/eDoIeYSKdVH7gWRmLSgmT0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://guysheep.tistory.com/entry/D-002-Idiom-Design-Patterns-Architectural-Patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://guysheep.tistory.com/entry/D-002-Idiom-Design-Patterns-Architectural-Patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKtFRe/hyP4z41Yzw/dKhytVck2n6d8wNKCk3ff1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bNu2h9/hyP4JzOL3W/eDoIeYSKdVH7gWRmLSgmT0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;D-002. Idiom, Design Patterns, Architectural Patterns&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;패턴 소개 우리가 알고 알는 디자인 패턴의 개념이 건축학에서 온 것은 알려진 사실입니다. 패턴은 전파하기 알맞게 포장되어 있다는 점에서 경험을 축적하고 전달하기에 좋다고 봅니다. 긍정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;guysheep.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2) JAVA에서 Static을 이용한 싱글턴 기법 사용 : &lt;a href=&quot;https://hsik0225.github.io/design%20pattern/2020/12/17/Singleton-Pattern/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hsik0225.github.io/design%20pattern/2020/12/17/Singleton-Pattern/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665253263702&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[디자인패턴] 싱글턴패턴(Singleton Pattern)&quot; data-og-description=&quot;불필요한 인스턴스 생성을 방지하는 패턴&quot; data-og-host=&quot;hsik0225.github.io&quot; data-og-source-url=&quot;https://hsik0225.github.io/design%20pattern/2020/12/17/Singleton-Pattern/&quot; data-og-url=&quot;https://hsik0225.github.io/design%20pattern/2020/12/17/Singleton-Pattern/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://hsik0225.github.io/design%20pattern/2020/12/17/Singleton-Pattern/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hsik0225.github.io/design%20pattern/2020/12/17/Singleton-Pattern/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[디자인패턴] 싱글턴패턴(Singleton Pattern)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;불필요한 인스턴스 생성을 방지하는 패턴&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hsik0225.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;nbsp;- Gof 패턴(Gang of Fours) &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체지향 프로그래밍에서 해결책으로 사용되는 패턴들 중 23가지를 카탈로그화 한 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23가지 패턴을 문제별(목적별) 사용하는 3가지 패턴으로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js 디자인 패턴 바이블에 나오는 패턴들 위주로만 가볍게 훑어보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(전반적인 디자인 패턴의 한줄설명은 &lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://coding-factory.tistory.com/708&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://coding-factory.tistory.com/708&lt;/a&gt; 를 참고하자)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;1. Creational Pattern(생성 패턴)&lt;/span&gt; : 객체의 생성과 관련된 패턴. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 시 다른 객체를 통해 만들면서 캡슐화를 한다 (ex. &lt;span&gt;Object A = new Object()같은 직관적 방법 외&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다양한 기법으로 생성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;&lt;/b&gt;&amp;nbsp;Factory : &lt;/b&gt;여러 타입의 객체가 있을 때, 중간 클래스(공장.Factory)에서 생성할 객체의 타입을 받아 생성하는 패턴. 자바 문법으로는 switch 같은 형식으로 객체를 생성하는 방식이다. 객체타입이 추가되는 경우 유지관리가 용이하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4Qtbq/btrN78WxaiC/1cKkYJOAGWSpdDWHVfQhU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4Qtbq/btrN78WxaiC/1cKkYJOAGWSpdDWHVfQhU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4Qtbq/btrN78WxaiC/1cKkYJOAGWSpdDWHVfQhU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4Qtbq%2FbtrN78WxaiC%2F1cKkYJOAGWSpdDWHVfQhU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;455&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;&amp;nbsp;Builder&amp;nbsp;:&lt;/b&gt; 객체를&amp;nbsp;생성할때&amp;nbsp;변수나&amp;nbsp;파라미터를&amp;nbsp;필수/옵션을&amp;nbsp;구분지을 때&amp;nbsp;사용하는&amp;nbsp;패턴.&amp;nbsp;필수값은&amp;nbsp;생성자를&amp;nbsp;통해&amp;nbsp;만들고,&amp;nbsp;옵션값은&amp;nbsp;메소드를&amp;nbsp;통해&amp;nbsp;입력받아&amp;nbsp;build를&amp;nbsp;통해&amp;nbsp;하나로&amp;nbsp;합쳐&amp;nbsp;생성한다.&amp;nbsp;파라미터가&amp;nbsp;많을&amp;nbsp;때&amp;nbsp;파라미터&amp;nbsp;관리&amp;nbsp;에러(변수&amp;nbsp;타입,순서)&amp;nbsp;방지&amp;nbsp;및&amp;nbsp;가독성을&amp;nbsp;높여주는&amp;nbsp;역할을&amp;nbsp;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vDZSY/btrN67KjtuE/3l9EMcWrDuPr1SLorxfi3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vDZSY/btrN67KjtuE/3l9EMcWrDuPr1SLorxfi3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vDZSY/btrN67KjtuE/3l9EMcWrDuPr1SLorxfi3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvDZSY%2FbtrN67KjtuE%2F3l9EMcWrDuPr1SLorxfi3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;397&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkgXV/btrN4DDqFov/8kN1i5IIcpOwCNtMpPlBK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkgXV/btrN4DDqFov/8kN1i5IIcpOwCNtMpPlBK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkgXV/btrN4DDqFov/8kN1i5IIcpOwCNtMpPlBK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkgXV%2FbtrN4DDqFov%2F8kN1i5IIcpOwCNtMpPlBK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;102&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;Singleton&lt;/b&gt; : 오직 하나의 인스턴스만 존재하도록 보장하는 객체 생성 패턴. 동일 클래스로 새로운 객체를 생성하는 경우에도 같은 객체를 전달받는다. 동일 인스턴스가 생기지 않게 구성하는 경우 사용된다. 보통 getInstance()를 이용해서 구현한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 singleton 패턴의 경우 JS에서 모듈을 가져올때 사용하는 require 함수를 예로 들 수 있다.&lt;br /&gt;모듈을 맨 처음 로드하는 경우 require.cache에서 저장되고, 다시 부르는 경우 캐시에서 값을 가져오기 때문에 singleton 패턴이 기본적으로 보장된다. 즉, 추가로 구현하는것이 오히려 코드의 복잡도를 높일 수 있다고 하니 사용 시 주의하자!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM1wmA/btrN4yISjC2/SUXjjjFD1KKSa0uIKMKPWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM1wmA/btrN4yISjC2/SUXjjjFD1KKSa0uIKMKPWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM1wmA/btrN4yISjC2/SUXjjjFD1KKSa0uIKMKPWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM1wmA%2FbtrN4yISjC2%2FSUXjjjFD1KKSa0uIKMKPWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1642&quot; height=&quot;398&quot; data-origin-width=&quot;1642&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1) Builder 설명1 : &lt;a href=&quot;https://yceffort.kr/2021/01/nodejs-4-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yceffort.kr/2021/01/nodejs-4-design-pattern&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254286995&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Home&quot; data-og-description=&quot;yceffort&quot; data-og-host=&quot;yceffort.kr&quot; data-og-source-url=&quot;https://yceffort.kr/2021/01/nodejs-4-design-pattern&quot; data-og-url=&quot;https://yceffort.kr&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOzA6Q/hyP4GC5blk/0gkxIWYRFhSU81XemTMJs0/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://yceffort.kr/2021/01/nodejs-4-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yceffort.kr/2021/01/nodejs-4-design-pattern&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOzA6Q/hyP4GC5blk/0gkxIWYRFhSU81XemTMJs0/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Home&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;yceffort&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yceffort.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2) Builder 설명2 : &lt;a href=&quot;https://velog.io/@namezin/%EB%B9%8C%EB%8D%94Builder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@namezin/%EB%B9%8C%EB%8D%94Builder&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254294956&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;빌더(Builder)&quot; data-og-description=&quot;빌더(Builder)&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@namezin/%EB%B9%8C%EB%8D%94Builder&quot; data-og-url=&quot;https://velog.io/@namezin/빌더Builder&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdmp3V/hyP4AiAFK4/AJ3HBlPIfDqWBvdeMee3j0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/jB4Y7/hyP4CUZ31B/jY4VqcoUY3w6jgtRo0Xu9K/img.jpg?width=5507&amp;amp;height=3098&amp;amp;face=0_0_5507_3098&quot;&gt;&lt;a href=&quot;https://velog.io/@namezin/%EB%B9%8C%EB%8D%94Builder&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@namezin/%EB%B9%8C%EB%8D%94Builder&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdmp3V/hyP4AiAFK4/AJ3HBlPIfDqWBvdeMee3j0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/jB4Y7/hyP4CUZ31B/jY4VqcoUY3w6jgtRo0Xu9K/img.jpg?width=5507&amp;amp;height=3098&amp;amp;face=0_0_5507_3098');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;빌더(Builder)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;빌더(Builder)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3) JS에서 require 함수 설명 : &lt;a href=&quot;https://kyungyeon.dev/posts/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kyungyeon.dev/posts/77&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254485971&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Node.js에서 singleton을 구현하려하지 마세요&quot; data-og-description=&quot;당신은 하지 않아도 될 코드를 생성하고 있을지도 모릅니다&quot; data-og-host=&quot;kyungyeon.dev&quot; data-og-source-url=&quot;https://kyungyeon.dev/posts/77&quot; data-og-url=&quot;https://kyungyeon.dev/posts/77&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGt96d/hyP4MXAUUv/NURSoGjxAhZBHfdxf5lRPk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://kyungyeon.dev/posts/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kyungyeon.dev/posts/77&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGt96d/hyP4MXAUUv/NURSoGjxAhZBHfdxf5lRPk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Node.js에서 singleton을 구현하려하지 마세요&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;당신은 하지 않아도 될 코드를 생성하고 있을지도 모릅니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kyungyeon.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;4) required 공식문서 : &lt;a href=&quot;https://nodejs.org/api/modules.html#requireid&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/api/modules.html#requireid&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254500410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Modules: CommonJS modules | Node.js v18.10.0 Documentation&quot; data-og-description=&quot;Modules: CommonJS modules# CommonJS modules are the original way to package JavaScript code for Node.js. Node.js also supports the ECMAScript modules standard used by browsers and other JavaScript runtimes. In Node.js, each file is treated as a separate mo&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/api/modules.html#requireid&quot; data-og-url=&quot;https://nodejs.org/api/modules.html#requireid&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://nodejs.org/api/modules.html#requireid&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/api/modules.html#requireid&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Modules: CommonJS modules | Node.js v18.10.0 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Modules: CommonJS modules# CommonJS modules are the original way to package JavaScript code for Node.js. Node.js also supports the ECMAScript modules standard used by browsers and other JavaScript runtimes. In Node.js, each file is treated as a separate mo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;5) node.js 모듈 설명 공식문서 : &lt;a href=&quot;https://nodejs.org/api/modules.html#modules_caching&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/api/modules.html#modules_caching&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254526533&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Modules: CommonJS modules | Node.js v18.10.0 Documentation&quot; data-og-description=&quot;Modules: CommonJS modules# CommonJS modules are the original way to package JavaScript code for Node.js. Node.js also supports the ECMAScript modules standard used by browsers and other JavaScript runtimes. In Node.js, each file is treated as a separate mo&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/api/modules.html#modules_caching&quot; data-og-url=&quot;https://nodejs.org/api/modules.html#modules_caching&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://nodejs.org/api/modules.html#modules_caching&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/api/modules.html#modules_caching&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Modules: CommonJS modules | Node.js v18.10.0 Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Modules: CommonJS modules# CommonJS modules are the original way to package JavaScript code for Node.js. Node.js also supports the ECMAScript modules standard used by browsers and other JavaScript runtimes. In Node.js, each file is treated as a separate mo&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) factory 설명1 : &lt;a href=&quot;https://velog.io/@lsj8367/%EC%9E%90%EB%B0%94-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@lsj8367/%EC%9E%90%EB%B0%94-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665276704417&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Java] 디자인 패턴 - 팩토리 패턴(Factory pattern)&quot; data-og-description=&quot;팩토리 패턴&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@lsj8367/%EC%9E%90%EB%B0%94-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4&quot; data-og-url=&quot;https://velog.io/@lsj8367/자바-팩토리패턴&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cWiCuA/hyP4FdhcOO/akTB7KkEGWTTuP7vPxhdk0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/cNH5Cn/hyP4EZJzP7/61zWONw7bSKZgpM2thjuTK/img.png?width=421&amp;amp;height=421&amp;amp;face=105_133_315_362&quot;&gt;&lt;a href=&quot;https://velog.io/@lsj8367/%EC%9E%90%EB%B0%94-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@lsj8367/%EC%9E%90%EB%B0%94-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cWiCuA/hyP4FdhcOO/akTB7KkEGWTTuP7vPxhdk0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/cNH5Cn/hyP4EZJzP7/61zWONw7bSKZgpM2thjuTK/img.png?width=421&amp;amp;height=421&amp;amp;face=105_133_315_362');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Java] 디자인 패턴 - 팩토리 패턴(Factory pattern)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;팩토리 패턴&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;2. Structural Pattern(구조 패턴)&lt;/span&gt; : 이미 있는 객체들을 이용해 더 큰/복잡한 객체를 만들거나 객체의 구조를 나눌 때 사용하는 패턴&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;&lt;/b&gt;Proxy&amp;nbsp;:&lt;/b&gt;&amp;nbsp;다른&amp;nbsp;객체로&amp;nbsp;접근하는&amp;nbsp;것을&amp;nbsp;제어하기&amp;nbsp;위해&amp;nbsp;관리자하는&amp;nbsp;객체를&amp;nbsp;생성하는&amp;nbsp;방식.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;&lt;/b&gt;Decorator&lt;/b&gt;&amp;nbsp;:&amp;nbsp;객체에&amp;nbsp;동적으로&amp;nbsp;기능&amp;nbsp;및&amp;nbsp;역할을&amp;nbsp;추가해주는&amp;nbsp;방식.&amp;nbsp;기본&amp;nbsp;기능에서&amp;nbsp;여러&amp;nbsp;옵션&amp;nbsp;기능들이&amp;nbsp;유연하게&amp;nbsp;확장하는&amp;nbsp;경우에&amp;nbsp;사용된다.&amp;nbsp;데코레이터는&amp;nbsp;기본&amp;nbsp;객체(대상)과&amp;nbsp;기능을&amp;nbsp;추가하는&amp;nbsp;객체(decorator)로&amp;nbsp;구성된다.&amp;nbsp;java에서는&amp;nbsp;상속과&amp;nbsp;override&amp;nbsp;기능을&amp;nbsp;이용한다고&amp;nbsp;보면&amp;nbsp;된다! &lt;br /&gt;특정&amp;nbsp;기능&amp;nbsp;앞뒤로&amp;nbsp;여러&amp;nbsp;패턴을&amp;nbsp;추가한다고&amp;nbsp;생각하면&amp;nbsp;좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/713&quot;&gt;사용 예시 : https://coding-factory.tistory.com/713&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1) 구조 패턴 기본적인 설명 : &lt;a href=&quot;https://velog.io/@tastestar/JS-%EC%84%A4%EA%B3%84%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%EC%96%B4%EB%8C%91%ED%84%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@tastestar/JS-%EC%84%A4%EA%B3%84%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%EC%96%B4%EB%8C%91%ED%84%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254877899&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[JS] 설계패턴 (프록시, 데코레이터, 어댑터)&quot; data-og-description=&quot;다른 객체에 대한 액세스를 제어할 수 있는 패턴Subject라고 하는 다른 객체에 대한 액세스를 제어하는 객체=&amp;gt; 객체의 여러 기본동작을 다른동작을 할 수 있게 도와주는 걸 말합니다.데이터 검증: &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@tastestar/JS-%EC%84%A4%EA%B3%84%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%EC%96%B4%EB%8C%91%ED%84%B0&quot; data-og-url=&quot;https://velog.io/@tastestar/JS-설계패턴-프록시-데코레이터-어댑터&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hhzIG/hyP4y58aZo/Czu6PXEyvlPoeIH8FhGBb1/img.png?width=339&amp;amp;height=417&amp;amp;face=0_0_339_417,https://scrap.kakaocdn.net/dn/kfvFy/hyP4DGnIhF/Ekv6tJORRoZuBLgSZbkSW1/img.png?width=339&amp;amp;height=417&amp;amp;face=0_0_339_417,https://scrap.kakaocdn.net/dn/ehEkog/hyP4FjTvMy/L0cLXbVB2kDm1kepYboxhK/img.jpg?width=1081&amp;amp;height=726&amp;amp;face=368_165_744_441&quot;&gt;&lt;a href=&quot;https://velog.io/@tastestar/JS-%EC%84%A4%EA%B3%84%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%EC%96%B4%EB%8C%91%ED%84%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@tastestar/JS-%EC%84%A4%EA%B3%84%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%EC%96%B4%EB%8C%91%ED%84%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hhzIG/hyP4y58aZo/Czu6PXEyvlPoeIH8FhGBb1/img.png?width=339&amp;amp;height=417&amp;amp;face=0_0_339_417,https://scrap.kakaocdn.net/dn/kfvFy/hyP4DGnIhF/Ekv6tJORRoZuBLgSZbkSW1/img.png?width=339&amp;amp;height=417&amp;amp;face=0_0_339_417,https://scrap.kakaocdn.net/dn/ehEkog/hyP4FjTvMy/L0cLXbVB2kDm1kepYboxhK/img.jpg?width=1081&amp;amp;height=726&amp;amp;face=368_165_744_441');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[JS] 설계패턴 (프록시, 데코레이터, 어댑터)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;다른 객체에 대한 액세스를 제어할 수 있는 패턴Subject라고 하는 다른 객체에 대한 액세스를 제어하는 객체=&amp;gt; 객체의 여러 기본동작을 다른동작을 할 수 있게 도와주는 걸 말합니다.데이터 검증:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2) Decorator 설명 1:&amp;nbsp; &lt;a href=&quot;https://velog.io/@koo8624/Javascript-Decorator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@koo8624/Javascript-Decorator&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254966492&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Javascript] Decorator&quot; data-og-description=&quot;ES6부터 자바스크립트에 데코레이터 문법이 추가되었다. 데코레이터는 그 이름처럼, 다른 함수를 꾸며주는 역할을 하는 함수로, 메서드를 인자로 받아 이를 감싸고 있는(wrapping) 새로운 함수를 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@koo8624/Javascript-Decorator&quot; data-og-url=&quot;https://velog.io/@koo8624/Javascript-Decorator&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cCqLkd/hyP4H25cE9/JAL7utLpKgycBtTZiNbWek/img.png?width=1200&amp;amp;height=633&amp;amp;face=0_0_1200_633,https://scrap.kakaocdn.net/dn/9xaKM/hyP4yZnSm0/7P7o35IQFPAjIFFbG4EGv0/img.png?width=1200&amp;amp;height=633&amp;amp;face=0_0_1200_633,https://scrap.kakaocdn.net/dn/c4AyX3/hyP4B2Q0zl/kKJwkzPXjZILzQ1mgh56K1/img.png?width=1200&amp;amp;height=633&amp;amp;face=0_0_1200_633&quot;&gt;&lt;a href=&quot;https://velog.io/@koo8624/Javascript-Decorator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@koo8624/Javascript-Decorator&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cCqLkd/hyP4H25cE9/JAL7utLpKgycBtTZiNbWek/img.png?width=1200&amp;amp;height=633&amp;amp;face=0_0_1200_633,https://scrap.kakaocdn.net/dn/9xaKM/hyP4yZnSm0/7P7o35IQFPAjIFFbG4EGv0/img.png?width=1200&amp;amp;height=633&amp;amp;face=0_0_1200_633,https://scrap.kakaocdn.net/dn/c4AyX3/hyP4B2Q0zl/kKJwkzPXjZILzQ1mgh56K1/img.png?width=1200&amp;amp;height=633&amp;amp;face=0_0_1200_633');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Javascript] Decorator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ES6부터 자바스크립트에 데코레이터 문법이 추가되었다. 데코레이터는 그 이름처럼, 다른 함수를 꾸며주는 역할을 하는 함수로, 메서드를 인자로 받아 이를 감싸고 있는(wrapping) 새로운 함수를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3) Decorator 설명 2 : &lt;a href=&quot;https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665254978512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog&quot; data-og-description=&quot;Step by step goes a long way.&quot; data-og-host=&quot;gmlwjd9405.github.io&quot; data-og-source-url=&quot;https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html&quot; data-og-url=&quot;http://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Uueuz/hyP4B9Cyr4/JfHpt7G2fGTlVYVI6cDfvK/img.png?width=2818&amp;amp;height=1005&amp;amp;face=0_0_2818_1005,https://scrap.kakaocdn.net/dn/VQbsX/hyP4Iuaa3i/kW2j67scrR6kK8kH3uzOpk/img.png?width=1615&amp;amp;height=732&amp;amp;face=0_0_1615_732,https://scrap.kakaocdn.net/dn/dpEAhx/hyP4GJSwVX/6YU5UfSTLQyNKDTyGbJivK/img.png?width=1575&amp;amp;height=554&amp;amp;face=0_0_1575_554&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Uueuz/hyP4B9Cyr4/JfHpt7G2fGTlVYVI6cDfvK/img.png?width=2818&amp;amp;height=1005&amp;amp;face=0_0_2818_1005,https://scrap.kakaocdn.net/dn/VQbsX/hyP4Iuaa3i/kW2j67scrR6kK8kH3uzOpk/img.png?width=1615&amp;amp;height=732&amp;amp;face=0_0_1615_732,https://scrap.kakaocdn.net/dn/dpEAhx/hyP4GJSwVX/6YU5UfSTLQyNKDTyGbJivK/img.png?width=1575&amp;amp;height=554&amp;amp;face=0_0_1575_554');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Step by step goes a long way.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gmlwjd9405.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) Decorator 설명3 : &lt;a href=&quot;https://coding-factory.tistory.com/713&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://coding-factory.tistory.com/713&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665278096246&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Design Pattern] 데코레이터 패턴(Decorator pattern)에 대하여&quot; data-og-description=&quot;데코레이터(Decorator pattern) 패턴이란? 데코레이터 패턴(Decorator Pattenr)은 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴을 말합니다. 데코레이터라는 말 그대로 장&quot; data-og-host=&quot;coding-factory.tistory.com&quot; data-og-source-url=&quot;https://coding-factory.tistory.com/713&quot; data-og-url=&quot;https://coding-factory.tistory.com/713&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwnqME/hyP4AQBma6/kpKJIvmxQIR6OpNmEyySP0/img.png?width=773&amp;amp;height=627&amp;amp;face=0_0_773_627,https://scrap.kakaocdn.net/dn/qwPcG/hyP4LkgONQ/i8DLKJDbOp1kTWeRPcbnBk/img.png?width=773&amp;amp;height=627&amp;amp;face=0_0_773_627,https://scrap.kakaocdn.net/dn/blISZB/hyP4Eem4iJ/bKy4N5y82ssEBBOYpazWS1/img.png?width=773&amp;amp;height=627&amp;amp;face=0_0_773_627&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/713&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://coding-factory.tistory.com/713&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwnqME/hyP4AQBma6/kpKJIvmxQIR6OpNmEyySP0/img.png?width=773&amp;amp;height=627&amp;amp;face=0_0_773_627,https://scrap.kakaocdn.net/dn/qwPcG/hyP4LkgONQ/i8DLKJDbOp1kTWeRPcbnBk/img.png?width=773&amp;amp;height=627&amp;amp;face=0_0_773_627,https://scrap.kakaocdn.net/dn/blISZB/hyP4Eem4iJ/bKy4N5y82ssEBBOYpazWS1/img.png?width=773&amp;amp;height=627&amp;amp;face=0_0_773_627');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Design Pattern] 데코레이터 패턴(Decorator pattern)에 대하여&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데코레이터(Decorator pattern) 패턴이란? 데코레이터 패턴(Decorator Pattenr)은 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴을 말합니다. 데코레이터라는 말 그대로 장&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;coding-factory.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;3. Behavioral Pattern(행위 패턴)&lt;/span&gt; : 객체에 어느정도의&amp;nbsp; 책임(responsiblities)을 부여할지 결정하는데 사용하는 패턴&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 수행해야 하는 작업을 여러개의 객체로 어떻게 분배할지, 객체끼리 어떤 관계를 가질지에 대한 문제를 해결하는 방식이다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;&lt;/b&gt;strategy&lt;/b&gt; : 객체의 기능을 동적으로 바꿔야 하는 문제가 자주 발생하는 경우 사용하는 전략. 객체의 기능을 직접 수정하는게 아닌 여러 기능을 미리 구현해놓고 특정 상황에서 기능의 교체가 가능하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예시 : &lt;a href=&quot;https://victorydntmd.tistory.com/292&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://victorydntmd.tistory.com/292&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;▶&lt;/b&gt;&lt;/b&gt;Iterator :&lt;/b&gt; 자료구조와&amp;nbsp;기능을&amp;nbsp;분리시켜&amp;nbsp;여러번&amp;nbsp;반복하는&amp;nbsp;작업이&amp;nbsp;있을때&amp;nbsp;자료구조에&amp;nbsp;상관없이&amp;nbsp;객체&amp;nbsp;접근&amp;nbsp;방법을&amp;nbsp;통일시키는&amp;nbsp;패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예시 : &lt;a href=&quot;https://zion830.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zion830.tistory.com/33&lt;/a&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) strategy 패턴 설명 : &lt;a href=&quot;https://victorydntmd.tistory.com/292&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://victorydntmd.tistory.com/292&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665255372856&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[디자인패턴] 전략 패턴 ( Strategy Pattern )&quot; data-og-description=&quot;전략 패턴 ( Strategy Pattern ) 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의&amp;nbsp;행위를&amp;nbsp;동적으로 바꾸고 싶은&amp;nbsp;경우 &quot; data-og-host=&quot;victorydntmd.tistory.com&quot; data-og-source-url=&quot;https://victorydntmd.tistory.com/292&quot; data-og-url=&quot;https://victorydntmd.tistory.com/292&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lJJww/hyP4EL2PhF/xLVG9qeMVDNTIUVDC4OoS0/img.png?width=583&amp;amp;height=406&amp;amp;face=0_0_583_406,https://scrap.kakaocdn.net/dn/blAhYB/hyP4Gb1CnX/4yzdnzYdr10fGOrVler3bK/img.png?width=583&amp;amp;height=406&amp;amp;face=0_0_583_406,https://scrap.kakaocdn.net/dn/di1vLC/hyP4CU0upQ/Hp63Vsk9Zv6bkGJHCZsgtk/img.png?width=583&amp;amp;height=406&amp;amp;face=0_0_583_406&quot;&gt;&lt;a href=&quot;https://victorydntmd.tistory.com/292&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://victorydntmd.tistory.com/292&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lJJww/hyP4EL2PhF/xLVG9qeMVDNTIUVDC4OoS0/img.png?width=583&amp;amp;height=406&amp;amp;face=0_0_583_406,https://scrap.kakaocdn.net/dn/blAhYB/hyP4Gb1CnX/4yzdnzYdr10fGOrVler3bK/img.png?width=583&amp;amp;height=406&amp;amp;face=0_0_583_406,https://scrap.kakaocdn.net/dn/di1vLC/hyP4CU0upQ/Hp63Vsk9Zv6bkGJHCZsgtk/img.png?width=583&amp;amp;height=406&amp;amp;face=0_0_583_406');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[디자인패턴] 전략 패턴 ( Strategy Pattern )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;전략 패턴 ( Strategy Pattern ) 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의&amp;nbsp;행위를&amp;nbsp;동적으로 바꾸고 싶은&amp;nbsp;경우&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;victorydntmd.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Iterator 패턴 설명 : &lt;a href=&quot;https://zion830.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://zion830.tistory.com/33&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665255385973&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[디자인 패턴] Iterator 패턴 (반복자 패턴)&quot; data-og-description=&quot;Iterator 패턴은 무언가 많이 모여있는 것을 하나씩 지정해서 순서대로 처리하는 패턴이다. iterator는 무언가를 반복한다 는 의미를 가지고 있다. 보통 프로그래밍을 하면서 반복이 필요할 때는 for &quot; data-og-host=&quot;zion830.tistory.com&quot; data-og-source-url=&quot;https://zion830.tistory.com/33&quot; data-og-url=&quot;https://zion830.tistory.com/33&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZqm76/hyP4EywKyc/xsxkR5Bn56UizMocdcMlZk/img.png?width=800&amp;amp;height=338&amp;amp;face=0_0_800_338,https://scrap.kakaocdn.net/dn/cMDFyb/hyP4Dl53X5/hN1K4sf9X15WB9NiLs1Gg0/img.png?width=800&amp;amp;height=338&amp;amp;face=0_0_800_338,https://scrap.kakaocdn.net/dn/Aar9e/hyP4BBMR92/0eyEasa7Tm9cRUAZahp7e0/img.png?width=1652&amp;amp;height=698&amp;amp;face=0_0_1652_698&quot;&gt;&lt;a href=&quot;https://zion830.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zion830.tistory.com/33&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZqm76/hyP4EywKyc/xsxkR5Bn56UizMocdcMlZk/img.png?width=800&amp;amp;height=338&amp;amp;face=0_0_800_338,https://scrap.kakaocdn.net/dn/cMDFyb/hyP4Dl53X5/hN1K4sf9X15WB9NiLs1Gg0/img.png?width=800&amp;amp;height=338&amp;amp;face=0_0_800_338,https://scrap.kakaocdn.net/dn/Aar9e/hyP4BBMR92/0eyEasa7Tm9cRUAZahp7e0/img.png?width=1652&amp;amp;height=698&amp;amp;face=0_0_1652_698');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[디자인 패턴] Iterator 패턴 (반복자 패턴)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Iterator 패턴은 무언가 많이 모여있는 것을 하나씩 지정해서 순서대로 처리하는 패턴이다. iterator는 무언가를 반복한다 는 의미를 가지고 있다. 보통 프로그래밍을 하면서 반복이 필요할 때는 for&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zion830.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>도서/Node.js</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/32</guid>
      <comments>https://kkureubik.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 9 Oct 2022 02:48:19 +0900</pubDate>
    </item>
    <item>
      <title>[백준 알고리즘]5397. 키로거</title>
      <link>https://kkureubik.tistory.com/31</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; margin-top: 5px; margin-right: 0px; margin-bottom: 10px; font-size: 28px; font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Apple SD Gothic Neo&amp;quot;, &amp;quot;Noto Sans CJK KR&amp;quot;, &amp;quot;Noto Sans KR&amp;quot;, 나눔바른고딕, 나눔고딕, 맑은고딕, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: normal; line-height: 35px; color: rgb(88, 95, 105); text-shadow: none; border-radius: 0px !important;&quot;&gt;&lt;br /&gt;&lt;/h1&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;처음 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;arraylist를 이용하여 작성.&lt;/p&gt;&lt;p&gt;add(index,value)와 remove를 사용하였다.&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;36&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;37&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;38&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;39&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;40&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;41&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;42&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;43&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;44&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;45&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;46&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;47&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.util.&lt;span style=&quot;color:#a71d5d&quot;&gt;*&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.io.BufferedReader;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.io.InputStreamReader;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;class&lt;/span&gt;&amp;nbsp;Main&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;main(&lt;span style=&quot;color:#066de2&quot;&gt;String&lt;/span&gt;&amp;nbsp;args[])&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;throws&lt;/span&gt;&amp;nbsp;Exception&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;BufferedReader(&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;InputStreamReader(&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;));&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;n&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;Integer.&lt;span style=&quot;color:#066de2&quot;&gt;parseInt&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.readLine());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;i&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;n;&amp;nbsp;i&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#066de2&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;password&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;ArrayList&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;cursor&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;String&lt;/span&gt;[]&amp;nbsp;input_string&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.readLine().&lt;span style=&quot;color:#066de2&quot;&gt;split&lt;/span&gt;(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;j&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;j&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;input_string.&lt;span style=&quot;color:#066de2&quot;&gt;length&lt;/span&gt;;j&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;switch&lt;/span&gt;&amp;nbsp;(input_string[j]){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;&amp;lt;&quot;&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(cursor&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;&amp;gt;&quot;&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(cursor&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;password.size())&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;-&quot;&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(cursor&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;password.size()&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password.remove(&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;cursor);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;default&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password.&lt;span style=&quot;color:#066de2&quot;&gt;add&lt;/span&gt;(cursor,input_string[j]);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;k&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;k&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;password.size();k&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;print&lt;/span&gt;(password.get(k));&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;println&lt;/span&gt;();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;최종코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;스택 2개를 이용하여 값을 옮겨가며 작성&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;36&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;37&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;38&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;39&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;40&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;41&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;42&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;43&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;44&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;45&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;46&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;47&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;48&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;49&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;50&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;51&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;52&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;53&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;54&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;55&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;56&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;57&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;58&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;59&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;60&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;61&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;62&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;63&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;64&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;65&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;66&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;67&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;68&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;69&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;70&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;71&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;72&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;73&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;74&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;75&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;76&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;77&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;78&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;79&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;80&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;81&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;82&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;83&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;84&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;85&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;86&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;87&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;88&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;89&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;90&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;91&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;92&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;93&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;94&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;95&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;96&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;97&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;98&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;99&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;100&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;101&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;102&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;103&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;104&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;105&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;106&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.io.&lt;span style=&quot;color:#a71d5d&quot;&gt;*&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.util.&lt;span style=&quot;color:#a71d5d&quot;&gt;*&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;class&lt;/span&gt;&amp;nbsp;Main&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;main(&lt;span style=&quot;color:#066de2&quot;&gt;String&lt;/span&gt;&amp;nbsp;args[])&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;throws&lt;/span&gt;&amp;nbsp;Exception&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File&amp;nbsp;file&amp;nbsp;=&amp;nbsp;new&amp;nbsp;File(&quot;C:\\Users\\minjeong\\Downloads\\2010-testdata\\testdata\\I.in&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader&amp;nbsp;in&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BufferedReader(new&amp;nbsp;FileReader(file));*/&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;BufferedReader(&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;InputStreamReader(&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;));&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;n&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;Integer.&lt;span style=&quot;color:#066de2&quot;&gt;parseInt&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.readLine());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;i&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;n;&amp;nbsp;i&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stack2&amp;nbsp;answer_st&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;Stack2(&lt;span style=&quot;color:#0099cc&quot;&gt;1000000&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stack2&amp;nbsp;temp_st&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;Stack2(&lt;span style=&quot;color:#0099cc&quot;&gt;1000000&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;char&lt;/span&gt;[]&amp;nbsp;input_string&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.readLine().toCharArray();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;len&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;input_string.&lt;span style=&quot;color:#066de2&quot;&gt;length&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;j&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;j&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;len;j&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;switch&lt;/span&gt;&amp;nbsp;(input_string[j]){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;'&amp;lt;'&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;answer_st.isEmpty())&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp_st.push(answer_st.pop());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;'&amp;gt;'&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;temp_st.isEmpty())&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer_st.push(temp_st.pop());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;case&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;'-'&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;answer_st.isEmpty())&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer_st.pop();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;default&lt;/span&gt;:&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer_st.push(input_string[j]);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;while&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;answer_st.isEmpty()){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp_st.push(answer_st.pop());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;answer&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;StringBuilder();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;while&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;temp_st.isEmpty()){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer.append(temp_st.pop());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;println&lt;/span&gt;(answer);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;class&lt;/span&gt;&amp;nbsp;Stack2&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;private&lt;/span&gt;&amp;nbsp;Object[]&amp;nbsp;st;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;size;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;Stack2(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;size_default){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;st&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;Object[size_default];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;push(Object&amp;nbsp;value){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;isFull()){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;st[size]&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;value;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;pop(){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;isEmpty()){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object&amp;nbsp;temp&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;st[size];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;st[size]&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;null&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;temp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;size(){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;size;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;boolean&lt;/span&gt;&amp;nbsp;isFull(){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(size&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;st.&lt;span style=&quot;color:#066de2&quot;&gt;length&lt;/span&gt;)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;boolean&lt;/span&gt;&amp;nbsp;isEmpty(){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(size&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;Object&amp;nbsp;peek(){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;isEmpty()){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object&amp;nbsp;t&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;st[size&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;t;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(255, 0, 0);&quot;&gt;스택 2개를 쓰는데도 시간초과가 났었다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(255, 0, 0);&quot;&gt;이때의 문제점&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1. char형을 안쓰고 string을 썼다.&lt;/p&gt;&lt;p&gt;(in.readLine().toCharArray()말고 in.readline().split(&quot;&quot;) 사용)&lt;/p&gt;&lt;p&gt;2. 직접 만든 stack을 사용했다.&lt;/p&gt;&lt;p&gt;3. 마지막에 System.out.print(stack.pop())을 하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt; color: rgb(255, 0, 0);&quot;&gt;결과&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1. char형이 더 빠르겟지만, string을 사용해도 문제가 없었다.&lt;/p&gt;&lt;p&gt;2. 직접 만든 스택이 더 시간이 짧게 걸렸다.&lt;/p&gt;&lt;p&gt;아마 스택 크기를 더 안늘려도 되게 잡았기 떄문&lt;/p&gt;&lt;p&gt;3. 하나하나 프린트하는데 io시간이 걸리기 떄문에 오래 걸리는 것이였다.&lt;/p&gt;&lt;p&gt;string += stack.pop()형식으로 바꾸어도 시간이 오래걸렸다!&lt;/p&gt;&lt;p&gt;최종으로는 stringBuilder 이용하니 다른거 pass!&lt;/p&gt;&lt;p&gt;(위 문제점 1,2를 안고쳐도 이거 하나만 고치면 시간이 줄었다.)&lt;/p&gt;&lt;p&gt;StringBuilder answer = new StringBuilder();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while(!temp_st.isEmpty()){&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;answer.append(temp_st.pop());&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;느낀점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;string+= 연산자의 돌아가는 구조가&lt;/p&gt;&lt;p&gt;string a = &quot;ㄱ&quot;&lt;/p&gt;&lt;p&gt;a += &quot;ㄴ&quot;&lt;/p&gt;&lt;p&gt;a += &quot;ㄷ&quot;&lt;/p&gt;&lt;p&gt;하면&lt;/p&gt;&lt;p&gt;&quot;ㄱ&quot;, &quot;ㄱㄴ&quot;, &quot;ㄱㄴㄷ&quot;...순으로 덮어쓰기가 아니라 새로생성으로&amp;nbsp;&lt;/p&gt;&lt;p&gt;들어간다는 정보를 확인하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞으로는 문자열 단순조회는 string, 갱신할땐 builder나 buffer를 이용하자&lt;/p&gt;&lt;p&gt;(builder와 buffer의 차이는 쓰레드 동기화차이. buffer가 동기화된다?고함)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2019.02.10 지금보니 처음코드도 print로 찍길래 stringbuilder를 이용해서 찍어보았는데 여전히 시간초과가 난다.&lt;/p&gt;&lt;p&gt;arraylist는 그냥 쓰지 말아야겠다...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;참고사이트&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;https://github.com/bactoria/Algorithm-java/blob/master/_5397KeyLoger_Stack.java&lt;/p&gt;&lt;p&gt;https://jeong-pro.tistory.com/85&lt;/p&gt;&lt;p&gt;https://novemberde.github.io/2017/04/15/String_0.html&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>1DP(알고리즘)</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/31</guid>
      <comments>https://kkureubik.tistory.com/31#entry31comment</comments>
      <pubDate>Sun, 10 Feb 2019 19:42:20 +0900</pubDate>
    </item>
    <item>
      <title>[백준 알고리즘]2293. 동전1</title>
      <link>https://kkureubik.tistory.com/30</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. (각각의 동전은 몇 개라도 사용할 수 있다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;핵심 풀이&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;n과 k의 숫자가 크기 때문에 재귀형식으로는 풀기 어렵다고 판단하고, BOTTOM-UP형식으로 풀어야 겠다고 생각했다.&lt;/p&gt;&lt;p&gt;그런데, 동전의 갯수가 아닌 만들수 있는 경우의 수라 어떻게 작은 문제를 해결해야 되는지를 구하지 못했다...&lt;/p&gt;&lt;p&gt;예를들어 2의경우 1+1과 2인 2가지 경우의 수가 있는데, 3의 경우 1+1+1, 2+1 이렇게 2가지의 경우인데, 두 상관관계를 어떻게 알지..?라는 생각으로 막혀버렸다ㅠㅠ&lt;/p&gt;&lt;p&gt;좀더 고민해봐야 할듯&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>1DP(알고리즘)</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/30</guid>
      <comments>https://kkureubik.tistory.com/30#entry30comment</comments>
      <pubDate>Sat, 10 Feb 2018 20:06:03 +0900</pubDate>
    </item>
    <item>
      <title>[백준 알고리즘]9461. 파도반 수열</title>
      <link>https://kkureubik.tistory.com/29</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 289px; margin-left: 10px; width: 289px; height: 182px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E87C3B5A6F710426&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E87C3B5A6F710426&quot; width=&quot;289&quot; height=&quot;182&quot; filename=&quot;pandovan.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;margin-left: 10px; width: 289px; height: 182px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;한 변의 길이가 1인 정삼각형부터 시작하여 나선모양으로 삼각형을 추가하여 붙인다.&lt;/p&gt;&lt;p&gt;이때 붙일 수 있는 변의 길이가 가장 긴 변 k가 존재할 경우, k변 정삼각형을 추가한다.&lt;/p&gt;&lt;p&gt;이 과정을 반복했을 때, 입력값의 순서에 가장 긴 변 k을 출력하라.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;핵심 풀이&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;계속 반복하다보면 특정한 규칙이 발견하게 된다.&lt;/p&gt;&lt;p&gt;6번째부터 규칙적으로 그 전 삼각형의 변 길이 + 이전에 붙인 삼각형(정확히는 5번째 전에 붙인 삼각형)의 변 길이를 더하면 최대 변이 나오게 된다.&lt;/p&gt;&lt;p&gt;그래서 그 방식을 코드로 만들면 된다.&lt;/p&gt;&lt;p&gt;주의할점은, 100번째를 돌려보면 int형의 범위를 벗어나는 것을 확인 할 수 있다.&lt;/p&gt;&lt;p&gt;그러므로 최대 길이의 변을 저장하는 변수는 long형으로 하자!&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.io.&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;*&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;import&lt;/span&gt;&amp;nbsp;java.util.&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;*&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;class&lt;/span&gt;&amp;nbsp;Main{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;main(&lt;span style=&quot;color:#066de2&quot;&gt;String&lt;/span&gt;[]&amp;nbsp;agrs)&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;throws&lt;/span&gt;&amp;nbsp;IOException{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;Scanner&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;Scanner&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;long&lt;/span&gt;&amp;nbsp;p[]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;long&lt;/span&gt;[&lt;span style=&quot;color:#0099cc&quot;&gt;100&lt;/span&gt;];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&lt;span style=&quot;color:#0099cc&quot;&gt;2&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&lt;span style=&quot;color:#0099cc&quot;&gt;3&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;2&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&lt;span style=&quot;color:#0099cc&quot;&gt;4&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;2&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;cnt&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.nextInt();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;testcase[]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;[cnt];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;cnt;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testcase[i]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.nextInt();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;cnt;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;for&lt;/span&gt;(&lt;span style=&quot;color:#066de2&quot;&gt;int&lt;/span&gt;&amp;nbsp;j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;;&amp;nbsp;j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;testcase[i];j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;(p[j]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;0&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[j]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;p[j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;]&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&amp;nbsp;p[j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;5&lt;/span&gt;];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;continue&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#066de2&quot;&gt;println&lt;/span&gt;(p[testcase[i]&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;1&lt;/span&gt;]);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;in&lt;/span&gt;.close();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>1DP(알고리즘)</category>
      <author>꾸르빅</author>
      <guid isPermaLink="true">https://kkureubik.tistory.com/29</guid>
      <comments>https://kkureubik.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 30 Jan 2018 04:11:55 +0900</pubDate>
    </item>
  </channel>
</rss>