<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>CamelAct</title>
    <link>https://camelact.tistory.com/</link>
    <description>CamelAct is a logo created by focusing on the camel marker used in programming.</description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 19:16:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>CamelAct</managingEditor>
    <item>
      <title>CSS 강의</title>
      <link>https://camelact.tistory.com/152</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS는 Cascading Style Sheets를 의미한다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. Cascading : 계단식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. Style : 멋을 내다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. Sheets : 종이 한&amp;nbsp; 장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;/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;h3 data-ke-size=&quot;size23&quot;&gt;CSS 기본 문법&lt;/h3&gt;
&lt;pre id=&quot;code_1724403552485&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;선택자 {
  속성명: 속성값;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;선택자: 어떤 요소에 스타일 을 적용할지에 대한 정보&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;{중괄호}: 선택한 요 소에 적 용할 스 타 일 을 정의하는 영역&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;속성명: 어떤 스타일을 정의하고 싶은지에 대한 정보 (색상, 크기 등)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;속성값 : 어떻게 정의하고 싶은지에 대한 정보&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724403531824&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p {
  color: red;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;선택자 : p 태 그에 스타일을 적용하겠다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;{중괄호} : 이 안에, p 태그에 대한 스타일을 정의하겠다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;속성명 color를 정의하겠다. 이건 글자색을 의미한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;속성값 : red로 정의하겠다. 빨간색 글자를 원한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;선택자&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;선택자란 말 그대로 선택을 해주는 요소입니다. 이를 통해 특정 요소들을 선택하여 스타일을 적용할 수 있게 됩니다. 먼저 CSS에서 스타일이 어떤 방식으로 정의 되는지 알아봅시다.&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;973&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sCGzU/btsJfi9Ya2K/x1d6MBw85aaEDDwSkT50j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sCGzU/btsJfi9Ya2K/x1d6MBw85aaEDDwSkT50j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sCGzU/btsJfi9Ya2K/x1d6MBw85aaEDDwSkT50j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsCGzU%2FbtsJfi9Ya2K%2Fx1d6MBw85aaEDDwSkT50j0%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;973&quot; height=&quot;249&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/p&gt;
&lt;pre id=&quot;code_1724411476960&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* {
  color:red;
}&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;/p&gt;
&lt;pre id=&quot;code_1724411517137&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body {
    /*body css code*/
    background-color:green;
}

header {
    /*header css code*/
    background-color:black;
    color:white;
}&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;/p&gt;
&lt;pre id=&quot;code_1724411582624&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;p class=&quot;name&quot;&amp;gt;
  dev2820
&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724411591859&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.name {
    /*name class css*/
    color:green;
}&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;/p&gt;
&lt;pre id=&quot;code_1724411670088&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1 id=&quot;title&quot;&amp;gt;
  제목
&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724411676467&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#title {
    /*title id css*/
    color:red;
}&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;pre id=&quot;code_1724411834607&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;http://www.google.com&quot;&amp;gt;google&amp;lt;/a&amp;gt;
&amp;lt;input type=&quot;password&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724411856815&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a[href=&quot;https://www.google.com&quot;] {
    /*href 속성값이 http://www.google.com 인 a 태그*/
    text-decoration:none;
    color: green;
}
input[type=&quot;password&quot;] {
    /*input*/
    border-radius:4px;
}
a[href] {
    /*href 속성을 지닌 모든 a 태그*/
}
a[href*=&quot;https://&quot;] {
    /*href 속성값이 https://로 시작하는 a 태그*/
}
img[src$=&quot;.png&quot;] {
    /*src 속성값이 .png로 끝나는 img 태그*/
}
[class *= &quot;it&quot;]{
   /* 클래스 값에 'it'가 포함되는 요소를 선택하기 */
} 

[class ^= &quot;it&quot;]{ 
   /* 클래스 값에 'it'로 시작하는 요소를 선택하기 */
 } 

[class $= &quot;it&quot;]{ 
   /* 클래스 값에 'it'로 끝나는 요소를 선택하기 */
}&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;클래스(Pseudo&amp;nbsp;class)&amp;nbsp;선택자&lt;/p&gt;
&lt;pre id=&quot;code_1724411941591&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;google.com&quot;&amp;gt;google&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://google.com&quot;&amp;gt;google&amp;lt;/a&amp;gt;
&amp;lt;div&amp;gt;hover me&amp;lt;/div&amp;gt;
&amp;lt;input value=&quot;focus&quot;&amp;gt;&amp;lt;/input&amp;gt;
&amp;lt;button&amp;gt;active&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724411955458&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a:link {
    /*방문하지 않은 a 태그*/
    color:red;
}
a:visited {
    /*방문한 a 태그*/
    color:blue;
}
div:hover {
    /*커서가 올라가 있는 div 요소*/
    color:gold;
}
input:focus {
    /*포커싱 되어있는 input 태그*/
  /*tab 또는 click으로 input에 focus를 주면 확인할 수 있습니다.*/
    background-color:green;
}
button:active {
    /*활성화한 button 태그*/
    background-color:red;
}&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;pre id=&quot;code_1724412333935&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  위는 안채워진 p태그, 아래는 채워진 p태그
  &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;abcde&amp;lt;/p&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724412349827&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:root {
  background-color:green;
  
}
p {
  border:2px solid black;
}
p:empty {
  border:2px solid blue;
}&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;pre id=&quot;code_1724412391687&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1 class=&quot;title&quot;&amp;gt;a&amp;lt;/h1&amp;gt;
&amp;lt;h1&amp;gt;b&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724412399698&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;h1:not(.title) {
  color:red;
}&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;/p&gt;
&lt;pre id=&quot;code_1724413267150&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hl, p, div{ color: blue; }&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;pre id=&quot;code_1724412625487&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ul class=&quot;list&quot;&amp;gt;
    &amp;lt;li class=&quot;a&quot;&amp;gt;a&amp;lt;/li&amp;gt;
    &amp;lt;li class=&quot;b&quot;&amp;gt;b&amp;lt;/li&amp;gt;
    &amp;lt;li class=&quot;c&quot;&amp;gt;c&amp;lt;/li&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;li class=&quot;d&quot;&amp;gt;d&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724412633744&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ul.list &amp;gt; li {
     /*ul 태그 자식 요소인 모든 li를 선택*/
    color:green;
}&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;/p&gt;
&lt;pre id=&quot;code_1724431604314&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hl ~ p{ /* h1 요소의 뒤에 오는 형제 중 모든 p요소를 선택하기 */ } 
hl + p{ /* h1 요소의 벓 뒤에 오는 형제 p요소를 선택하기 */ }&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;/p&gt;
&lt;pre class=&quot;css&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;div#title.box.big {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;위 css는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;lt;div id=&quot;title&quot; class=&quot;box big&quot;&amp;gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;를 가리킵니다. 이렇게 tag, id, class선택자는 여러개를 함께 사용할 수 있습니다.&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: #ee2323;&quot;&gt;(*암기)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;!important 선언 &amp;gt; 인라인 CSS &amp;gt; ID 선택자 &amp;gt; class 선택자 = 의사 클래스 &amp;gt; tag 선택자 = 가상 요소 &amp;gt; 브라우저 기본 CSS(default css)&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;a href=&quot;https://velog.io/@dev2820/CSS-CSS-%EC%84%A0%ED%83%9D%EC%9E%90-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;참고 : https://velog.io/@dev2820/CSS-CSS-%EC%84%A0%ED%83%9D%EC%9E%90-%EC%A0%95%EB%A6%AC&lt;/a&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;h3 data-ke-size=&quot;size23&quot;&gt;React에서 CSS 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inline&amp;nbsp;style&amp;nbsp;사용&lt;/p&gt;
&lt;pre id=&quot;code_1724403409005&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* App.js */
import &quot;./App.css&quot;;

function App() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p style={{ backgroundColor: &quot;red&quot;, marginTop: &quot;10px&quot; }}&amp;gt;
        글자를 파랗게 만들어줘
      &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 주의: 속성 키명은 react가 js 라이브러리여서 - 를 쓰면 -(빼기) 연산자로 받아들이므로 camelCase를 이용한다.&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;CSS&amp;nbsp;파일을&amp;nbsp;통한&amp;nbsp;stylesheet&amp;nbsp;사용&lt;/p&gt;
&lt;pre id=&quot;code_1724403896397&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* App.css */
p {
  background-color: red !important;
  margin-top: 10px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724403874957&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* App.js */
import &quot;./App.css&quot;;

function App() {
    return (
        &amp;lt;div&amp;gt;
            &amp;lt;p&amp;gt; 글자를 파랗게 만들어줘 &amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}

export default App;&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;style&amp;nbsp;변수&amp;nbsp;사용&lt;/p&gt;
&lt;pre id=&quot;code_1724405385707&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* App.js */

function App() {
  const style = {
    marginTop: &quot;10px&quot;,
    backgroundColor: &quot;red&quot;,
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p style={style}&amp;gt;글자를 파랗게 만들어줘&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&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;h3 data-ke-size=&quot;size23&quot;&gt;텍스트 꾸미기 속성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;font-family:&amp;nbsp;요소를 구성하는 텍스트의 글꼴을 정의한다. 글꼴명을 속성값으로 지정한다. 여러 개의 글꼴을 연달아 기입하여 우선 순 위 를 지정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1724413365079&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* { 
  font-family: Times, monospace, serif;
}&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;font-size: 글자 크기, 아래는 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;px: 모니터 상의 화소 하나 크기에 대응하는 절대적인 크기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rem: &amp;lt;html&amp;gt; 태그의 font-size에 대응하는 상대적인 크기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;em: 부모태그(상위태그)의 font-size에 대응하는 상태적인 크기&lt;/p&gt;
&lt;pre id=&quot;code_1724413556407&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;span{ font-size: 16px; } 
span{ font-size: 2rem; } 
span{ font-size: 1.5em; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;abgGLPr&quot; data-pen-title=&quot;font-size&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/abgGLPr&quot;&gt;
  font-size&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text-align : 글자의 정렬을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;left / right : 왼쪽 또는 오른쪽 정렬한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;center : 가운데 정렬한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;justify : 양끝 정렬한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724413932454&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p { text-align: right; }&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;color: 색 정의&lt;/p&gt;
&lt;pre id=&quot;code_1724413968541&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;span{ color: red; } 
span{ color: #FF0000; } 
span{ color: rgb(100%, 0%, 0%); }&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;h3 data-ke-size=&quot;size23&quot;&gt;block, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;inline&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 레벨 요소: 자기가 속한 영역의 너비를 모두 차지하여 블록을 형성한다.&lt;span style=&quot;color: #ee2323;&quot;&gt;(*암기)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) div, p, h1&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인라인 요소: 자기에게 필요한 만큼의 공간만 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) span, a&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;display 속성은 요소를 블록과 인라인 요소 중 어느 쪽으로 처리할지 정의한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724414157766&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;div{ display: inline; }
a{ display: block; }&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;display 속성 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inline : 인라인으로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;block: 블록 레벨로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inline-block 인라인으로 배치라되, 블록 레벨 요소의 속성을 추가할 수 있도록 처리한다. width, height를 설정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;none : 디스플레이하지 않는다.&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;border&lt;/h3&gt;
&lt;pre id=&quot;code_1724414733044&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;span{ border: 2px solid green; }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;border-color: color 정의 방식과 동일&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;border-width: thin, medium, thick 등의 키워드 또는 px, em, rem 등의 단위&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;border-style: none, solid, dotted, dashed 등&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;WNqJZmd&quot; data-pen-title=&quot;text-align:border&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/WNqJZmd&quot;&gt;
  text-align:border&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Box Model&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;브라우저가 요소를 렌더링 할 때, 각각의 요소는 기본적으로 사각형 형태로 영역을 차지하게 된다. 이 영역을 '박스'라 표현하며, CSS는 박스의 크기, 위치, 속성(색, 배경, 테두리, 모양 등)을 결정할 수있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&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;204&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EvSqR/btsJfj8WESo/Pv7uMxKNSuhY3DLAoE3R9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EvSqR/btsJfj8WESo/Pv7uMxKNSuhY3DLAoE3R9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EvSqR/btsJfj8WESo/Pv7uMxKNSuhY3DLAoE3R9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEvSqR%2FbtsJfj8WESo%2FPv7uMxKNSuhY3DLAoE3R9k%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;204&quot; height=&quot;171&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;171&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;contents, padding, border, margin 영역을 살펴보면 아래와 같다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;mdZLWgZ&quot; data-pen-title=&quot; contents, padding, border, margin&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/mdZLWgZ&quot;&gt;
   contents, padding, border, margin&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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;pre id=&quot;code_1724415863926&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;div{
  width: 100px; height: 100px; 
  padding: 10px; 
  border: 5px solid red; 
  margin: 20px; 
  padding-top: 10px; 
  padding-right: 20px; 
  padding-bottom: 30px; 
  padding-left: 40px;
  margin-top: 40px; 
  margin-right: 30px; 
  margin-bottom: 20px; 
  margin-left: 10px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724416015542&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;span{ 
  display: inline-block; 
  width: 100px; height: 100px; 
  margin: 10px 20px 30px 40px;
}&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;box-sizing: 박스의 크기 기준 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content-box: 기본값, 너비와 높이가 콘텐츠 영역만 포함한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;border-box: 너비와 높이가 안쪽 여백과 테두리까지 포함한다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;oNryYQr&quot; data-pen-title=&quot;Untitled&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/oNryYQr&quot;&gt;
  Untitled&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;backgroud&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;background-color: 배경 색을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;background-image: 배경 이미지를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;background-position: 벼경 이미지의 초기 위치를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;background-size: 배경 이미지의 크기 정의한다. cover:&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;찌그러지지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 않고 잘려서 최대 사이즈, contain : 찌그러지지 않으며 잘리지 않는 최대 사이즈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;background-repeat: 배경 이미지의 반복을 정의한다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;jOjKVKL&quot; data-pen-title=&quot;backgroud&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/jOjKVKL&quot;&gt;
  backgroud&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;pre id=&quot;code_1724428418433&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;div{ 
  box-sizing: border-box; 
  width: 500px; height:500px;
  border: 1px solid red; 
  background-image: url(./my-cat.jpeg)
  background-repeat: no-repeat; 
  background-position: left top;
  background-size: 300px 300px
}&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;h3 data-ke-size=&quot;size23&quot;&gt;float&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;none: 기본값, 원래 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;left: 자신을 포함하고 있는 박스의 왼편에 떠 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;right: 자신을 포함하고 있는 박스의 오른편에 떠 있어야 함&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;dyBezjq&quot; data-pen-title=&quot;float&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/dyBezjq&quot;&gt;
  float&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clear&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clear 속성은 float 요소 이후에 표시되는 요소가 float을 해제(clear)하여 float 요소의 아래로 내려가게 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;none: 기본값, 아래로 이동되지 않음을 나타내는 키워드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;left: float이 left인 요소의 아래로 내려가겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;right: float이 right인 요소의 아래로 내려가겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;both: float이 left 및 right인 요소의 아래로 내려가겠다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;RwzJKgK&quot; data-pen-title=&quot;clear&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/RwzJKgK&quot;&gt;
  clear&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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;h3 data-ke-size=&quot;size23&quot;&gt;position&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;position은 문서 상에 요소를 배치하는 방법을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;position이 요소의 배치 방법을 결정하면, top, bottom, right, left가 최종 위치를 결정하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;position 속성 5가지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static : 기본값, 요소를 일반적인 문서 흐름에 다라 배치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;relative: 일반적인 문서 흐름에 따라 배치하되, 상하좌우 위치 값에 따라 오프셋을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;absolute: 일반적인 문서 흐름에서 제거하고, 가장 가까운 postion 지정 요소에 대해 상대적으로 오프셋을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fixed: 일반적인 문서 흐름에서 제거하고 지정한 위치에 고정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sticky: 일반적인 문서 흐름에서 제거하고, 스크롤 동작이 존재하는 가장 가까운 요소에 대해 오프셋을 적용한다.&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;position:relative&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;JjQvyzZ&quot; data-pen-title=&quot;position&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/JjQvyzZ&quot;&gt;
  position&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;position:absolute&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;jOjxLjV&quot; data-pen-title=&quot;position:absolute&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/jOjxLjV&quot;&gt;
  position:absolute&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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;h3 data-ke-size=&quot;size23&quot;&gt;flexbox&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;floexbox란 박스 내 요소 간의 공간 배분과 정렬 기능을 제공하기 위한 1차원 레이아웃 모델이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;floxbox를 1차원 모델이라 부르는 이유는, 레이아웃을 다룰 때 한 번에 하나의 차원(행이나 열)만 다룬다는 특성 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행방향(세로)가 주축이다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;poXVWjw&quot; data-pen-title=&quot;flexbox&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/poXVWjw&quot;&gt;
  flexbox&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flex-direction&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flex-direction 속성은 flexbox 내 요소를 배치할 때 사용할 주축 및 방향(정방향, 역방향)을 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;row: 기본값, 주축은 행이고 방향은 콘텐츠의 방향과 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;row-reverse: 주축은 행이고 방향은 콘텐츠의 방향과 반대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;column: 주축은 열이고 방향은 콘텐츠의 방향과 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;column-reverse: 주축은 열이고 방향은 콘텐츠의 방향과 반대&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;flexbox 연계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;justify-content : 주죽 배치 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;align-items: 교차축 배치 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;align-self: 교차축 개별요소 배치 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flex-wrap: 줄 바꿈 여부&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;ZEdoXex&quot; data-pen-title=&quot;justify-content&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/ZEdoXex&quot;&gt;
  justify-content&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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;h3 data-ke-size=&quot;size23&quot;&gt;inherit, initial, unset&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속이란 하위 요소가 상위 요소의 스타일 속성값을 물려받는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속 된다 : &lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;color,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;font-family,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;font-size,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;font-weight,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;text-align,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;cursor 등 &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;(*암기)&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;상속 안 된다 : &lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;background-color,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;background-image,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;background-repeat,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;border,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;display 등 &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;(*암기)&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #f9fafb; color: #111827; text-align: start;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://www.w3.org/TR/CSS21/propidx.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;참고 : https://www.w3.org/TR/CSS21/propidx.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&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;inherit: 상위 요소로부터 해당 속성의 값을 받아 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;initial: 해당 속성의 브라우저 기본값을 요소에 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unset: 상속 속성에 대해서는 inherit처럼, 상속되지 않는 속성에 대해서는 initial처럼 적용된다.&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;inherit 사용 예제&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;MWMGEvQ&quot; data-pen-title=&quot;inherit&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/MWMGEvQ&quot;&gt;
  inherit&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;initial, unset 사용 예제&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;bGPMoaq&quot; data-pen-title=&quot;initial&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/bGPMoaq&quot;&gt;
  initial&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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;h3 data-ke-size=&quot;size23&quot;&gt;z-index&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요소의 쌓임 순서를 정의할 수있다. 정수 값을 지정하여 쌓임 맥락에서의 레벨을 정의하는 방식으로 적용되며, 위치 지정 요소에 대해 적용할 수 있는 속성이다. =&amp;gt; 위치 지정 요소란, postion 속성이 정의되어 있는 요소를 말한다.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;poXVWKL&quot; data-pen-title=&quot;z-index&quot; data-user=&quot;Peace-Kwak&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/poXVWKL&quot;&gt;
  z-index&lt;/a&gt; by Peace Kwak (&lt;a href=&quot;https://codepen.io/Peace-Kwak&quot;&gt;@Peace-Kwak&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;word-break&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS 속성 은 텍스트가 콘텐츠 상자를 넘어갈 때마다 줄 바꿈을 표시할지 여부를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어를 기준으로 개행되지 않고 단어가 잘리도록 개행되면 문제가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;word-break로 이를 해결할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/word-break&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/word-break&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTMLCSSResult&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;2&quot;&gt;&lt;span style=&quot;color: #221199;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;div {&lt;br /&gt;&amp;nbsp; width : 400px;&lt;br /&gt;&amp;nbsp; border : 1px solid black;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #221199;&quot;&gt;div {&lt;br /&gt;&amp;nbsp; width : 400px;&lt;br /&gt;&amp;nbsp; border : 1px solid black;&amp;nbsp;&lt;br /&gt;&amp;nbsp; word-break: keep-all;&lt;br /&gt;}&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codepen.io/Peace-Kwak/pen/NWZzdYz&quot;&gt;https://codepen.io/Peace-Kwak/pen/NWZzdYz&lt;/a&gt;&lt;/p&gt;</description>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/152</guid>
      <comments>https://camelact.tistory.com/152#entry152comment</comments>
      <pubDate>Fri, 23 Aug 2024 17:11:16 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][IPv4][IPv6]Using IP Checker</title>
      <link>https://camelact.tistory.com/148</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;We use IP addresses in various situations. It is necessary to check the IP address that users enter incorrectly and prevent errors. The following is an example of checking whether IPv4 and IPv6 is a normal format, and in the case of IPv6, if it is long format, it is converted to a universal short format. &lt;br /&gt;&lt;br /&gt;IPv6 can be abbreviated for 0, so the following addresses are the same.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:ab8:18a3:0000:0000:8a2e:0120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:0ab8:18a3:0000:0000:8a2e:120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:ab8:18a3:0000:0000:8a2e:120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:ab8:18a3::8a2e:120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:0ab8:18a3::8a2e:0120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:ab8:18a3::8a2e:0120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:0ab8:18a3::8a2e:120:3&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1:ab8:18a3::8a2e:120:3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order to handle it as a program, writing the same address is easy to manage.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1:ab8:18a3:0:0:8a2e:120:3&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;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Pattern;

public class MyFilterOption {
	public static void main(String[] args) throws UnknownHostException {
		new MyFilterOption().start();
	}

	private static String regexIPv4 = &quot;^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$&quot;;
	private static String regexIPv6 = &quot;(^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?$)|(^((([0-9A-Fa-f]{1,4}:){6}([0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}((([0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}((([0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}((([0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}((([0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}((([0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))):\\*$)&quot;;

	public static boolean checkIpv4OrIpv6(String ipAddr) {
		Pattern pattern;

		pattern = Pattern.compile(regexIPv6);
		if (pattern.matcher(ipAddr).matches() == true) {
			return true;
		}

		pattern = Pattern.compile(regexIPv4);
		if (pattern.matcher(ipAddr).matches() == true) {
			return true;
		}

		return false;
	}

	public void getIpValue(String ipValue) {
		try {
			if (!checkIpv4OrIpv6(ipValue)) {
				throw new UnknownHostException();
			}

			InetAddress inetAddress = InetAddress.getByName(ipValue);
			String shortFormat = inetAddress.getHostAddress();
			System.out.println(shortFormat);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void start() throws UnknownHostException {
		getIpValue(&quot;1:ab8:18a3:0000:0000:8a2e:0120:3&quot;);
		getIpValue(&quot;1:0ab8:18a3:0000:0000:8a2e:120:3&quot;);
		getIpValue(&quot;1:ab8:18a3:0000:0000:8a2e:120:3&quot;);
		getIpValue(&quot;1:ab8:18a3::8a2e:120:3&quot;);
		getIpValue(&quot;1:0ab8:18a3::8a2e:0120:3&quot;);
		getIpValue(&quot;1:ab8:18a3::8a2e:0120:3&quot;);
		getIpValue(&quot;1:0ab8:18a3::8a2e:120:3&quot;);
		getIpValue(&quot;1:ab8:18a3::8a2e:120:3&quot;);

		/*
		&amp;nbsp;&amp;nbsp;1:ab8:18a3:0:0:8a2e:120:3
		 */
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3
1:ab8:18a3:0:0:8a2e:120:3&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;N/A&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QNR6t/btrP7OpUrd8/fzOxLkisfcQXsWBjaD4Pzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QNR6t/btrP7OpUrd8/fzOxLkisfcQXsWBjaD4Pzk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QNR6t/btrP7OpUrd8/fzOxLkisfcQXsWBjaD4Pzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQNR6t%2FbtrP7OpUrd8%2FfzOxLkisfcQXsWBjaD4Pzk%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;275&quot; height=&quot;183&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;183&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;</description>
      <category>Java Utility</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/148</guid>
      <comments>https://camelact.tistory.com/148#entry148comment</comments>
      <pubDate>Wed, 2 Nov 2022 13:35:25 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][Mina]Using Apache Mina sshd - shell command line</title>
      <link>https://camelact.tistory.com/147</link>
      <description>&lt;h3 id=&quot;Overview&quot; data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache&amp;nbsp;Mina&amp;nbsp;was&amp;nbsp;used.&amp;nbsp;In&amp;nbsp;the&amp;nbsp;past,&amp;nbsp;there&amp;nbsp;are&amp;nbsp;many&amp;nbsp;examples&amp;nbsp;of&amp;nbsp;ssh&amp;nbsp;connection&amp;nbsp;using&amp;nbsp;Jsch&amp;nbsp;on&amp;nbsp;the&amp;nbsp;Internet.&amp;nbsp;But&amp;nbsp;Jsch&amp;nbsp;doesn't&amp;nbsp;update&amp;nbsp;anymore.&amp;nbsp;This&amp;nbsp;can&amp;nbsp;be&amp;nbsp;a&amp;nbsp;security&amp;nbsp;risk.&amp;nbsp;Apache&amp;nbsp;Mina&amp;nbsp;is&amp;nbsp;constantly&amp;nbsp;updated,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;method&amp;nbsp;used&amp;nbsp;is&amp;nbsp;almost&amp;nbsp;similar&amp;nbsp;to&amp;nbsp;that&amp;nbsp;of&amp;nbsp;Jsch,&amp;nbsp;so&amp;nbsp;it&amp;nbsp;can&amp;nbsp;be&amp;nbsp;replaced. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1343&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OG37V/btrK5DL1333/FRlJOaQvrDHMXIfOehrXx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OG37V/btrK5DL1333/FRlJOaQvrDHMXIfOehrXx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OG37V/btrK5DL1333/FRlJOaQvrDHMXIfOehrXx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOG37V%2FbtrK5DL1333%2FFRlJOaQvrDHMXIfOehrXx0%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;1343&quot; height=&quot;447&quot; data-origin-width=&quot;1343&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;First&amp;nbsp;of&amp;nbsp;all,&amp;nbsp;there&amp;nbsp;weren't&amp;nbsp;too&amp;nbsp;many&amp;nbsp;examples.&amp;nbsp;The&amp;nbsp;examples&amp;nbsp;in&amp;nbsp;Apache&amp;nbsp;Mina&amp;nbsp;were&amp;nbsp;too&amp;nbsp;poorly&amp;nbsp;explained&amp;nbsp;to&amp;nbsp;work&amp;nbsp;properly.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/apache/mina-sshd&quot;&gt;https://github.com/apache/mina-sshd&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There&amp;nbsp;are&amp;nbsp;too&amp;nbsp;many&amp;nbsp;codes,&amp;nbsp;and&amp;nbsp;I&amp;nbsp;just&amp;nbsp;want&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;through&amp;nbsp;ssh&amp;nbsp;and&amp;nbsp;do&amp;nbsp;a&amp;nbsp;shell&amp;nbsp;command,&amp;nbsp;but&amp;nbsp;the&amp;nbsp;code&amp;nbsp;I&amp;nbsp;found&amp;nbsp;does&amp;nbsp;not&amp;nbsp;work.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.baeldung.com/java-ssh-connection&quot;&gt;https://www.baeldung.com/java-ssh-connection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Running&amp;nbsp;the&amp;nbsp;example&amp;nbsp;here&amp;nbsp;only&amp;nbsp;works&amp;nbsp;half&amp;nbsp;way&amp;nbsp;through.&amp;nbsp;One&amp;nbsp;line&amp;nbsp;command&amp;nbsp;line&amp;nbsp;commands&amp;nbsp;work&amp;nbsp;fine.&amp;nbsp;However,&amp;nbsp;consecutive&amp;nbsp;shell&amp;nbsp;command&amp;nbsp;input&amp;nbsp;does&amp;nbsp;not&amp;nbsp;work.&lt;br /&gt;&lt;br /&gt;You&amp;nbsp;will&amp;nbsp;get&amp;nbsp;an&amp;nbsp;error&amp;nbsp;with&amp;nbsp;&quot;channel.open()&quot;&amp;nbsp;and&amp;nbsp;&quot;channel.waitFor(..&quot;).&lt;br /&gt;&lt;br /&gt;The&amp;nbsp;following&amp;nbsp;is&amp;nbsp;an&amp;nbsp;example&amp;nbsp;code&amp;nbsp;that&amp;nbsp;confirms&amp;nbsp;the&amp;nbsp;normal&amp;nbsp;operation&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Shell&amp;nbsp;Command.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Request_Project_Code_Example&quot; data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1661947509693&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.Collections;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.channel.ChannelShell;
import org.apache.sshd.client.channel.ClientChannelEvent;
import org.apache.sshd.client.future.ConnectFuture;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.common.util.io.input.NoCloseInputStream;
import org.apache.sshd.common.util.io.output.NoCloseOutputStream;
import org.springframework.web.socket.TextMessage;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SshdMina {
	private static final ExecutorService executor = Executors.newCachedThreadPool();

	private static final int PIPE_STREAM_BUFFER_SIZE = 1024 * 100;
	final PipedInputStream sshClientInputStream = new PipedInputStream(PIPE_STREAM_BUFFER_SIZE);
	final PipedOutputStream sshClientOutputStream = new PipedOutputStream();
	private final PipedInputStream bizInputStream = new PipedInputStream(PIPE_STREAM_BUFFER_SIZE);
	private final PipedOutputStream bizOutputStream = new PipedOutputStream();

	public static void main(String[] args) throws Exception {
		new SshdMina().boot();
	}

	private SshdMina() throws IOException {
		sshClientInputStream.connect(bizOutputStream);
		sshClientOutputStream.connect(bizInputStream);
	}

	private void boot() throws Exception {
		final SshClient client = SshClient.setUpDefaultClient();
		client.start();
		final ConnectFuture connect = client.connect(&quot;your usename&quot;, &quot;your ip address&quot;, 22);
		connect.await(5000L);
		final ClientSession session = connect.getSession();
		session.addPasswordIdentity(&quot;your password&quot;);
		session.auth().verify(5000L);

		final ChannelShell channel = session.createShellChannel();
		channel.setIn(new NoCloseInputStream(sshClientInputStream));
		channel.setOut(new NoCloseOutputStream(sshClientOutputStream));
		channel.setErr(new NoCloseOutputStream(sshClientOutputStream));

		channel.setPtyType(&quot;xterm-256color&quot;);
		channel.setEnv(&quot;LANG&quot;, &quot;en_US.UTF-8&quot;);
		channel.open();

		beginRead();
		beginWriteStd();

		channel.waitFor(Collections.singleton(ClientChannelEvent.CLOSED), 0);
	}

	void beginRead() {
		executor.execute(() -&amp;gt; {
			final byte[] buffer = new byte[10240];
			String line = &quot;&quot;;
			while (!Thread.currentThread().isInterrupted()) {
				try {
					while (bizInputStream.available() &amp;gt; 0) {
						int i = bizInputStream.read(buffer, 0, 1024);
						if (i &amp;lt; 0) {
							break;
						}
						line = new String(buffer, 0, i);
						System.out.println(line);
						System.out.flush();
					}

					try {
						Thread.sleep(100);
					} catch (Exception ee) {
					}
				
					
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}

	void beginWriteStd() {
		executor.execute(() -&amp;gt; {
			try {
				final Scanner in = new Scanner(System.in);
				while (!Thread.currentThread().isInterrupted()) {
					final String command = in.nextLine();

					bizOutputStream.write((command + &quot;\n&quot;).getBytes());
					bizOutputStream.flush();
				}

				in.close();
			} catch (Throwable e) {
				e.printStackTrace();
			}
		});
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;build.gralde&lt;/h3&gt;
&lt;pre id=&quot;code_1661948020856&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation group: 'org.apache.sshd', name: 'sshd-core', version: '2.9.0'
implementation group: 'net.i2p.crypto', name: 'eddsa', version: '0.3.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;Console_Result&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1661948907752&quot; class=&quot;angelscript&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@control-plane ~]# pwd
18:38:28.166 [sshd-ClientInputStreamPump[31304]-thread-1] DEBUG org.apache.sshd.common.channel.Window - waitForSpace(Window[client/remote](ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22])) available: 2093782
18:38:28.166 [sshd-ClientInputStreamPump[31304]-thread-1] DEBUG org.apache.sshd.common.channel.Window - waitAndConsume(Window[client/remote](ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22])) - requested=4, available=2093782
18:38:28.166 [sshd-ClientInputStreamPump[31304]-thread-1] DEBUG org.apache.sshd.client.session.ClientSessionImpl - encode(ClientSessionImpl[root@/10.251.94.146:22]) packet #38 sending command=94[SSH_MSG_CHANNEL_DATA] len=13
18:38:28.166 [sshd-ClientInputStreamPump[31304]-thread-1] DEBUG org.apache.sshd.common.io.nio2.Nio2Session - writeBuffer(Nio2Session[local=/10.251.94.146:44560, remote=/10.251.94.146:22]) writing 44 bytes
18:38:28.167 [sshd-SshClient[3bd323e9]-nio2-thread-8] DEBUG org.apache.sshd.client.channel.ChannelShell - handleData(ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22]) SSH_MSG_CHANNEL_DATA len=1
p18:38:28.167 [sshd-SshClient[3bd323e9]-nio2-thread-8] DEBUG org.apache.sshd.client.channel.ChannelShell - handleData(ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22]) SSH_MSG_CHANNEL_DATA len=1
w18:38:28.168 [sshd-SshClient[3bd323e9]-nio2-thread-8] DEBUG org.apache.sshd.client.channel.ChannelShell - handleData(ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22]) SSH_MSG_CHANNEL_DATA len=3
18:38:28.168 [sshd-SshClient[3bd323e9]-nio2-thread-8] DEBUG org.apache.sshd.client.channel.ChannelShell - handleData(ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22]) SSH_MSG_CHANNEL_DATA len=7
d
/root
18:38:28.168 [sshd-SshClient[3bd323e9]-nio2-thread-8] DEBUG org.apache.sshd.client.channel.ChannelShell - handleData(ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22]) SSH_MSG_CHANNEL_DATA len=25
 ]0;root@control-plane:~ 18:38:28.168 [sshd-SshClient[3bd323e9]-nio2-thread-8] DEBUG org.apache.sshd.client.channel.ChannelShell - handleData(ChannelShell[id=0, recipient=0]-ClientSessionImpl[root@/10.251.94.146:22]) SSH_MSG_CHANNEL_DATA len=24
[root@control-plane ~]#
[root@control-plane ~]# ls -lrt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java Utility</category>
      <category>apache</category>
      <category>command</category>
      <category>Line</category>
      <category>Mina</category>
      <category>shell</category>
      <category>SSHD</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/147</guid>
      <comments>https://camelact.tistory.com/147#entry147comment</comments>
      <pubDate>Wed, 31 Aug 2022 18:05:57 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]기본 베이스</title>
      <link>https://camelact.tistory.com/146</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Library/Framework./Platform&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Library : 재사용이 필요한 기능들을 모듈화해서 언제든지 호출하여 사용가능하도록 한 것 &lt;br /&gt;Framework&amp;nbsp;:&amp;nbsp;원하는&amp;nbsp;기능&amp;nbsp;구현에만&amp;nbsp;빠르게&amp;nbsp;집중하여&amp;nbsp;개발할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;공통적으로&amp;nbsp;필요한&amp;nbsp;기능을&amp;nbsp;갖추고&amp;nbsp;있다.&amp;nbsp;프레임워크&amp;nbsp;안에&amp;nbsp;기능을&amp;nbsp;추가해야하고,&amp;nbsp;프레임워크가&amp;nbsp;정한&amp;nbsp;규칙,&amp;nbsp;Life&amp;nbsp;cycle에&amp;nbsp;의존하여&amp;nbsp;개발해야한다. &lt;br /&gt;Platform&amp;nbsp;:&amp;nbsp;프로그램이&amp;nbsp;실행되는&amp;nbsp;환경을&amp;nbsp;말함,&amp;nbsp;어플리케이션을&amp;nbsp;동작시킬&amp;nbsp;때&amp;nbsp;기반이&amp;nbsp;되는&amp;nbsp;OS와&amp;nbsp;그밖의&amp;nbsp;환경,&amp;nbsp;설정&amp;nbsp;등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Complexity&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도 - 문제 해결하는데 걸리는 시간과 함수 관계 &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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Stakeholder의 의견이 조율이 되지 않을 때에는 어떻게 해야하나?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Stakeholder들간의 의견들을 토대로 후보모델들을 분석해야 한다. ATAM과 같은 방법을 통하여 각 stakeholder가 가지는 요구사항과 그에 따른 품질 속성, 후보모델들의 architecture를 분석한다. &lt;br /&gt;그리고,&amp;nbsp;각&amp;nbsp;후보모델들에&amp;nbsp;대한&amp;nbsp;분석&amp;nbsp;결과를&amp;nbsp;기반으로,&amp;nbsp;CBAM(Cost&amp;nbsp;Benefit&amp;nbsp;Analysis&amp;nbsp;Method)와&amp;nbsp;같은&amp;nbsp;평가방법을&amp;nbsp;통해&amp;nbsp;architecture&amp;nbsp;중에&amp;nbsp;최적의&amp;nbsp;architecture를&amp;nbsp;선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Balanced mvc?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC&amp;nbsp;Style&amp;nbsp;과&amp;nbsp;Client-Server&amp;nbsp;Style을&amp;nbsp;통합한&amp;nbsp;것 &lt;br /&gt;Client&amp;nbsp;와&amp;nbsp;Server&amp;nbsp;각각에&amp;nbsp;MVC&amp;nbsp;Style이&amp;nbsp;적용되어&amp;nbsp;있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC와 MVVM의 차이를 설명해보세요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC는&amp;nbsp;상호&amp;nbsp;통신을&amp;nbsp;하지만&amp;nbsp;MVVM의&amp;nbsp;경우&amp;nbsp;단&amp;nbsp;방향으로&amp;nbsp;통신하며,&amp;nbsp;모든&amp;nbsp;응답은&amp;nbsp;event로&amp;nbsp;처리되거나&amp;nbsp;binding&amp;nbsp;한다 &lt;br /&gt;Comment)&amp;nbsp;MVC에서는&amp;nbsp;View가&amp;nbsp;직접&amp;nbsp;Model을&amp;nbsp;참조할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;차이점이&amp;nbsp;있다고&amp;nbsp;조언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;본인의 설계가 타당한지 어떻게 확신하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평가검증에서&amp;nbsp;QA&amp;nbsp;Scenario&amp;nbsp;정의하고&amp;nbsp;scenario를&amp;nbsp;성공하기&amp;nbsp;위한&amp;nbsp;Architectural&amp;nbsp;Approach를&amp;nbsp;제시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Product line 과 Application과 Domain 관점에서 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Product 들을 categorising 한 후 필요한 product들을 선택해서 최종 product 를 만들어 내는 것으로 재사용성을 극대화하며, 수많은 모델로 파생되는 것에 효율적으로 대응할 수 있게 된다. &lt;br /&gt;전체&amp;nbsp;product들의&amp;nbsp;기능들을&amp;nbsp;use&amp;nbsp;case별로&amp;nbsp;나열하고&amp;nbsp;해당&amp;nbsp;기능들을&amp;nbsp;category별로&amp;nbsp;정리를&amp;nbsp;한&amp;nbsp;후,&amp;nbsp;product별&amp;nbsp;공통적인&amp;nbsp;기능,&amp;nbsp;특정&amp;nbsp;category의&amp;nbsp;Product가&amp;nbsp;필요로&amp;nbsp;하는&amp;nbsp;기능들로&amp;nbsp;분류한다. &lt;br /&gt;그리고,&amp;nbsp;기능별&amp;nbsp;category,&amp;nbsp;공통&amp;nbsp;기능으로서의&amp;nbsp;category,&amp;nbsp;family&amp;nbsp;product들이&amp;nbsp;가지는&amp;nbsp;공통&amp;nbsp;기능등으로&amp;nbsp;나누어,&amp;nbsp;category별&amp;nbsp;기능&amp;nbsp;component들을&amp;nbsp;정의하여&amp;nbsp;개발 &lt;br /&gt;실제&amp;nbsp;product&amp;nbsp;개발시&amp;nbsp;category별&amp;nbsp;기능들을&amp;nbsp;선택하여&amp;nbsp;조합하여&amp;nbsp;최종&amp;nbsp;product를&amp;nbsp;정의하여&amp;nbsp;개발 &lt;br /&gt;수많은 파생모델이 존재하는 경우, category별 개발된 component&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SPL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#.&amp;nbsp;SPL?&amp;nbsp;(Software&amp;nbsp;Product&amp;nbsp;Line) &lt;br /&gt;-&amp;nbsp;재사용&amp;nbsp;단위인&amp;nbsp;core&amp;nbsp;asset을&amp;nbsp;이용하여,&amp;nbsp;공통&amp;nbsp;부분은&amp;nbsp;가져다&amp;nbsp;쓰고,&amp;nbsp;가변&amp;nbsp;부분은&amp;nbsp;개발하여&amp;nbsp;product을&amp;nbsp;만들어내는&amp;nbsp;방법 &lt;br /&gt;&amp;nbsp; &lt;br /&gt;#.&amp;nbsp;SPL&amp;nbsp;효과 &lt;br /&gt;-&amp;nbsp;생산성&amp;nbsp;향상 &lt;br /&gt;-&amp;nbsp;품질&amp;nbsp;향상 &lt;br /&gt;-&amp;nbsp;비용&amp;nbsp;감소 &lt;br /&gt;- 빠른 제품 출시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아키텍처 드라이버를 도출하는 단계를 설명하라&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Architecture&amp;nbsp;driver란&amp;nbsp;SW&amp;nbsp;architecture가&amp;nbsp;가져야하는&amp;nbsp;Functional&amp;nbsp;Requirement와&amp;nbsp;Non-functional&amp;nbsp;Requirement이다. &lt;br /&gt;목표를&amp;nbsp;설정&amp;nbsp;-&amp;gt;&amp;nbsp;Use&amp;nbsp;case들을&amp;nbsp;도출&amp;nbsp;-&amp;gt;&amp;nbsp;Use&amp;nbsp;case&amp;nbsp;diagram에서&amp;nbsp;quality&amp;nbsp;scenario&amp;nbsp;도출&amp;nbsp;-&amp;gt;&amp;nbsp;quality&amp;nbsp;attribute들을&amp;nbsp;도출&amp;nbsp;한&amp;nbsp;후,&amp;nbsp;architecture를&amp;nbsp;결정하는데&amp;nbsp;있어&amp;nbsp;중요한&amp;nbsp;것들을&amp;nbsp;선택.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture Design / Architecture Style / Architecture Pattern / Design Pattern 의 차이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Architecture&amp;nbsp;Design:&amp;nbsp;Architecture를&amp;nbsp;만들어(design해)&amp;nbsp;가는&amp;nbsp;과정&amp;nbsp;전체 &lt;br /&gt;Architecture&amp;nbsp;Style:&amp;nbsp;high&amp;nbsp;level의&amp;nbsp;컴포넌트&amp;nbsp;간의&amp;nbsp;관계를&amp;nbsp;보여준다.&amp;nbsp;각&amp;nbsp;컴포넌트는&amp;nbsp;package&amp;nbsp;정도의&amp;nbsp;단위이다.&amp;nbsp;구조적인&amp;nbsp;표현에&amp;nbsp;초점,&amp;nbsp;품질속성과&amp;nbsp;관련&amp;nbsp;장단점&amp;nbsp;추리기 &lt;br /&gt;Architecture&amp;nbsp;Pattern:&amp;nbsp;보다&amp;nbsp;세분화된&amp;nbsp;컴포넌트&amp;nbsp;간의&amp;nbsp;관계를&amp;nbsp;보여준다.&amp;nbsp;Functional&amp;nbsp;View(Component&amp;nbsp;Diagram)가&amp;nbsp;그려진다.&amp;nbsp;문제와&amp;nbsp;연관된&amp;nbsp;솔루션&amp;nbsp;제시 &lt;br /&gt;Design&amp;nbsp;Pattern:&amp;nbsp;Class&amp;nbsp;단위의&amp;nbsp;세분화된&amp;nbsp;구조를&amp;nbsp;보여준다.&amp;nbsp;Information&amp;nbsp;View(대략적인&amp;nbsp;Class&amp;nbsp;Diagram)와&amp;nbsp;Behavior&amp;nbsp;View(Sequence&amp;nbsp;Diagram,&amp;nbsp;State&amp;nbsp;Machine&amp;nbsp;Diagram)가&amp;nbsp;그려진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;COR과 decorator는 responsibility를 덧붙이는 구조로 유사한것 같은데 차이점은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cor은 연결리스트와 같이 수평한 구조로 책임을 덧붙이며, decorator는 계층적으로 책임을 덧붙입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;State Machine Diagram에서 병렬 수행을 나타내는 notation은 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parallelization&amp;nbsp;node&amp;nbsp;&amp;amp;&amp;nbsp;Synchronization&amp;nbsp;node&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;State Machine Diagram에서 transition을 표시하는 3가지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Event&amp;nbsp;(trigger),&amp;nbsp;Guard&amp;nbsp;(condition),&amp;nbsp;Activity&amp;nbsp;(Effect)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스테이트 다이어그램에서 orthogonal 스테이트가 무엇인지&lt;br /&gt;Compatible&amp;nbsp;and&amp;nbsp;independent&amp;nbsp;하게&amp;nbsp;동시에&amp;nbsp;존재하는&amp;nbsp;2개&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;660&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/umtCe/btrKYGXibXR/oBj3wpzulgJFVbLPa0xBvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/umtCe/btrKYGXibXR/oBj3wpzulgJFVbLPa0xBvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/umtCe/btrKYGXibXR/oBj3wpzulgJFVbLPa0xBvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FumtCe%2FbtrKYGXibXR%2FoBj3wpzulgJFVbLPa0xBvk%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;594&quot; height=&quot;199&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;220&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;h3 data-ke-size=&quot;size23&quot;&gt;OOAD와 SW Architecture 차이가 무엇인가? &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; : OOAD는 주어진 문제에 맞도록 클래스간의 구조와 동작들에 패턴을 적용하여, 클래스에 대한 패턴 &lt;br /&gt;&amp;nbsp;&amp;nbsp;:&amp;nbsp;SW&amp;nbsp;Architecture는&amp;nbsp;전체&amp;nbsp;system을&amp;nbsp;목적에&amp;nbsp;맞는&amp;nbsp;architecture&amp;nbsp;style을&amp;nbsp;적용하여&amp;nbsp;subsystem이나&amp;nbsp;component단위로&amp;nbsp;분리하고&amp;nbsp;component들간의&amp;nbsp;관계와&amp;nbsp;communication을&amp;nbsp;정의하는&amp;nbsp;것으로,&amp;nbsp;전체&amp;nbsp;System에서의&amp;nbsp;subsystem과&amp;nbsp;component들에&amp;nbsp;대한&amp;nbsp;패턴 &lt;br /&gt;&amp;nbsp;&amp;nbsp;이러한&amp;nbsp;관점에서&amp;nbsp;보았을&amp;nbsp;때,&amp;nbsp;SW공학은&amp;nbsp;비기능적인&amp;nbsp;요구사항을&amp;nbsp;고려하여&amp;nbsp;비기능적&amp;nbsp;요구사항을&amp;nbsp;만족시키기&amp;nbsp;위한&amp;nbsp;개발&amp;nbsp;과정에서&amp;nbsp;구조적인&amp;nbsp;변경&amp;nbsp;가능성을&amp;nbsp;최소화&amp;nbsp;해&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;반면&amp;nbsp;OOAD는&amp;nbsp;넓은&amp;nbsp;범위에서&amp;nbsp;component별&amp;nbsp;구조를&amp;nbsp;고려하지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;추후&amp;nbsp;발생할&amp;nbsp;비기능적인&amp;nbsp;요구사항이나&amp;nbsp;NFR변경에&amp;nbsp;취약한&amp;nbsp;구조가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알고리즘을 다양하게 쓸 수 있는 패턴들과 component level interface를 정의하는 게 어떤 차이가 있나?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Strategy pattern. &lt;br /&gt;=&amp;gt;&amp;nbsp;Provided&amp;nbsp;interface&amp;nbsp;&amp;lt;-&amp;gt;&amp;nbsp;required&amp;nbsp;interface &lt;br /&gt;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Strategy는&amp;nbsp;특정&amp;nbsp;behavior나&amp;nbsp;method의&amp;nbsp;알고리즘이나&amp;nbsp;동작&amp;nbsp;방식이&amp;nbsp;runtime에&amp;nbsp;바뀔&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경우&amp;nbsp;적용하는&amp;nbsp;패턴으로,&amp;nbsp;context&amp;nbsp;class가&amp;nbsp;strategy&amp;nbsp;interface를&amp;nbsp;member로&amp;nbsp;가짐으로서&amp;nbsp;알고리즘을&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;: Strategy pattern의 경우, 해당 클래스를 사용하는 client측에서 어떤 알고리즘을 쓸 것인가를 확인하고 명시적으로 알고리즘을 교체하지만, component level interface는 외부 component가 내부 component를 볼 수 없기 때문에 component level interface를 통해 제공되는 behavior가 변경되더라도 이를 알 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마이크로&amp;nbsp;커널을&amp;nbsp;클래스&amp;nbsp;레벨로&amp;nbsp;어떻게&amp;nbsp;구성할&amp;nbsp;것인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microkernel architecture - system requirement가 빈번히 변경되는 경우, minimum functionality만을 제공하는 core system과 각 feature들을 분리하고, 특정 기능이 필요한 경우 해당 기능을 구현한 plugin을 사용하여 기능을 동작하는 architecture style. &lt;br /&gt;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microkernel에서&amp;nbsp;core&amp;nbsp;system은&amp;nbsp;정해진&amp;nbsp;순서에&amp;nbsp;따라&amp;nbsp;동작을&amp;nbsp;진행하고,&amp;nbsp;그&amp;nbsp;과정에서&amp;nbsp;plugin의&amp;nbsp;인터페이스를&amp;nbsp;순서대로&amp;nbsp;호출하도록&amp;nbsp;해야&amp;nbsp;한다.&amp;nbsp;그리고,&amp;nbsp;plugin&amp;nbsp;개발자는&amp;nbsp;core&amp;nbsp;system에서&amp;nbsp;요구하는&amp;nbsp;plugin에서&amp;nbsp;제공해야하는&amp;nbsp;interface들을&amp;nbsp;구현하는&amp;nbsp;형태로&amp;nbsp;plugin을&amp;nbsp;개발하여&amp;nbsp;제공하면&amp;nbsp;된다.&amp;nbsp;따라서,&amp;nbsp;이러한&amp;nbsp;형태에&amp;nbsp;가장&amp;nbsp;적합한&amp;nbsp;Template&amp;nbsp;method&amp;nbsp;pattern을&amp;nbsp;적용하여,&amp;nbsp;core&amp;nbsp;system에서&amp;nbsp;필요로&amp;nbsp;하는&amp;nbsp;인터페이스를&amp;nbsp;abstract&amp;nbsp;class로&amp;nbsp;정의하여&amp;nbsp;두고,&amp;nbsp;plugin개발자는&amp;nbsp;concrete&amp;nbsp;class로&amp;nbsp;plugin을&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ADD (Attribute Driven Design) 방법론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능&amp;nbsp;요구사항,&amp;nbsp;품질&amp;nbsp;요구사항을&amp;nbsp;아키텍처에&amp;nbsp;반영하는&amp;nbsp;아키텍처&amp;nbsp;설계&amp;nbsp;방법이다. &lt;br /&gt;분해할&amp;nbsp;모듈을&amp;nbsp;선택&amp;nbsp;&amp;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;gt;&amp;nbsp;계속&amp;nbsp;반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture viewpoint 중 Logical View에서는 use case를 묶어서 component에 할당하게 되는데, 어떤 use case들이 한 component로 할당되도록 하는 판단 기준이 있나?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cohesion은 높고 coupling은 낮도록 component 나누거나 합치기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Abstract Class를 상속하는 것 보다 Interface를 구현하도록 하는 것이 갖는 장점은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Abstract Class : is a 관계가 명확하고 일부 구현이 필요한 경우 &lt;br /&gt;Interface&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Repository Style과 Black board style의 공통점과 차이점을 설명하고, 저장되는 내용의 차이도 설명하라&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data centric architecture로 Data를 어떻게 다루는지에 따라 구성된 Architecture라는 점에서 공통점이 있다. &lt;br /&gt;Repository&amp;nbsp;style은&amp;nbsp;data&amp;nbsp;storage가&amp;nbsp;passive한&amp;nbsp;역할을&amp;nbsp;수행하며,&amp;nbsp;system의&amp;nbsp;subsystem&amp;nbsp;또는&amp;nbsp;component들이&amp;nbsp;data를&amp;nbsp;읽거나&amp;nbsp;쓰고자&amp;nbsp;할&amp;nbsp;때&amp;nbsp;storage에&amp;nbsp;정보를&amp;nbsp;저장하거나&amp;nbsp;읽어준다. &lt;br /&gt;Blackboard&amp;nbsp;style은&amp;nbsp;data&amp;nbsp;storage가&amp;nbsp;active한&amp;nbsp;역할을&amp;nbsp;수행하며,&amp;nbsp;data&amp;nbsp;storage의&amp;nbsp;state에&amp;nbsp;따라&amp;nbsp;event가&amp;nbsp;trigger되어&amp;nbsp;subsystem이나&amp;nbsp;component에&amp;nbsp;해당하는&amp;nbsp;Knowledge&amp;nbsp;source가&amp;nbsp;연산이나&amp;nbsp;동작을&amp;nbsp;수행한다.&amp;nbsp;Blackboard&amp;nbsp;style은&amp;nbsp;control이&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SW 개발 vs 모델링&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SW 개발 = 모델링 + 구현 + 테스트 &lt;br /&gt;- 모델링 = 요구사항 정의 + 분석 + 설계&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/146</guid>
      <comments>https://camelact.tistory.com/146#entry146comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:10:32 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Re-engineering</title>
      <link>https://camelact.tistory.com/145</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reverse Engineering 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;프로세스. &lt;br /&gt;재문서화,&amp;nbsp;설계&amp;nbsp;복구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reengineering 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Reengineering&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;방식은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운&amp;nbsp;형태로&amp;nbsp;재구성하고&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;br /&gt;디자인&amp;nbsp;개선&amp;nbsp;‒&amp;nbsp;유지보수성,&amp;nbsp;이식성&amp;nbsp;등을&amp;nbsp;개선합니다. &lt;br /&gt;신기술의&amp;nbsp;활용 &lt;br /&gt;&lt;br /&gt;리팩토링&amp;nbsp;대상을&amp;nbsp;선정한다 &lt;br /&gt;선정된&amp;nbsp;대상을&amp;nbsp;테스트&amp;nbsp;코드&amp;nbsp;작성한다. &lt;br /&gt;코드를&amp;nbsp;분해한&amp;nbsp;후&amp;nbsp;재조립한다. &lt;br /&gt;재조립&amp;nbsp;코드를&amp;nbsp;테스트한다. &lt;br /&gt;위 과정을 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Test Driven Refactoring 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1&amp;nbsp;실패한&amp;nbsp;단위&amp;nbsp;테스트를&amp;nbsp;만듭니다. &lt;br /&gt;2.&amp;nbsp;해당&amp;nbsp;테스트를&amp;nbsp;통과하는&amp;nbsp;프로덕션&amp;nbsp;코드를&amp;nbsp;작성합니다 &lt;br /&gt;3.&amp;nbsp;방금&amp;nbsp;만든&amp;nbsp;혼란을&amp;nbsp;정리하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Golden Master Test&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 수행한 다음 저장된 &quot;골드 마스터&quot;와 향후 실행을 비교하여 예기치 않은 변경 사항을 발견합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Smell&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Long Method&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Large&amp;nbsp;Class&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Primitive&amp;nbsp;Obsession&amp;nbsp;객체를&amp;nbsp;처음&amp;nbsp;접하는&amp;nbsp;사람은&amp;nbsp;보통&amp;nbsp;숫자와&amp;nbsp;통화를&amp;nbsp;연동하는&amp;nbsp;돈&amp;nbsp;관련&amp;nbsp;클래스나&amp;nbsp;전화번호와&amp;nbsp;우편번호&amp;nbsp;같은&amp;nbsp;특수&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;br /&gt;우물&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;br /&gt;Long&amp;nbsp;parameter&amp;nbsp;lists&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Data&amp;nbsp;Clump&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;br /&gt;Switch&amp;nbsp;Statements&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Temporary&amp;nbsp;Field&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;br /&gt;Refused&amp;nbsp;Bequest&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;br /&gt;Alternative&amp;nbsp;Classes&amp;nbsp;with&amp;nbsp;Different&amp;nbsp;Interfaces&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;br /&gt;Divergent&amp;nbsp;Change&amp;nbsp;클래스가&amp;nbsp;다른&amp;nbsp;방식으로&amp;nbsp;계속&amp;nbsp;변경된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Shotgun&amp;nbsp;Surgery&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Parallel&amp;nbsp;Inheritance&amp;nbsp;Hierarchy&amp;nbsp;클래스에&amp;nbsp;대한&amp;nbsp;하위&amp;nbsp;클래스를&amp;nbsp;만들&amp;nbsp;때마다&amp;nbsp;다른&amp;nbsp;클래스에&amp;nbsp;대한&amp;nbsp;하위&amp;nbsp;클 &lt;br /&gt;래스를&amp;nbsp;만들어야&amp;nbsp;하는&amp;nbsp;자신을&amp;nbsp;발견하게&amp;nbsp;됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Duplicate&amp;nbsp;Code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Lazy&amp;nbsp;Class&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;br /&gt;Data Class 필드와 Getter/Setter만 있는 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Dead&amp;nbsp;Code&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Speculative&amp;nbsp;Generality&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;클래스,&amp;nbsp;메서드,&amp;nbsp;필드&amp;nbsp;또는&amp;nbsp;매개변수가&amp;nbsp;있습니다.&amp;nbsp;&amp;bull;&amp;nbsp;때 &lt;br /&gt;때로&amp;nbsp;지원을&amp;nbsp;위해&amp;nbsp;&quot;만약에&amp;nbsp;대비하여&quot;&amp;nbsp;코드가&amp;nbsp;생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Feature&amp;nbsp;envy&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;br /&gt;Inappropriate&amp;nbsp;Intimacy&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;br /&gt;Message&amp;nbsp;Chains&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Middle&amp;nbsp;Man&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;위임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Incomplete Library Class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;치료 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Long Method - Extract Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Large&amp;nbsp;Class&amp;nbsp;-&amp;nbsp;Extract&amp;nbsp;Class,&amp;nbsp;Extract&amp;nbsp;Subclass&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Primitive&amp;nbsp;Obsession&amp;nbsp;-&amp;nbsp;consider&amp;nbsp;turning&amp;nbsp;it&amp;nbsp;into&amp;nbsp;a&amp;nbsp;class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Long&amp;nbsp;parameter&amp;nbsp;lists&amp;nbsp;-&amp;nbsp;Replace&amp;nbsp;Parameter&amp;nbsp;With&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Data&amp;nbsp;Clump&amp;nbsp;-&amp;nbsp;Extract&amp;nbsp;Class,&amp;nbsp;Introduce&amp;nbsp;Parameter&amp;nbsp;Object,&amp;nbsp;Preserve&amp;nbsp;Whole&amp;nbsp;Object&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Switch&amp;nbsp;Statements&amp;nbsp;-&amp;nbsp;Extract&amp;nbsp;Method,&amp;nbsp;Move&amp;nbsp;Method,&amp;nbsp;Replace&amp;nbsp;Type&amp;nbsp;Code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Temporary&amp;nbsp;Field&amp;nbsp;-&amp;nbsp;Extract&amp;nbsp;Class,&amp;nbsp;Replace&amp;nbsp;Method&amp;nbsp;with&amp;nbsp;Method&amp;nbsp;Object.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Refused&amp;nbsp;Bequest&amp;nbsp;-&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;new&amp;nbsp;subclass&amp;nbsp;and&amp;nbsp;use&amp;nbsp;Push&amp;nbsp;Down&amp;nbsp;Method&amp;nbsp;and&amp;nbsp;Push&amp;nbsp;Down&amp;nbsp;Field&amp;nbsp;on&amp;nbsp;the&amp;nbsp;unused&amp;nbsp;methods&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Alternative&amp;nbsp;Classes&amp;nbsp;with&amp;nbsp;Different&amp;nbsp;Interfaces&amp;nbsp;-&amp;nbsp;Rename&amp;nbsp;Method,&amp;nbsp;Move&amp;nbsp;Method,&amp;nbsp;Add&amp;nbsp;Parameter&amp;nbsp;and&amp;nbsp;Parameterize&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Divergent&amp;nbsp;Change&amp;nbsp;-&amp;nbsp;&amp;nbsp;Extract&amp;nbsp;Class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Shotgun&amp;nbsp;Surgery&amp;nbsp;-&amp;nbsp;Move&amp;nbsp;Method&amp;nbsp;and&amp;nbsp;Move&amp;nbsp;Field&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Parallel&amp;nbsp;Inheritance&amp;nbsp;Hierarchy&amp;nbsp;-&amp;nbsp;Merge&amp;nbsp;Class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Duplicate&amp;nbsp;Code&amp;nbsp;-&amp;nbsp;Extract&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Lazy&amp;nbsp;Class&amp;nbsp;-&amp;nbsp;Collapse&amp;nbsp;Hierarchy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Data&amp;nbsp;Class&amp;nbsp;-&amp;nbsp;Encapsulate&amp;nbsp;Field,&amp;nbsp;Encapsulate&amp;nbsp;Collection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Dead&amp;nbsp;Code&amp;nbsp;-&amp;nbsp;Collapse&amp;nbsp;Hierarchy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Speculative&amp;nbsp;Generality&amp;nbsp;-&amp;nbsp;Collapse&amp;nbsp;Hierarchy,&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;클래스,&amp;nbsp;메소드,&amp;nbsp;필드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Feature&amp;nbsp;envy&amp;nbsp;-&amp;nbsp;Extract&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Inappropriate&amp;nbsp;Intimacy&amp;nbsp;-&amp;nbsp;Move&amp;nbsp;Method,&amp;nbsp;Move&amp;nbsp;Field,&amp;nbsp;Extract&amp;nbsp;Class,&amp;nbsp;&amp;nbsp;Replace&amp;nbsp;&amp;nbsp;Inheritance&amp;nbsp;With&amp;nbsp;Delegation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Message&amp;nbsp;Chains&amp;nbsp;-&amp;nbsp;Hide&amp;nbsp;Delegate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Middle&amp;nbsp;Man&amp;nbsp;-&amp;nbsp;Remove&amp;nbsp;Middle&amp;nbsp;Man,&amp;nbsp;Inline&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Incomplete&amp;nbsp;Library&amp;nbsp;Class&amp;nbsp;-&amp;nbsp;Introduce&amp;nbsp;Foreign&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CC = Cyclomatic Complexity&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CC는 정량적 수치를 기반으로 여러 설계를 직접 분석할 수 있는 등 설계 단계에서 사용이 유용하다. &lt;br /&gt;Threshold&amp;nbsp;=&amp;nbsp;10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NPath&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건부 * 조건부 * 조건부 &amp;hellip; Threshold = 200&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/145</guid>
      <comments>https://camelact.tistory.com/145#entry145comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:07:48 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Architectural Evaluation</title>
      <link>https://camelact.tistory.com/144</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;ATAM - Architecture Tradeoff Analysis Method&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA6GYD/btrKZeTOJWj/vwFa8qjLom3DmQea75KBvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA6GYD/btrKZeTOJWj/vwFa8qjLom3DmQea75KBvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA6GYD/btrKZeTOJWj/vwFa8qjLom3DmQea75KBvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA6GYD%2FbtrKZeTOJWj%2FvwFa8qjLom3DmQea75KBvk%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;527&quot; height=&quot;308&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quality Attribute를 기준으로 시나리오를 정하고, 우선순위 결정(유틸리티 트리 만들기) 우선순위가 높은 시나리오에 대해 S R T N 를 알아보고 대안 아키텍처를 결정&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HIZG5/btrK0Ma8C2B/nKBlVK0Y3SE9n9JoIEIKi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HIZG5/btrK0Ma8C2B/nKBlVK0Y3SE9n9JoIEIKi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HIZG5/btrK0Ma8C2B/nKBlVK0Y3SE9n9JoIEIKi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHIZG5%2FbtrK0Ma8C2B%2FnKBlVK0Y3SE9n9JoIEIKi0%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;527&quot; height=&quot;300&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;516&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Sensitivity Point 란 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A는&amp;nbsp;B에&amp;nbsp;영향을&amp;nbsp;준다&amp;nbsp;Sensitivity&amp;nbsp;Point &lt;br /&gt;CBAM&amp;nbsp;-&amp;nbsp;Cost&amp;nbsp;Benefit&amp;nbsp;Analysis&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;What is the procedure of applying x method?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;작성한다. &lt;br /&gt;대안&amp;nbsp;아키텍쳐를&amp;nbsp;나열하고&amp;nbsp;품질&amp;nbsp;속성별로&amp;nbsp;T를&amp;nbsp;작성한다,&amp;nbsp;-&amp;nbsp;포인트&amp;nbsp;지점이&amp;nbsp;R이&amp;nbsp;되고&amp;nbsp;이를&amp;nbsp;분석하여&amp;nbsp;두&amp;nbsp;아키텍처를&amp;nbsp;비교한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SAAM VS ATAM VS CBAM&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이점에&amp;nbsp;대해서&amp;nbsp;설명하세요 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QC4Fz/btrKVVtXpok/fbtZBZW6unKKk88mtCcMkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QC4Fz/btrKVVtXpok/fbtZBZW6unKKk88mtCcMkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QC4Fz/btrKVVtXpok/fbtZBZW6unKKk88mtCcMkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQC4Fz%2FbtrKVVtXpok%2FfbtZBZW6unKKk88mtCcMkk%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;527&quot; height=&quot;227&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAAM &amp;ndash; Software Architecture Analysis Method &lt;br /&gt;&amp;ndash;&amp;nbsp;변경&amp;nbsp;용이성,&amp;nbsp;기능&amp;nbsp;집중,&amp;nbsp;평가&amp;nbsp;용이, &lt;br /&gt;&amp;ndash;&amp;nbsp;직접&amp;nbsp;/&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;br /&gt;&amp;nbsp; &lt;br /&gt;ATAM &amp;ndash;&amp;nbsp;Architecture&amp;nbsp;Trade-off&amp;nbsp;Analysis&amp;nbsp;Method &lt;br /&gt;&amp;ndash;&amp;nbsp;품질속성&amp;nbsp;만족&amp;nbsp;여부&amp;nbsp;판단,&amp;nbsp;이해&amp;nbsp;관계&amp;nbsp;평가, &lt;br /&gt;&amp;ndash;&amp;nbsp;품질속성&amp;nbsp;시나리오에&amp;nbsp;기반하여&amp;nbsp;아키텍처&amp;nbsp;Tradeoff를&amp;nbsp;분석하고,&amp;nbsp;이에&amp;nbsp;대한&amp;nbsp;risk를&amp;nbsp;찾아내는&amp;nbsp;아키텍처&amp;nbsp;평가&amp;nbsp;방법 &lt;br /&gt;&amp;nbsp; &lt;br /&gt;CBAM &amp;ndash;&amp;nbsp;Cost&amp;nbsp;Benefit&amp;nbsp;Analysis&amp;nbsp;Method &lt;br /&gt;&amp;ndash;&amp;nbsp;의사결정&amp;nbsp;요구&amp;nbsp;충족,&amp;nbsp;ATAM바탕&amp;nbsp;분석, &lt;br /&gt;&amp;ndash;&amp;nbsp;아키텍처를&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정적분석, 무엇이 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어&amp;nbsp;지표&amp;nbsp;복잡도,&amp;nbsp;결합도 &lt;br /&gt;객체지향&amp;nbsp;지표 &lt;br /&gt;의존성&amp;nbsp;분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;동적분석, 무엇이 있나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리&amp;nbsp;분석,&amp;nbsp;쓰레드&amp;nbsp;프로세스&amp;nbsp;분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture Style의 Applicability를 평가하는 방법은 무엇입니까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;각&amp;nbsp;설계&amp;nbsp;스타일에&amp;nbsp;대해서&amp;nbsp;Applicable&amp;nbsp;situation을&amp;nbsp;작성한&amp;nbsp;후,&amp;nbsp;각&amp;nbsp;상황에&amp;nbsp;대한&amp;nbsp;시스템의&amp;nbsp;수요를&amp;nbsp;적어&amp;nbsp;일치하는&amp;nbsp;지&amp;nbsp;평가한다. &lt;br /&gt;: 각 설계 스타일에 대해서 Pros, Cons를 적고 시스템에 가져올 장점과 시스템에서 어떻게 단점을 해결할 것인지 적고 Match하는지 평가한다.&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/144</guid>
      <comments>https://camelact.tistory.com/144#entry144comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:07:13 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Applying Tactics for NRF</title>
      <link>https://camelact.tistory.com/143</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;conventional NFR의 효과적인 tactic이 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;availability, efficiency 등 ISO 9126에 있는 것들에 대한 건 다 숙지해 놓을 것 &lt;br /&gt;Q)&amp;nbsp;efficiency &lt;br /&gt;resource&amp;nbsp;관점의&amp;nbsp;efficiency &lt;br /&gt;runtime&amp;nbsp;관점의&amp;nbsp;efficiency &lt;br /&gt;구별해서&amp;nbsp;이야기&amp;nbsp;할&amp;nbsp;것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Methods&amp;nbsp;and&amp;nbsp;tactics&amp;nbsp;are&amp;nbsp;widely&amp;nbsp;available&amp;nbsp;for&amp;nbsp;Conventional&amp;nbsp;NFRs. &lt;br /&gt;Architects&amp;nbsp;should&amp;nbsp;utilize&amp;nbsp;existing&amp;nbsp;approaches&amp;nbsp;and&amp;nbsp;tactics. &lt;br /&gt;&amp;amp;번역 &lt;br /&gt;방법과&amp;nbsp;전술은&amp;nbsp;기존&amp;nbsp;NFR에&amp;nbsp;널리&amp;nbsp;사용&amp;nbsp;가능합니다. &lt;br /&gt;건축가는&amp;nbsp;기존&amp;nbsp;접근&amp;nbsp;방식과&amp;nbsp;전술을&amp;nbsp;활용해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;ISO&amp;nbsp;9026,&amp;nbsp;범용적,&amp;nbsp;가용성&amp;nbsp;높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture Design for Non-Conventional NFRs&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Methods and tactics are not widely available for NonConventional NFRs.&amp;nbsp; &lt;br /&gt;Architects&amp;nbsp;should&amp;nbsp;define&amp;nbsp;an&amp;nbsp;effective&amp;nbsp;process&amp;nbsp;for&amp;nbsp;the&amp;nbsp;particular&amp;nbsp;NFR,&amp;nbsp;and&amp;nbsp;apply&amp;nbsp;the&amp;nbsp;process. &lt;br /&gt;iTechnical&amp;nbsp;Hardship&amp;nbsp;for&amp;nbsp;this&amp;nbsp;is&amp;nbsp;high &lt;br /&gt;&amp;amp;번역 &lt;br /&gt;방법과&amp;nbsp;전술은&amp;nbsp;비재래식&amp;nbsp;NFR에&amp;nbsp;널리&amp;nbsp;사용되지&amp;nbsp;않습니다. &lt;br /&gt;설계자는&amp;nbsp;특정&amp;nbsp;NFR에&amp;nbsp;대한&amp;nbsp;효과적인&amp;nbsp;프로세스를&amp;nbsp;정의하고&amp;nbsp;프로세스를&amp;nbsp;적용해야&amp;nbsp;합니다. &lt;br /&gt;이에&amp;nbsp;대한&amp;nbsp;iTechnical&amp;nbsp;어려움이&amp;nbsp;높음 &lt;br /&gt;&lt;br /&gt;대상&amp;nbsp;시스템에&amp;nbsp;특정한&amp;nbsp;NFR,&amp;nbsp;가용성&amp;nbsp;낮음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Tactics 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전술: 품질 시나리오에서의 자극(Stimulus)에 대한 기대 응답 (Response)를 수행하기 위한 여러 방법 및 패턴을 의미함 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Tactics의 종류를 나열해 보세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Modifiability Tactics &lt;br /&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;시간 &lt;br /&gt;&lt;br /&gt;Availability&amp;nbsp;Tactics &lt;br /&gt;오류&amp;nbsp;감지,&amp;nbsp;오류&amp;nbsp;복구:&amp;nbsp;준비/수리,&amp;nbsp;오류&amp;nbsp;예방 &lt;br /&gt;&lt;br /&gt;Interoperability&amp;nbsp;Tactics&amp;nbsp;-&amp;nbsp;상호운용성 &lt;br /&gt;인터페이스&amp;nbsp;관리,&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Usability&amp;nbsp;Tactics &lt;br /&gt;취소,&amp;nbsp;Undo,&amp;nbsp;정지/재시작 &lt;br /&gt;&lt;br /&gt;Performance&amp;nbsp;Tactics &lt;br /&gt;연산&amp;nbsp;부하&amp;nbsp;감소,&amp;nbsp;실행&amp;nbsp;횟수&amp;nbsp;제한,&amp;nbsp;큐&amp;nbsp;크기&amp;nbsp;제한 &lt;br /&gt;&lt;br /&gt;Security&amp;nbsp;Tactics &lt;br /&gt;공격&amp;nbsp;감지,&amp;nbsp;메시지&amp;nbsp;무결성&amp;nbsp;검증,&amp;nbsp;사용자&amp;nbsp;인증,&amp;nbsp;데이타&amp;nbsp;암호화 &lt;br /&gt;&lt;br /&gt;Testability&amp;nbsp;Tactics &lt;br /&gt;특화된&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Design for Non-Functional Requirements Step 말하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Identify Facts and Policies &lt;br /&gt;Define&amp;nbsp;Criteria&amp;nbsp;for&amp;nbsp;Tactics &lt;br /&gt;Propose&amp;nbsp;Architecture&amp;nbsp;Tactics &lt;br /&gt;Evaluate&amp;nbsp;Architecture&amp;nbsp;Tactics &lt;br /&gt;Analyze&amp;nbsp;Impacts&amp;nbsp;of&amp;nbsp;Tactics &lt;br /&gt;Apply&amp;nbsp;Architecture&amp;nbsp;Tactics &lt;br /&gt;Validate&amp;nbsp;Conformance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Tactics for Availability 가용성 Tactics 말해보세요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prevention&amp;nbsp; &lt;br /&gt;Phase&amp;nbsp;Commitment&amp;nbsp;Transaction &lt;br /&gt;Active&amp;nbsp;Redundancy &lt;br /&gt;Passive&amp;nbsp;Redundancy &lt;br /&gt;Spare &lt;br /&gt;&lt;br /&gt;Fault&amp;nbsp;Tolerance &lt;br /&gt;Ping/Echo &lt;br /&gt;Heartbeat &lt;br /&gt;Voting &lt;br /&gt;Process&amp;nbsp;Monitor&amp;nbsp;/&amp;nbsp;Watch&amp;nbsp;Dog &lt;br /&gt;Exceptions &lt;br /&gt;&lt;br /&gt;Recoverability &lt;br /&gt;Shadowing &lt;br /&gt;State&amp;nbsp;Resynchronization &lt;br /&gt;Rollback&amp;nbsp;with&amp;nbsp;Checkpoint&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Recoverability는 뭘 복구하려는 건가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sw product가 복구대상. 복구하고 어느정도 퍼포먼스 유지 &lt;br /&gt;fail할&amp;nbsp;당시에&amp;nbsp;어떤&amp;nbsp;data를&amp;nbsp;처리하고&amp;nbsp;있다가&amp;nbsp;function&amp;nbsp;fail했다면, &lt;br /&gt;이때&amp;nbsp;partially&amp;nbsp;update해버리는&amp;nbsp;경우가&amp;nbsp;있다 &lt;br /&gt;마저해서 성공하게 하거나 처음으로 롤백시켜줘야함.&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/143</guid>
      <comments>https://camelact.tistory.com/143#entry143comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:06:12 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Applying Viewpoints</title>
      <link>https://camelact.tistory.com/142</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;View 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템을&amp;nbsp;이루는&amp;nbsp;SW요소들의&amp;nbsp;집합&amp;nbsp;과&amp;nbsp;SW요소들의&amp;nbsp;연관&amp;nbsp;관계를&amp;nbsp;추상적&amp;nbsp;으로&amp;nbsp;표현한&amp;nbsp;것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Module View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Module간의&amp;nbsp;상호&amp;nbsp;연결&amp;nbsp;관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Runtime View = Component and Connector View(C&amp;amp;C View)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어&amp;nbsp;뭐가&amp;nbsp;있을까요? &lt;br /&gt;split&amp;nbsp;lower&amp;nbsp;upper&amp;nbsp;merge&amp;nbsp;등 &lt;br /&gt;&lt;br /&gt;파이프-필터&amp;nbsp;스타일(Pipe-and-Filter&amp;nbsp;Style) &lt;br /&gt;공유-데이터&amp;nbsp;스타일(Shared-Data&amp;nbsp;Style) &lt;br /&gt;게시-구독&amp;nbsp;스타일(Publish-Subscribe&amp;nbsp;Style) &lt;br /&gt;클라이언트-서버&amp;nbsp;스타일(Client-Server&amp;nbsp;Style) &lt;br /&gt;피어&amp;nbsp;투&amp;nbsp;피어&amp;nbsp;스타일(Peer-to-Peer&amp;nbsp;Style)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Allocation View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;folder&amp;nbsp;hierarchy &lt;br /&gt;&lt;br /&gt;배치&amp;nbsp;스타일(Deployment&amp;nbsp;Style) &lt;br /&gt;컴포넌트-커넥터&amp;nbsp;스타일의&amp;nbsp;요소를&amp;nbsp;실행&amp;nbsp;플랫폼에&amp;nbsp;할당&amp;nbsp;}&amp;nbsp;일반적으로&amp;nbsp;통신&amp;nbsp;프로세스&amp;nbsp;스타일(Communicating-Processes&amp;nbsp;Style)요소를&amp;nbsp;할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4+1&amp;nbsp;View&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Logical View &lt;br /&gt;Process&amp;nbsp;View &lt;br /&gt;Development&amp;nbsp;View &lt;br /&gt;Physical&amp;nbsp;View &lt;br /&gt;+Use&amp;nbsp;Cases/Scenarios &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s9SZN/btrK1qFEyii/b0DwtqS0Nwl3vjyXphGg10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s9SZN/btrK1qFEyii/b0DwtqS0Nwl3vjyXphGg10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s9SZN/btrK1qFEyii/b0DwtqS0Nwl3vjyXphGg10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs9SZN%2FbtrK1qFEyii%2Fb0DwtqS0Nwl3vjyXphGg10%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;527&quot; height=&quot;260&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;유스케이스 뷰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Usecase&amp;nbsp;View) &lt;br /&gt;다른&amp;nbsp;뷰를&amp;nbsp;검증하는데&amp;nbsp;사용 &lt;br /&gt;사용자,&amp;nbsp;설계자,&amp;nbsp;개발자,&amp;nbsp;테스트&amp;nbsp;관점 &lt;br /&gt;유스케이스&amp;nbsp;다이어그램 &lt;br /&gt;&lt;br /&gt;논리&amp;nbsp;뷰 &lt;br /&gt;(Logical&amp;nbsp;View) &lt;br /&gt;시스템&amp;nbsp;기능&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;구현&amp;nbsp;되는지&amp;nbsp;설명 &lt;br /&gt;설계자&amp;nbsp;관점&amp;nbsp;(순서도나&amp;nbsp;UML&amp;nbsp;그리는&amp;nbsp;시점) &lt;br /&gt;클래스/시퀀스&amp;nbsp;다이어그램 &lt;br /&gt;&lt;br /&gt;프로세스&amp;nbsp;뷰 &lt;br /&gt;(Process&amp;nbsp;View) &lt;br /&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;br /&gt;성능,&amp;nbsp;확장성,&amp;nbsp;효율성&amp;nbsp;관련 &lt;br /&gt;시스템&amp;nbsp;통합자의&amp;nbsp;관점 &lt;br /&gt;시퀀스/협력&amp;nbsp;다이어그램 &lt;br /&gt;&lt;br /&gt;Development&amp;nbsp;뷰 &lt;br /&gt;개발&amp;nbsp;환경&amp;nbsp;안에서&amp;nbsp;정적인&amp;nbsp;소프트웨어&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;정보&amp;nbsp;정의 &lt;br /&gt;실제&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;여부를&amp;nbsp;확인 &lt;br /&gt;직접&amp;nbsp;만드는&amp;nbsp;개발자의&amp;nbsp;관점 &lt;br /&gt;컴포넌트&amp;nbsp;다이어그램 &lt;br /&gt;&lt;br /&gt;Physical&amp;nbsp;뷰 &lt;br /&gt;컴포넌트가&amp;nbsp;물리적&amp;nbsp;환경에서&amp;nbsp;배치&amp;nbsp;연결&amp;nbsp;작업이&amp;nbsp;어떻게&amp;nbsp;실행&amp;nbsp;되는지를&amp;nbsp;매핑해서&amp;nbsp;보여주는&amp;nbsp;뷰 &lt;br /&gt;배치(배포)&amp;nbsp;다이어그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Context View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템과&amp;nbsp;환경사이의&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;포함&amp;nbsp;상호&amp;nbsp;작용,&amp;nbsp;하이레벨로&amp;nbsp;이해를&amp;nbsp;위한,&amp;nbsp;미리&amp;nbsp;알고있는&amp;nbsp;관점,&amp;nbsp;10,&amp;nbsp;20년된&amp;nbsp;시스템의&amp;nbsp;2.0&amp;nbsp;버젼은&amp;nbsp;이거&amp;nbsp;필요&amp;nbsp;없다&amp;nbsp;~=&amp;nbsp;usecase&amp;nbsp;view&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DFD - Data Flow Diagram 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 기능을 나타냅니다. 레벨 0 DFD에서는 전체 대상 시스템을 나타냅니다 &lt;br /&gt;공통&amp;nbsp;터미널&amp;nbsp;-&amp;nbsp;.사용자,&amp;nbsp;외부&amp;nbsp;시스템,&amp;nbsp;&amp;nbsp;하드웨어&amp;nbsp;장치 &lt;br /&gt;데이터&amp;nbsp;저장소 &lt;br /&gt;데이터&amp;nbsp;흐름&amp;nbsp;정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DFD의 터미널에 유스케이스 액터가 안되는 경우가 있는지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFD에서 터미널이란 입력 정보를 주는 주체, 인풋 아웃풋 &lt;br /&gt;usecase에서&amp;nbsp;엑터는&amp;nbsp;특정&amp;nbsp;기능을&amp;nbsp;인보크하는&amp;nbsp;주체&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Functional View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의&amp;nbsp;기능적&amp;nbsp;요소,&amp;nbsp;해당&amp;nbsp;책임,&amp;nbsp;인터페이스&amp;nbsp;및&amp;nbsp;기본&amp;nbsp;상호&amp;nbsp;작용.&amp;nbsp; &lt;br /&gt;시스템의&amp;nbsp;Functional&amp;nbsp;elements와&amp;nbsp;elements들의&amp;nbsp;책임,&amp;nbsp;컴포넌트&amp;nbsp;간의&amp;nbsp;interface,&amp;nbsp;interaction&amp;nbsp;을&amp;nbsp;의미한다.&amp;nbsp;이 &lt;br /&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Functional Context&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Functional Viewpoint Steps&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Refine Use Case Model - 유즈케이스 다이어그램 다시 그리기 &lt;br /&gt;2.&amp;nbsp;Define&amp;nbsp;Functional&amp;nbsp;Components&amp;nbsp;-&amp;nbsp;파란색&amp;nbsp;묶는거 &lt;br /&gt;3.&amp;nbsp;Allocate&amp;nbsp;Functional&amp;nbsp;Components&amp;nbsp;-&amp;nbsp;배포&amp;nbsp;뷰에&amp;nbsp;할당 &lt;br /&gt;4.&amp;nbsp;Design&amp;nbsp;Functional&amp;nbsp;Components&amp;nbsp;-&amp;nbsp;&amp;nbsp;아래 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Functional component를 잘 찾았는지 아는 기준은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;functional component는 modularity가 높아야 함. &lt;br /&gt;cohesion높고(한&amp;nbsp;component가&amp;nbsp;one&amp;nbsp;&amp;amp;&amp;nbsp;only&amp;nbsp;기능만&amp;nbsp;handle) &lt;br /&gt;coupling&amp;nbsp;낮아야함(component간에&amp;nbsp;dependency&amp;nbsp;최소화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Design Functional Components 무엇을 정의해야 하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Defining&amp;nbsp;Visibility&amp;nbsp;-&amp;nbsp;Black,&amp;nbsp;White&amp;nbsp;Box &lt;br /&gt;Defining&amp;nbsp;Variability&amp;nbsp;-&amp;nbsp;Mediator,&amp;nbsp;Facade &lt;br /&gt;Defining&amp;nbsp;Interfaces&amp;nbsp;-&amp;nbsp;Opened,&amp;nbsp;Closed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인터페이스 디자인 원리 말하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노출이&amp;nbsp;적을수록&amp;nbsp;좋다 &lt;br /&gt;Method가&amp;nbsp;Field보다&amp;nbsp;좋다 &lt;br /&gt;Factory가&amp;nbsp;Constructor보다&amp;nbsp;좋다 &lt;br /&gt;한&amp;nbsp;가지&amp;nbsp;기능,&amp;nbsp;SRP &lt;br /&gt;구현이&amp;nbsp;API에&amp;nbsp;영향&amp;nbsp;주어서는&amp;nbsp;안&amp;nbsp;된다. &lt;br /&gt;접근성&amp;nbsp;최소화&amp;nbsp;캡슐화 &lt;br /&gt;이름을&amp;nbsp;잘&amp;nbsp;지어라 &lt;br /&gt;테스트에&amp;nbsp;염두&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;white box / black box&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;white&amp;nbsp;box&amp;nbsp;compo와&amp;nbsp;black&amp;nbsp;box&amp;nbsp;compo는&amp;nbsp;UML에서&amp;nbsp;어떻게&amp;nbsp;표현할까? &lt;br /&gt;package&amp;nbsp;diagram&amp;nbsp;:&amp;nbsp;안이&amp;nbsp;다&amp;nbsp;보임.아예&amp;nbsp;interface&amp;nbsp;정의가&amp;nbsp;없음 &lt;br /&gt;class들의&amp;nbsp;단순한&amp;nbsp;집합 &lt;br /&gt;자바의&amp;nbsp;패키지는&amp;nbsp;white&amp;nbsp;box이다.&amp;nbsp;외부로부터&amp;nbsp;패키지쓸때&amp;nbsp;바로&amp;nbsp;접근 &lt;br /&gt;component&amp;nbsp;diagram&amp;nbsp;:&amp;nbsp;black&amp;nbsp;box.&amp;nbsp;interface정의&amp;nbsp;있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Information View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적&amp;nbsp;데이터&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;정보를&amp;nbsp;분배하는&amp;nbsp;방법을&amp;nbsp;묘사한다.&amp;nbsp;내용,&amp;nbsp;구조,&amp;nbsp;지연,&amp;nbsp;참조,&amp;nbsp;ownership,&amp;nbsp;data&amp;nbsp;migration을&amp;nbsp;고려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Information Context 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스&amp;nbsp;정의,&amp;nbsp;관계&amp;nbsp;정의,&amp;nbsp;카디널리티&amp;nbsp;정의,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Information&amp;nbsp;Viewpoint&amp;nbsp;Steps&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Refine&amp;nbsp;Object&amp;nbsp;Model&amp;nbsp;-&amp;nbsp;클래스&amp;nbsp;다이어그램&amp;nbsp;다시&amp;nbsp;그리기 &lt;br /&gt;2.&amp;nbsp;Define&amp;nbsp;Data&amp;nbsp;Components&amp;nbsp;-&amp;nbsp;파란색&amp;nbsp;묶는거 &lt;br /&gt;3.&amp;nbsp;Allocate&amp;nbsp;Data&amp;nbsp;Components&amp;nbsp;-&amp;nbsp;배포&amp;nbsp;뷰에&amp;nbsp;할당 &lt;br /&gt;4.&amp;nbsp;Design&amp;nbsp;Data&amp;nbsp;Components&amp;nbsp;-&amp;nbsp;메서드,&amp;nbsp;어트리뷰트,&amp;nbsp;인터페이스&amp;nbsp;정의&amp;nbsp;등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Behavior View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의&amp;nbsp;런타임&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;식별하고&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Behavior Context 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행동 패턴 관찰, 기능 그룹에 대한 스케치 제어 흐름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Behavior Viewpoint Steps&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Define&amp;nbsp;Overall&amp;nbsp;Control&amp;nbsp;Flow&amp;nbsp;-&amp;nbsp;재작성 &lt;br /&gt;2.&amp;nbsp;Identify&amp;nbsp;Complex&amp;nbsp;Behavior&amp;nbsp;-&amp;nbsp;하나&amp;nbsp;골라서&amp;nbsp;상세히&amp;nbsp;작성 &lt;br /&gt;3.&amp;nbsp;Define&amp;nbsp;Detailed&amp;nbsp;Control&amp;nbsp;Flows&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Behavior 용어 정의, activity와 action의 차이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action&amp;nbsp;:&amp;nbsp;atomic&amp;nbsp;operation(완료하거나&amp;nbsp;중지하거나&amp;nbsp;둘중하나뿐인상태) &lt;br /&gt;fault&amp;nbsp;발생시&amp;nbsp;abort&amp;nbsp;되는&amp;nbsp;단위 &lt;br /&gt;activity&amp;nbsp;:&amp;nbsp;group&amp;nbsp;of&amp;nbsp;action&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Detail activity 설명할때 diagram쓰는 이유와 장단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. common vocabulary. 내 설계를 다른 사람이 볼때 오해없어 &lt;br /&gt;2.&amp;nbsp;specific&amp;nbsp;purpose&amp;nbsp;:&amp;nbsp;내목적에&amp;nbsp;맞는&amp;nbsp;diagram &lt;br /&gt;3.&amp;nbsp;limited&amp;nbsp;vocabulary&amp;nbsp;:&amp;nbsp;(장점)precise&amp;nbsp;(단점)&amp;nbsp;표현력이&amp;nbsp;떨어짐 &lt;br /&gt;표현력&amp;nbsp;떨어지는걸&amp;nbsp;보안하기&amp;nbsp;위해&amp;nbsp;슈도코드로&amp;nbsp;표현.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Development View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어&amp;nbsp;개발&amp;nbsp;프로세스&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;환경,&amp;nbsp;런타임&amp;nbsp;환경을&amp;nbsp;고려한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment Views 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템이 적용되는 환경을 설명합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment Viewpoint Steps&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Define Nodes &lt;br /&gt;2.&amp;nbsp;Define&amp;nbsp;Network&amp;nbsp;Connectivity &lt;br /&gt;3.&amp;nbsp;Deploy&amp;nbsp;Software&amp;nbsp;Artifacts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Operational View 무엇인가요? &lt;br /&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;지침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;facade, mediator의 차이가 뭔가요?&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부를 안보여주는것은 똑같다 &lt;br /&gt;&lt;br /&gt;facade&amp;nbsp;:&amp;nbsp;외부&amp;nbsp;component가&amp;nbsp;직접&amp;nbsp;들어오지&amp;nbsp;못하게&amp;nbsp;블랙박스화&amp;nbsp;하는&amp;nbsp;것. &lt;br /&gt;외부에서&amp;nbsp;온것을&amp;nbsp;내부에&amp;nbsp;delegate&amp;nbsp;하는것. &lt;br /&gt;외부와&amp;nbsp;내부를&amp;nbsp;decoupled&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;br /&gt;flow가&amp;nbsp;client마다&amp;nbsp;다르다면&amp;nbsp;facade. &lt;br /&gt;mdeiator&amp;nbsp;:&amp;nbsp;컨트롤&amp;nbsp;알고리즘&amp;nbsp;로직&amp;nbsp;수행등을&amp;nbsp;한다.&amp;nbsp;내부적으로&amp;nbsp;취합할게&amp;nbsp;있다면,&amp;nbsp;기능을&amp;nbsp;수행할&amp;nbsp;순서가&amp;nbsp;정해져&amp;nbsp;있다면.&amp;nbsp;mediator&amp;nbsp;=&amp;nbsp;coordinator &lt;br /&gt;flow가 고정되어 있다면 mediator&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/142</guid>
      <comments>https://camelact.tistory.com/142#entry142comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:05:44 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Skeleton/Core Architecture</title>
      <link>https://camelact.tistory.com/141</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architect란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Architect : 한정된 자원 내에서 기능 및 품질 요구사항을 최대한 끌어올릴수 있도록 균형을 맞추는 사람, Concern을 잘 포착하고 이것을 설계에 반영함 &lt;br /&gt;통찰력,&amp;nbsp;추상화,&amp;nbsp;설득력&amp;nbsp;필요 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture Style Pattern 적용 효과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안정성, 의사소통, 생산성, 재사용, 접근성 &lt;br /&gt;디자인&amp;nbsp;패턴에서는&amp;nbsp;솔루션이&amp;nbsp;들어가야한다 &lt;br /&gt;아키텍쳐스타일에선&amp;nbsp;유형이&amp;nbsp;들어가야한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture 설득 방법.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATAM, Trade off, Risk 등을 분석 설득, 판단의 근거를 Tracebility하게 남겨두어야 근거로 쓸 수 있다. &lt;br /&gt;Architecture:&amp;nbsp;Definition&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아키텍처란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;말한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architecture Style &amp;amp; Pattern 차이? &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXz9HH/btrK1gJRfVo/D3Cmp2ktalFvLQiVS3j0ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXz9HH/btrK1gJRfVo/D3Cmp2ktalFvLQiVS3j0ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXz9HH/btrK1gJRfVo/D3Cmp2ktalFvLQiVS3j0ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXz9HH%2FbtrK1gJRfVo%2FD3Cmp2ktalFvLQiVS3j0ck%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;527&quot; height=&quot;97&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;213&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;h3 data-ke-size=&quot;size23&quot;&gt;Architecture Description의 세 가지는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skeleton&amp;nbsp;Architecture&amp;nbsp;-&amp;nbsp;Architecture&amp;nbsp;Styles &lt;br /&gt;Design&amp;nbsp;for&amp;nbsp;NFRs&amp;nbsp;-&amp;nbsp;Architecture&amp;nbsp;Tactics&amp;nbsp;for&amp;nbsp;NFRs &lt;br /&gt;Design&amp;nbsp;for&amp;nbsp;Views&amp;nbsp;-&amp;nbsp;Architecture&amp;nbsp;&amp;nbsp;Viewpoints&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Quality Attributes and Software Architecture &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3UWQS/btrKUS5geXu/7MsqzNx3e9GfFqdc8nAaL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3UWQS/btrKUS5geXu/7MsqzNx3e9GfFqdc8nAaL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3UWQS/btrKUS5geXu/7MsqzNx3e9GfFqdc8nAaL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3UWQS%2FbtrKUS5geXu%2F7MsqzNx3e9GfFqdc8nAaL0%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;527&quot; height=&quot;364&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Robustness : 견고함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Trade off 예를 들어 설명하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능과&amp;nbsp;품질은&amp;nbsp;상호&amp;nbsp;독립적(orthogonal)이다. &lt;br /&gt;품질&amp;nbsp;속성은&amp;nbsp;반드시&amp;nbsp;초기&amp;nbsp;설계에&amp;nbsp;반영이&amp;nbsp;되어야&amp;nbsp;한다. &lt;br /&gt;아키텍처&amp;nbsp;구성에&amp;nbsp;있어&amp;nbsp;품질&amp;nbsp;속성&amp;nbsp;간&amp;nbsp;Trade-off가&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Skeleton Architecture Design, Step 말하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조적 특성 관찰,&amp;nbsp; &lt;br /&gt;후보&amp;nbsp;Architectural&amp;nbsp;Styles&amp;nbsp;정의,&amp;nbsp; &lt;br /&gt;후보&amp;nbsp;아키텍처&amp;nbsp;스타일&amp;nbsp;평가,&amp;nbsp; &lt;br /&gt;아키텍처&amp;nbsp;스타일&amp;nbsp;통합,&amp;nbsp; &lt;br /&gt;정교한&amp;nbsp;스켈레톤&amp;nbsp;아키텍처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;아키텍처 스타일 통합 순서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Tiers 관련된 스타일 &lt;br /&gt;-&amp;nbsp;Tier-based&amp;nbsp;Architecture&amp;nbsp;Styles &lt;br /&gt;-&amp;nbsp;Client&amp;nbsp;Server&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;N-tier&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Peer-to-Peer&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Load-balancing&amp;nbsp;Architecture&amp;nbsp;Styles &lt;br /&gt;-&amp;nbsp;Broker&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Dispatcher&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Master&amp;nbsp;Slave&amp;nbsp;architecture&amp;nbsp;style&amp;bull; &lt;br /&gt;-&amp;nbsp;Edge-based&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;서비스&amp;nbsp;관련&amp;nbsp;스타일 &lt;br /&gt;-&amp;nbsp;Microservice&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Service-Oriented&amp;nbsp;Architecture&amp;nbsp;(SOA)&amp;nbsp;style &lt;br /&gt;&lt;br /&gt;3&amp;nbsp;레이어드&amp;nbsp;스타일 &lt;br /&gt;-&amp;nbsp;Layered&amp;nbsp;architecture&amp;nbsp;Style &lt;br /&gt;-&amp;nbsp;MVC&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;행동&amp;nbsp;스타일 &lt;br /&gt;-&amp;nbsp;Batch&amp;nbsp;Sequential&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Pipe-n-Filter&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Event-Driven&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Publish-and-Subscriber&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;가변성&amp;nbsp;있는&amp;nbsp;스타일 &lt;br /&gt;-&amp;nbsp;Micro&amp;nbsp;Kernel&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Microservice&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;-&amp;nbsp;Blackboard&amp;nbsp;architecture&amp;nbsp;style &lt;br /&gt;Component간의&amp;nbsp;Interactions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Skeleton Architecture를 완성한 후 Component간의 Interactions을 정의하는 이유는 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&amp;nbsp;Interaction은&amp;nbsp;Component간의&amp;nbsp;의존성과&amp;nbsp;영구적인&amp;nbsp;관계에&amp;nbsp;대한&amp;nbsp;설명이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;function&amp;nbsp;call과&amp;nbsp;커뮤니케이션이&amp;nbsp;필요한&amp;nbsp;Component간의&amp;nbsp;메시지&amp;nbsp;전송을&amp;nbsp;보여준다.&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/141</guid>
      <comments>https://camelact.tistory.com/141#entry141comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:04:51 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Architecture Styles</title>
      <link>https://camelact.tistory.com/140</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Active Repository Architecture Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스타일은 리포지토리의 데이터 세트가 응용 프로그램( 예: 접근 모듈)에서 수동으로 액세스하는 공유 리포지토리 아키텍처 스타일을 약간 수정한 것입니다. 데이터세트 의 수동적 공유 는 Active Repository 아키텍처 스타일에서 능동 공유 로 변경됩니다 . 활성 저장소 는 구독자, 즉 응용 프로 그램의 레지스트리를 유지 관리하고 저장소 업데이트 이벤트를 구독자에게 적극적으로 알립니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Batch Sequential Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대용량 처리에 용이 &lt;br /&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;실행이&amp;nbsp;끝날&amp;nbsp;때까지&amp;nbsp;기다립니다. &lt;br /&gt;각&amp;nbsp;Sub&amp;nbsp;System을&amp;nbsp;독립적으로&amp;nbsp;처리하는&amp;nbsp;프로그램이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;cons&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Blackboard Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Shared data, database와 같은 데이터 중심 패턴 중에 하나 &lt;br /&gt;명확히&amp;nbsp;정의된&amp;nbsp;문제&amp;nbsp;해법이&amp;nbsp;없을&amp;nbsp;때&amp;nbsp;문제를&amp;nbsp;풀어가는&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;지식을&amp;nbsp;조합하는&amp;nbsp;패턴 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&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;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXI3w/btrKZeM6sFE/luZrtKnw0d3gQE54xJMlj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXI3w/btrKZeM6sFE/luZrtKnw0d3gQE54xJMlj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXI3w/btrKZeM6sFE/luZrtKnw0d3gQE54xJMlj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXI3w%2FbtrKZeM6sFE%2FluZrtKnw0d3gQE54xJMlj1%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;527&quot; height=&quot;264&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros : 완벽한 해법을 찾기 어려운 경우에 사용할 수 있음; 다양한 실험 가능 &lt;br /&gt;KS,&amp;nbsp;Control,&amp;nbsp;Blackboard&amp;nbsp;가&amp;nbsp;독립적으로&amp;nbsp;동작하여&amp;nbsp;가변성이나&amp;nbsp;유지보수&amp;nbsp;성이&amp;nbsp;좋음 &lt;br /&gt;KS는&amp;nbsp;타&amp;nbsp;문제&amp;nbsp;도메인에&amp;nbsp;재사용될&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;장애&amp;nbsp;허용(Fault&amp;nbsp;tolerance)과&amp;nbsp;저항성(robustness)을&amp;nbsp;지원함&amp;nbsp; &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;계산&amp;nbsp;결과가&amp;nbsp;항상&amp;nbsp;동일하지&amp;nbsp;않아&amp;nbsp;테스트가&amp;nbsp;어려움 &lt;br /&gt;어떤&amp;nbsp;좋은&amp;nbsp;해법도&amp;nbsp;완벽하다고&amp;nbsp;장담할&amp;nbsp;수&amp;nbsp;없음 &lt;br /&gt;좋은&amp;nbsp;전략&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;노력이&amp;nbsp;필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Broker Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처는 특정 시스템 혹은 특정 구현의 세 부 사항을 컴포넌트나 서비스 사용자로부터 숨겨야 함 &lt;br /&gt;Broker&amp;nbsp;컴포넌트가&amp;nbsp;클라이언트와&amp;nbsp;서버의&amp;nbsp;정보를&amp;nbsp;가지고&amp;nbsp;있어&amp;nbsp;서로간의&amp;nbsp;통신을&amp;nbsp;조율 &lt;br /&gt;클라이언트와&amp;nbsp;서버&amp;nbsp;Proxy를&amp;nbsp;두어&amp;nbsp;특정&amp;nbsp;환경과&amp;nbsp;관련된&amp;nbsp;부분을&amp;nbsp;처리 &lt;br /&gt;브로커는&amp;nbsp;그때그때마다&amp;nbsp;서버&amp;nbsp;호출이&amp;nbsp;바뀔수&amp;nbsp;있다&amp;nbsp;Stateless&amp;nbsp;&amp;lt;-&amp;gt;&amp;nbsp;디스패처는&amp;nbsp;Dedicated&amp;nbsp; &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp; &lt;br /&gt;컴포넌트간의&amp;nbsp;위치&amp;nbsp;투명성,&amp;nbsp;컴포넌트의&amp;nbsp;가변성(Changeability)과&amp;nbsp;확장성(Extensibility)이&amp;nbsp;보장,&amp;nbsp;플랫폼&amp;nbsp;간의&amp;nbsp;이식가능성(Portability)&amp;nbsp;제공함,&amp;nbsp;재사용&amp;nbsp;컴포넌트&amp;nbsp;확보에&amp;nbsp;용이(Reusability) &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp; &lt;br /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Client-Sever Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros : 분산 환경에서 UI presentation와 business logic의 분리에 용이함. &lt;br /&gt;Server의&amp;nbsp;reusability가&amp;nbsp;높음. &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;요구&amp;nbsp;사항&amp;nbsp;변경시&amp;nbsp;client/server&amp;nbsp;양단을&amp;nbsp;변경해야하는&amp;nbsp;번거로움이&amp;nbsp;있음. &lt;br /&gt;Server의&amp;nbsp;가용성,&amp;nbsp;안정성을&amp;nbsp;유지하는데&amp;nbsp;어려움이&amp;nbsp;있음. &lt;br /&gt;Server/Client가&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dispatch Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QoS evaluator랑 Sever allocator &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp;서버의&amp;nbsp;교환가능성&amp;nbsp;보장,&amp;nbsp;서버의&amp;nbsp;위치&amp;nbsp;투명성&amp;nbsp;보장,&amp;nbsp;서버의&amp;nbsp;재구성&amp;nbsp;가능,&amp;nbsp;장애&amp;nbsp;허용성&amp;nbsp;보장,&amp;nbsp;availability가&amp;nbsp;높아짐,&amp;nbsp;Scalability가&amp;nbsp;높아짐. &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;명시적이며&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Edge Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros : 응답 지연(Latency) 감소, 대역폭(Bandwidth) 요구 감소, 신뢰성(Reliability) 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;cons&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Layered Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어는 펑션콜이지 네트웍이 아니다 &lt;br /&gt;소프트웨어를&amp;nbsp;레이어&amp;nbsp;단위로&amp;nbsp;분할 &lt;br /&gt;각&amp;nbsp;레이어는&amp;nbsp;인터페이스를&amp;nbsp;가진&amp;nbsp;가상&amp;nbsp;머신(virtual&amp;nbsp;machine)&amp;nbsp; &lt;br /&gt;가상&amp;nbsp;머신은&amp;nbsp;엄격한&amp;nbsp;순서&amp;nbsp;관계에&amp;nbsp;따라&amp;nbsp;상호작용 &lt;br /&gt;&lt;br /&gt;하위&amp;nbsp;레이어의&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;br /&gt;&lt;br /&gt;시스템의 규모가 커서 분해할 필요가 있을 경우 &lt;br /&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;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp; &lt;br /&gt;레이어&amp;nbsp;별&amp;nbsp;연동을&amp;nbsp;한정할&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;Loosely&amp;nbsp;coupled&amp;nbsp;원칙을&amp;nbsp;지킬&amp;nbsp;수&amp;nbsp;있음,&amp;nbsp;레이어&amp;nbsp;재사용&amp;nbsp;가능&amp;nbsp; &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;&amp;nbsp;레이어&amp;nbsp;동작&amp;nbsp;변경&amp;nbsp;시&amp;nbsp;단계별&amp;nbsp;재작업&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Master Slave Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros : 교환가능성(Exchangeability)와 확장성(Extensibility)을 도입, 관심사항(Concerns)의 분리가 가능, 병렬 계산을 신중히 구현하면, 특정 계산에서의 성능 향상 가능&amp;nbsp; &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;Master의&amp;nbsp;작업&amp;nbsp;분할,&amp;nbsp;할당,&amp;nbsp;대기,&amp;nbsp;결과&amp;nbsp;계산&amp;nbsp;등을&amp;nbsp;위한&amp;nbsp;처리&amp;nbsp;시간과&amp;nbsp;공간&amp;nbsp;필요&amp;nbsp;-&amp;nbsp;Feasibility &lt;br /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Microkernel Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의 요구사항이 변할 때, 이를 쉽게 시스템에 반영하기 위한 패턴, 일반적인 시스템의 기능에서 최소 핵심 기능은 공통으로 두고 변경이 가능한 확장 부분을&amp;nbsp; &lt;br /&gt;&amp;nbsp;-&amp;nbsp;플러그인&amp;nbsp;방식으로&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;패턴 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Microkernel&amp;nbsp;은&amp;nbsp;파일이나&amp;nbsp;프로세스처럼&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;br /&gt;&amp;nbsp;-&amp;nbsp;Microkernel&amp;nbsp;내에&amp;nbsp;구현할&amp;nbsp;필요가&amp;nbsp;없는&amp;nbsp;핵심&amp;nbsp;기능은&amp;nbsp;Internal&amp;nbsp;server로&amp;nbsp;분리시&amp;nbsp;켜&amp;nbsp;크기나&amp;nbsp;복잡성을&amp;nbsp;줄임 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;External&amp;nbsp;server에는&amp;nbsp;External&amp;nbsp;server&amp;nbsp;자체의&amp;nbsp;뷰를&amp;nbsp;구현하고&amp;nbsp;Microkernel&amp;nbsp;의&amp;nbsp;인터페이스를&amp;nbsp;이용하여&amp;nbsp;연동함 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Client는&amp;nbsp;Microkernel의&amp;nbsp;통신&amp;nbsp;기능을&amp;nbsp;이용하여&amp;nbsp;External&amp;nbsp;server와&amp;nbsp;통신 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgpxJy/btrKWB9MVM2/iay5KTF74GxdIW5rb8PiZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgpxJy/btrKWB9MVM2/iay5KTF74GxdIW5rb8PiZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgpxJy/btrKWB9MVM2/iay5KTF74GxdIW5rb8PiZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgpxJy%2FbtrKWB9MVM2%2Fiay5KTF74GxdIW5rb8PiZK%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;527&quot; height=&quot;289&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros : 모듈 단위 개발로 확장과 포팅이 용이, 이식성이 보장, 유연성과 교환가능성이 확보, 유지보수성과 가변성을 향상, 확장성(Scalability) 확보(새 머신 추가), 신뢰성 지원(서버 문제), 투명성을 제공 &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;메시지&amp;nbsp;전달하는&amp;nbsp;방식으로&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템이 3개의 레이어로 명확하게 분할된 경우.&amp;nbsp; &lt;br /&gt;시스템이&amp;nbsp;고도로&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;독립&amp;nbsp;적으로&amp;nbsp;모델링&amp;nbsp;해야&amp;nbsp;하는&amp;nbsp;경우. &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp; &lt;br /&gt;동일한&amp;nbsp;모델로부터&amp;nbsp;여러&amp;nbsp;View&amp;nbsp;들을&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;View의&amp;nbsp;추가,&amp;nbsp;변경,&amp;nbsp;삭제가&amp;nbsp;자유로움 &lt;br /&gt;프레임워크로&amp;nbsp;확장하여&amp;nbsp;구현이&amp;nbsp;가능함 &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;: &lt;br /&gt;설계가&amp;nbsp;복잡하고&amp;nbsp;개발이&amp;nbsp;어려움&amp;nbsp; &lt;br /&gt;View와&amp;nbsp;Controller는&amp;nbsp;밀접히&amp;nbsp;관련되어&amp;nbsp;있음&amp;nbsp;-&amp;nbsp;재사용&amp;nbsp;어려움 &lt;br /&gt;모델의&amp;nbsp;인터페이스를&amp;nbsp;변경하면&amp;nbsp;View와&amp;nbsp;Controller로&amp;nbsp;변경&amp;nbsp;되어야&amp;nbsp;함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Micro Service Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인은 공통 REST 기반 웹 인터페이스 &lt;br /&gt;서비스를&amp;nbsp;독립적으로&amp;nbsp;배포할&amp;nbsp;수&amp;nbsp;있습니다 &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp;확장성,&amp;nbsp;탄력성,&amp;nbsp;진화성 &lt;br /&gt;오류의&amp;nbsp;고립(Fault&amp;nbsp;Isolation)을&amp;nbsp;돕는다.&amp;nbsp;새로운&amp;nbsp;기술을&amp;nbsp;도입,&amp;nbsp;적용하기가&amp;nbsp;용이하다. &lt;br /&gt;&lt;br /&gt;cons&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;복잡해&amp;nbsp;진다. &lt;br /&gt;어려운&amp;nbsp;트랜잭션&amp;nbsp;관리,&amp;nbsp;테스트의&amp;nbsp;어려움,&amp;nbsp;디버깅의&amp;nbsp;어려움,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;N-Tier Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cons : 2개 이상의 티어에 있는 데이터를 가져갈 때 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Publish-Subscribe Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Publish-Subscribe : Subject와 Observer 간에 직접적인 Dependency 존재 &lt;br /&gt;Public&amp;nbsp;Broker&amp;nbsp;Subscribe:&amp;nbsp;메시지&amp;nbsp;브로커&amp;nbsp;따로&amp;nbsp;존재,&amp;nbsp;비동기&amp;nbsp;방식 &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp;새로운&amp;nbsp;event&amp;nbsp;handler&amp;nbsp;(event&amp;nbsp;listener)를&amp;nbsp;추가하기&amp;nbsp;용이함. &lt;br /&gt;동적인&amp;nbsp;등록&amp;nbsp;절차를&amp;nbsp;통해&amp;nbsp;event&amp;nbsp;source와&amp;nbsp;listener가&amp;nbsp;연결되므로&amp;nbsp;event&amp;nbsp;source와&amp;nbsp;listener가&amp;nbsp;runtime에&amp;nbsp;변경되기&amp;nbsp;용이함 &lt;br /&gt;&lt;br /&gt;cons:&amp;nbsp;Event&amp;nbsp;listener의&amp;nbsp;동작이&amp;nbsp;언제&amp;nbsp;끝날지&amp;nbsp;예상되지&amp;nbsp;않아&amp;nbsp;테스트와&amp;nbsp;디버깅이&amp;nbsp;어려움. &lt;br /&gt;Non-deterministic&amp;nbsp;한&amp;nbsp;문제:&amp;nbsp;전달하지&amp;nbsp;못할&amp;nbsp;수도&amp;nbsp;있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pipe-n-Filter Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros :&amp;nbsp; &lt;br /&gt;Concurrency:&amp;nbsp;High&amp;nbsp;throughput &lt;br /&gt;Reusability:&amp;nbsp;단계별&amp;nbsp;프로세싱이&amp;nbsp;filter로&amp;nbsp;filter를&amp;nbsp;변경함으로써&amp;nbsp;Encapsulation되어&amp;nbsp;끼워넣거나&amp;nbsp;치환하기가&amp;nbsp;쉽다. &lt;br /&gt;Modifiability:&amp;nbsp;pipe를&amp;nbsp;통한&amp;nbsp;filter간&amp;nbsp;연결로&amp;nbsp;filter간&amp;nbsp;low&amp;nbsp;coupling이&amp;nbsp;형성되어&amp;nbsp;새로운&amp;nbsp;filter를&amp;nbsp;추가할&amp;nbsp;때&amp;nbsp;다른&amp;nbsp;filter에&amp;nbsp;주는&amp;nbsp;영향이&amp;nbsp;적다. &lt;br /&gt;Flexibility:&amp;nbsp;Sequential&amp;nbsp;execution과&amp;nbsp;parallel&amp;nbsp;execution&amp;nbsp;두가지를&amp;nbsp;지원함. &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp; &lt;br /&gt;Interaction이&amp;nbsp;많은&amp;nbsp;경우에&amp;nbsp;적합하지&amp;nbsp;않음. &lt;br /&gt;Pip를&amp;nbsp;통과할&amp;nbsp;때마다&amp;nbsp;data&amp;nbsp;parsing에&amp;nbsp;대한&amp;nbsp;overhead가&amp;nbsp;늘어남. &lt;br /&gt;다중&amp;nbsp;입력을&amp;nbsp;받는&amp;nbsp;Filter의&amp;nbsp;경우&amp;nbsp;모든&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;경우,&amp;nbsp;과부하&amp;nbsp;발생 &lt;br /&gt;에러&amp;nbsp;처리가&amp;nbsp;어려움&amp;nbsp; &lt;br /&gt;&lt;br /&gt;batch&amp;nbsp;sequential&amp;nbsp;스타일과의&amp;nbsp;차이점 &lt;br /&gt;Batch-sequential&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Peer to Peer Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pros : 분할은 분산 시스템 플랫폼 상의 배치에 있어 유연성(flexibility)을 제공, CPU와 디스크 자원의 효율적인 사용, 탈중화된 컴퓨팅 지원, 특정 노드 장애 감내 &lt;br /&gt;&lt;br /&gt;cons&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Presentation Abstraction Control Architecture Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAC 스타일의 시스템은 대화형 소프트웨어 시스템을 위한 협력 에이전트의 트리와 같은 계층을 정의합니다. &lt;br /&gt;계층에는&amp;nbsp;최상위&amp;nbsp;에이전트,&amp;nbsp;중간&amp;nbsp;수준&amp;nbsp;에이전트가&amp;nbsp;포함됩니다. &lt;br /&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Presentation(View,&amp;nbsp;Controller),&amp;nbsp;Abstraction(Model),&amp;nbsp;Control&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shared Repository Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cons: &lt;br /&gt;데이터와&amp;nbsp;계산을&amp;nbsp;데이터&amp;nbsp;저장소와&amp;nbsp;데이터&amp;nbsp;접근자에&amp;nbsp;매핑시키는&amp;nbsp;방법이&amp;nbsp;중요&amp;nbsp; &lt;br /&gt;성능은&amp;nbsp;향상시키지만&amp;nbsp;복잡성을&amp;nbsp;증가시키고&amp;nbsp;신뢰성과&amp;nbsp;보안을&amp;nbsp;감소, &lt;br /&gt;스트럭쳐가&amp;nbsp;바뀌면&amp;nbsp;사용하는&amp;nbsp;부분에서&amp;nbsp;다&amp;nbsp;바꾸어주어야한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sensor Controller Actuator Architecture Style&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스타일은 주로 시스템 환경 컨텍스트를 읽는 센서와 환경 설정을 제어하는 액 추에이터를 연결하는 임베디드 시스템을 설계하는 데 사용됩니다. 수행 동작 결정, 명령 전송 등을 수행. closed-loop &lt;br /&gt;&lt;br /&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;높일&amp;nbsp;수&amp;nbsp;있습&amp;nbsp;니다. &lt;br /&gt;&lt;br /&gt;SOA 데이터베이스가 하나,&amp;nbsp; &lt;br /&gt;마이크로서비스는 데이터베이스도 다 분리 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg8X3v/btrK1qZYFj5/fcRm8xRmU1LFVgQSiVcXGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg8X3v/btrK1qZYFj5/fcRm8xRmU1LFVgQSiVcXGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg8X3v/btrK1qZYFj5/fcRm8xRmU1LFVgQSiVcXGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg8X3v%2FbtrK1qZYFj5%2FfcRm8xRmU1LFVgQSiVcXGk%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;527&quot; height=&quot;172&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;244&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;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/140</guid>
      <comments>https://camelact.tistory.com/140#entry140comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:04:01 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Requirement Engineering</title>
      <link>https://camelact.tistory.com/139</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Error/Fault/Failure&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error/Fault/Failure&amp;nbsp;각각을&amp;nbsp;설명하세요. &lt;br /&gt;Error &lt;br /&gt;-&amp;nbsp;Incorrect&amp;nbsp;usage&amp;nbsp;of&amp;nbsp;software&amp;nbsp;by&amp;nbsp;users&amp;nbsp;-&amp;nbsp;Bad&amp;nbsp;design&amp;nbsp;by&amp;nbsp;architects&amp;nbsp;-&amp;nbsp;Bad&amp;nbsp;programming&amp;nbsp;by&amp;nbsp;developers&amp;nbsp;-&amp;nbsp;Inadequate&amp;nbsp;testing&amp;nbsp;by&amp;nbsp;testers&amp;nbsp;-&amp;nbsp;Incorrect&amp;nbsp;configuration&amp;nbsp;by&amp;nbsp;build&amp;nbsp;members &lt;br /&gt;Fault &lt;br /&gt;-&amp;nbsp;An&amp;nbsp;incorrect&amp;nbsp;statement&amp;nbsp;-&amp;nbsp;Wrong&amp;nbsp;data&amp;nbsp;type&amp;nbsp;-&amp;nbsp;Wrong&amp;nbsp;formula&amp;nbsp;in&amp;nbsp;design&amp;nbsp;document&amp;nbsp;-&amp;nbsp;Missing&amp;nbsp;functionality&amp;nbsp;in&amp;nbsp;the&amp;nbsp;system &lt;br /&gt;Failure &lt;br /&gt;-&amp;nbsp;Faulty&amp;nbsp;piece&amp;nbsp;of&amp;nbsp;code&amp;nbsp;is&amp;nbsp;executed&amp;nbsp;leading&amp;nbsp;to&amp;nbsp;an&amp;nbsp;incorrect&amp;nbsp;state&amp;nbsp;that&amp;nbsp;propagates&amp;nbsp;to&amp;nbsp;the&amp;nbsp;program&amp;rsquo;s&amp;nbsp;output. &lt;br /&gt;&lt;br /&gt;Error&amp;nbsp;:&amp;nbsp;개발&amp;nbsp;개발자에의해&amp;nbsp;나온&amp;nbsp;도중에&amp;nbsp;나온&amp;nbsp;문제점 &lt;br /&gt;Fault:&amp;nbsp;기능&amp;nbsp;동작상의&amp;nbsp;비정상적&amp;nbsp;상황&amp;nbsp;발생&amp;nbsp;&amp;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;br /&gt;System&amp;nbsp;Failure&amp;nbsp;:&amp;nbsp;Server의&amp;nbsp;system&amp;nbsp;down&amp;nbsp;&amp;gt;&amp;nbsp;서버나&amp;nbsp;component가&amp;nbsp;아예&amp;nbsp;멈추는&amp;nbsp;것 &lt;br /&gt;&lt;br /&gt;유입의&amp;nbsp;순서&amp;nbsp;:&amp;nbsp;Error&amp;nbsp;-&amp;nbsp;Fault&amp;nbsp;-&amp;nbsp;Failure&amp;nbsp; &lt;br /&gt;발견의&amp;nbsp;순서&amp;nbsp;:&amp;nbsp;Failure&amp;nbsp;-&amp;nbsp;Fault&amp;nbsp;-&amp;nbsp;Error&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Needs와 Requirements 무엇이&amp;nbsp;다른가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;needs &lt;br /&gt;:&amp;nbsp;고객이&amp;nbsp;실제&amp;nbsp;원하는것,&amp;nbsp;인포말 &lt;br /&gt;requirement &lt;br /&gt;:&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Requirements 대상과 목적에 따른 구분 세&amp;nbsp;가지는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Business Requirements &lt;br /&gt;조직의&amp;nbsp;목표,&amp;nbsp;프로젝트&amp;nbsp;이유,&amp;nbsp;Business&amp;nbsp;Use&amp;nbsp;Cases,&amp;nbsp;비즈니스&amp;nbsp;규칙은&amp;nbsp;프로젝트&amp;nbsp;수준이&amp;nbsp;아니라&amp;nbsp;전사적&amp;nbsp;수준으로&amp;nbsp;다루어야&amp;nbsp;함 &lt;br /&gt;&lt;br /&gt;User&amp;nbsp;Requirements &lt;br /&gt;사용자&amp;nbsp;엑세스&amp;nbsp;서비스&amp;nbsp;조건,&amp;nbsp;사용자&amp;nbsp;서비스,&amp;nbsp;Functional&amp;nbsp;Requirements,&amp;nbsp;Non-functional&amp;nbsp;Requirements &lt;br /&gt;&lt;br /&gt;System&amp;nbsp;Requirements &lt;br /&gt;운영상의&amp;nbsp;제약,&amp;nbsp;시스템의&amp;nbsp;기능,&amp;nbsp;System&amp;nbsp;Specification,&amp;nbsp;&amp;nbsp;Sub-system&amp;nbsp;specification&amp;nbsp;&amp;nbsp;Software&amp;nbsp;Requirements&amp;nbsp;Specification&amp;nbsp;(SRS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요구 추출 기법 대강 방법 말해보시오. &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xvf5M/btrKZm5kZyl/pLBeZeYw4Hr104bNBNNQj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xvf5M/btrKZm5kZyl/pLBeZeYw4Hr104bNBNNQj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xvf5M/btrKZm5kZyl/pLBeZeYw4Hr104bNBNNQj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxvf5M%2FbtrKZm5kZyl%2FpLBeZeYw4Hr104bNBNNQj0%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;527&quot; height=&quot;248&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;307&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;h3 data-ke-size=&quot;size23&quot;&gt;요구 모델링 목적은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상적 요구사항을 정확하고 상세하게 정의 &lt;br /&gt;-&amp;nbsp;식별된&amp;nbsp;고객의&amp;nbsp;needs&amp;nbsp;만족을&amp;nbsp;확인하는&amp;nbsp;방법&amp;nbsp;제공&amp;nbsp; &lt;br /&gt;-&amp;nbsp;&amp;nbsp;business&amp;nbsp;owner&amp;rsquo;s&amp;nbsp;view를&amp;nbsp;architect&amp;rsquo;s&amp;nbsp;view으로&amp;nbsp;변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요구 모델링 단계는?&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhLk1T/btrKZ8Fwmo3/gICOTFzgTOBmF793eInl5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhLk1T/btrKZ8Fwmo3/gICOTFzgTOBmF793eInl5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhLk1T/btrKZ8Fwmo3/gICOTFzgTOBmF793eInl5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhLk1T%2FbtrKZ8Fwmo3%2FgICOTFzgTOBmF793eInl5K%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;527&quot; height=&quot;289&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;497&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;h3 data-ke-size=&quot;size23&quot;&gt;모델링의 관점은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조 관점 : Structured Analysis &lt;br /&gt;Data&amp;nbsp;Flow&amp;nbsp;Diagram&amp;nbsp;(DFD) &lt;br /&gt;Entity-Relation&amp;nbsp;Diagram&amp;nbsp;(ERD) &lt;br /&gt;State&amp;nbsp;Transition&amp;nbsp;Diagram&amp;nbsp;(STD) &lt;br /&gt;Class&amp;nbsp;Diagram &lt;br /&gt;&lt;br /&gt;기능&amp;nbsp;관점&amp;nbsp;:&amp;nbsp;Use&amp;nbsp;Case&amp;nbsp;Analysis,&amp;nbsp;Goal&amp;nbsp;and&amp;nbsp;Scenario&amp;nbsp;Based&amp;nbsp;Analysis &lt;br /&gt;Use&amp;nbsp;Case&amp;nbsp;Modeling&amp;nbsp;(UC) &lt;br /&gt;Goal-Scenario&amp;nbsp;Modeling&amp;nbsp;(GS) &lt;br /&gt;&lt;br /&gt;행위&amp;nbsp;관점:&amp;nbsp;Behavior&amp;nbsp;Analysis &lt;br /&gt;Sequence&amp;nbsp;Diagram,&amp;nbsp;Communication&amp;nbsp;Diagram&amp;nbsp;(UML)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요구사항 우선순위화, 우선순위는 어떻게 매기는가?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uDD2k/btrKY266aQ8/Z1asC1iFc0y9urSdwRY540/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDD2k/btrKY266aQ8/Z1asC1iFc0y9urSdwRY540/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDD2k/btrKY266aQ8/Z1asC1iFc0y9urSdwRY540/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDD2k%2FbtrKY266aQ8%2FZ1asC1iFc0y9urSdwRY540%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;527&quot; height=&quot;137&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Value, Cost, Risk 제약 안에서 Product value를 최대화 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요구 명세, 요구문서 품질 요소 세 가지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Correct&amp;nbsp;&amp;nbsp;정확성 &lt;br /&gt;Complete&amp;nbsp;&amp;nbsp;완전성 &lt;br /&gt;Consistent&amp;nbsp;일관성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Definition of SW Quality, 품질 요구란 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;속성). &lt;br /&gt;&lt;br /&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;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;품질 속성, Types of Quality Aspects, 품질 속성 네가지? &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkT6Bb/btrKXGQNsaS/pQWrNEWNEFdSKv5W2dndHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkT6Bb/btrKXGQNsaS/pQWrNEWNEFdSKv5W2dndHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkT6Bb/btrKXGQNsaS/pQWrNEWNEFdSKv5W2dndHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkT6Bb%2FbtrKXGQNsaS%2FpQWrNEWNEFdSKv5W2dndHK%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;527&quot; height=&quot;235&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;407&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;h3 data-ke-size=&quot;size23&quot;&gt;각&amp;nbsp;품질&amp;nbsp;속성의&amp;nbsp;관계는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process Quality : Quality of Life-cycle Process &lt;br /&gt;Internal&amp;nbsp;Quality&amp;nbsp;주로&amp;nbsp;개발자나&amp;nbsp;유지보수자가&amp;nbsp;보는&amp;nbsp;품질&amp;nbsp;속성으로&amp;nbsp;소프트웨어&amp;nbsp;실행&amp;nbsp;중&amp;nbsp;발견하기&amp;nbsp;힘든&amp;nbsp;속성임,&amp;nbsp;Development-time&amp;nbsp;품질 &lt;br /&gt;External&amp;nbsp;Quality&amp;nbsp;사용자&amp;nbsp;시각에서&amp;nbsp;소프트웨어의&amp;nbsp;runtime시&amp;nbsp;관찰되는&amp;nbsp;속성,&amp;nbsp;Run-time&amp;nbsp;품질 &lt;br /&gt;Quality&amp;nbsp;in&amp;nbsp;Use&amp;nbsp;:&amp;nbsp;소프트웨어가&amp;nbsp;포함된&amp;nbsp;환경의&amp;nbsp;품질에&amp;nbsp;대한&amp;nbsp;사용자&amp;nbsp;관점 &lt;br /&gt;환경에서&amp;nbsp;소프트웨어를&amp;nbsp;사용한&amp;nbsp;결과에서&amp;nbsp;평가 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8YJtF/btrKWBaZbxO/zjuPaoswL2kdOeSK4ISS5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8YJtF/btrKWBaZbxO/zjuPaoswL2kdOeSK4ISS5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8YJtF/btrKWBaZbxO/zjuPaoswL2kdOeSK4ISS5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8YJtF%2FbtrKWBaZbxO%2FzjuPaoswL2kdOeSK4ISS5k%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;527&quot; height=&quot;164&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;253&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;h3 data-ke-size=&quot;size23&quot;&gt;Quality Model of ISO 9126 , 6 Main Factors and Sub-Factors for each&amp;nbsp; &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PERFUM - 향수 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKgxfp/btrK0GvdS1t/PRRz1kYl6qp8jNVJ8KA3tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKgxfp/btrK0GvdS1t/PRRz1kYl6qp8jNVJ8KA3tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKgxfp/btrK0GvdS1t/PRRz1kYl6qp8jNVJ8KA3tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKgxfp%2FbtrK0GvdS1t%2FPRRz1kYl6qp8jNVJ8KA3tK%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;492&quot; height=&quot;424&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Functionality 기능을 사용할 때 오류가 있는가?, 기능들이 모두 잘 동작하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;nbsp;Suitability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Accurateness &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Interoperability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Compliance &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Security&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Usability&amp;nbsp;사용성은시스템의&amp;nbsp;입력을&amp;nbsp;준비시키고,&amp;nbsp;동작시키며,&amp;nbsp;출력하는데&amp;nbsp;드는&amp;nbsp;노력을측정함 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Understandability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Learabiliiy &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Operability &lt;br /&gt;&lt;br /&gt;Efficiency&amp;nbsp;시스템이&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;br /&gt;&amp;nbsp;-&amp;nbsp;Time&amp;nbsp;Behavior &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Resource&amp;nbsp;Behavior &lt;br /&gt;&lt;br /&gt;Maintainability&amp;nbsp;소프트웨어를&amp;nbsp;얼마나&amp;nbsp;쉽게&amp;nbsp;수정할&amp;nbsp;수&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;br /&gt;&amp;nbsp;-&amp;nbsp;Analyzability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Changeability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Stability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Testability &lt;br /&gt;&lt;br /&gt;Portability&amp;nbsp;소프트웨어가&amp;nbsp;다른&amp;nbsp;환경으로&amp;nbsp;이식될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;능력 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Adaptability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Installability &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Conformance(일치성) &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Replaceability &lt;br /&gt;&lt;br /&gt;Reliability&amp;nbsp;소프트웨어가&amp;nbsp;특정상황에서&amp;nbsp;특정기간&amp;nbsp;동안&amp;nbsp;일정&amp;nbsp;수준&amp;nbsp;이상으로&amp;nbsp;동작할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;능력 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Maturity &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Fault&amp;nbsp;Tolerance &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Recoverability &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하위&amp;nbsp;특성&amp;nbsp;대강&amp;nbsp;나열 &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pvt2x/btrK2nPudQN/QNJXELlM5H8q3CbxlFkIIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pvt2x/btrK2nPudQN/QNJXELlM5H8q3CbxlFkIIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pvt2x/btrK2nPudQN/QNJXELlM5H8q3CbxlFkIIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPvt2x%2FbtrK2nPudQN%2FQNJXELlM5H8q3CbxlFkIIK%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;527&quot; height=&quot;237&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;261&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;h3 data-ke-size=&quot;size23&quot;&gt;품질 요구 카테고리, 몇가지 예를 들어 보시오.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Availability 서비스가 이용가능하고 완벽하게 작동하는 기간에 대한 비율 (예: 가용성 99.9%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Integrity(무결성)&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;br /&gt;Interoperability(상호운영성)&amp;nbsp;시스템이&amp;nbsp;다른&amp;nbsp;장비와,&amp;nbsp;소프트웨어와&amp;nbsp;얼마나&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;br /&gt;Performance&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;br /&gt;Reliability&amp;nbsp;소프트웨어가&amp;nbsp;실행되는&amp;nbsp;특정시간&amp;nbsp;동안&amp;nbsp;장애가&amp;nbsp;발생하지&amp;nbsp;않을&amp;nbsp;확률을&amp;nbsp;말함&amp;nbsp;0.001%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Modifiability&amp;nbsp;SW&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;br /&gt;Scalability&amp;nbsp;성능이나&amp;nbsp;정확성&amp;nbsp;차이&amp;nbsp;없이&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;사용자,&amp;nbsp;데이터,&amp;nbsp;서버,&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Process of Requirement Engineering, 요구공학 절차는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 추출 &lt;br /&gt;요구&amp;nbsp;사항&amp;nbsp;모델링과&amp;nbsp;분석 &lt;br /&gt;요구사항&amp;nbsp;우선순위화 &lt;br /&gt;요구사항&amp;nbsp;명세 &lt;br /&gt;품질요구 &lt;br /&gt;요구사항&amp;nbsp;검증 &lt;br /&gt;요구사항&amp;nbsp;관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Agile Constructs for Requirement Management, 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile&amp;nbsp;Development:&amp;nbsp;빠른&amp;nbsp;프로토타이핑과&amp;nbsp;빠른&amp;nbsp;개발&amp;nbsp;경험에&amp;nbsp;비중을&amp;nbsp;둔&amp;nbsp;방법론&amp;nbsp;중&amp;nbsp;하나.&amp;nbsp;문서화나&amp;nbsp;과정&amp;nbsp;사양의&amp;nbsp;비중은&amp;nbsp;낮춤.&amp;nbsp;ex)&amp;nbsp;XP(eXtream&amp;nbsp;Programming,&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;요구사항에&amp;nbsp;대한&amp;nbsp;백로그를&amp;nbsp;만들고 &lt;br /&gt;계획과&amp;nbsp;우선순위를&amp;nbsp;하며 &lt;br /&gt;분할&amp;nbsp;그룹&amp;nbsp;생성&amp;nbsp;등에&amp;nbsp;이점을&amp;nbsp;줌 &lt;br /&gt;&amp;nbsp; &lt;br /&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;반영함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Agile Principles, 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은&amp;nbsp;변경주기를&amp;nbsp;적용한다. &lt;br /&gt;-&amp;nbsp;변경을&amp;nbsp;수용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;가능성을&amp;nbsp;확보한다.&amp;nbsp;(60%&amp;nbsp;baseline) &lt;br /&gt;-&amp;nbsp;문서를&amp;nbsp;강조하지&amp;nbsp;않고&amp;nbsp;변경&amp;nbsp;장려,&amp;nbsp;개발&amp;nbsp;초기부터&amp;nbsp;테스트&amp;nbsp;병행을&amp;nbsp;권고 &lt;br /&gt;-&amp;nbsp;Pair&amp;nbsp;programming,&amp;nbsp;informative&amp;nbsp;workspace&amp;nbsp;유지 &lt;br /&gt;-&amp;nbsp;고객이&amp;nbsp;가장&amp;nbsp;중요하게&amp;nbsp;생각하는&amp;nbsp;것을&amp;nbsp;먼저&amp;nbsp;구현&amp;nbsp; &lt;br /&gt;-&amp;nbsp;1～3주&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;br /&gt;Requirements for Platform Software에서&amp;nbsp;고려해야할&amp;nbsp;품질은? &lt;br /&gt;Scalability &lt;br /&gt;Distributed&amp;nbsp;processing&amp;nbsp;capabilities&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SW품질이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;explicit req.(문서로 정확히 정의된 요구사항),&amp;nbsp; &lt;br /&gt;implicit&amp;nbsp;req.(예상되는&amp;nbsp;변경/요구)&amp;nbsp;모두&amp;nbsp;만족해야함. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SW품질 달성 방안&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신뢰성 달성 방안 - Fault Tolerance&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;변경용이성 달성 방안 - 응집성, Information Hide, 커플링 제한, 인터페이스화, Polymorphism, Plug-in, Configuration files&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&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;br /&gt;가용성&amp;nbsp;달성&amp;nbsp;방안&amp;nbsp;-&amp;nbsp;Active&amp;nbsp;Redundancy,&amp;nbsp;Ping/echo,&amp;nbsp;Heartbeat&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;사용성 달성 방안 - Cancel, undo, 쓰는 메뉴만 노출, 예상 시간, 진행률 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Security&amp;nbsp;달성&amp;nbsp;방안&amp;nbsp;:&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;br /&gt;Performance&amp;nbsp;달성&amp;nbsp;방안&amp;nbsp;:&amp;nbsp;Periodic&amp;nbsp;cleaning,&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;br /&gt;Testability&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;br /&gt;Interoperability&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;br /&gt;Modifiability&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;br /&gt;Traceability 달성 방안 : 고유한 데이터 조각(예: 주문 날짜/시간 또는 일련 번호)의 사용&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/139</guid>
      <comments>https://camelact.tistory.com/139#entry139comment</comments>
      <pubDate>Wed, 31 Aug 2022 01:01:39 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Design Patterns - Pattern</title>
      <link>https://camelact.tistory.com/137</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Abstract Factory&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkXstY/btrK0Mvpn7c/6QItQh1xPKxh2yLnY55Ku0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkXstY/btrK0Mvpn7c/6QItQh1xPKxh2yLnY55Ku0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkXstY/btrK0Mvpn7c/6QItQh1xPKxh2yLnY55Ku0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkXstY%2FbtrK0Mvpn7c%2F6QItQh1xPKxh2yLnY55Ku0%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;527&quot; height=&quot;292&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합, 서로 독립적인 객체들의 집합을 생성할 수 있는 인터페이스를 제공하는 패턴. &lt;br /&gt;위임,&amp;nbsp;DIP,&amp;nbsp;Composition&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Adapter&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y7g5L/btrKUSKXx79/dleXso0Zf472V6eUgeFUPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y7g5L/btrKUSKXx79/dleXso0Zf472V6eUgeFUPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y7g5L/btrKUSKXx79/dleXso0Zf472V6eUgeFUPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy7g5L%2FbtrKUSKXx79%2FdleXso0Zf472V6eUgeFUPk%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;525&quot; height=&quot;229&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Composit &lt;br /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bridge&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHXj5p/btrKZwfAF2e/NtQtqea1Pg2tQ1rzOrLhi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHXj5p/btrKZwfAF2e/NtQtqea1Pg2tQ1rzOrLhi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHXj5p/btrKZwfAF2e/NtQtqea1Pg2tQ1rzOrLhi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHXj5p%2FbtrKZwfAF2e%2FNtQtqea1Pg2tQ1rzOrLhi0%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;527&quot; height=&quot;197&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;구현부에서&amp;nbsp;추상층을&amp;nbsp;분리하여&amp;nbsp;각자&amp;nbsp;독립적으로&amp;nbsp;변형할&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;종속&amp;nbsp;관계를&amp;nbsp;피하고&amp;nbsp;싶을&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어댑터 패턴과 브릿지 패턴의 차이는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;패턴 &lt;br /&gt;구조적으로 어댑터는 간단한싱글 인터페이스, 브릿지는 복잡한 분리, 전체를 앱스트랙트 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Builder&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v1ONi/btrK2ta5V4G/G26fo8rhVXpOi3anSKq10K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v1ONi/btrK2ta5V4G/G26fo8rhVXpOi3anSKq10K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v1ONi/btrK2ta5V4G/G26fo8rhVXpOi3anSKq10K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/v1ONi/btrK2ta5V4G/G26fo8rhVXpOi3anSKq10K/img.gif&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;424&quot; height=&quot;179&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composition &lt;br /&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;패턴. &lt;br /&gt;&lt;br /&gt;빌더&amp;nbsp;패턴과&amp;nbsp;팩토리&amp;nbsp;패턴의&amp;nbsp;차이점을&amp;nbsp;서술하세요. &lt;br /&gt;팩토리&amp;nbsp;패턴이랑&amp;nbsp;비교하면&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;맨&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;br /&gt;팩토리는&amp;nbsp;요청을&amp;nbsp;할&amp;nbsp;때마다&amp;nbsp;즉각적으로&amp;nbsp;리턴한다음&amp;nbsp;나중에&amp;nbsp;prepare로&amp;nbsp;만드는&amp;nbsp;것 &lt;br /&gt;여러&amp;nbsp;군들에&amp;nbsp;대한&amp;nbsp;생성을&amp;nbsp;감춘다 &lt;br /&gt;&lt;br /&gt;빌더는 &lt;br /&gt;-&amp;nbsp;메인&amp;nbsp;클래스의&amp;nbsp;인스턴스&amp;nbsp;생성전.&amp;nbsp;한번에&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;일치&amp;nbsp;(C#&amp;nbsp;JSON&amp;nbsp;??) &lt;br /&gt;-&amp;nbsp;메인&amp;nbsp;클래스의&amp;nbsp;인스턴스가.&amp;nbsp;각&amp;nbsp;클래스와&amp;nbsp;같은&amp;nbsp;기능 &lt;br /&gt;-&amp;nbsp;복잡한&amp;nbsp;객체의&amp;nbsp;단계별&amp;nbsp;생성에&amp;nbsp;중점 &lt;br /&gt;-&amp;nbsp;마지막&amp;nbsp;단계에서&amp;nbsp;생성한&amp;nbsp;제품&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;팩토리는 &lt;br /&gt;-&amp;nbsp;메인&amp;nbsp;클래스의&amp;nbsp;인스턴스&amp;nbsp;생성&amp;nbsp;후.&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;br /&gt;-&amp;nbsp;메인&amp;nbsp;클래스의&amp;nbsp;인스턴스가.&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;br /&gt;-&amp;nbsp;만드는&amp;nbsp;즉시&amp;nbsp;제품을&amp;nbsp;반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chain Of Responsibility&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&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;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNqNwG/btrK0MoDV5Y/uWVMX2QXWMIbMRiTWwp5O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNqNwG/btrK0MoDV5Y/uWVMX2QXWMIbMRiTWwp5O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNqNwG/btrK0MoDV5Y/uWVMX2QXWMIbMRiTWwp5O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNqNwG%2FbtrK0MoDV5Y%2FuWVMX2QXWMIbMRiTWwp5O0%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;527&quot; height=&quot;251&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 처리할 수 있는 기회를 하나 이상의 객체에게 부여하여 요청을 보내는 객체와 그 요청을 받는 객체 사이의 결합을 피하는 패턴. &lt;br /&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;전달. &lt;br /&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;Chain&amp;nbsp;of&amp;nbsp;Responsibility&amp;nbsp;패턴 &lt;br /&gt;-&amp;nbsp;장점&amp;nbsp;:&amp;nbsp;sender와&amp;nbsp;receiver의&amp;nbsp;디커플링,&amp;nbsp;추가에&amp;nbsp;유연함 &lt;br /&gt;-&amp;nbsp;단점&amp;nbsp;:&amp;nbsp;client는&amp;nbsp;누가&amp;nbsp;request를&amp;nbsp;handle하는지&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없다. &lt;br /&gt;- Java의 try-catch 패턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Command&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBHUo2/btrK0MoDV8R/4e36qEns1wVsGWVbqAMlQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBHUo2/btrK0MoDV8R/4e36qEns1wVsGWVbqAMlQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBHUo2/btrK0MoDV8R/4e36qEns1wVsGWVbqAMlQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBHUo2%2FbtrK0MoDV8R%2F4e36qEns1wVsGWVbqAMlQ0%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;527&quot; height=&quot;185&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;DIP &lt;br /&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;br /&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;유용하다. &lt;br /&gt;&lt;br /&gt;Request를&amp;nbsp;캡슐화&amp;nbsp;시킵니다.&amp;nbsp;클라이언트는&amp;nbsp;command&amp;nbsp;객체를&amp;nbsp;invoker에&amp;nbsp;넣어&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;동작시키는&amp;nbsp;Invoker와&amp;nbsp;전달받는&amp;nbsp;Receiver를&amp;nbsp;디커플링&amp;nbsp;시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Composite &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djl8VM/btrK1rkil6K/e6JLa26Rhx15TGPyPkUBC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djl8VM/btrK1rkil6K/e6JLa26Rhx15TGPyPkUBC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djl8VM/btrK1rkil6K/e6JLa26Rhx15TGPyPkUBC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjl8VM%2FbtrK1rkil6K%2Fe6JLa26Rhx15TGPyPkUBC0%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;484&quot; height=&quot;217&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DIP &lt;br /&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;다룸.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Decorator &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNoFtL/btrKXGiZ3Ro/MiUvICkRekiTW50AIkQX50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNoFtL/btrKXGiZ3Ro/MiUvICkRekiTW50AIkQX50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNoFtL/btrKXGiZ3Ro/MiUvICkRekiTW50AIkQX50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNoFtL%2FbtrKXGiZ3Ro%2FMiUvICkRekiTW50AIkQX50%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;358&quot; height=&quot;283&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OCP &lt;br /&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;있다.&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;Decorator 객체가 Inheritance와 Association이 모두 존재해야하는 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inheritance&amp;nbsp;:&amp;nbsp;감싸는&amp;nbsp;기능,&amp;nbsp;확장에서&amp;nbsp;모든&amp;nbsp;type이&amp;nbsp;같아야하기&amp;nbsp;때문에 &lt;br /&gt;Association&amp;nbsp;:&amp;nbsp;객체를&amp;nbsp;감싸서&amp;nbsp;기능을&amp;nbsp;추가&amp;nbsp;확장하므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Facade &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfzSxR/btrKWB232av/xbi64S6AMYcPyO9oH9Umpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfzSxR/btrKWB232av/xbi64S6AMYcPyO9oH9Umpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfzSxR/btrKWB232av/xbi64S6AMYcPyO9oH9Umpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfzSxR%2FbtrKWB232av%2Fxbi64S6AMYcPyO9oH9Umpk%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;527&quot; height=&quot;173&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브시스템에 있는 인터페이스 집합에 대해서 하나의 통합된 인터페이스를 제공하는 패턴. 서브시스템을 좀더 사용하기 편하게 만드는 상위 수준의 인터페이스를 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Factory Method &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXMNR/btrKVxGB9kD/23kcckkvusTvwerfA0hsjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXMNR/btrKVxGB9kD/23kcckkvusTvwerfA0hsjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXMNR/btrKVxGB9kD/23kcckkvusTvwerfA0hsjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXMNR%2FbtrKVxGB9kD%2F23kcckkvusTvwerfA0hsjk%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;204&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DIP &lt;br /&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;/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;AbstractFactory와 무엇이 다른가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팩토리메소드는&amp;nbsp;상속,&amp;nbsp;템플릿메소드&amp;nbsp;패턴을&amp;nbsp;포함한다 &lt;br /&gt;if(&amp;nbsp;type&amp;nbsp;==&amp;nbsp;&quot;z&quot;){&amp;nbsp;pizza&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Zpizza(); &lt;br /&gt;&lt;br /&gt;Abtract&amp;nbsp;팩토리는&amp;nbsp;델리게이션,&amp;nbsp;팩토리를&amp;nbsp;이용해서&amp;nbsp;만드는것만&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;br /&gt;pizza&amp;nbsp;=&amp;nbsp;factory.createPizza();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Flyweight &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erGmE6/btrKU7VEKqk/AWQnoOIKbFbzyUzxi5bKy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erGmE6/btrKU7VEKqk/AWQnoOIKbFbzyUzxi5bKy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erGmE6/btrKU7VEKqk/AWQnoOIKbFbzyUzxi5bKy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerGmE6%2FbtrKU7VEKqk%2FAWQnoOIKbFbzyUzxi5bKy0%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;527&quot; height=&quot;523&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 큰 객체가 여러 개 있을 때, 공유를 통해 이들을 효율적으로 지원하는 패턴. 해쉬 테이블에 자주 사용되고 반복적이며 메모리가 큰 것을 저장해두고 재사용하는것 &lt;br /&gt;&lt;br /&gt;인스턴스를&amp;nbsp;가능한&amp;nbsp;한&amp;nbsp;공유시켜서,&amp;nbsp;쓸데없이&amp;nbsp;new를&amp;nbsp;하지&amp;nbsp;않도록&amp;nbsp;한다.&amp;nbsp;&amp;ndash;&amp;nbsp;인스턴스가&amp;nbsp;필요할&amp;nbsp;때&amp;nbsp;마다&amp;nbsp;new를&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;br /&gt;Prototype은 복제를 하는 것이고 Flyweight는 있는것 그대로 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Iterator &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FaSaP/btrKU6PV3YX/DuKY7dnYkRBxLjd7sUX7qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FaSaP/btrKU6PV3YX/DuKY7dnYkRBxLjd7sUX7qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FaSaP/btrKU6PV3YX/DuKY7dnYkRBxLjd7sUX7qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFaSaP%2FbtrKU6PV3YX%2FDuKY7dnYkRBxLjd7sUX7qK%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;374&quot; height=&quot;205&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;SRP, DIP, &lt;br /&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;패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interpreter &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3q1Td/btrKZCUkN2v/hSF1oFWs3BRz4FLSa79Yfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3q1Td/btrKZCUkN2v/hSF1oFWs3BRz4FLSa79Yfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3q1Td/btrKZCUkN2v/hSF1oFWs3BRz4FLSa79Yfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3q1Td%2FbtrKZCUkN2v%2FhSF1oFWs3BRz4FLSa79Yfk%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;527&quot; height=&quot;303&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 언어에 대해, 그 언어의 문법을 위한 표현 수단을 정의하고, 그 표현 수단을 사용하여 해당 언어로 작성된 문장을 해석하는 해석기를 정의하는 패턴. &lt;br /&gt;&lt;br /&gt;프로그램이 해결하려고 하는 문제를 간단한 &amp;lsquo;미니 언어&amp;rsquo;로 표현함&amp;nbsp; &lt;br /&gt;&amp;ndash;&amp;nbsp;구체적인&amp;nbsp;문제를&amp;nbsp;미니&amp;nbsp;언어로&amp;nbsp;쓰여진&amp;nbsp;&amp;lsquo;미니&amp;nbsp;프로그램&amp;rsquo;으로&amp;nbsp;표현한다. &lt;br /&gt;&amp;ndash;&amp;nbsp;미니&amp;nbsp;프로그램을&amp;nbsp;자바&amp;nbsp;언어로&amp;nbsp;&amp;lsquo;통역&amp;rsquo;하는&amp;nbsp;역할을&amp;nbsp;하는&amp;nbsp;프로그램을&amp;nbsp;만&amp;nbsp;든다. &lt;br /&gt;&amp;ndash;&amp;nbsp;통역&amp;nbsp;프로그램은&amp;nbsp;미니&amp;nbsp;언어를&amp;nbsp;이해하고&amp;nbsp;미니&amp;nbsp;프로그램을&amp;nbsp;해석&amp;nbsp;및&amp;nbsp;실&amp;nbsp;행한다. &lt;br /&gt;&amp;ndash;&amp;nbsp;해결해야&amp;nbsp;할&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mediator &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JM5bY/btrKZ0OfmdQ/DEDvdblZ97cltfzL43YzSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JM5bY/btrKZ0OfmdQ/DEDvdblZ97cltfzL43YzSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JM5bY/btrKZ0OfmdQ/DEDvdblZ97cltfzL43YzSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJM5bY%2FbtrKZ0OfmdQ%2FDEDvdblZ97cltfzL43YzSk%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;339&quot; height=&quot;187&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loosely coupled, 코드 리유즈 어려움 &lt;br /&gt;한&amp;nbsp;집합에&amp;nbsp;속해있는&amp;nbsp;객체들의&amp;nbsp;상호작용을&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;사이의&amp;nbsp;Loose&amp;nbsp;coupling을&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Memento &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OWPsY/btrK0M3f3ln/KIXLCm9yVyzzdJ6nwFnl8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OWPsY/btrK0M3f3ln/KIXLCm9yVyzzdJ6nwFnl8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OWPsY/btrK0M3f3ln/KIXLCm9yVyzzdJ6nwFnl8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOWPsY%2FbtrK0M3f3ln%2FKIXLCm9yVyzzdJ6nwFnl8k%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;527&quot; height=&quot;363&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 객체의 상태를 기록하여 보존하기 위한 Memento 패턴&amp;nbsp; &lt;br /&gt;&amp;ndash;&amp;nbsp;Caretaker&amp;nbsp;역할은&amp;nbsp;중간&amp;nbsp;중간&amp;nbsp;Originator&amp;nbsp;역할에게&amp;nbsp;부탁하여&amp;nbsp;&amp;lsquo;현&amp;nbsp;재의&amp;nbsp;상태&amp;rsquo;를&amp;nbsp;표현하는&amp;nbsp;Memento&amp;nbsp;역할을&amp;nbsp;만든다.&amp;nbsp; &lt;br /&gt;&amp;ndash;&amp;nbsp;Caretaker&amp;nbsp;역할은&amp;nbsp;필요할&amp;nbsp;때&amp;nbsp;서랍&amp;nbsp;안에서&amp;nbsp;Memento&amp;nbsp;역할을&amp;nbsp;꺼&amp;nbsp;내서&amp;nbsp;Originator&amp;nbsp;역할에게&amp;nbsp;건네주면,&amp;nbsp;그&amp;nbsp;상태로&amp;nbsp;복원이&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MVC &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zht5t/btrKZDTkrIZ/J578iEWkVO6dLgq5YhKkv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zht5t/btrKZDTkrIZ/J578iEWkVO6dLgq5YhKkv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zht5t/btrKZDTkrIZ/J578iEWkVO6dLgq5YhKkv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZht5t%2FbtrKZDTkrIZ%2FJ578iEWkVO6dLgq5YhKkv0%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;313&quot; height=&quot;197&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다. 이러한 &quot;관심사 분리&quot; 는 더나은 업무의 분리와 향상된 관리를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Observer&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjGxMK/btrK1it6E8x/khWEziyie8O8SCotsKH4IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjGxMK/btrK1it6E8x/khWEziyie8O8SCotsKH4IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjGxMK/btrK1it6E8x/khWEziyie8O8SCotsKH4IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjGxMK%2FbtrK1it6E8x%2FkhWEziyie8O8SCotsKH4IK%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;349&quot; height=&quot;144&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loosely coupled &lt;br /&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;갱신될&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;만드는&amp;nbsp;패턴. &lt;br /&gt;주체(Subject)와&amp;nbsp;감시자(Observer)&amp;nbsp;사이에서&amp;nbsp;주체의&amp;nbsp;변경이&amp;nbsp;일어났을&amp;nbsp;때&amp;nbsp;감시자에게&amp;nbsp;알려주어&amp;nbsp;변화되어야&amp;nbsp;하는&amp;nbsp;객체들에게&amp;nbsp;전달(Update)합니다. &lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;-&amp;gt;&amp;nbsp;subject의&amp;nbsp;state가&amp;nbsp;바뀔때마다&amp;nbsp;noti가&amp;nbsp;올것임.&amp;nbsp;특정&amp;nbsp;상태일때만&amp;nbsp;알면&amp;nbsp;될때는&amp;nbsp;overhead가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;그래서&amp;nbsp;ChangeManager를&amp;nbsp;중간에&amp;nbsp;둘수도&amp;nbsp;있겠다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Push&amp;nbsp;VS&amp;nbsp;Pull &lt;br /&gt;Push&amp;nbsp;방식은&amp;nbsp;observer.update(data1,&amp;nbsp;data2,&amp;nbsp;data3);&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;Observable에서&amp;nbsp;update메서드로&amp;nbsp;직접&amp;nbsp;넣어주는&amp;nbsp;방식.&amp;nbsp;observer은&amp;nbsp;update의&amp;nbsp;인자로&amp;nbsp;넘어온&amp;nbsp;값들을&amp;nbsp;사용하게&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Pull&amp;nbsp;방식은&amp;nbsp;observer.update(this,&amp;nbsp;arg);&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;Observable&amp;nbsp;인스턴스를&amp;nbsp;보내고,&amp;nbsp;observer.update&amp;nbsp;함수에서&amp;nbsp;observable.getXXX()&amp;nbsp;함수를&amp;nbsp;사용하여&amp;nbsp;가져가는&amp;nbsp;방식.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prototype &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zA5KR/btrK1pzY0Pj/yUcUZ4Ey2EmCNrKrEq7P4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zA5KR/btrK1pzY0Pj/yUcUZ4Ey2EmCNrKrEq7P4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zA5KR/btrK1pzY0Pj/yUcUZ4Ey2EmCNrKrEq7P4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzA5KR%2FbtrK1pzY0Pj%2FyUcUZ4Ey2EmCNrKrEq7P4k%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;527&quot; height=&quot;305&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성할 객체의 종류를 명시하는 데에 원형이 되는(Prototypical) 인스턴스를 이용하고, 그 원형을 복사함으로써 새로운 객체를 생성하는 패턴. &lt;br /&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;사용한다 &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp;인스턴스를&amp;nbsp;만드는&amp;nbsp;복잡한&amp;nbsp;과정을&amp;nbsp;몰라도&amp;nbsp;되고&amp;nbsp;속도가&amp;nbsp;빠르다 &lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;복사본&amp;nbsp;자체를&amp;nbsp;만드는일&amp;nbsp;자체가&amp;nbsp;복잡할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;객체를 빨리 생성하는 패턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Proxy &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4clvq/btrKZoB1GRT/XyhwxY01Z8bwFMeFIUexj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4clvq/btrKZoB1GRT/XyhwxY01Z8bwFMeFIUexj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4clvq/btrKZoB1GRT/XyhwxY01Z8bwFMeFIUexj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4clvq%2FbtrKZoB1GRT%2FXyhwxY01Z8bwFMeFIUexj0%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;527&quot; height=&quot;316&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 다른 객체로 접근하는 것을 통제하기 위해서 그 객체의 대리자(Surrogate) 또는 Placeholder를 제공하는 패턴.&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;Proxy pattern의 활용되는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Real subject가 필요한 경우에 생성될 수 있도록 컨트롤 하거나 생성되기 전까지 대리인 역할을 한다. Real subject가 생성되면 Client로부터의 요청사항을 Real subject로 전달한다. &lt;br /&gt;Client와&amp;nbsp;Real&amp;nbsp;subject가&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;주소체계에&amp;nbsp;있거나&amp;nbsp;Real&amp;nbsp;subject가&amp;nbsp;생성하는데&amp;nbsp;오래걸리거나&amp;nbsp;비싸거나,&amp;nbsp;Real&amp;nbsp;subject에&amp;nbsp;접근하는&amp;nbsp;권한의&amp;nbsp;관리가&amp;nbsp;필요할&amp;nbsp;경우&amp;nbsp;활용된다. &lt;br /&gt;&lt;br /&gt;- remote proxy : responsible for encoding a request and its arguments and for sending the encoded request to the real subject in a different address space &amp;ndash;&amp;nbsp; &lt;br /&gt;- virtual proxy : may cache additional information about the real subject so that they can postpone accessing it &amp;ndash;&amp;nbsp; &lt;br /&gt;- protection proxy : checks that the caller has the access permissions required to perform a request &lt;br /&gt;&lt;br /&gt;원격 프록시 : 요청과 해당 인수를 인코딩하고 인코딩된 요청을 다른 주소 공간의 실제 주체에게 보내는 역할을 합니다. &lt;br /&gt;- 가상 프록시 : 실제 주제에 대한 추가 정보를 캐시에 저장하여 액세스를 연기할 수 있습니다. &lt;br /&gt;- 보호 프록시 : 호출자가 요청을 수행하는 데 필요한 액세스 권한이 있는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Singleton&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;State&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9ffgt/btrK2miJN1P/FBvvk6oppq9zPLiFnkQzdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9ffgt/btrK2miJN1P/FBvvk6oppq9zPLiFnkQzdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9ffgt/btrK2miJN1P/FBvvk6oppq9zPLiFnkQzdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9ffgt%2FbtrK2miJN1P%2FFBvvk6oppq9zPLiFnkQzdK%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;335&quot; height=&quot;123&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OCP, 위임, DIP &lt;br /&gt;객체의&amp;nbsp;내부상태에&amp;nbsp;따라&amp;nbsp;&amp;nbsp;스스로&amp;nbsp;행동을&amp;nbsp;변경할&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;br /&gt;&amp;nbsp; &lt;br /&gt;장점으로는&amp;nbsp;한&amp;nbsp;State와&amp;nbsp;관계된&amp;nbsp;모든&amp;nbsp;동작들이&amp;nbsp;하나의&amp;nbsp;Object&amp;nbsp;안에&amp;nbsp;모두&amp;nbsp;모인다. &lt;br /&gt;State&amp;nbsp;추가&amp;nbsp;시&amp;nbsp;다른&amp;nbsp;Object에&amp;nbsp;대한&amp;nbsp;수정&amp;nbsp;없이&amp;nbsp;하나의&amp;nbsp;Object만&amp;nbsp;추가되면&amp;nbsp;된다. &lt;br /&gt;따라서&amp;nbsp;State에&amp;nbsp;따른&amp;nbsp;조건문&amp;nbsp;없이&amp;nbsp;관리가&amp;nbsp;가능하다. &lt;br /&gt;단점으로는&amp;nbsp;State&amp;nbsp;수만큼&amp;nbsp;Object가&amp;nbsp;관리되어야&amp;nbsp;함으로&amp;nbsp;Object가&amp;nbsp;늘어나고, &lt;br /&gt;State&amp;nbsp;안에&amp;nbsp;동작이&amp;nbsp;추가될&amp;nbsp;경우&amp;nbsp;모든&amp;nbsp;Object들에&amp;nbsp;대해서&amp;nbsp;추가되어야&amp;nbsp;해서&amp;nbsp;수정범위가&amp;nbsp;늘어나게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Strategy &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brs5Wa/btrKZ1fhOja/xdUuTyiZQjOh5KhBbDh0XK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brs5Wa/btrKZ1fhOja/xdUuTyiZQjOh5KhBbDh0XK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brs5Wa/btrKZ1fhOja/xdUuTyiZQjOh5KhBbDh0XK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/brs5Wa/btrKZ1fhOja/xdUuTyiZQjOh5KhBbDh0XK/img.gif&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;437&quot; height=&quot;164&quot; data-origin-width=&quot;437&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;Has a 관계가 아닌 Is a 관계로 코드 재사용성이 높다, Composition, Polymorphism, 위임, DIP, &lt;br /&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;br /&gt;알고리즘을&amp;nbsp;사용하는&amp;nbsp;사용자와&amp;nbsp;상관없이&amp;nbsp;독립적으로&amp;nbsp;알고리즘을&amp;nbsp;다양하게 &lt;br /&gt;변경할&amp;nbsp;수&amp;nbsp;있게&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;Strategy는 알고리즘이 다양하고 상호교환이 필요할 때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Template Method &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6IIk8/btrKZ0guNNv/w5xDTlHEkiRp36iABfFrFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6IIk8/btrKZ0guNNv/w5xDTlHEkiRp36iABfFrFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6IIk8/btrKZ0guNNv/w5xDTlHEkiRp36iABfFrFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6IIk8%2FbtrKZ0guNNv%2Fw5xDTlHEkiRp36iABfFrFK%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;204&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 연산에는 알고리듬의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미루는 패턴. &lt;br /&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;합니다. &lt;br /&gt;&lt;br /&gt;Template&amp;nbsp;Method&amp;nbsp;패턴은&amp;nbsp;어떤&amp;nbsp;부분이&amp;nbsp;opened,&amp;nbsp;closed&amp;nbsp;되어있나요? &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Visit &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMZDm1/btrKU7OVunk/CvVROa2XmUH3RpEMHhZWC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMZDm1/btrKU7OVunk/CvVROa2XmUH3RpEMHhZWC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMZDm1/btrKU7OVunk/CvVROa2XmUH3RpEMHhZWC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMZDm1%2FbtrKU7OVunk%2FCvVROa2XmUH3RpEMHhZWC1%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;527&quot; height=&quot;452&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 구조를 이루는 원소에 대해 수행할 연산을 표현하는 패턴. &lt;br /&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;중요하지&amp;nbsp;않은&amp;nbsp;경우에&amp;nbsp;사용. &lt;br /&gt;데이터&amp;nbsp;구조와&amp;nbsp;처리를&amp;nbsp;분리하자.&amp;nbsp; &lt;br /&gt;&amp;ndash;&amp;nbsp;데이터&amp;nbsp;구조를&amp;nbsp;돌아다니는&amp;nbsp;&amp;ldquo;방문자&amp;rdquo;를&amp;nbsp;정의해서,&amp;nbsp;이&amp;nbsp;방문자가&amp;nbsp;&amp;ldquo;처리&amp;rdquo;를&amp;nbsp;담당하도록&amp;nbsp;하자.&amp;nbsp; &lt;br /&gt;&amp;ndash; 새로운 처리를 추가하고 싶을 때는, 새로운 &amp;ldquo;방문자&amp;rdquo;를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Mediator VS Facade&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mediator는&amp;nbsp;Colleague간&amp;nbsp;복잡한&amp;nbsp;Communication을&amp;nbsp;간접적으로&amp;nbsp;서로&amp;nbsp;통신하는데&amp;nbsp;사용,&amp;nbsp;Facade는&amp;nbsp;복잡한&amp;nbsp;Sub&amp;nbsp;System의&amp;nbsp;Interface를&amp;nbsp;제공하여&amp;nbsp;클라이언트가&amp;nbsp;Sub&amp;nbsp;System과의&amp;nbsp;디펜던시가&amp;nbsp;생기지&amp;nbsp;않도록&amp;nbsp;한다. &lt;br /&gt;Mediator는&amp;nbsp;양방향&amp;nbsp;통신,&amp;nbsp;Facade는&amp;nbsp;단방향&amp;nbsp;통신 &lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/137</guid>
      <comments>https://camelact.tistory.com/137#entry137comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:58:52 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Design Patterns - Concept</title>
      <link>https://camelact.tistory.com/136</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;디자인패턴을 세 가지 특성으로 분류하고 목적 기준으로 말해보세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갱&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;900&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mnowI/btrKXHB7Rst/Rnb2z9gUakKC5l18FPtLb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mnowI/btrKXHB7Rst/Rnb2z9gUakKC5l18FPtLb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mnowI/btrKXHB7Rst/Rnb2z9gUakKC5l18FPtLb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmnowI%2FbtrKXHB7Rst%2FRnb2z9gUakKC5l18FPtLb1%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;527&quot; height=&quot;283&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Creational : New를 하지 않는다, 객체 인스턴스 생성을 위한 패턴으로, 클라이언트와 그 클라이언트에서 생성할 객체 인스턴스 사이의 연결을 끊어주는 패턴이다. &lt;br /&gt;&lt;br /&gt;- Structural : 구조적인 패턴, 클래스 및 객체들을 구성(합성)을 통해서 더 큰 구조로 만들 수 있게 해주는 것과 관련된 패턴이다. &lt;br /&gt;&lt;br /&gt;- Behavioral : 클래스에 책임할당, 정적관계와 의사소통, 클래스와 객체들이 상호작용하는 방법 및 역할을 분담하는 방법과 관련된 패턴이다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디자인패턴을 범위 기준으로 말해보세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;br /&gt;&lt;br /&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;유연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;General Responsibility Assignment Software Pattern, GRASP에 대해서 설명하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Creator : 생성되는 객체의 컨텍스트를 알고 있는 다른 객체가 있다면, 컨텍스트를 알고 있는 객체에 객체의 생성을 부여.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- Controller : 시스템 이벤트(사용자의 요청)를 처리할 객체를 만들자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- Pure Fabrication : 도메인에 관련된 문제를 대표하는 것이 아니라면 기능적인&amp;nbsp; &lt;br /&gt;책임을&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;br /&gt;- Information Expert : 책임을 수행할 수 있는 데이터를 가지고 있는 객체에 책임을 부여하는 것. &lt;br /&gt;객체는&amp;nbsp;데이터와&amp;nbsp;처리로직이&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;Method로만&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;br /&gt;- High Cohesion : 모듈 하나에서 응집되어 있는지 : 높을수록 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- Indirection : 두 객체 사이의 직접적인 Coupling을 피하고 싶으면, 그 사이에 다른 매개체를 통해 전달하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- Low Coupling : 여러 모듈간 측정 인터디펜턴시 : 약할수록 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- Polymorphism : 객체의 종류에 따라 행동양식이 바뀐다면, Polymorphism 기능을 사용하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;- Protected Variations : 변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자. &lt;br /&gt;- Don&amp;rsquo;t talk to Stranger : 높은 결합을 피하기 위해. 특히, 클라이언트 개체가 서버 개체의 내부 구조 및 연결에 대해 소유해야 하는 지식의 정도를 제한합니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Coupling과 Cohesion의 차이를 설명하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Coupling&amp;nbsp;:&amp;nbsp;여러&amp;nbsp;모듈간&amp;nbsp;측정&amp;nbsp;인터디펜턴시&amp;nbsp;:&amp;nbsp;약할수록&amp;nbsp;좋다 &lt;br /&gt;Cohesion&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pattern-Oriented Software Architecture, 세 가지로 구분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;ex)&amp;nbsp;MVC&amp;nbsp;패턴 &lt;br /&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;ex)&amp;nbsp;옵저버패턴 &lt;br /&gt;코팅 패턴 : 스페시픽한 프로그래밍 랭기지, ex) 포인터**&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/136</guid>
      <comments>https://camelact.tistory.com/136#entry136comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:55:45 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]Principles of SW Design</title>
      <link>https://camelact.tistory.com/135</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;SOLID, S가&amp;nbsp;무엇의&amp;nbsp;약자이고&amp;nbsp;무엇을&amp;nbsp;의미하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;What are the benefits of OCP?&lt;br /&gt;What&amp;nbsp;are&amp;nbsp;the&amp;nbsp;mechanisms&amp;nbsp;for&amp;nbsp;implementing&amp;nbsp;OCP? &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;SRP&amp;nbsp;:&amp;nbsp;단일&amp;nbsp;책임의&amp;nbsp;원칙&amp;nbsp;:&amp;nbsp;단일&amp;nbsp;책임&amp;nbsp;원칙.&amp;nbsp;클래스는&amp;nbsp;단&amp;nbsp;하나의&amp;nbsp;기능만을&amp;nbsp;갖고,&amp;nbsp;하나의&amp;nbsp;기능을&amp;nbsp;여러&amp;nbsp;component에&amp;nbsp;나누어&amp;nbsp;놓지마라. &lt;br /&gt;SRP&amp;nbsp;Single&amp;nbsp;responsibility&amp;nbsp;principle, &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;OCP&amp;nbsp;:&amp;nbsp;개방&amp;nbsp;폐쇄&amp;nbsp;원칙&amp;nbsp;OCP&amp;nbsp;:&amp;nbsp;확장에&amp;nbsp;대해&amp;nbsp;열려&amp;nbsp;있어야&amp;nbsp;하고,&amp;nbsp;수정에&amp;nbsp;대해서는&amp;nbsp;닫혀&amp;nbsp;있어야&amp;nbsp;한다'는&amp;nbsp;프로그래밍&amp;nbsp;원칙,&amp;nbsp;Open&amp;nbsp;Closed&amp;nbsp;Principle &lt;br /&gt;자동차&amp;nbsp;운전을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;소나타,&amp;nbsp;그랜저,&amp;nbsp;BMW... &lt;br /&gt;즉,&amp;nbsp;자동차가&amp;nbsp;바뀌더라도&amp;nbsp;내가&amp;nbsp;운전하는&amp;nbsp;방식은&amp;nbsp;동일해야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;LSP&amp;nbsp;:&amp;nbsp;서브타입은&amp;nbsp;대체할&amp;nbsp;수&amp;nbsp;있어야한다&amp;nbsp;베이스&amp;nbsp;타입을,&amp;nbsp;Liskov&amp;nbsp;substitution&amp;nbsp;principle &lt;br /&gt;어떠한&amp;nbsp;서브타입으로&amp;nbsp;바꾸어도라도&amp;nbsp;프로그램&amp;nbsp;동작에&amp;nbsp;문제가&amp;nbsp;없어야한다 &lt;br /&gt;상속&amp;nbsp;:&amp;nbsp;큐는&amp;nbsp;리스트를&amp;nbsp;상속하지&amp;nbsp;말고&amp;nbsp;List를&amp;nbsp;가져다가&amp;nbsp;쓰는&amp;nbsp;방식으로&amp;nbsp;해야&amp;nbsp;그&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;br /&gt;상속을&amp;nbsp;했을&amp;nbsp;때&amp;nbsp;부모의&amp;nbsp;함수를&amp;nbsp;썼지만&amp;nbsp;예상되는&amp;nbsp;결과를&amp;nbsp;받아오지&amp;nbsp;못하는&amp;nbsp;현상 &lt;br /&gt;&amp;amp; &lt;br /&gt;너비와&amp;nbsp;높이의&amp;nbsp;조회(getter)&amp;nbsp;및&amp;nbsp;할당(setter)&amp;nbsp;메서드를&amp;nbsp;가진&amp;nbsp;직사각형&amp;nbsp;클래스로부터&amp;nbsp;정사각형&amp;nbsp;클래스를&amp;nbsp;파생하는&amp;nbsp;경우를&amp;nbsp;들&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;정사각형&amp;nbsp;클래스는&amp;nbsp;항상&amp;nbsp;너비와&amp;nbsp;높이가&amp;nbsp;같다고&amp;nbsp;간주할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;정사각형&amp;nbsp;객체가&amp;nbsp;직사각형을&amp;nbsp;다루는&amp;nbsp;문맥에서&amp;nbsp;사용되는&amp;nbsp;경우,&amp;nbsp;정사각형의&amp;nbsp;크기는&amp;nbsp;독립적으로&amp;nbsp;변경할&amp;nbsp;수&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;br /&gt;&lt;br /&gt;4.&amp;nbsp;ISP&amp;nbsp;인터페이스&amp;nbsp;분리&amp;nbsp;Interface&amp;nbsp;Segregation&amp;nbsp;Principle &lt;br /&gt;클라이언트가&amp;nbsp;자신이&amp;nbsp;이용하지&amp;nbsp;않는&amp;nbsp;메서드에&amp;nbsp;의존하면&amp;nbsp;안된다는&amp;nbsp;원칙 &lt;br /&gt;인터페이스를&amp;nbsp;더&amp;nbsp;잘게&amp;nbsp;나누어&amp;nbsp;사용하자 &lt;br /&gt;&amp;nbsp;복합기에&amp;nbsp;print(),&amp;nbsp;copy(),&amp;nbsp;fax()&amp;nbsp;메소드가&amp;nbsp;있다.&amp;nbsp;프린터는&amp;nbsp;print()를,&amp;nbsp;복사기는&amp;nbsp;copy()를,&amp;nbsp;팩스는&amp;nbsp;fax()를&amp;nbsp;사용한다.&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;메소드는&amp;nbsp;같은&amp;nbsp;파일에&amp;nbsp;존재하므로,&amp;nbsp;프린터의&amp;nbsp;print()로직만&amp;nbsp;바뀌어도&amp;nbsp;복사기와&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;한다.&amp;nbsp;인터페이스를&amp;nbsp;분리하면&amp;nbsp;프린터의&amp;nbsp;print()&amp;nbsp;로직이&amp;nbsp;바뀌어도&amp;nbsp;복사기와&amp;nbsp;팩스는&amp;nbsp;영향을&amp;nbsp;받지&amp;nbsp;않는다. &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;DIP&amp;nbsp;디펜던시&amp;nbsp;역전&amp;nbsp;원칙&amp;nbsp;Dependency&amp;nbsp;Inversion&amp;nbsp;Principle &lt;br /&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;DIP는&amp;nbsp;의존&amp;nbsp;관계를&amp;nbsp;맺을&amp;nbsp;때&amp;nbsp;변화하기&amp;nbsp;쉬운&amp;nbsp;것&amp;nbsp;또는&amp;nbsp;자주&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;br /&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;한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;What are the benefits of applying SOLID?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW&amp;nbsp;design을&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Refinement 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;높은&amp;nbsp;수준의&amp;nbsp;Design으로부터&amp;nbsp;낮은&amp;nbsp;수준&amp;nbsp;Design으로&amp;nbsp;세밀화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Give examples of applying Separation of Concerns?&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SoC,&amp;nbsp;SoC는&amp;nbsp;긴&amp;nbsp;복잡한&amp;nbsp;함수를&amp;nbsp;쓰지&amp;nbsp;말라고&amp;nbsp;이야기하는&amp;nbsp;것입니다.&amp;nbsp;함수의&amp;nbsp;크기가&amp;nbsp;커지기&amp;nbsp;시작하면&amp;nbsp;함수가&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;작업을&amp;nbsp;처리한&amp;nbsp;다는&amp;nbsp;것이고,&amp;nbsp;이는&amp;nbsp;함수를&amp;nbsp;분리&amp;nbsp;해야하는&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SRP 와 SoC의 차이점.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SRP는&amp;nbsp;각&amp;nbsp;모듈에&amp;nbsp;대한거고.&amp;nbsp;Soc&amp;nbsp;는&amp;nbsp;절차에&amp;nbsp;관한&amp;nbsp;것으로&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;범위다.&amp;nbsp;SRP를&amp;nbsp;만족한다고&amp;nbsp;soc가&amp;nbsp;만족되는것은&amp;nbsp;아니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Modularity 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상호&amp;nbsp;연결은&amp;nbsp;간단하고&amp;nbsp;작아야&amp;nbsp;합니다. &lt;br /&gt;SoC를&amp;nbsp;잘&amp;nbsp;구현하면&amp;nbsp;Modularity가&amp;nbsp;좋아짐 &lt;br /&gt;OOP의&amp;nbsp;장점이기도&amp;nbsp;함,&amp;nbsp; &lt;br /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Information Hiding 장단점은 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부&amp;nbsp;디자인&amp;nbsp;결정사항을&amp;nbsp;외부로부터&amp;nbsp;숨김,&amp;nbsp;Encapsulation &lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp; &lt;br /&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;br /&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;낮아진다 &lt;br /&gt;&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp; &lt;br /&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;듬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Divide and Conquer 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를&amp;nbsp;재귀적으로&amp;nbsp;해결한다,&amp;nbsp;더&amp;nbsp;작은&amp;nbsp;하위&amp;nbsp;문제로.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디자인 패턴을 설계할때 꼭 써야 하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장성을 예상가능하다.(OCP) &lt;br /&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;있다. &lt;br /&gt;같은&amp;nbsp;이유로&amp;nbsp;커뮤니케이션에&amp;nbsp;수월하다. &lt;br /&gt;재사용 가능하다. 변경 용이성, 재사용성, 유지보수 용이성&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/135</guid>
      <comments>https://camelact.tistory.com/135#entry135comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:54:15 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]OO Analysis &amp;amp; Design - Consistency</title>
      <link>https://camelact.tistory.com/134</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Consistency, Use&amp;nbsp;Case&amp;nbsp;Model&amp;nbsp;&amp;amp;&amp;nbsp;Class&amp;nbsp;Diagram&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use case에 등장하는 명사(Noun)들을 추출하여 클래스로 만들 수 있다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Use&amp;nbsp;Case&amp;nbsp;Model&amp;nbsp;&amp;amp;&amp;nbsp;Sequence&amp;nbsp;Diagram&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use case에서 등장하는 actor와 system 사이의 상호작용을 시나리오에 따라 sequence diagram으로 나타낼 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Functional &amp;amp; Information&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Consider&amp;nbsp;datasets&amp;nbsp;manipulated&amp;nbsp;by&amp;nbsp;use&amp;nbsp;cases &lt;br /&gt;Consider&amp;nbsp;functionality&amp;nbsp;which&amp;nbsp;manipulates&amp;nbsp;the&amp;nbsp;dataset. &lt;br /&gt;&lt;br /&gt;Use&amp;nbsp;case가&amp;nbsp;dataset을&amp;nbsp;사용하고&amp;nbsp;dataset은&amp;nbsp;information&amp;nbsp;view에서&amp;nbsp;persistent&amp;nbsp;object&amp;nbsp;classes&amp;nbsp;형태로&amp;nbsp;표현&amp;nbsp;됨 &lt;br /&gt;Dataset을&amp;nbsp;사용할&amp;nbsp;functionallity를&amp;nbsp;고려해야하고&amp;nbsp;이것이&amp;nbsp;Functional&amp;nbsp;View에&amp;nbsp;표현&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;State&amp;nbsp;Machine&amp;nbsp;Diagram&amp;nbsp;&amp;amp;&amp;nbsp;Class&amp;nbsp;Diagram&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의한 상태별로 클래스가 구성된다. 해당 클래스의 Method는 실행 가능한 Event에 대해서는 구현하고 그렇지 않은 함수는 Block처리하여 두 다이어그램의 일관성을 유지한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Activity Diagram &amp;amp; Use Case Diagram&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든&amp;nbsp;Use&amp;nbsp;case가&amp;nbsp;Activity&amp;nbsp;또는&amp;nbsp;Action으로&amp;nbsp;표현되어야&amp;nbsp;하며&amp;nbsp;Activity에서는&amp;nbsp;전체적인&amp;nbsp;제어흐름도&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;다이어그램이다.&amp;nbsp;등장하지&amp;nbsp;않았던&amp;nbsp;Action이&amp;nbsp;나타나면&amp;nbsp;Consistency에&amp;nbsp;어긋난다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Functional &amp;amp; Behavior&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity&amp;nbsp;Diagram&amp;nbsp;should&amp;nbsp;only&amp;nbsp;include&amp;nbsp;the&amp;nbsp;functionality&amp;nbsp;of&amp;nbsp;use&amp;nbsp;cases. &lt;br /&gt;A&amp;nbsp;use&amp;nbsp;case&amp;nbsp;should&amp;nbsp;be&amp;nbsp;reflected&amp;nbsp;in&amp;nbsp;some&amp;nbsp;control&amp;nbsp;flow. &lt;br /&gt;Verify&amp;nbsp;the&amp;nbsp;functionality&amp;nbsp;of&amp;nbsp;Swimlane&amp;nbsp;Elements &lt;br /&gt;&lt;br /&gt;Behavior&amp;nbsp;Control&amp;nbsp;flow는&amp;nbsp;1&amp;nbsp;use&amp;nbsp;case&amp;nbsp;이상이&amp;nbsp;매핑되어야&amp;nbsp;합니다. &lt;br /&gt;Control&amp;nbsp;flow는&amp;nbsp;use&amp;nbsp;case의&amp;nbsp;Functionality를&amp;nbsp;포함한다. &lt;br /&gt;Activity&amp;nbsp;Diagram의&amp;nbsp;Swimlane&amp;nbsp;Elements들은&amp;nbsp;functionality는&amp;nbsp;functional&amp;nbsp;view에서&amp;nbsp;Component,&amp;nbsp;Layer&amp;nbsp;Tier의&amp;nbsp;Functionality로&amp;nbsp;표현된다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Information&amp;nbsp;&amp;amp;&amp;nbsp;Behavior&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity 다이어그램은 Data nodes, Object Nodes 들이 포함될 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Activity Diag. &amp;amp; State M. Diag.&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Objects/Data&amp;nbsp;Nodes&amp;nbsp;can&amp;nbsp;be&amp;nbsp;given&amp;nbsp;&amp;lsquo;State&amp;rsquo;&amp;nbsp;information. &lt;br /&gt;State&amp;nbsp;transitions&amp;nbsp;on&amp;nbsp;both&amp;nbsp;diagrams&amp;nbsp;must&amp;nbsp;be&amp;nbsp;consistent. &lt;br /&gt;&lt;br /&gt;Activity의&amp;nbsp;Data,&amp;nbsp;Object&amp;nbsp;Node들이&amp;nbsp;State&amp;nbsp;Information으로&amp;nbsp;주어질&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;Transition이&amp;nbsp;Control&amp;nbsp;flow로&amp;nbsp;드러나야한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Information&amp;nbsp;&amp;amp;&amp;nbsp;State&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;State Diagram의 Transition 들이 class의 public Method가 될 수 있어야한다. &lt;br /&gt;없다면&amp;nbsp;class의&amp;nbsp;public&amp;nbsp;method로&amp;nbsp;추가되어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Consistency,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Sequence&amp;nbsp;&amp;amp;&amp;nbsp;Activity&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sequence Diagram은 1개의 Usecase를 이용하여 작성되며 Activity Diagram에서 Control flow는 1개 혹은 여러 개의 Usecase Diagram으로 이루어 짐.&amp;nbsp; &lt;br /&gt;모든&amp;nbsp;Usecase가&amp;nbsp;Sequence&amp;nbsp;Diagram과&amp;nbsp;Activity&amp;nbsp;Diagram으로&amp;nbsp;반영되어&amp;nbsp;있어야&amp;nbsp;함. &lt;br /&gt;Sequence들이 모두 Activity Diagram으로 포함되어야 함.&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/134</guid>
      <comments>https://camelact.tistory.com/134#entry134comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:53:42 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]OO Analysis &amp;amp; Design - Diagram</title>
      <link>https://camelact.tistory.com/133</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cardinality를&amp;nbsp;Car와&amp;nbsp;Tire를&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;설명하시오.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Car 0..1 ◆ㅡ 4 Tire : 0이 있어서 말이 된다, 0이 없으면 말이 안 됨, 타이어 가게가 있어서, 0은 차가 없어도 타이어가 존재할 수 있어서 &lt;br /&gt;Car&amp;nbsp;*&amp;nbsp;◇ㅡ&amp;nbsp;4&amp;nbsp;Tire&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cardinality를 Student와 Class를 예를 들어 설명하시오.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Student&amp;nbsp;1&amp;nbsp;ㅡ&amp;nbsp;0..*&amp;nbsp;Registration&amp;nbsp;0..*&amp;nbsp;ㅡ&amp;nbsp;1..*&amp;nbsp;Class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Order&amp;nbsp;the&amp;nbsp;strengths&amp;nbsp;of&amp;nbsp;5&amp;nbsp;class&amp;nbsp;diagram&amp;nbsp;relationship&amp;nbsp;types.&amp;nbsp;Justify&amp;nbsp;the&amp;nbsp;ordering.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inheritance &lt;br /&gt;Composition&amp;nbsp;:&amp;nbsp;소멸까지 &lt;br /&gt;Aggregation&amp;nbsp;:&amp;nbsp;&amp;nbsp;Classifier&amp;nbsp;간의&amp;nbsp;관계에서&amp;nbsp;사용.&amp;nbsp;+&amp;nbsp;&amp;nbsp;집합&amp;nbsp;+&amp;nbsp;필수요소 &lt;br /&gt;Association&amp;nbsp;:&amp;nbsp;Classifier&amp;nbsp;간의&amp;nbsp;관계에서&amp;nbsp;사용.&amp;nbsp;+&amp;nbsp;필수는&amp;nbsp;아님 &lt;br /&gt;Dependency :&amp;nbsp;&amp;nbsp;Method&amp;nbsp;&amp;nbsp;간의 관계에서 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;cardinality가 중요한가? 꼭 정확히 적어야 하나?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cardinality를 정확히 써야 array를 써야할지 아닐지 명확히 할수 있다. &lt;br /&gt;코딩은&amp;nbsp;이&amp;nbsp;cardinality(요구사항)을&amp;nbsp;그대로&amp;nbsp;따르게&amp;nbsp;되어&amp;nbsp;있다. &lt;br /&gt;객체간&amp;nbsp;관계가&amp;nbsp;1&amp;nbsp;-&amp;nbsp;1&amp;nbsp;인데&amp;nbsp;0이&amp;nbsp;나오는&amp;nbsp;것을&amp;nbsp;허용하게&amp;nbsp;하면&amp;nbsp;안된다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;association과 dependency 차이?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dependency 주로 함수내에서 instance를 생성, 사용, 호출하거나 매개변수로 쓰이는 등 instance를 잠시 사용할때 사용. 주로 class diagram에서는 생략 &lt;br /&gt;association&amp;nbsp;:&amp;nbsp;instance의&amp;nbsp;reference를&amp;nbsp;계속&amp;nbsp;유지하고&amp;nbsp;있을&amp;nbsp;경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;association과 aggregation 왜 구분해서 사용하나? 둘다 멤버변수 가지는데?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aggregation&amp;nbsp;:&amp;nbsp;new&amp;nbsp;Car(new&amp;nbsp;Engine)처럼&amp;nbsp;car에&amp;nbsp;engine을&amp;nbsp;강제할수있게&amp;nbsp;됨. &lt;br /&gt;whole-part&amp;nbsp;관계를&amp;nbsp;나타낼때&amp;nbsp;사용.&amp;nbsp;부품(part)없이&amp;nbsp;전체를&amp;nbsp;만들수&amp;nbsp;없다. &lt;br /&gt;association&amp;nbsp;:&amp;nbsp;new&amp;nbsp;Car()해도&amp;nbsp;쓸수&amp;nbsp;있는것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;class 관계에서 strong과 weak의 의미는 뭔가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상호작용이&amp;nbsp;강하다.&amp;nbsp;약하다의&amp;nbsp;의미 &lt;br /&gt;life&amp;nbsp;time관련해서&amp;nbsp;둘이&amp;nbsp;서로&amp;nbsp;depend하는지 &lt;br /&gt;method&amp;nbsp;invoke&amp;nbsp;관점 &lt;br /&gt;link&amp;nbsp;persistence&amp;nbsp;:&amp;nbsp;dependency&amp;nbsp;빼면&amp;nbsp;나머지&amp;nbsp;4개는&amp;nbsp;다&amp;nbsp;link를&amp;nbsp;보존하고&amp;nbsp;있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Use Case Diagram 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Actor가&amp;nbsp;목표를&amp;nbsp;위해&amp;nbsp;시스템을&amp;nbsp;어떻게&amp;nbsp;이용하는지를&amp;nbsp;표현함,&amp;nbsp;Functional&amp;nbsp;requirement&amp;nbsp;를&amp;nbsp;나타냄. &lt;br /&gt;Action을 중심으로 시스템을 구성하고 시스템의 범위와 기능을 정의한 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Component Diagram 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트들과&amp;nbsp;시스템이&amp;nbsp;어떻게&amp;nbsp;연결되어&amp;nbsp;있는지&amp;nbsp;모델링한&amp;nbsp;다이어그램 &lt;br /&gt;Provided&amp;nbsp;Interface &lt;br /&gt;Required&amp;nbsp;Interface &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Component Diagram의 Components 와 Deployment Diagram의 Components 의 차이점은 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트&amp;nbsp;다이어그램의&amp;nbsp;컴포넌트는&amp;nbsp;만드는&amp;nbsp;소스파일,&amp;nbsp;개발중인&amp;nbsp;것 &lt;br /&gt;디플로이먼트&amp;nbsp;다이어그램에의&amp;nbsp;컴포넌트는&amp;nbsp;런타임&amp;nbsp;수준,&amp;nbsp;컴포넌트의&amp;nbsp;인스턴스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sequence Diagram 시퀀스 다이어그램은 언제 사용하나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Usecase&amp;nbsp;1개의&amp;nbsp;시간의&amp;nbsp;순서에&amp;nbsp;따른&amp;nbsp;컨트롤&amp;nbsp;플로우. &lt;br /&gt;특정기능(usecase&amp;nbsp;1개)에&amp;nbsp;대해서&amp;nbsp;객체간에&amp;nbsp;메시지&amp;nbsp;흘러가는&amp;nbsp;순서를&amp;nbsp;나타낼때.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Applying MVC style paradigm in drawing Sequence Diagram&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC&amp;nbsp;style&amp;nbsp;paradigm을&amp;nbsp;적용하여&amp;nbsp;CRUD&amp;nbsp;류의&amp;nbsp;Sequence&amp;nbsp;diagram을&amp;nbsp;그릴&amp;nbsp;수&amp;nbsp;있음&amp;nbsp;(User&amp;nbsp;-&amp;nbsp;View&amp;nbsp;-&amp;nbsp;Control&amp;nbsp;-&amp;nbsp;Model) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sequence Diagram, &lt;/span&gt;alt와 opt 차이는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alt는&amp;nbsp;워크플로우의&amp;nbsp;조건&amp;nbsp;if&amp;nbsp;else에서&amp;nbsp;각&amp;nbsp;조건을&amp;nbsp;표시한다 &lt;br /&gt;opt는&amp;nbsp;하나의&amp;nbsp;영역만&amp;nbsp;조건에&amp;nbsp;존재&amp;nbsp;하는&amp;nbsp;경우에&amp;nbsp;사용한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Sequence Diagram, &lt;/span&gt;기타 용어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;critical&amp;nbsp;:&amp;nbsp;하나의&amp;nbsp;스레드만&amp;nbsp;접근하여&amp;nbsp;표현하는&amp;nbsp;operator &lt;br /&gt;ignore&amp;nbsp;:&amp;nbsp;특정&amp;nbsp;메시지를&amp;nbsp;무시할&amp;nbsp;경우 &lt;br /&gt;consider&amp;nbsp;:&amp;nbsp;특정&amp;nbsp;메시지를&amp;nbsp;중요하게&amp;nbsp;고려할&amp;nbsp;경우 &lt;br /&gt;assert&amp;nbsp;:&amp;nbsp;절대&amp;nbsp;처리(정의된&amp;nbsp;로직이&amp;nbsp;반드시&amp;nbsp;성립되는&amp;nbsp;처리)&amp;nbsp; &lt;br /&gt;neg&amp;nbsp;:&amp;nbsp;negative&amp;nbsp;절대&amp;nbsp;발생하면&amp;nbsp;안되는&amp;nbsp;상황 &lt;br /&gt;State&amp;nbsp;Machine&amp;nbsp;Diagram &lt;br /&gt;What&amp;nbsp;is&amp;nbsp;Event&amp;nbsp;in&amp;nbsp;State&amp;nbsp;Machine&amp;nbsp;Diagram?&amp;nbsp;Give&amp;nbsp;examples. &lt;br /&gt;도어는&amp;nbsp;&quot;열림&quot;,&amp;nbsp;&quot;닫힘&quot;&amp;nbsp;또는&amp;nbsp;&quot;잠김&quot;의&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;상태&amp;nbsp;중&amp;nbsp;하나일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;열기,&amp;nbsp;닫기,&amp;nbsp;잠금&amp;nbsp;및&amp;nbsp;잠금&amp;nbsp;해제&amp;nbsp;이벤트에&amp;nbsp;응답할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;모든&amp;nbsp;이벤트가&amp;nbsp;모든&amp;nbsp;상태에서&amp;nbsp;유효한&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;문이&amp;nbsp;열려&amp;nbsp;있으면&amp;nbsp;닫을&amp;nbsp;때까지&amp;nbsp;잠글&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;또한&amp;nbsp;상태&amp;nbsp;전환에는&amp;nbsp;가드&amp;nbsp;조건이&amp;nbsp;첨부될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;문이&amp;nbsp;열림이면&amp;nbsp;doorWay-&amp;gt;isEmpty&amp;nbsp;조건이&amp;nbsp;충족되는&amp;nbsp;경우에만&amp;nbsp;닫기&amp;nbsp;이벤트에&amp;nbsp;응답할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;어떤 경우에 적용하면 좋나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;state sensitive, state dependent한 behavior가 있고,&amp;nbsp; &lt;br /&gt;state에&amp;nbsp;따라&amp;nbsp;할수&amp;nbsp;있는&amp;nbsp;action이&amp;nbsp;고정되어&amp;nbsp;있는&amp;nbsp;경우. &lt;br /&gt;시스템안에&amp;nbsp;set&amp;nbsp;of&amp;nbsp;state가&amp;nbsp;잘&amp;nbsp;정의될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경우. &lt;br /&gt;예)&amp;nbsp;자동차&amp;nbsp;시동은&amp;nbsp;P에서만&amp;nbsp;걸리고&amp;nbsp;D에서는&amp;nbsp;안걸린다 &lt;br /&gt;구현은&amp;nbsp;간단한&amp;nbsp;것은&amp;nbsp;enum&amp;nbsp;state로,&amp;nbsp;복잡하다면&amp;nbsp;state&amp;nbsp;pattern&amp;nbsp;사용 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성요소 설명해 보시오.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transition&amp;nbsp;:&amp;nbsp;오브젝트가&amp;nbsp;다른&amp;nbsp;상태로&amp;nbsp;변경 &lt;br /&gt;Event(Trigger)&amp;nbsp;:&amp;nbsp;system에&amp;nbsp;영향을&amp;nbsp;미치는&amp;nbsp;어떠한&amp;nbsp;동작&amp;nbsp;(구체적이지&amp;nbsp;않은) &lt;br /&gt;Guard(Condition)&amp;nbsp;:&amp;nbsp;event의&amp;nbsp;파라미터의&amp;nbsp;값으로&amp;nbsp;동적으로&amp;nbsp;체크되는&amp;nbsp;Boolean&amp;nbsp;expressions &lt;br /&gt;Action(Effect)&amp;nbsp;:&amp;nbsp;하나의&amp;nbsp;event가&amp;nbsp;dispatch되면&amp;nbsp;state&amp;nbsp;machine은&amp;nbsp;action을&amp;nbsp;수행하는&amp;nbsp;것으로&amp;nbsp;응답&amp;nbsp;한다.&amp;nbsp;&amp;nbsp; &lt;br /&gt;Orthogonal&amp;nbsp;State:&amp;nbsp;State의&amp;nbsp;동시성을&amp;nbsp;표기하는&amp;nbsp;기능 &lt;br /&gt;Swallow&amp;nbsp;History&amp;nbsp;:&amp;nbsp;Composite&amp;nbsp;state의&amp;nbsp;같은&amp;nbsp;Level의&amp;nbsp;첫&amp;nbsp;state로&amp;nbsp;복원 &lt;br /&gt;Deep&amp;nbsp;History&amp;nbsp;:&amp;nbsp;&amp;nbsp;Last&amp;nbsp;State로&amp;nbsp;복원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Class Diagram과 일관성 확인 방법은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;State&amp;nbsp;Action에&amp;nbsp;대해서&amp;nbsp;Class의&amp;nbsp;Attribute가&amp;nbsp;제공되어야하고 &lt;br /&gt;Event는&amp;nbsp;Class의&amp;nbsp;Method로&amp;nbsp;제공되어야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Timing Diagram 언제&amp;nbsp;쓰는가?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csYoGQ/btrKZnC73EX/zvVVxS8ABPGlnKKvBrUKsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csYoGQ/btrKZnC73EX/zvVVxS8ABPGlnKKvBrUKsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csYoGQ/btrKZnC73EX/zvVVxS8ABPGlnKKvBrUKsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsYoGQ%2FbtrKZnC73EX%2FzvVVxS8ABPGlnKKvBrUKsK%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;295&quot; height=&quot;120&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이밍 다이어그램은 시퀀스 다이어그램 의 특수한 형태입니다 . 타이밍 다이어그램과 시퀀스 다이어그램의 차이점은 축이 반대로 되어 왼쪽에서 오른쪽으로 시간이 증가하고 생명선이 수직으로 배열된 별도의 구획에 표시된다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Activity Diagram, When would you use an Activity Diagram?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각&amp;nbsp;기능&amp;nbsp;블록에&amp;nbsp;대한&amp;nbsp;Action과&amp;nbsp;Activity를&amp;nbsp;정의 &lt;br /&gt;단계별&amp;nbsp;작업흐름을&amp;nbsp;그림으로&amp;nbsp;표현 &lt;br /&gt;둥근네모를 액티비티, 화살표를 액션, 마름모를 디시젼 심볼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deployment Diagram 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템이&amp;nbsp;적용되는&amp;nbsp;환경을&amp;nbsp;설명합니다 &lt;br /&gt;Define&amp;nbsp;Nodes &lt;br /&gt;Define&amp;nbsp;Network&amp;nbsp;Connectivity &lt;br /&gt;Deploy Software Artifacts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UML Constructs for Parallel Processing, 무슨 다이어그램을 쓰면 되나요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Using&amp;nbsp;an&amp;nbsp;activity&amp;nbsp;diagram,&amp;nbsp;fork&amp;nbsp;and&amp;nbsp;join,&amp;nbsp;can&amp;nbsp;display&amp;nbsp;parallel&amp;nbsp;processing&amp;nbsp;via&amp;nbsp;UML. &lt;br /&gt;Sequence, State&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/133</guid>
      <comments>https://camelact.tistory.com/133#entry133comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:52:41 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]OO Analysis &amp;amp; Design - Concept</title>
      <link>https://camelact.tistory.com/132</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;UML Diagram의 분류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UML&amp;nbsp;Diagram을&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;타입으로&amp;nbsp;구분하고&amp;nbsp;각&amp;nbsp;타입별&amp;nbsp;대표적인&amp;nbsp;것&amp;nbsp;한&amp;nbsp;두개씩&amp;nbsp;말해보세요. &lt;br /&gt;Structural&amp;nbsp;Diagram&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;br /&gt;&lt;br /&gt;Behavioral&amp;nbsp;Diagram&amp;nbsp;:&amp;nbsp;액티비티&amp;nbsp;다이어그램,&amp;nbsp;유스케이스다이어그램,&amp;nbsp;스테이트머신&amp;nbsp;다이어그램,&amp;nbsp;인터렉션&amp;nbsp;다이어그램 &lt;br /&gt;&lt;br /&gt;Interaction Diagram : 시퀀스 다이어그램, 커뮤니케이션 다이어그램, 인터랙션 오버뷰 다이어그램, 타이밍 다이어그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UML&amp;nbsp;만드는&amp;nbsp;3가지&amp;nbsp;방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sketch, Blueprint, Programming language&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOA가 무엇이고 사용되는 다이어그램은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트&amp;nbsp;관계를&amp;nbsp;분석하는&amp;nbsp;단계,&amp;nbsp;정의,&amp;nbsp;컨셉잡기,&amp;nbsp;환경&amp;nbsp;등을&amp;nbsp;포함,&amp;nbsp;개념&amp;nbsp;식별 &lt;br /&gt;usecase&amp;nbsp;diagram &lt;br /&gt;domain&amp;nbsp;model&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOD가 무엇이고 사용되는 다이어그램은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서&amp;nbsp;분석한&amp;nbsp;오브젝트를&amp;nbsp;더&amp;nbsp;정확하게&amp;nbsp;디자인함,&amp;nbsp;메소드&amp;nbsp;호출,&amp;nbsp;책임&amp;nbsp;할당 &lt;br /&gt;sequence&amp;nbsp;diagram &lt;br /&gt;class&amp;nbsp;diagram&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UP의 4단계 프로세스에 대해 설명하세요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inception(개시) &lt;br /&gt;대강의 비전과 요구사항, 비즈니스 케이스, 범위, 대략적, 비용 추정에 대해 정의, 용어집, 보충 명세서, 프로토타입과 개념 증명, Iteration 계획, Usecase Model &lt;br /&gt;Elaboration(정련) &lt;br /&gt;정제된 비전, 핵심 아키텍처(구조) 정의, 높은 위험성 해결, 대부분의 요구사항과 범위 식별, 보다 현실적인 추정, OOA, Domain Model, Class Diagram, Sequence Diagram &lt;br /&gt;Construction(구축) &lt;br /&gt;좀더&amp;nbsp;쉬운&amp;nbsp;부분의&amp;nbsp;반복적인&amp;nbsp;구현&amp;nbsp;및&amp;nbsp;배치&amp;nbsp;준비 &lt;br /&gt;Transition(전이) &lt;br /&gt;베타&amp;nbsp;테스트,&amp;nbsp;배치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Requirements의&amp;nbsp;유형과&amp;nbsp;설명하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능적 요구 사항(functional requirements) &lt;br /&gt;&amp;nbsp;-&amp;nbsp;시스템이&amp;nbsp;무엇을&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;서비스등의&amp;nbsp;외형적&amp;nbsp;기능 &lt;br /&gt;&lt;br /&gt;비기능적&amp;nbsp;요구&amp;nbsp;사항(nonfunctional&amp;nbsp;requirements) &lt;br /&gt;&amp;nbsp;-&amp;nbsp;개발&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;품질&amp;nbsp;특성에&amp;nbsp;대한&amp;nbsp;수준 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;사용용이성,&amp;nbsp;효율성,&amp;nbsp;신뢰성,&amp;nbsp;유지보수성,&amp;nbsp;재사용성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;FURPS가&amp;nbsp;무엇인지&amp;nbsp;나열하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Functionality, Usability, Reliability, Performance, Supportability&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Why is Required Interface essential in designing platform SW?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로 직접 구현하지는 않는 상황 - 외부로부터 플러그인으로 받을 수 있도록, 범용으로 쓰려고, 가변적으로. &lt;br /&gt;platform&amp;nbsp;sw에&amp;nbsp;가변적인&amp;nbsp;부분이&amp;nbsp;있고,&amp;nbsp;플랫폼은&amp;nbsp;단독으로&amp;nbsp;동작을&amp;nbsp;하지&amp;nbsp;않는다. &lt;br /&gt;그&amp;nbsp;위에&amp;nbsp;application이&amp;nbsp;돌아야&amp;nbsp;하는데,&amp;nbsp;이&amp;nbsp;application이&amp;nbsp;해당&amp;nbsp;가변적인&amp;nbsp;부분을&amp;nbsp;interface로&amp;nbsp;반드시&amp;nbsp;구현하도록&amp;nbsp;하기&amp;nbsp;위해.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Provided&amp;nbsp;Interface&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트에서 기능을 제공하기 위해 노출되는 Interface&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UP의 단계&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce066X/btrK1pGNn5d/H5EIK28ih7VnDiO2HtYlKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce066X/btrK1pGNn5d/H5EIK28ih7VnDiO2HtYlKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce066X/btrK1pGNn5d/H5EIK28ih7VnDiO2HtYlKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce066X%2FbtrK1pGNn5d%2FH5EIK28ih7VnDiO2HtYlKk%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;687&quot; height=&quot;319&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/132</guid>
      <comments>https://camelact.tistory.com/132#entry132comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:45:50 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][아키텍처]OOP Concepts</title>
      <link>https://camelact.tistory.com/131</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOP, 다이나믹 바인딩이 OOP에서 왜 필수인가요? 장점, 단점은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;장점&amp;nbsp;:&amp;nbsp;runtime시에&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;들어올&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;br /&gt;들어오는&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOP 5가지 원칙에 대해서 설명해 보세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Abstraction &lt;br /&gt;-&amp;nbsp;객체의&amp;nbsp;공통된&amp;nbsp;속성들&amp;nbsp;중&amp;nbsp;필요한&amp;nbsp;부분을&amp;nbsp;포착해서&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;하나의&amp;nbsp;개념(집합)으로&amp;nbsp;다루는&amp;nbsp;것 &lt;br /&gt;Encapsulation &lt;br /&gt;-&amp;nbsp;외부에&amp;nbsp;노출할&amp;nbsp;필요가&amp;nbsp;없는&amp;nbsp;정보들은&amp;nbsp;은닉 &lt;br /&gt;-&amp;nbsp;필요한&amp;nbsp;정보만&amp;nbsp;보여주게끔&amp;nbsp;설계 &lt;br /&gt;Inheritance &lt;br /&gt;-&amp;nbsp;부모&amp;nbsp;클래스가&amp;nbsp;자손&amp;nbsp;클래스에게&amp;nbsp;속성을&amp;nbsp;물려주는&amp;nbsp;것 &lt;br /&gt;-&amp;nbsp;코드의&amp;nbsp;재사용 &lt;br /&gt;Polymorphism &lt;br /&gt;-&amp;nbsp;같은&amp;nbsp;형태이지만&amp;nbsp;다른&amp;nbsp;기능을&amp;nbsp;하는&amp;nbsp;것 &lt;br /&gt;-&amp;nbsp;오버라이딩(Overriding)&amp;nbsp;은&amp;nbsp;상위&amp;nbsp;클래스가&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;메서드를&amp;nbsp;하위&amp;nbsp;클래스가&amp;nbsp;재정의해서&amp;nbsp;사용 &lt;br /&gt;-&amp;nbsp;오버로딩(Overloading)&amp;nbsp;은&amp;nbsp;이름의&amp;nbsp;메서드&amp;nbsp;여러개를&amp;nbsp;가지면서&amp;nbsp;매개변수의&amp;nbsp;유형과&amp;nbsp;개수가&amp;nbsp;다르도록&amp;nbsp;하는&amp;nbsp;기술 &lt;br /&gt;Composition &lt;br /&gt;- &amp;lsquo;Has-a&amp;rsquo; 관계. 런타임에 동적으로 다른 객체의 reference를 얻어 정의됨. Interface를 통해서만 접근하므로 Encapsulation 원칙을 망가뜨리지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Encapsulation, 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SW가 어떻게 동작하는지 자세히 몰라도 쉽게 사용할 수 있도록 설계/구현함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Information Hiding, 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client에게 interface만 제공하고 data에 대한 접근은 막음(Visibility)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Inheritance, 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;Is-a&amp;rsquo; , &amp;lsquo;Is a kind of&amp;rsquo; 관계라고도 하며 Class를 organize 하는 방식, Generalization이라고도 표현함. 공통 속성을 갖는 Class들을 묶어서 공통 속성이 한 번만 정의되도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Polymorphism, 무엇인가요? 4가지 기억&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Descendants(자손) &lt;br /&gt;부모의&amp;nbsp;X에서&amp;nbsp;X&amp;nbsp;b&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Y()를&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;반대는불가 &lt;br /&gt;&lt;br /&gt;다형성은&amp;nbsp;&quot;여러&amp;nbsp;객체에게&amp;nbsp;동일한&amp;nbsp;명령을&amp;nbsp;내렸을&amp;nbsp;때&amp;nbsp;서로&amp;nbsp;다르게&amp;nbsp;반응하는&amp;nbsp;현상&quot;을&amp;nbsp;의미합니다. &lt;br /&gt;1)&amp;nbsp;인터페이스(interface) &lt;br /&gt;2)&amp;nbsp;추상클래스(abstract) &lt;br /&gt;3)&amp;nbsp;메소드&amp;nbsp;오버라이딩 &lt;br /&gt;4)&amp;nbsp;메소드&amp;nbsp;오버로딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컴파일 타임과 런타임시에 Polymorphism을 설명하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드&amp;nbsp;오버라이딩을&amp;nbsp;통해&amp;nbsp;컴파일&amp;nbsp;타임/런타임&amp;nbsp;폴리모피즘&amp;nbsp;가능 &lt;br /&gt;컴파일시&amp;nbsp;-&amp;nbsp;메소드명은&amp;nbsp;같으나&amp;nbsp;파라미터가&amp;nbsp;다른경우&amp;nbsp;-&amp;gt;&amp;nbsp;Overloading &lt;br /&gt;런타임시 - 상속을 통해 메소드 명, 파라미터가 같은 경우 -&amp;gt; Overriding&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Abstract&amp;nbsp;Class&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상 클래스와 인터페이스의 차이점은 무엇입니까? &lt;br /&gt;인터페이스&amp;nbsp;:&amp;nbsp;역할&amp;nbsp;구분을&amp;nbsp;하고&amp;nbsp;싶다면,&amp;nbsp;구현할&amp;nbsp;컴포넌트의&amp;nbsp;표준을&amp;nbsp;정하는&amp;nbsp;것 &lt;br /&gt;추상클래스&amp;nbsp;:&amp;nbsp;abstract&amp;nbsp;is&amp;nbsp;a&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추상화란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Generic Class &amp;amp; Template 무엇인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스를 디자인할 때 클래스를 사용할 타입을 지정하지 않고, 클래스를 사용할 때 지정하여 사용하는 기술을 뜻한다. 미리 정의하지 않은 타입은 매개변수로 제공한다. 예를 들어, List 클래스는 내부에 포함할 원소들의 타입으로 매개변수화 될 수 있다. 정수형의 리스트를 선언하고 싶으면 List 타입에 Integer 타입을 매개변수로 넘겨주면 되고, String 객체의 리스트를 만들고 싶다면 String을 넘기면 된다. C++에서는 Template이라고 하며, Ada와 Eiffel에서는 Generic이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOP, C와 같은 절차적 프로그램의 일반적인 단점은 무엇입니까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점 &lt;br /&gt;1.&amp;nbsp;개인&amp;nbsp;프로젝트에&amp;nbsp;적합한&amp;nbsp;언어입니다. &lt;br /&gt;2.&amp;nbsp;객체지향&amp;nbsp;프로그래밍과&amp;nbsp;비교하여&amp;nbsp;속도가&amp;nbsp;빠른편입니다. &lt;br /&gt;&lt;br /&gt;단점 &lt;br /&gt;1.&amp;nbsp;유지보수가&amp;nbsp;어렵습니다. &lt;br /&gt;2.&amp;nbsp;코드의&amp;nbsp;순서가&amp;nbsp;바뀌면&amp;nbsp;의도한&amp;nbsp;대로&amp;nbsp;프로그램이&amp;nbsp;동작하지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;3.&amp;nbsp;프로그램의&amp;nbsp;분석과&amp;nbsp;디버깅이&amp;nbsp;어렵습니다. &lt;br /&gt;4.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOP, Functional Programming 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOP, Convert from C to OOP&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인&amp;nbsp;엔티티를&amp;nbsp;식별해내고&amp;nbsp;그것을&amp;nbsp;객체로&amp;nbsp;만듭니다 &lt;br /&gt;Procedure에&amp;nbsp;있던&amp;nbsp;책임을&amp;nbsp;GRASP&amp;nbsp;원칙을&amp;nbsp;지키면서&amp;nbsp;객체들에&amp;nbsp;옮겨줍니다 &lt;br /&gt;Procedure을&amp;nbsp;Usecase라고&amp;nbsp;본다면&amp;nbsp;Loose&amp;nbsp;coupling,&amp;nbsp;high&amp;nbsp;cohesion으로&amp;nbsp;묶어서&amp;nbsp;객체화,&amp;nbsp;Component화&amp;nbsp;합니다. &lt;br /&gt;Abstraction, Encapsulation하여 객체를 만들어야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OOP 개념&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W0yZt/btrK1qlmsBB/CFAx8rsJO7kAVss2j3trY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W0yZt/btrK1qlmsBB/CFAx8rsJO7kAVss2j3trY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W0yZt/btrK1qlmsBB/CFAx8rsJO7kAVss2j3trY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW0yZt%2FbtrK1qlmsBB%2FCFAx8rsJO7kAVss2j3trY0%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;479&quot; height=&quot;372&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Architecture</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/131</guid>
      <comments>https://camelact.tistory.com/131#entry131comment</comments>
      <pubDate>Wed, 31 Aug 2022 00:37:43 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][자료구조]Priority Queue 이론과 예제</title>
      <link>https://camelact.tistory.com/96</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐(Queue)는 먼저 들어오는 데이터가 먼저 나가는&lt;span&gt;&amp;nbsp;&lt;/span&gt;FIFO(First In First Out)&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식의 자료구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐(Priority Queue)는 먼저 들어오는 데이터가 아니라, 우선순위가 높은 데이터가 먼저 나가는 형태의 자료구조이다.&amp;nbsp;우선순위 큐는 일반적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;힙(Heap)을 이용하여 구현합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;oP565GF.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGy3t2/btrFqq5vSbs/9g1t1PHAOYjCFKgHte0BiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGy3t2/btrFqq5vSbs/9g1t1PHAOYjCFKgHte0BiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGy3t2/btrFqq5vSbs/9g1t1PHAOYjCFKgHte0BiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGy3t2%2FbtrFqq5vSbs%2F9g1t1PHAOYjCFKgHte0BiK%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;590&quot; height=&quot;287&quot; data-filename=&quot;oP565GF.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;부모 노드의 키 값이 자식 노드보다 크거나 같은 완전 이진트리입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입 또는 삭제 연산을 위한 시간 복잡도는 O(n)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 힙트리는 완전 이진트리 구조이므로 힙트리의 높이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;log₂(n+1)이며, 힙의 시간 복잡도는 O(log₂n)입니다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 왼쪽 자식 노드 index = (부모 노드 index) * 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 오른쪽 자식 노드 index = (부모 노드 index) * 2 + 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 노드를 구하고 싶을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 부모 노드 index = (자식 노드 index) / 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Usecase&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 명품 스토어 대기열에 명단을 넣는데 VVIP라면 먼저 거래할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIRFYV/btrFo0fpFpz/lYs9NPvl8hshduH8kVthjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIRFYV/btrFo0fpFpz/lYs9NPvl8hshduH8kVthjk/img.png&quot; data-alt=&quot;http://m.blog.naver.com/c_18/220026838448&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIRFYV/btrFo0fpFpz/lYs9NPvl8hshduH8kVthjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIRFYV%2FbtrFo0fpFpz%2FlYs9NPvl8hshduH8kVthjk%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;740&quot; height=&quot;313&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http://m.blog.naver.com/c_18/220026838448&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.algorithm.basic;

public class PriorityQueue {
	final int MAX_SIZE = 1000;

	int heap[] = new int[MAX_SIZE];
	int heapSize = 0;

	void init() {
		heapSize = 0;
	}

	void push(int value) {
		if (heapSize + 1 &amp;gt; MAX_SIZE) {
			return;
		}

		heap[heapSize] = value;

		int current = heapSize;
		while (current &amp;gt; 0 &amp;amp;&amp;amp; heap[current] &amp;lt; heap[(current - 1) / 2]) {
			int temp = heap[(current - 1) / 2];
			heap[(current - 1) / 2] = heap[current];
			heap[current] = temp;
			current = (current - 1) / 2;
		}

		heapSize = heapSize + 1;
	}

	int pop() {
		if (heapSize &amp;lt;= 0) {
			return -1;
		}

		int value = heap[0];
		heapSize = heapSize - 1;

		heap[0] = heap[heapSize];

		int current = 0;
		while (current &amp;lt; heapSize &amp;amp;&amp;amp; current * 2 + 1 &amp;lt; heapSize) {
			int child;
			if (current * 2 + 2 &amp;gt;= heapSize) {
				child = current * 2 + 1;
			} else {
				child = heap[current * 2 + 1] &amp;lt; heap[current * 2 + 2] ? current * 2 + 1 : current * 2 + 2;
			}

			if (heap[current] &amp;lt; heap[child]) {
				break;
			}

			int temp = heap[current];
			heap[current] = heap[child];
			heap[child] = temp;

			current = child;
		}
		return value;
	}

	void print(int[] heap, int heap_size) {
		for (int i = 0; i &amp;lt; heap_size; i++) {
			System.out.print(heap[i] + &quot; &quot;);
		}
		System.out.println();
	}

	public static void main(String arg[]) throws Exception {
		PriorityQueue priorityQueue = new PriorityQueue();
		
		int N = 10;

		priorityQueue.init();

		priorityQueue.push(1);
		priorityQueue.push(3);
		priorityQueue.push(6);
		priorityQueue.push(5);
		priorityQueue.push(2);
		priorityQueue.push(7);
		priorityQueue.push(4);
		priorityQueue.push(8);
		priorityQueue.push(9);
		priorityQueue.push(0);

		for (int i = 0; i &amp;lt; N; i++) {
			System.out.print(priorityQueue.pop() + &quot; &quot;);
		}
		System.out.println();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0 1 2 3 4 5 6 7 8 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Data Structure</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/96</guid>
      <comments>https://camelact.tistory.com/96#entry96comment</comments>
      <pubDate>Sun, 26 Jun 2022 22:48:39 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]구글 에드센스 광고 게시</title>
      <link>https://camelact.tistory.com/127</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;에드센스 연동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 관리에서 수익 메뉴 - Google AdSense를 확인 후 연동하기 버튼을 클릭합니다.&lt;/p&gt;
&lt;p 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-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xQWN/btrFo00Hg49/yF8XxMrUEvymWwCviRWVw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xQWN/btrFo00Hg49/yF8XxMrUEvymWwCviRWVw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xQWN/btrFo00Hg49/yF8XxMrUEvymWwCviRWVw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xQWN%2FbtrFo00Hg49%2FyF8XxMrUEvymWwCviRWVw0%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;904&quot; height=&quot;412&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;412&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;연동이 된다면 상세보기를 통해 연동 확인을 합니다.&lt;/p&gt;
&lt;p 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;918&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfgFg8/btrFoQcXAbE/kPhpdnVC6z0rj2ek09yX41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfgFg8/btrFoQcXAbE/kPhpdnVC6z0rj2ek09yX41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfgFg8/btrFoQcXAbE/kPhpdnVC6z0rj2ek09yX41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfgFg8%2FbtrFoQcXAbE%2FkPhpdnVC6z0rj2ek09yX41%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;918&quot; height=&quot;275&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;275&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;아래에 내려보면 광고를 어디에 게시할지 설정을 할 수 있습니다.&lt;/p&gt;
&lt;p 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;931&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byvr5C/btrFrdY5ImQ/kz5CzWSlc2pFoLppJI5be1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byvr5C/btrFrdY5ImQ/kz5CzWSlc2pFoLppJI5be1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byvr5C/btrFrdY5ImQ/kz5CzWSlc2pFoLppJI5be1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyvr5C%2FbtrFrdY5ImQ%2Fkz5CzWSlc2pFoLppJI5be1%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;931&quot; height=&quot;592&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;592&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;실제 광고 수익을 얻기 위해선 구글 에드센스에 연동이 되어야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;a href=&quot;https://www.google.com/adsense/start/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.google.com/adsense/start/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655812917394&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;Google AdSense - ウェブサイトを収益化&quot; data-og-description=&quot;Google AdSense を使用してウェブサイトを収益化しましょう。広告のサイズは自動的に最適化され、表示とクリックが促進されます。&quot; data-og-host=&quot;www.google.com&quot; data-og-source-url=&quot;https://www.google.com/adsense/start/&quot; data-og-url=&quot;https://www.google.com/adsense/start/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bM8xJn/hyOQj90iiF/IIdn9tFx0q4XU0L2nHbMmK/img.jpg?width=512&amp;amp;height=341&amp;amp;face=0_0_512_341&quot;&gt;&lt;a href=&quot;https://www.google.com/adsense/start/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.google.com/adsense/start/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bM8xJn/hyOQj90iiF/IIdn9tFx0q4XU0L2nHbMmK/img.jpg?width=512&amp;amp;height=341&amp;amp;face=0_0_512_341');&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;Google AdSense - ウェブサイトを収益化&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Google AdSense を使用してウェブサイトを収益化しましょう。広告のサイズは自動的に最適化され、表示とクリックが促進されます。&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.google.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 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;p 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;2449&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJzAzO/btrFnBHB2Rm/UXWP5RHkG2GXYbTuCfreJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJzAzO/btrFnBHB2Rm/UXWP5RHkG2GXYbTuCfreJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJzAzO/btrFnBHB2Rm/UXWP5RHkG2GXYbTuCfreJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJzAzO%2FbtrFnBHB2Rm%2FUXWP5RHkG2GXYbTuCfreJK%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;2449&quot; height=&quot;752&quot; data-origin-width=&quot;2449&quot; data-origin-height=&quot;752&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;에드고시라는 말이 있는데 그만큼 에드센스 승인 받기가 어렵다는 말입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그는 운이 좋아서 한 번에 통과하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글을 매일 하루에 한 개씩 쓰고, 내용이 어느정도 알차게 쓰면 통과되는 것으로 보입니다.&lt;/p&gt;
&lt;p 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;657&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLda9f/btrFmXYwB3e/dCjIluUCnaIZ8REVdVT1Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLda9f/btrFmXYwB3e/dCjIluUCnaIZ8REVdVT1Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLda9f/btrFmXYwB3e/dCjIluUCnaIZ8REVdVT1Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLda9f%2FbtrFmXYwB3e%2FdCjIluUCnaIZ8REVdVT1Bk%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;657&quot; height=&quot;866&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;866&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;에드센스 고시를 통과하게되면 위와 같이 메일로 활성화 되었음 알 수 있습니다.&lt;/p&gt;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/127</guid>
      <comments>https://camelact.tistory.com/127#entry127comment</comments>
      <pubDate>Sat, 25 Jun 2022 22:20:52 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][자료구조]Queue 이론과 예제</title>
      <link>https://camelact.tistory.com/95</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;큐의 구조는 스택과 다르게 '선입선출'의 구조를 가지고 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;스택은 막힌 박스와 같아 먼저 들어온 것이 가장 나중에 나가는 구조지만, 큐는 먼저 들어온 것이 먼저 나가는 구조입니다. 좋은 예로 은행에 있는 번호표가 있습니다. 은행에 방문하여 먼저 온 사람이 먼저 업무를 봐야 합니다.&amp;nbsp;은행에서는 번호표를 나눠줍니다. 먼저 온 손님은 늦게 온 손님보다 먼저 서비스를 받게 하기 위해서죠. 이러한 은행의 번호표의 체계가 큐(Queue)입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&amp;nbsp; - enqueue&amp;nbsp;: 큐 맨 뒤에 어떠한 요소를 추가, 마지막으로 온 손님에게 번호표&amp;nbsp;발부&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&amp;nbsp; - dequeue&amp;nbsp;: 큐 맨 앞쪽의 요소를 삭제, 창구에서 서비스를 받은 손님의 번호표를 대기목록에서 삭제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&amp;nbsp; - peek&amp;nbsp;: front에 위치한 데이터를 읽음, 다음 서비스를 받을 손님이 누구인지 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&amp;nbsp; - front&amp;nbsp;: 큐의 맨 앞의 위치(인덱스), 다음 서비스를 받을 손님의 번호&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&amp;nbsp; -&amp;nbsp;rear&amp;nbsp;: 큐의 맨 뒤의 위치(인덱스), 마지막에 온 손님의 번호&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Usecase&lt;/h3&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;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Data_Queue.svg.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0wopJ/btrE5zixICs/MvnNOzGyxvl2FKHoyXFqV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0wopJ/btrE5zixICs/MvnNOzGyxvl2FKHoyXFqV1/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%ED%81%90_(%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0wopJ/btrE5zixICs/MvnNOzGyxvl2FKHoyXFqV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0wopJ%2FbtrE5zixICs%2FMvnNOzGyxvl2FKHoyXFqV1%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;220&quot; height=&quot;144&quot; data-filename=&quot;Data_Queue.svg.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%ED%81%90_(%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.data.structure;

public class MyQueue {
	final int MAX_N = 1000;

	int front;
	int rear;
	int queue[] = new int[MAX_N];

	void init() {
		front = 0;
		rear = 0;
	}

	boolean queueIsEmpty() {
		return (front == rear);
	}

	boolean queueIsFull() {
		if ((front + 1) % MAX_N == rear) {
			return true;
		} else {
			return false;
		}
	}

	boolean enqueue(int value) {
		if (queueIsFull()) {
			System.out.print(&quot;queue is full!&quot;);
			return false;
		}
		queue[front] = value;
		front++;
		if (front == MAX_N) {
			front = 0;
		}

		return true;
	}

	Integer dequeue() {
		if (queueIsEmpty()) {
			System.out.print(&quot;queue is empty!&quot;);
			return null;
		}

		Integer value = new Integer(queue[rear]);

		rear++;
		if (rear &amp;gt;= MAX_N) {
			rear = 0;
		}
		return value;
	}

	public static void main(String arg[]) throws Exception {
		MyQueue myQueue = new MyQueue();

		int N = 10;

		myQueue.init();

		for (int i = 0; i &amp;lt; N; i++) {
			myQueue.enqueue(i);
		}

		while (!myQueue.queueIsEmpty()) {
			Integer value = myQueue.dequeue();
			if (value != null) {
				System.out.print(value.intValue() + &quot; &quot;);
			}
		}
		System.out.println();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0 1 2 3 4 5 6 7 8 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Data Structure</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/95</guid>
      <comments>https://camelact.tistory.com/95#entry95comment</comments>
      <pubDate>Fri, 24 Jun 2022 22:52:56 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][자료구조]Stack 이론과 예제</title>
      <link>https://camelact.tistory.com/94</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료 구조&lt;br /&gt;즉, 가장 최근에 스택에 추가한 항목이 가장 먼저 제거될 항목이다.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;pop():&amp;nbsp;스택에서&amp;nbsp;가장&amp;nbsp;위에&amp;nbsp;있는&amp;nbsp;항목을&amp;nbsp;제거한다.&lt;br /&gt;&lt;span&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;push(item):&amp;nbsp;item&amp;nbsp;하나를&amp;nbsp;스택의&amp;nbsp;가장&amp;nbsp;윗부분에&amp;nbsp;추가한다.&lt;br /&gt;&lt;span&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;peek():&amp;nbsp;스택의&amp;nbsp;가장&amp;nbsp;위에&amp;nbsp;있는&amp;nbsp;항목을&amp;nbsp;반환한다.&lt;br /&gt;&lt;span&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;isEmpty():&amp;nbsp;스택이&amp;nbsp;비어&amp;nbsp;있을&amp;nbsp;때에&amp;nbsp;true를&amp;nbsp;반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;배열과 달리 스택은 i번째 항목에 접근할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Usecase&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 웹 브라우저 방문기록 (뒤로 가기) &lt;br /&gt;&amp;nbsp; - 실행 취소 (undo) &lt;br /&gt;&amp;nbsp; - 역순 문자열 만들기 &lt;br /&gt;&amp;nbsp; - 수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사, 후위 표기법 계산)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;300px-Data_stack.svg.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLbaps/btrE4VfCH3w/zChKXHg3TJyrTm7d6Te6Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLbaps/btrE4VfCH3w/zChKXHg3TJyrTm7d6Te6Rk/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLbaps/btrE4VfCH3w/zChKXHg3TJyrTm7d6Te6Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLbaps%2FbtrE4VfCH3w%2FzChKXHg3TJyrTm7d6Te6Rk%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;300&quot; height=&quot;216&quot; data-filename=&quot;300px-Data_stack.svg.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.data.structure;

class MyStack {

	public final int MAX_N = 1000;

	public int top;
	public int stack[] = new int[MAX_N];

	public void stackInit() {
		top = 0;
	}

	public boolean stackIsEmpty() {
		return (top == 0);
	}

	public boolean stackIsFull() {
		return (top == MAX_N);
	}

	public boolean push(int value) {
		if (stackIsFull()) {
			System.out.println(&quot;stack overflow!&quot;);
			return false;
		}
		stack[top] = value;
		top++;

		return true;
	}

	public Integer pop() {
		if (top == 0) {
			System.out.println(&quot;stack is empty!&quot;);
			return null;
		}

		top--;
		Integer value = new Integer(stack[top]);

		return value;
	}

	public static void main(String arg[]) throws Exception {
		MyStack myStack = new MyStack();
		
		int N = 10;

		myStack.stackInit();
		
		for (int i = 0; i &amp;lt; N; i++) {
			int value = i;
			myStack.push(value);
		}

		while ( ! myStack.stackIsEmpty()) {
			Integer value = myStack.pop();
			if (value != null) {
				System.out.print(value.intValue() + &quot; &quot;);
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;9 8 7 6 5 4 3 2 1 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Data Structure</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/94</guid>
      <comments>https://camelact.tistory.com/94#entry94comment</comments>
      <pubDate>Thu, 23 Jun 2022 22:25:52 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Prototype 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/110</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;br /&gt;&lt;br /&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;br /&gt;&lt;br /&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;않습니다. &lt;br /&gt;그러나&amp;nbsp;&quot;초기화&quot;&amp;nbsp;작업이&amp;nbsp;필요합니다.&amp;nbsp;팩토리&amp;nbsp;메소드&amp;nbsp;패턴은&amp;nbsp;서브클래싱이&amp;nbsp;필요하지만&amp;nbsp;&quot;초기화&quot;&amp;nbsp;작업은&amp;nbsp;필요하지&amp;nbsp;않습니다. &lt;br /&gt;&lt;br /&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;있습니다. &lt;br /&gt;&lt;br /&gt;원칙은&amp;nbsp;&quot;런타임&quot;에&amp;nbsp;다른&amp;nbsp;&quot;객체&quot;를&amp;nbsp;생성한다는&amp;nbsp;것입니다. &lt;br /&gt;즉,&amp;nbsp;이&amp;nbsp;시점에서&amp;nbsp;복제되는&amp;nbsp;개체의&amp;nbsp;&quot;실제&amp;nbsp;복사본&quot;이&amp;nbsp;만들어집니다. &lt;br /&gt;&lt;br /&gt;&quot;실제&amp;nbsp;사본&quot;이라는&amp;nbsp;용어는&amp;nbsp;새로&amp;nbsp;생성된&amp;nbsp;개체가&amp;nbsp;복제된&amp;nbsp;개체의&amp;nbsp;속성과&amp;nbsp;동일한&amp;nbsp;속성을&amp;nbsp;가짐을&amp;nbsp;의미합니다. &lt;br /&gt;&lt;br /&gt;반면에&amp;nbsp;&quot;new&quot;를&amp;nbsp;사용하여&amp;nbsp;객체를&amp;nbsp;생성하는&amp;nbsp;경우&amp;nbsp;새로&amp;nbsp;생성된&amp;nbsp;객체의&amp;nbsp;속성은&amp;nbsp;초기&amp;nbsp;값을&amp;nbsp;갖습니다. &lt;br /&gt;&lt;br /&gt;장점&lt;br /&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;있습니다. &lt;br /&gt;&lt;br /&gt;단점&lt;br /&gt;생성하고자&amp;nbsp;하는&amp;nbsp;객체의&amp;nbsp;데이터&amp;nbsp;타입인&amp;nbsp;모든&amp;nbsp;클래스는&amp;nbsp;clone()&amp;nbsp;메소드를&amp;nbsp;구현해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2184D/btrE4Cmhsq5/ZEZEc50VK2Oir9IaAGh9x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2184D/btrE4Cmhsq5/ZEZEc50VK2Oir9IaAGh9x1/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2184D/btrE4Cmhsq5/ZEZEc50VK2Oir9IaAGh9x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2184D%2FbtrE4Cmhsq5%2FZEZEc50VK2Oir9IaAGh9x1%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;412&quot; height=&quot;90&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

import java.util.Hashtable;

interface Product extends Cloneable {
	public abstract void use(String s);

	public abstract Product createClone();
}

class Manager {
	private Hashtable showcase = new Hashtable();

	public void register(String name, Product proto) {
		showcase.put(name, proto);
	}

	public Product create(String protoname) {
		Product p = (Product) showcase.get(protoname);
		return p.createClone();
	}
}

class UnderlinePen implements Product {
	private char ulchar;

	public UnderlinePen(char ulchar) {
		this.ulchar = ulchar;
	}

	public void use(String s) {
		int length = s.getBytes().length;
		System.out.println(&quot;\&quot;&quot; + s + &quot;\&quot;&quot;);
		System.out.print(&quot; &quot;);
		for (int i = 0; i &amp;lt; length; i++) {
			System.out.print(ulchar);
		}
		System.out.println(&quot;&quot;);
	}

	public Product createClone() {
		Product p = null;
		try {
			p = (Product) clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
}

class MessageBox implements Product {
	private char decochar;

	public MessageBox(char decochar) {
		this.decochar = decochar;
	}

	public void use(String s) {
		int length = s.getBytes().length;
		for (int i = 0; i &amp;lt; length + 4; i++) {
			System.out.print(decochar);
		}
		System.out.println(&quot;&quot;);
		System.out.println(decochar + &quot; &quot; + s + &quot; &quot; + decochar);
		for (int i = 0; i &amp;lt; length + 4; i++) {
			System.out.print(decochar);
		}
		System.out.println(&quot;&quot;);
	}

	public Product createClone() {
		Product p = null;
		try {
			p = (Product) clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return p;
	}
}

public class MyPrototype {
	public static void main(String[] args) {
		// 준비
		Manager manager = new Manager();
		UnderlinePen upen = new UnderlinePen('~');
		MessageBox mbox = new MessageBox('*');
		MessageBox sbox = new MessageBox('/');

		UnderlinePen upen2 = new UnderlinePen('%');

		upen.use(&quot;Hello, world.&quot;);
		System.out.println();
		mbox.use(&quot;Hello, world.&quot;);
		System.out.println();
		sbox.use(&quot;Hello, world.&quot;);
		System.out.println();
		upen2.use(&quot;Hello, world.&quot;);
		System.out.println();

		manager.register(&quot;strong message&quot;, upen);
		manager.register(&quot;warning box&quot;, mbox);
		manager.register(&quot;slash box&quot;, sbox);

		// Prototype으로부터 복제 생성

		Product p1 = manager.create(&quot;strong message&quot;);
		p1.use(&quot;Hello, world.&quot;);
		System.out.println();

		Product p2 = manager.create(&quot;warning box&quot;);
		p2.use(&quot;Hello, world.&quot;);
		System.out.println();

		Product p3 = manager.create(&quot;slash box&quot;);
		p3.use(&quot;Hello, world.&quot;);
		System.out.println();

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;Hello, world.&quot;
 ~~~~~~~~~~~~~

*****************
* Hello, world. *
*****************

/////////////////
/ Hello, world. /
/////////////////

&quot;Hello, world.&quot;
 %%%%%%%%%%%%%

&quot;Hello, world.&quot;
 ~~~~~~~~~~~~~

*****************
* Hello, world. *
*****************

/////////////////
/ Hello, world. /
/////////////////&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/110</guid>
      <comments>https://camelact.tistory.com/110#entry110comment</comments>
      <pubDate>Wed, 22 Jun 2022 16:21:24 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Proxy 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/93</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시&amp;nbsp;패턴은&amp;nbsp;컴퓨터&amp;nbsp;프로그래밍의&amp;nbsp;소프트웨어&amp;nbsp;디자인&amp;nbsp;패턴&amp;nbsp;중&amp;nbsp;하나입니다. &lt;br /&gt;&lt;br /&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;또는&amp;nbsp;복제할&amp;nbsp;수&amp;nbsp;없거나&amp;nbsp;수요가&amp;nbsp;많은&amp;nbsp;리소스). &lt;br /&gt;&lt;br /&gt;프록시&amp;nbsp;패턴의&amp;nbsp;잘&amp;nbsp;알려진&amp;nbsp;예는&amp;nbsp;참조&amp;nbsp;카운트&amp;nbsp;스마트&amp;nbsp;포인터&amp;nbsp;개체입니다. &lt;br /&gt;&lt;br /&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;있습니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;전처리&amp;nbsp;및&amp;nbsp;후처리에&amp;nbsp;사용하기&amp;nbsp;쉽습니다.&amp;nbsp;(B가&amp;nbsp;C에게&amp;nbsp;묻기&amp;nbsp;전에&amp;nbsp;다른&amp;nbsp;작업을&amp;nbsp;전처리할&amp;nbsp;수&amp;nbsp;있음) &lt;br /&gt;특정&amp;nbsp;방법에&amp;nbsp;대한&amp;nbsp;보안은&amp;nbsp;양호합니다.&amp;nbsp;(B가&amp;nbsp;C에게&amp;nbsp;요청한다는&amp;nbsp;사실은&amp;nbsp;A가&amp;nbsp;무슨&amp;nbsp;일이&amp;nbsp;일어나고&amp;nbsp;있는지&amp;nbsp;정확히&amp;nbsp;알기&amp;nbsp;어렵게&amp;nbsp;만든다) &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;절차적&amp;nbsp;패턴을&amp;nbsp;사용하면&amp;nbsp;가독성이&amp;nbsp;떨어집니다.&amp;nbsp;(A-&amp;gt;B-C의&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba6Oym/btrE5TuxQK8/C1NCRvXjkxj9kCbMoPoiQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba6Oym/btrE5TuxQK8/C1NCRvXjkxj9kCbMoPoiQ0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba6Oym/btrE5TuxQK8/C1NCRvXjkxj9kCbMoPoiQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba6Oym%2FbtrE5TuxQK8%2FC1NCRvXjkxj9kCbMoPoiQ0%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;400&quot; height=&quot;223&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

import java.awt.Component;
import java.awt.Graphics;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

class ImageComponent extends JComponent {
	private static final long serialVersionUID = 1L;
	private Icon icon;

	public ImageComponent(Icon icon) {
		this.icon = icon;
	}

	public void setIcon(Icon icon) {
		this.icon = icon;
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		int w = icon.getIconWidth();
		int h = icon.getIconHeight();
		int x = (800 - w)/2;
		int y = (600 - h)/2;
		icon.paintIcon(this, g, x, y);
	}
}

class ImageProxy implements Icon {
	volatile ImageIcon imageIcon;
	final URL imageURL;
	Thread retrievalThread;
	boolean retrieving = false;

	public ImageProxy(URL url) {
		imageURL = url;
	}

	@Override
	public int getIconWidth() {
		if (imageIcon != null) {
			return imageIcon.getIconWidth();
		} else {
			return 800;
		}
	}

	@Override
	public int getIconHeight() {
		if (imageIcon != null) {
			return imageIcon.getIconHeight();
		} else {
			return 600;
		}
	}

	synchronized void setImageIcon(ImageIcon imageIcon) {
		this.imageIcon = imageIcon;
	}

	@Override
	public void paintIcon(final Component c, Graphics g, int x, int y) {
		if (imageIcon != null) {
			imageIcon.paintIcon(c, g, x, y);
		} else {
			g.drawString(&quot;Loading CD cover, please wait...&quot;, x + 300, y + 190);
			if (!retrieving) {
				retrieving = true;

				retrievalThread = new Thread(new Runnable() {
					public void run() {
						try {
							setImageIcon(new ImageIcon(imageURL, &quot;CD Cover&quot;));
							c.repaint();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				});
				retrievalThread.start();
			}
		}
	}
}

public class MyProxy {

	ImageComponent imageComponent;
	JFrame frame = new JFrame(&quot;CD Cover Viewer&quot;);
	JMenuBar menuBar;
	JMenu menu;
	Hashtable&amp;lt;String, String&amp;gt; cds = new Hashtable&amp;lt;String, String&amp;gt;();

	public static void main(String[] args) throws Exception {
		new MyProxy();
	}

	public MyProxy() throws Exception{
		cds.put(&quot;Buddha Bar&quot;,&quot;http://images.amazon.com/images/P/B00009XBYK.01.LZZZZZZZ.jpg&quot;);
		cds.put(&quot;Ima&quot;,&quot;http://images.amazon.com/images/P/B000005IRM.01.LZZZZZZZ.jpg&quot;);
		cds.put(&quot;Karma&quot;,&quot;http://images.amazon.com/images/P/B000005DCB.01.LZZZZZZZ.gif&quot;);
		cds.put(&quot;MCMXC A.D.&quot;,&quot;http://images.amazon.com/images/P/B000002URV.01.LZZZZZZZ.jpg&quot;);
		cds.put(&quot;Northern Exposure&quot;,&quot;http://images.amazon.com/images/P/B000003SFN.01.LZZZZZZZ.jpg&quot;);
		cds.put(&quot;Selected Ambient Works, Vol. 2&quot;,&quot;http://images.amazon.com/images/P/B000002MNZ.01.LZZZZZZZ.jpg&quot;);

		URL initialURL = new URL((String)cds.get(&quot;Selected Ambient Works, Vol. 2&quot;));
		menuBar = new JMenuBar();
		menu = new JMenu(&quot;Favorite CDs&quot;);
		menuBar.add(menu);
		frame.setJMenuBar(menuBar);

		for (Enumeration&amp;lt;String&amp;gt; e = cds.keys(); e.hasMoreElements();) {
			String name = (String)e.nextElement();
			JMenuItem menuItem = new JMenuItem(name);
			menu.add(menuItem); 
			menuItem.addActionListener(event -&amp;gt; {
				imageComponent.setIcon(new ImageProxy(getCDUrl(event.getActionCommand())));
				frame.repaint();
			});
		}

		// set up frame and menus

		Icon icon = new ImageProxy(initialURL);
		imageComponent = new ImageComponent(icon);
		frame.getContentPane().add(imageComponent);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800,600);
		frame.setVisible(true);

	}

	URL getCDUrl(String name) {
		try {
			return new URL((String) cds.get(name));
		} catch (MalformedURLException e) {
			e.printStackTrace();
			return null;
		}
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u50dW/btrEXVe7tC4/t64b4fdaMPbhitCPQnFpw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u50dW/btrEXVe7tC4/t64b4fdaMPbhitCPQnFpw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u50dW/btrEXVe7tC4/t64b4fdaMPbhitCPQnFpw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu50dW%2FbtrEXVe7tC4%2Ft64b4fdaMPbhitCPQnFpw1%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;786&quot; height=&quot;594&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;594&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;h3 id=&quot;Additional_Code_Example&quot; data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Additional Code&amp;nbsp;Example&lt;/h3&gt;
&lt;pre id=&quot;code_1655431817462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern.core;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;

class NonOwnerInvocationHandler implements InvocationHandler {
	PersonBean person;

	public NonOwnerInvocationHandler(PersonBean person) {
		this.person = person;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {

		try {
			if (method.getName().startsWith(&quot;get&quot;)) {
				return method.invoke(person, args);
			} else if (method.getName().equals(&quot;setHotOrNotRating&quot;)) {
				return method.invoke(person, args);
			} else if (method.getName().startsWith(&quot;set&quot;)) {
				throw new IllegalAccessException();
			}
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}
}

class OwnerInvocationHandler implements InvocationHandler {
	PersonBean person;

	public OwnerInvocationHandler(PersonBean person) {
		this.person = person;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {

		try {
			if (method.getName().startsWith(&quot;get&quot;)) {
				return method.invoke(person, args);
			} else if (method.getName().equals(&quot;setHotOrNotRating&quot;)) {
				throw new IllegalAccessException();
			} else if (method.getName().startsWith(&quot;set&quot;)) {
				return method.invoke(person, args);
			}
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}
}

class PersonBeanImpl implements PersonBean {
	String name;
	String gender;
	String interests;
	int rating;
	int ratingCount = 0;

	public String getName() {
		return name;
	}

	public String getGender() {
		return gender;
	}

	public String getInterests() {
		return interests;
	}

	public int getHotOrNotRating() {
		if (ratingCount == 0)
			return 0;
		return (rating / ratingCount);
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public void setInterests(String interests) {
		this.interests = interests;
	}

	public void setHotOrNotRating(int rating) {
		this.rating += rating;
		ratingCount++;
	}
}

interface PersonBean {

	String getName();

	String getGender();

	String getInterests();

	int getHotOrNotRating();

	void setName(String name);

	void setGender(String gender);

	void setInterests(String interests);

	void setHotOrNotRating(int rating);

}

public class MyProxy {
	HashMap&amp;lt;String, PersonBean&amp;gt; datingDB = new HashMap&amp;lt;String, PersonBean&amp;gt;();

	public static void main(String[] args) {
		MyProxy test = new MyProxy();
		test.drive();
	}

	public MyProxy() {
		initializeDatabase();
	}

	public void drive() {
		PersonBean joe = getPersonFromDatabase(&quot;Joe Javabean&quot;);
		PersonBean ownerProxy = getOwnerProxy(joe);
		System.out.println(&quot;Name is &quot; + ownerProxy.getName());
		ownerProxy.setInterests(&quot;bowling, Go&quot;);
		System.out.println(&quot;Interests set from owner proxy&quot;);
		try {
			ownerProxy.setHotOrNotRating(10);
		} catch (Exception e) {
			System.out.println(&quot;Can't set rating from owner proxy&quot;);
		}
		System.out.println(&quot;Rating is &quot; + ownerProxy.getHotOrNotRating());

		PersonBean nonOwnerProxy = getNonOwnerProxy(joe);
		System.out.println(&quot;Name is &quot; + nonOwnerProxy.getName());
		try {
			nonOwnerProxy.setInterests(&quot;bowling, Go&quot;);
		} catch (Exception e) {
			System.out.println(&quot;Can't set interests from non owner proxy&quot;);
		}
		nonOwnerProxy.setHotOrNotRating(3);
		System.out.println(&quot;Rating set from non owner proxy&quot;);
		System.out.println(&quot;Rating is &quot; + nonOwnerProxy.getHotOrNotRating());
	}

	PersonBean getOwnerProxy(PersonBean person) {

		return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),
				person.getClass().getInterfaces(), new OwnerInvocationHandler(person));
	}

	PersonBean getNonOwnerProxy(PersonBean person) {

		return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),
				person.getClass().getInterfaces(), new NonOwnerInvocationHandler(person));
	}

	PersonBean getPersonFromDatabase(String name) {
		return (PersonBean) datingDB.get(name);
	}

	void initializeDatabase() {
		PersonBean joe = new PersonBeanImpl();
		joe.setName(&quot;Joe Javabean&quot;);
		joe.setInterests(&quot;cars, computers, music&quot;);
		joe.setHotOrNotRating(7);
		datingDB.put(joe.getName(), joe);

		PersonBean kelly = new PersonBeanImpl();
		kelly.setName(&quot;Kelly Klosure&quot;);
		kelly.setInterests(&quot;ebay, movies, music&quot;);
		kelly.setHotOrNotRating(6);
		datingDB.put(kelly.getName(), kelly);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1655431836292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Name is Joe Javabean
Interests set from owner proxy
Can't set rating from owner proxy
Rating is 7
Name is Joe Javabean
Can't set interests from non owner proxy
Rating set from non owner proxy
Rating is 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/93</guid>
      <comments>https://camelact.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 21 Jun 2022 12:11:21 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Facade 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/90</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Facade&amp;nbsp;패턴은&amp;nbsp;새로운&amp;nbsp;서비스를&amp;nbsp;개발하는&amp;nbsp;것이므로&amp;nbsp;서브시스템을&amp;nbsp;사용하고자&amp;nbsp;할&amp;nbsp;때&amp;nbsp;이들을&amp;nbsp;함께&amp;nbsp;묶는&amp;nbsp;클래스를&amp;nbsp;생성한다.&amp;nbsp;다시&amp;nbsp;말해,&amp;nbsp;새로운&amp;nbsp;클래스가&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;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;하위&amp;nbsp;시스템&amp;nbsp;간의&amp;nbsp;결합을&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;클라이언트의&amp;nbsp;관점에서&amp;nbsp;코드를&amp;nbsp;더&amp;nbsp;간결하게&amp;nbsp;만듭니다. &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;레거시에서&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;facade_concept.svg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfFHQV/btrE4TnOFCh/dcjK3GGxSOvuLnsI6Pckyk/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfFHQV/btrE4TnOFCh/dcjK3GGxSOvuLnsI6Pckyk/tfile.svg&quot; data-alt=&quot;https://sbcode.net/typescript/facade/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfFHQV/btrE4TnOFCh/dcjK3GGxSOvuLnsI6Pckyk/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfFHQV%2FbtrE4TnOFCh%2FdcjK3GGxSOvuLnsI6Pckyk%2Ftfile.svg&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;602&quot; height=&quot;204&quot; data-filename=&quot;facade_concept.svg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://sbcode.net/typescript/facade/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package  com.example.design.pattern;

class CdPlayer {
	String description;
	int currentTrack;
	Amplifier amplifier;
	String title;

	public CdPlayer(String description, Amplifier amplifier) {
		this.description = description;
		this.amplifier = amplifier;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void eject() {
		title = null;
		System.out.println(description + &quot; eject&quot;);
	}

	public void play(String title) {
		this.title = title;
		currentTrack = 0;
		System.out.println(description + &quot; playing \&quot;&quot; + title + &quot;\&quot;&quot;);
	}

	public void play(int track) {
		if (title == null) {
			System.out.println(description + &quot; can't play track &quot; + currentTrack + &quot;, no cd inserted&quot;);
		} else {
			currentTrack = track;
			System.out.println(description + &quot; playing track &quot; + currentTrack);
		}
	}

	public void stop() {
		currentTrack = 0;
		System.out.println(description + &quot; stopped&quot;);
	}

	public void pause() {
		System.out.println(description + &quot; paused \&quot;&quot; + title + &quot;\&quot;&quot;);
	}

	public String toString() {
		return description;
	}
}

class DvdPlayer {
	String description;
	int currentTrack;
	Amplifier amplifier;
	String movie;

	public DvdPlayer(String description, Amplifier amplifier) {
		this.description = description;
		this.amplifier = amplifier;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void eject() {
		movie = null;
		System.out.println(description + &quot; eject&quot;);
	}

	public void play(String movie) {
		this.movie = movie;
		currentTrack = 0;
		System.out.println(description + &quot; playing \&quot;&quot; + movie + &quot;\&quot;&quot;);
	}

	public void play(int track) {
		if (movie == null) {
			System.out.println(description + &quot; can't play track &quot; + track + &quot; no dvd inserted&quot;);
		} else {
			currentTrack = track;
			System.out.println(description + &quot; playing track &quot; + currentTrack + &quot; of \&quot;&quot; + movie + &quot;\&quot;&quot;);
		}
	}

	public void stop() {
		currentTrack = 0;
		System.out.println(description + &quot; stopped \&quot;&quot; + movie + &quot;\&quot;&quot;);
	}

	public void pause() {
		System.out.println(description + &quot; paused \&quot;&quot; + movie + &quot;\&quot;&quot;);
	}

	public void setTwoChannelAudio() {
		System.out.println(description + &quot; set two channel audio&quot;);
	}

	public void setSurroundAudio() {
		System.out.println(description + &quot; set surround audio&quot;);
	}

	public String toString() {
		return description;
	}
}

class Tuner {
	String description;
	Amplifier amplifier;
	double frequency;

	public Tuner(String description, Amplifier amplifier) {
		this.description = description;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void setFrequency(double frequency) {
		System.out.println(description + &quot; setting frequency to &quot; + frequency);
		this.frequency = frequency;
	}

	public void setAm() {
		System.out.println(description + &quot; setting AM mode&quot;);
	}

	public void setFm() {
		System.out.println(description + &quot; setting FM mode&quot;);
	}

	public String toString() {
		return description;
	}
}

class Projector {
	String description;
	DvdPlayer dvdPlayer;

	public Projector(String description, DvdPlayer dvdPlayer) {
		this.description = description;
		this.dvdPlayer = dvdPlayer;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void wideScreenMode() {
		System.out.println(description + &quot; in widescreen mode (16x9 aspect ratio)&quot;);
	}

	public void tvMode() {
		System.out.println(description + &quot; in tv mode (4x3 aspect ratio)&quot;);
	}

	public String toString() {
		return description;
	}
}

class Amplifier {
	String description;
	Tuner tuner;
	DvdPlayer dvd;
	CdPlayer cd;

	public Amplifier(String description) {
		this.description = description;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void setStereoSound() {
		System.out.println(description + &quot; stereo mode on&quot;);
	}

	public void setSurroundSound() {
		System.out.println(description + &quot; surround sound on (5 speakers, 1 subwoofer)&quot;);
	}

	public void setVolume(int level) {
		System.out.println(description + &quot; setting volume to &quot; + level);
	}

	public void setTuner(Tuner tuner) {
		System.out.println(description + &quot; setting tuner to &quot; + dvd);
		this.tuner = tuner;
	}

	public void setDvd(DvdPlayer dvd) {
		System.out.println(description + &quot; setting DVD player to &quot; + dvd);
		this.dvd = dvd;
	}

	public void setCd(CdPlayer cd) {
		System.out.println(description + &quot; setting CD player to &quot; + cd);
		this.cd = cd;
	}

	public String toString() {
		return description;
	}
}

class Screen {
	String description;

	public Screen(String description) {
		this.description = description;
	}

	public void up() {
		System.out.println(description + &quot; going up&quot;);
	}

	public void down() {
		System.out.println(description + &quot; going down&quot;);
	}

	public String toString() {
		return description;
	}
}

class TheaterLights {
	String description;

	public TheaterLights(String description) {
		this.description = description;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void dim(int level) {
		System.out.println(description + &quot; dimming to &quot; + level + &quot;%&quot;);
	}

	public String toString() {
		return description;
	}
}

class PopcornPopper {
	String description;

	public PopcornPopper(String description) {
		this.description = description;
	}

	public void on() {
		System.out.println(description + &quot; on&quot;);
	}

	public void off() {
		System.out.println(description + &quot; off&quot;);
	}

	public void pop() {
		System.out.println(description + &quot; popping popcorn!&quot;);
	}

	public String toString() {
		return description;
	}
}

class HomeTheaterFacade {
	Amplifier amp;
	Tuner tuner;
	DvdPlayer dvd;
	CdPlayer cd;
	Projector projector;
	TheaterLights lights;
	Screen screen;
	PopcornPopper popper;

	public HomeTheaterFacade(Amplifier amp, Tuner tuner, DvdPlayer dvd, CdPlayer cd, Projector projector, Screen screen,
			TheaterLights lights, PopcornPopper popper) {

		this.amp = amp;
		this.tuner = tuner;
		this.dvd = dvd;
		this.cd = cd;
		this.projector = projector;
		this.screen = screen;
		this.lights = lights;
		this.popper = popper;
	}

	public void watchMovie(String movie) {
		System.out.println(&quot;Get ready to watch a movie...&quot;);
		popper.on();
		popper.pop();
		lights.dim(10);
		screen.down();
		projector.on();
		projector.wideScreenMode();
		amp.on();
		amp.setDvd(dvd);
		amp.setSurroundSound();
		amp.setVolume(5);
		dvd.on();
		dvd.play(movie);
	}

	public void endMovie() {
		System.out.println(&quot;Shutting movie theater down...&quot;);
		popper.off();
		lights.on();
		screen.up();
		projector.off();
		amp.off();
		dvd.stop();
		dvd.eject();
		dvd.off();
	}

	public void listenToCd(String cdTitle) {
		System.out.println(&quot;Get ready for an audiopile experence...&quot;);
		lights.on();
		amp.on();
		amp.setVolume(5);
		amp.setCd(cd);
		amp.setStereoSound();
		cd.on();
		cd.play(cdTitle);
	}

	public void endCd() {
		System.out.println(&quot;Shutting down CD...&quot;);
		amp.off();
		amp.setCd(cd);
		cd.eject();
		cd.off();
	}

	public void listenToRadio(double frequency) {
		System.out.println(&quot;Tuning in the airwaves...&quot;);
		tuner.on();
		tuner.setFrequency(frequency);
		amp.on();
		amp.setVolume(5);
		amp.setTuner(tuner);
	}

	public void endRadio() {
		System.out.println(&quot;Shutting down the tuner...&quot;);
		tuner.off();
		amp.off();
	}
}

public class MyFacade {
	public static void main(String[] args) {
		Amplifier amp = new Amplifier(&quot;Top-O-Line Amplifier&quot;);
		Tuner tuner = new Tuner(&quot;Top-O-Line AM/FM Tuner&quot;, amp);
		DvdPlayer dvd = new DvdPlayer(&quot;Top-O-Line DVD Player&quot;, amp);
		CdPlayer cd = new CdPlayer(&quot;Top-O-Line CD Player&quot;, amp);
		Projector projector = new Projector(&quot;Top-O-Line Projector&quot;, dvd);
		TheaterLights lights = new TheaterLights(&quot;Theater Ceiling Lights&quot;);
		Screen screen = new Screen(&quot;Theater Screen&quot;);
		PopcornPopper popper = new PopcornPopper(&quot;Popcorn Popper&quot;);

		HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, tuner, dvd, cd, projector, screen, lights, popper);

		homeTheater.watchMovie(&quot;Raiders of the Lost Ark&quot;);
		homeTheater.endMovie();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get ready to watch a movie...
Popcorn Popper on
Popcorn Popper popping popcorn!
Theater Ceiling Lights dimming to 10%
Theater Screen going down
Top-O-Line Projector on
Top-O-Line Projector in widescreen mode (16x9 aspect ratio)
Top-O-Line Amplifier on
Top-O-Line Amplifier setting DVD player to Top-O-Line DVD Player
Top-O-Line Amplifier surround sound on (5 speakers, 1 subwoofer)
Top-O-Line Amplifier setting volume to 5
Top-O-Line DVD Player on
Top-O-Line DVD Player playing &quot;Raiders of the Lost Ark&quot;
Shutting movie theater down...
Popcorn Popper off
Theater Ceiling Lights on
Theater Screen going up
Top-O-Line Projector off
Top-O-Line Amplifier off
Top-O-Line DVD Player stopped &quot;Raiders of the Lost Ark&quot;
Top-O-Line DVD Player eject
Top-O-Line DVD Player off&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/90</guid>
      <comments>https://camelact.tistory.com/90#entry90comment</comments>
      <pubDate>Mon, 20 Jun 2022 12:06:13 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][Algorithm]Insert Sort 이론과 예제</title>
      <link>https://camelact.tistory.com/104</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손안의 카드를 정렬하는 방법과 유사하다.&lt;br /&gt;새로운&amp;nbsp;카드를&amp;nbsp;기존의&amp;nbsp;정렬된&amp;nbsp;카드&amp;nbsp;사이의&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;카드가&amp;nbsp;정렬된다.&lt;br /&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;알고리즘&lt;br /&gt;매&amp;nbsp;순서마다&amp;nbsp;해당&amp;nbsp;원소를&amp;nbsp;삽입할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;위치를&amp;nbsp;찾아&amp;nbsp;해당&amp;nbsp;위치에&amp;nbsp;넣는다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;br /&gt;안정한&amp;nbsp;정렬&amp;nbsp;방법&lt;br /&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;있다.&lt;br /&gt;대부분위&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;br /&gt;단점&lt;br /&gt;비교적&amp;nbsp;많은&amp;nbsp;레코드들의&amp;nbsp;이동을&amp;nbsp;포함한다.&lt;br /&gt;레코드 수가 많고 레코드 크기가 클 경우에 적합하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Usecase&lt;/h3&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; - Best T(n) = O(n)&lt;br /&gt;&amp;nbsp; - Worst T(n) = O(n^2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Insertion_sort_001.png&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XelX2/btrE4Wli1QW/IvKMLnKjwU9lyrbwnTRHQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XelX2/btrE4Wli1QW/IvKMLnKjwU9lyrbwnTRHQK/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%82%BD%EC%9E%85_%EC%A0%95%EB%A0%AC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XelX2/btrE4Wli1QW/IvKMLnKjwU9lyrbwnTRHQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXelX2%2FbtrE4Wli1QW%2FIvKMLnKjwU9lyrbwnTRHQK%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;285&quot; height=&quot;547&quot; data-filename=&quot;Insertion_sort_001.png&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%82%BD%EC%9E%85_%EC%A0%95%EB%A0%AC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.algorithm.basic;

public class MyInsertSort {
	void insertionSort(int[] input) {
		for (int i = 1; i &amp;lt; input.length; i++) {
			int temp = input[i]; 		// 7
			int j = i - 1; 				// 0

			while ((j &amp;gt;= 0) &amp;amp;&amp;amp; (temp &amp;lt; input[j])) {		// j = 0 &amp;amp;&amp;amp; 7 &amp;lt; 8
				input[j + 1] = input[j];
				j = j - 1;
			}
			input[j + 1] = temp;
		}
	}

	void printResult(int[] input) {
		int i;

		for (i = 0; i &amp;lt; input.length; ++i) {
			System.out.print(input[i] + &quot; &quot;);
		}
		System.out.println();
	}

	public static void main(String arg[]) throws Exception {
		MyInsertSort myInsertSort = new MyInsertSort();

		int[] input = { 8, 7, 9, 6, 0, 1, 2, 3, 5, 4 };

		myInsertSort.insertionSort(input);

		myInsertSort.printResult(input);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0 1 2 3 4 5 6 7 8 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Algorithm</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/104</guid>
      <comments>https://camelact.tistory.com/104#entry104comment</comments>
      <pubDate>Sun, 19 Jun 2022 16:11:35 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Command 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/91</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;정보를&amp;nbsp;취소합니다. &lt;br /&gt;명령&amp;nbsp;패턴은&amp;nbsp;항상&amp;nbsp;명령,&amp;nbsp;수신자,&amp;nbsp;호출자&amp;nbsp;및&amp;nbsp;클라이언트의&amp;nbsp;네&amp;nbsp;가지&amp;nbsp;용어를&amp;nbsp;따릅니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&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;않습니다. &lt;br /&gt;클라이언트와 Invoker클래스 간의 종속성이 제거됩니다. &lt;br /&gt;&lt;br /&gt;단점&lt;br /&gt;수신자의 액션을 추가하면 액션에 대한 클래스를 생성해야 하므로 잡다한 클래스가 오히려 많이 추가되는 단점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&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;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zPA8a/btrE6x5RWbw/OKRuk1jrju3DFEtJitmKPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zPA8a/btrE6x5RWbw/OKRuk1jrju3DFEtJitmKPk/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%A7%A8%EB%93%9C_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zPA8a/btrE6x5RWbw/OKRuk1jrju3DFEtJitmKPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzPA8a%2FbtrE6x5RWbw%2FOKRuk1jrju3DFEtJitmKPk%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;353&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%A7%A8%EB%93%9C_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

interface Command {
	public abstract void execute();
}

class Button {
	private Command theCommand;

	public Button(Command theCommand) {
		setCommand(theCommand);
	}

	public void setCommand(Command newCommand) {
		this.theCommand = newCommand;
	}

	public void pressed() {
		theCommand.execute();
	}
}

class Lamp {
	public void turnOn() {
		System.out.println(&quot;Lamp On&quot;);
	}
}

class LampOnCommand implements Command {
	private Lamp theLamp;

	public LampOnCommand(Lamp theLamp) {
		this.theLamp = theLamp;
	}

	public void execute() {
		theLamp.turnOn();
	}
}

class Alarm {
	public void start() {
		System.out.println(&quot;Alarming&quot;);
	}
}

class AlarmStartCommand implements Command {
	private Alarm theAlarm;

	public AlarmStartCommand(Alarm theAlarm) {
		this.theAlarm = theAlarm;
	}

	public void execute() {
		theAlarm.start();
	}
}

public class MyCommand {
	public static void main(String[] args) {
		Lamp lamp = new Lamp();
		Command lampOnCommand = new LampOnCommand(lamp);
		Alarm alarm = new Alarm();
		Command alarmStartCommand = new AlarmStartCommand(alarm);

		Button button1 = new Button(lampOnCommand); 
		button1.pressed();

		Button button2 = new Button(alarmStartCommand);
		button2.pressed(); 
		button2.setCommand(lampOnCommand);
		button2.pressed(); 
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998589092&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Lamp On
Alarming
Lamp On&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/91</guid>
      <comments>https://camelact.tistory.com/91#entry91comment</comments>
      <pubDate>Sat, 18 Jun 2022 12:05:28 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Abstract Factory 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/81</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;시스템을&amp;nbsp;생성하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;되기&amp;nbsp;때문에&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;재사용성은&amp;nbsp;구체적인&amp;nbsp;클래스를&amp;nbsp;분리하여&amp;nbsp;개선할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;List와&amp;nbsp;Iterator가&amp;nbsp;강하게&amp;nbsp;연결되어&amp;nbsp;있다는&amp;nbsp;점을&amp;nbsp;감안하면&amp;nbsp;제품의&amp;nbsp;일관성을&amp;nbsp;향상시킬&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;(반복자는&amp;nbsp;List를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;항상&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있음) &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;낮은&amp;nbsp;확장성.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;List에서&amp;nbsp;다른&amp;nbsp;Iterator&amp;nbsp;인터페이스를&amp;nbsp;사용하려는&amp;nbsp;경우&amp;nbsp;상속받은&amp;nbsp;클래스인&amp;nbsp;ArrayList와&amp;nbsp;LinkedList를&amp;nbsp;모두&amp;nbsp;구현해야&amp;nbsp;합니다.&amp;nbsp;또는&amp;nbsp;ArrayList&amp;nbsp;에서&amp;nbsp;Iterator&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;517px-Abstract_factory.svg.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zd3xh/btrE9RI3kQj/j1q9Vas1LSf71NVc62yl30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zd3xh/btrE9RI3kQj/j1q9Vas1LSf71NVc62yl30/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81_%ED%8C%A9%ED%86%A0%EB%A6%AC_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zd3xh/btrE9RI3kQj/j1q9Vas1LSf71NVc62yl30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzd3xh%2FbtrE9RI3kQj%2Fj1q9Vas1LSf71NVc62yl30%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;329&quot; data-filename=&quot;517px-Abstract_factory.svg.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81_%ED%8C%A9%ED%86%A0%EB%A6%AC_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern.core;

interface Dough {
	public String toString();
}

class ThickCrustDough implements Dough {
	public String toString() {
		return &quot;ThickCrust style extra thick crust dough&quot;;
	}
}

class ThinCrustDough implements Dough {
	public String toString() {
		return &quot;Thin Crust Dough&quot;;
	}
}

interface Pepperoni {
	public String toString();
}

class SlicedPepperoni implements Pepperoni {
	public String toString() {
		return &quot;Sliced Pepperoni&quot;;
	}
}

interface PizzaIngredientFactory {
	public Dough createDough();
	public Pepperoni createPepperoni();
}

class NYPizzaIngredientFactory implements PizzaIngredientFactory {
	public Dough createDough() {
		return new ThinCrustDough();
	}

	public Pepperoni createPepperoni() {
		return new SlicedPepperoni();
	}
}

class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
	public Dough createDough() {
		return new ThickCrustDough();
	}

	public Pepperoni createPepperoni() {
		return new SlicedPepperoni();
	}
}

abstract class Pizza {
	String name;
	Dough dough;
	Pepperoni pepperoni;

	abstract void prepare();

	void bake() {
		System.out.println(&quot;Bake for 25 minutes at 350&quot;);
	}

	void cut() {
		System.out.println(&quot;Cutting the pizza into diagonal slices&quot;);
	}

	void box() {
		System.out.println(&quot;Place pizza in official PizzaStore box&quot;);
	}

	void setName(String name) {
		this.name = name;
	}

	String getName() {
		return name;
	}

	public String toString() {
		StringBuffer result = new StringBuffer();
		result.append(&quot;---- &quot; + name + &quot; ----\n&quot;);
		if (dough != null) {
			result.append(dough);
			result.append(&quot;\n&quot;);
		}

		if (pepperoni != null) {
			result.append(pepperoni);
			result.append(&quot;\n&quot;);
		}
		return result.toString();
	}
}

class CheesePizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;

	public CheesePizza(PizzaIngredientFactory ingredientFactory) {
		this.ingredientFactory = ingredientFactory;
	}

	void prepare() {
		System.out.println(&quot;Preparing &quot; + name);
		dough = ingredientFactory.createDough();
		pepperoni = ingredientFactory.createPepperoni();
	}
}

class PepperoniPizza extends Pizza {
	PizzaIngredientFactory ingredientFactory;

	public PepperoniPizza(PizzaIngredientFactory ingredientFactory) {
		this.ingredientFactory = ingredientFactory;
	}

	void prepare() {
		System.out.println(&quot;Preparing &quot; + name);
		dough = ingredientFactory.createDough();
		pepperoni = ingredientFactory.createPepperoni();
	}
}

abstract class PizzaStore {
	protected abstract Pizza createPizza(String item);

	public Pizza orderPizza(String type) {
		Pizza pizza = createPizza(type);
		System.out.println(&quot;--- Making a &quot; + pizza.getName() + &quot; ---&quot;);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

class NYPizzaStore extends PizzaStore {
	protected Pizza createPizza(String item) {
		Pizza pizza = null;
		PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();

		if (item.equals(&quot;cheese&quot;)) {
			pizza = new CheesePizza(ingredientFactory);
			pizza.setName(&quot;New York Style Cheese Pizza&quot;);
		} else if (item.equals(&quot;pepperoni&quot;)) {
			pizza = new PepperoniPizza(ingredientFactory);
			pizza.setName(&quot;New York Style Pepperoni Pizza&quot;);
		}
		return pizza;
	}
}

class ChicagoPizzaStore extends PizzaStore {
	protected Pizza createPizza(String item) {
		Pizza pizza = null;
		PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();

		if (item.equals(&quot;cheese&quot;)) {
			pizza = new CheesePizza(ingredientFactory);
			pizza.setName(&quot;Chicago Style Cheese Pizza&quot;);
		} else if (item.equals(&quot;pepperoni&quot;)) {

			pizza = new PepperoniPizza(ingredientFactory);
			pizza.setName(&quot;Chicago Style Pepperoni Pizza&quot;);

		}
		return pizza;
	}
}

public class MyAbstractFactory {
	public static void main(String[] args) {
		PizzaStore nyStore = new NYPizzaStore();
		PizzaStore chicagoStore = new ChicagoPizzaStore();

		Pizza pizza = nyStore.orderPizza(&quot;cheese&quot;);
		System.out.println(&quot;Ethan ordered a &quot; + pizza + &quot;\n&quot;);

		pizza = chicagoStore.orderPizza(&quot;cheese&quot;);
		System.out.println(&quot;Joel ordered a &quot; + pizza + &quot;\n&quot;);


		pizza = nyStore.orderPizza(&quot;pepperoni&quot;);
		System.out.println(&quot;Ethan ordered a &quot; + pizza + &quot;\n&quot;);

		pizza = chicagoStore.orderPizza(&quot;pepperoni&quot;);
		System.out.println(&quot;Joel ordered a &quot; + pizza + &quot;\n&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999196946&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--- Making a New York Style Cheese Pizza ---
Preparing New York Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a ---- New York Style Cheese Pizza ----
Thin Crust Dough
Sliced Pepperoni


--- Making a Chicago Style Cheese Pizza ---
Preparing Chicago Style Cheese Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Joel ordered a ---- Chicago Style Cheese Pizza ----
ThickCrust style extra thick crust dough
Sliced Pepperoni


--- Making a New York Style Pepperoni Pizza ---
Preparing New York Style Pepperoni Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a ---- New York Style Pepperoni Pizza ----
Thin Crust Dough
Sliced Pepperoni


--- Making a Chicago Style Pepperoni Pizza ---
Preparing Chicago Style Pepperoni Pizza
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Joel ordered a ---- Chicago Style Pepperoni Pizza ----
ThickCrust style extra thick crust dough
Sliced Pepperoni&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/81</guid>
      <comments>https://camelact.tistory.com/81#entry81comment</comments>
      <pubDate>Fri, 17 Jun 2022 14:28:44 +0900</pubDate>
    </item>
    <item>
      <title>정규식 작성 및 확인</title>
      <link>https://camelact.tistory.com/88</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;정규식 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring.aaa.bbb&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등 application.properties에서 사용하는 키에 대한 포맷을 검사하는 정규식을 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring.으로 시작하며 특수문자는 허용하지 않아야합니다.&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;pre id=&quot;code_1655569559535&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;^spring(\.[a-z0-9-]+)+$&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://regex101.com&quot;&gt;https://regex101.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655434850586&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;regex101: build, test, and debug regex&quot; data-og-description=&quot;Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET.&quot; data-og-host=&quot;regex101.com&quot; data-og-source-url=&quot;https://regex101.com&quot; data-og-url=&quot;https://regex101.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4huDI/hyONOPkHym/kQS2DGkKCwHrDgQkyqRCWK/img.png?width=1200&amp;amp;height=629&amp;amp;face=0_0_1200_629,https://scrap.kakaocdn.net/dn/bMpq29/hyOMNxLbxL/1mJ1OqHJ4KVwDgvHxIzzw0/img.png?width=1200&amp;amp;height=629&amp;amp;face=0_0_1200_629&quot;&gt;&lt;a href=&quot;https://regex101.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://regex101.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4huDI/hyONOPkHym/kQS2DGkKCwHrDgQkyqRCWK/img.png?width=1200&amp;amp;height=629&amp;amp;face=0_0_1200_629,https://scrap.kakaocdn.net/dn/bMpq29/hyOMNxLbxL/1mJ1OqHJ4KVwDgvHxIzzw0/img.png?width=1200&amp;amp;height=629&amp;amp;face=0_0_1200_629');&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;regex101: build, test, and debug regex&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;regex101.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 data-ke-size=&quot;size16&quot;&gt;각 부분별 무엇을 의미하는지 설명이 잘 나옵니다.&lt;/p&gt;
&lt;p 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;856&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Nh9k/btrE8OFXIcM/GB4osPDfdiErlkk1Wisozk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Nh9k/btrE8OFXIcM/GB4osPDfdiErlkk1Wisozk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Nh9k/btrE8OFXIcM/GB4osPDfdiErlkk1Wisozk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Nh9k%2FbtrE8OFXIcM%2FGB4osPDfdiErlkk1Wisozk%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;856&quot; height=&quot;253&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Regular Expression</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/88</guid>
      <comments>https://camelact.tistory.com/88#entry88comment</comments>
      <pubDate>Tue, 14 Jun 2022 17:14:48 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]프로그래스바 놓기</title>
      <link>https://camelact.tistory.com/87</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그에서 아래와 같은 상단 프로그래스바를 종종 보았을 것입니다.&lt;/p&gt;
&lt;p 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;600&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9eto/btrE4UAgh0b/uSBJLFsKZzwhDqR04o0XMK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9eto/btrE4UAgh0b/uSBJLFsKZzwhDqR04o0XMK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9eto/btrE4UAgh0b/uSBJLFsKZzwhDqR04o0XMK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/z9eto/btrE4UAgh0b/uSBJLFsKZzwhDqR04o0XMK/img.gif&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;600&quot; height=&quot;61&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;61&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;h3 data-ke-size=&quot;size23&quot;&gt;Edit HTML&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 블로그관리에서 스킨 편집 메뉴로 들어갑니다.&lt;/p&gt;
&lt;p 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;891&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do50Su/btrE5zCoGlk/r0kNGHeMhPziSxD20mg2Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do50Su/btrE5zCoGlk/r0kNGHeMhPziSxD20mg2Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do50Su/btrE5zCoGlk/r0kNGHeMhPziSxD20mg2Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo50Su%2FbtrE5zCoGlk%2Fr0kNGHeMhPziSxD20mg2Ak%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;891&quot; height=&quot;442&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;442&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;들어가면 오른쪽에 html 편집 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mw2v5/btrE5gX9zDp/gbu8XGZAktDt1XiyHWZSU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mw2v5/btrE5gX9zDp/gbu8XGZAktDt1XiyHWZSU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mw2v5/btrE5gX9zDp/gbu8XGZAktDt1XiyHWZSU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmw2v5%2FbtrE5gX9zDp%2Fgbu8XGZAktDt1XiyHWZSU1%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;669&quot; height=&quot;416&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;416&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;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;와 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; 사이에 하기 구문을 추가합니다.&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655562004842&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- progress-bar 영역 Start --&amp;gt;
&amp;lt;div class = &quot;progress-container&quot;&amp;gt;
        &amp;lt;div class = &quot;progress-bar&quot; id = &quot;indicator&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!-- progress-bar 영역 End --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Edit CSS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html 편집 메뉴 안에서 상단의 CSS를 클릭합니다.&lt;/p&gt;
&lt;p 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;609&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xZDjH/btrE5TalfyN/q9IkG71x33zmo5kcDl6YMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xZDjH/btrE5TalfyN/q9IkG71x33zmo5kcDl6YMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xZDjH/btrE5TalfyN/q9IkG71x33zmo5kcDl6YMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxZDjH%2FbtrE5TalfyN%2Fq9IkG71x33zmo5kcDl6YMk%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;609&quot; height=&quot;257&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;257&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;맨 아래에 하기 구문을 추가합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655562142849&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 프로그래스바 컨테이너 디자인 */
.progress-container {
    position: fixed; /*상단 고정*/
    top: 0; /*페이지의 최상단에 붙어서 위치*/
    z-index: 1000; /*페이지의 다른 요소보다 가장 위에 나타나도록 설정*/
      width: 100%; 
      height: 8px; /* 높이 */
      background: #ccc; /* 기본 배경색 */
}
 
/* 프로그래스바 디자인 */
.progress-bar {
      height: 8px;  /* 높이 */
      background: #000000; /* 색상 */
      width: 0%;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/87</guid>
      <comments>https://camelact.tistory.com/87#entry87comment</comments>
      <pubDate>Mon, 13 Jun 2022 19:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]스크롤에 따른 목차 하이라이트 만들기</title>
      <link>https://camelact.tistory.com/89</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;145&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VUt4L/btrE5s49eLT/HL24Fp3tV1lNVXkxxCxN50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VUt4L/btrE5s49eLT/HL24Fp3tV1lNVXkxxCxN50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VUt4L/btrE5s49eLT/HL24Fp3tV1lNVXkxxCxN50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVUt4L%2FbtrE5s49eLT%2FHL24Fp3tV1lNVXkxxCxN50%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;145&quot; height=&quot;262&quot; data-origin-width=&quot;145&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차 표시 설정을 이미 마쳤으며 글을 스크롤하면 해당 제목이 목차에 색이 반영되는 스크립트를 구현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Create Script&lt;/h3&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;a href=&quot;https://camelact.tistory.com/67&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://camelact.tistory.com/67&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655563500491&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
$(document).ready(function() {
  $(&quot;#toc&quot;).toc({
 	  content: &quot;.tt_article_useless_p_margin&quot;, 
	  headings: &quot;h2,h3&quot;
  });
});
	
	function checkPosition() {
    var findHeading = $('#content').find('h2,h3,h4');
		var scrollY = window.scrollY + 000;
		if(findHeading.length &amp;gt; 1) {
			for(var i = 0; i &amp;lt; findHeading.length; i++) {
				var findA = $('#toc').find('a');
				if(i &amp;lt; findHeading.length - 1) {
					if(findHeading.eq(i).offset().top &amp;lt; scrollY 
						 &amp;amp;&amp;amp; findHeading.eq(i + 1).offset().top &amp;gt; scrollY) {
						findA.removeAttr('style');
						findA.eq(i).css('background-color', '#ccc');
						// findA.eq(i).css('border-left', '5px solid #666');
						break;
					}
				}
				else {
					if(findHeading.eq(i).offset().top &amp;lt; scrollY) {
						findA.removeAttr('style');
						findA.eq(i).css('background-color', '#ccc');
					//	findA.eq(i).css('border-left', '5px solid #666');
						break;
					}
				}
			}
		}
	}

	$(document).ready(function() {
		$(window).on('scroll', function() {
			checkPosition();
		});
	});
&amp;lt;/script&amp;gt;&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;findA.eq(i).css... 부분에 기존에 사용하던 자신의 CSS 값을 넣으면 된다.&lt;/p&gt;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/89</guid>
      <comments>https://camelact.tistory.com/89#entry89comment</comments>
      <pubDate>Sun, 12 Jun 2022 21:32:19 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]Google 검색 등록하기</title>
      <link>https://camelact.tistory.com/85</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구글 서치콘솔 등록&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에서 서치콘솔이라고 검색을 한 후 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성검색 - 속성추가를 클릭합니다.&lt;/p&gt;
&lt;p 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;1265&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv2yUP/btrE8OMJbZH/F0rLE8KSDYLsYCQDYjDz10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv2yUP/btrE8OMJbZH/F0rLE8KSDYLsYCQDYjDz10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv2yUP/btrE8OMJbZH/F0rLE8KSDYLsYCQDYjDz10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv2yUP%2FbtrE8OMJbZH%2FF0rLE8KSDYLsYCQDYjDz10%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;1265&quot; height=&quot;967&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;967&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;URL 접두어 란에 자신의 블로그 주소를 입력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;소유권 확인&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;1169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qZKyt/btrE8OMJdKW/0kFhvEsxpKKsDUcPlZWSl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qZKyt/btrE8OMJdKW/0kFhvEsxpKKsDUcPlZWSl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qZKyt/btrE8OMJdKW/0kFhvEsxpKKsDUcPlZWSl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqZKyt%2FbtrE8OMJdKW%2F0kFhvEsxpKKsDUcPlZWSl0%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;661&quot; height=&quot;1169&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;1169&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;소유권 확인 페이지에서 HTML 태그를 선택하고 발생하는 &amp;lt;meta../&amp;gt; 구문을 복사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 자신의 블로그로 이동 후 블로그관리에서 스킨 편집 - html 편집으로 이동하여 head에 붙여넣기를 해 줍니다.&lt;/p&gt;
&lt;p 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;637&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baTDpS/btrE5sKUvNC/RFvWWvTEYA2MEtTST0Gm80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baTDpS/btrE5sKUvNC/RFvWWvTEYA2MEtTST0Gm80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baTDpS/btrE5sKUvNC/RFvWWvTEYA2MEtTST0Gm80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaTDpS%2FbtrE5sKUvNC%2FRFvWWvTEYA2MEtTST0Gm80%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;637&quot; height=&quot;591&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;591&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;&lt;span&gt;소유권이 확인됨 - 완료를 클릭하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RSS 및 Sitemap 등록&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MMMJV/btrE3UVmDfB/WK96eA2uejNyuk2MgNOeEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MMMJV/btrE3UVmDfB/WK96eA2uejNyuk2MgNOeEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MMMJV/btrE3UVmDfB/WK96eA2uejNyuk2MgNOeEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMMMJV%2FbtrE3UVmDfB%2FWK96eA2uejNyuk2MgNOeEk%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;1494&quot; height=&quot;605&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;605&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;Sitemap 메뉴에 들어가서 rss와 sitemap을 등록합니다.&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;자신의 블로그 주소/rss&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 블로그 주소/sitemap.xml을 입력 후 제출합니다.&lt;/p&gt;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/85</guid>
      <comments>https://camelact.tistory.com/85#entry85comment</comments>
      <pubDate>Sat, 11 Jun 2022 19:15:59 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]Naver 검색 등록하기</title>
      <link>https://camelact.tistory.com/84</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;네이버에 서치 어드바이저&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버에서 서치 어드바이저를 검색하여 들어간 후 시작하기 탭에 들어갑니다. 미리 로그인을 완료합니다.&lt;/p&gt;
&lt;p 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;1640&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DMeHW/btrE6yw2x8m/zDa4GSmTXZp09w3dzkPwvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DMeHW/btrE6yw2x8m/zDa4GSmTXZp09w3dzkPwvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DMeHW/btrE6yw2x8m/zDa4GSmTXZp09w3dzkPwvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDMeHW%2FbtrE6yw2x8m%2FzDa4GSmTXZp09w3dzkPwvk%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;1640&quot; height=&quot;253&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;253&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;h3 data-ke-size=&quot;size23&quot;&gt;웹마스터 도구&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/piHsl/btrE9QwLir1/nosp6NgSPeUTaM6t46coAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/piHsl/btrE9QwLir1/nosp6NgSPeUTaM6t46coAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/piHsl/btrE9QwLir1/nosp6NgSPeUTaM6t46coAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpiHsl%2FbtrE9QwLir1%2Fnosp6NgSPeUTaM6t46coAk%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;1085&quot; height=&quot;153&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;153&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;안에 들어가서 자신의 블로그 주소를 등록합니다.&lt;/p&gt;
&lt;p 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;1237&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcRUib/btrE8NmJwCF/4WKetkrYyy5br20LxbN6J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcRUib/btrE8NmJwCF/4WKetkrYyy5br20LxbN6J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcRUib/btrE8NmJwCF/4WKetkrYyy5br20LxbN6J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcRUib%2FbtrE8NmJwCF%2F4WKetkrYyy5br20LxbN6J0%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;1237&quot; height=&quot;488&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;488&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;h3 data-ke-size=&quot;size23&quot;&gt;사이트 소유 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 관리하고 있는 사이트가 맞는지 확인하는 작업이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 태그를 선택하고 &amp;lt;meta .../&amp;gt; 부분을 전체 복사합니다.&lt;/p&gt;
&lt;p 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;1078&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FTS0t/btrE5twfNdl/P5sN1MvmmdgtMw3k9yQJ20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FTS0t/btrE5twfNdl/P5sN1MvmmdgtMw3k9yQJ20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FTS0t/btrE5twfNdl/P5sN1MvmmdgtMw3k9yQJ20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFTS0t%2FbtrE5twfNdl%2FP5sN1MvmmdgtMw3k9yQJ20%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;1078&quot; height=&quot;745&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사된 구문을 자신의 티스토리 스킨 편집에 html 편집 부분에 넣어줍니다.&lt;/p&gt;
&lt;p 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;636&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DCC2G/btrE4bCxMie/Q3zHXl02jkWEIqbJDq0350/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DCC2G/btrE4bCxMie/Q3zHXl02jkWEIqbJDq0350/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DCC2G/btrE4bCxMie/Q3zHXl02jkWEIqbJDq0350/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDCC2G%2FbtrE4bCxMie%2FQ3zHXl02jkWEIqbJDq0350%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;636&quot; height=&quot;875&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;875&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;h3 data-ke-size=&quot;size23&quot;&gt;사이트 관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 절차가 마무리되면 다시 웹마스터 도구로 돌아와 사이트 관리 탭으로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록된 자신의 블로그 주소를 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RSS 등록&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEkzz4/btrE51rVE2U/O0et1KKzA88CtA7kKHRD01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEkzz4/btrE51rVE2U/O0et1KKzA88CtA7kKHRD01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEkzz4/btrE51rVE2U/O0et1KKzA88CtA7kKHRD01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEkzz4%2FbtrE51rVE2U%2FO0et1KKzA88CtA7kKHRD01%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;1076&quot; height=&quot;771&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 이미지와 같이 요청 - RSS 제출에 자신의 블로그 주소/rss를 입력하고 등록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sitemap 등록&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBWsN/btrE7DkEdMh/HunrvFdLyLrAf11mayJfOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBWsN/btrE7DkEdMh/HunrvFdLyLrAf11mayJfOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBWsN/btrE7DkEdMh/HunrvFdLyLrAf11mayJfOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBWsN%2FbtrE7DkEdMh%2FHunrvFdLyLrAf11mayJfOK%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;1085&quot; height=&quot;777&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 이미지와 같이 요청 - 사이트맵 제출에 자신의 블로그 주소/sitemap.xml를 입력하고 등록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;간단 체크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단 체크 기능을 통해 정상 등록되었는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p 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;1096&quot; data-origin-height=&quot;1067&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHqZ7h/btrE5eZCKWh/qdLdbGaVNHCql6OCMPKUVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHqZ7h/btrE5eZCKWh/qdLdbGaVNHCql6OCMPKUVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHqZ7h/btrE5eZCKWh/qdLdbGaVNHCql6OCMPKUVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHqZ7h%2FbtrE5eZCKWh%2FqdLdbGaVNHCql6OCMPKUVK%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;1096&quot; height=&quot;1067&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;1067&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;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/84</guid>
      <comments>https://camelact.tistory.com/84#entry84comment</comments>
      <pubDate>Fri, 10 Jun 2022 19:15:40 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]번역기 붙이기</title>
      <link>https://camelact.tistory.com/86</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p 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;309&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1zUod/btrE5f5fZfX/lkLcNKAdmZX4X5Kana0kz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1zUod/btrE5f5fZfX/lkLcNKAdmZX4X5Kana0kz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1zUod/btrE5f5fZfX/lkLcNKAdmZX4X5Kana0kz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1zUod%2FbtrE5f5fZfX%2FlkLcNKAdmZX4X5Kana0kz1%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;309&quot; height=&quot;110&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 게시물 상단에 국기 모양의 아이콘을 넣어주고 클릭하면 번역된 글을 볼 수 있게 해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러나라 방문자에게 유용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Create Tag&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하기 사이트에서 html Tag를 만들 수 있다.&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;a href=&quot;https://gtranslate.io/&quot;&gt;https://gtranslate.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655440192919&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;GTranslate - Website Translator: Translate Your Website&quot; data-og-description=&quot;Here is the list: Afrikaans, Albanian, Amharic, Arabic, Armenian, Azerbaijani, Basque, Belarusian, Bengali, Bosnian, Bulgarian, Catalan, Cebuano, Chichewa, Chinese (Simplified), Chinese (Traditional), Corsican, Croatian, Czech, Danish, Dutch, English, Espe&quot; data-og-host=&quot;gtranslate.io&quot; data-og-source-url=&quot;https://gtranslate.io/&quot; data-og-url=&quot;https://gtranslate.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b42mLe/hyONT4eswK/F7J7gnkkUhe9Or9VugxjF1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://gtranslate.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gtranslate.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b42mLe/hyONT4eswK/F7J7gnkkUhe9Or9VugxjF1/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;GTranslate - Website Translator: Translate Your Website&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Here is the list: Afrikaans, Albanian, Amharic, Arabic, Armenian, Azerbaijani, Basque, Belarusian, Bengali, Bosnian, Bulgarian, Catalan, Cebuano, Chichewa, Chinese (Simplified), Chinese (Traditional), Corsican, Croatian, Czech, Danish, Dutch, English, Espe&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gtranslate.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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpxmaW/btrE5sjHmb6/l5KJwfTWpqCKIqSllID8gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpxmaW/btrE5sjHmb6/l5KJwfTWpqCKIqSllID8gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpxmaW/btrE5sjHmb6/l5KJwfTWpqCKIqSllID8gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpxmaW%2FbtrE5sjHmb6%2Fl5KJwfTWpqCKIqSllID8gk%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;783&quot; height=&quot;326&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;326&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;GO GLOBAL을 클릭한다.&lt;/p&gt;
&lt;p 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;1258&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7FnaQ/btrE4bWNd53/51oIMyiH8K3HKLEIIaXl50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7FnaQ/btrE4bWNd53/51oIMyiH8K3HKLEIIaXl50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7FnaQ/btrE4bWNd53/51oIMyiH8K3HKLEIIaXl50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7FnaQ%2FbtrE4bWNd53%2F51oIMyiH8K3HKLEIIaXl50%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;1258&quot; height=&quot;458&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돈을 지불하지 않으려면 $0에서 DOWNLOAD를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 유료 구독 서비스는 번역된 글로 검색까지 도와준다.&lt;/p&gt;
&lt;p 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;872&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5GDRp/btrE5fRKZE3/OLUd7hDe1RESomA2BgsJCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5GDRp/btrE5fRKZE3/OLUd7hDe1RESomA2BgsJCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5GDRp/btrE5fRKZE3/OLUd7hDe1RESomA2BgsJCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5GDRp%2FbtrE5fRKZE3%2FOLUd7hDe1RESomA2BgsJCK%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;872&quot; height=&quot;591&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;591&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;HTML 탭을 선택한 후 기호에 맞게 위젯을 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Widget code에 있는 스크립트를 복사하여 자신의 블로그의 원하는 위치에 붙여넣기 한다.&lt;/p&gt;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/86</guid>
      <comments>https://camelact.tistory.com/86#entry86comment</comments>
      <pubDate>Thu, 9 Jun 2022 17:24:26 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Composite 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/83</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;패턴입니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;복잡한&amp;nbsp;트리&amp;nbsp;구조가&amp;nbsp;사용하기&amp;nbsp;더&amp;nbsp;편리합니다. &lt;br /&gt;다형성&amp;nbsp;재귀를&amp;nbsp;유리하게&amp;nbsp;사용하십시오. &lt;br /&gt;개방/폐쇄&amp;nbsp;원칙. &lt;br /&gt;기존&amp;nbsp;코드를&amp;nbsp;중단하지&amp;nbsp;않고&amp;nbsp;애플리케이션에&amp;nbsp;새로운&amp;nbsp;요소&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;br /&gt;불리 &lt;br /&gt;&lt;br /&gt;기능이&amp;nbsp;상당히&amp;nbsp;다른&amp;nbsp;클래스에&amp;nbsp;공통&amp;nbsp;인터페이스를&amp;nbsp;제공하는&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;이해하기&amp;nbsp;어렵게&amp;nbsp;만들어야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;480px-Composite_UML_class_diagram_(fixed).svg.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZV3rZ/btrE3TB36sU/q6YKgq9uvoRnDmhmCw2J0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZV3rZ/btrE3TB36sU/q6YKgq9uvoRnDmhmCw2J0k/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZV3rZ/btrE3TB36sU/q6YKgq9uvoRnDmhmCw2J0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZV3rZ%2FbtrE3TB36sU%2Fq6YKgq9uvoRnDmhmCw2J0k%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;480&quot; height=&quot;310&quot; data-filename=&quot;480px-Composite_UML_class_diagram_(fixed).svg.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern.core;

import java.util.ArrayList;
import java.util.Iterator;

abstract class MenuComponent {
	public void add(MenuComponent menuComponent) {
		throw new UnsupportedOperationException();
	}

	public void remove(MenuComponent menuComponent) {
		throw new UnsupportedOperationException();
	}

	public MenuComponent getChild(int index) {
		throw new UnsupportedOperationException();
	}

	public String getName() {
		throw new UnsupportedOperationException();
	}

	public String getDescription() {
		throw new UnsupportedOperationException();
	}

	public String show() {
		throw new UnsupportedOperationException();
	}
}

class MenuItem extends MenuComponent {
	private final String name;
	private final String description;

	public MenuItem(String name, String description) {
		this.name = name;
		this.description = description;
	}

	@Override
	public String getName() {
		return name;
	}

	@Override
	public String getDescription() {
		return description;
	}

	@Override
	public String show() {
		return getName() + &quot;,&quot; + getDescription();
	}
}

class Menu extends MenuComponent {
	private final ArrayList&amp;lt;MenuComponent&amp;gt; menuComponents = new ArrayList&amp;lt;MenuComponent&amp;gt;();
	private final String name;
	private final String description;

	public Menu(String name, String description) {
		this.name = name;
		this.description = description;
	}

	@Override
	public void add(MenuComponent menuComponent) {
		menuComponents.add(menuComponent);
	}

	@Override
	public void remove(MenuComponent menuComponent) {
		menuComponents.remove(menuComponent);
	}

	@Override
	public MenuComponent getChild(int index) {
		return (MenuComponent) menuComponents.get(index);
	}

	@Override
	public String getName() {
		return name;
	}

	@Override
	public String getDescription() {
		return description;
	}

	@Override
	public String show() {
		String menuDisplay = getMenuComponentInfo();
		Iterator iterator = menuComponents.iterator();
		while (iterator.hasNext()) {
			MenuComponent menuComponent = (MenuComponent) iterator.next();
			menuDisplay += &quot;\n&quot; + menuComponent.show();
		}
		return menuDisplay;
	}

	private String getMenuComponentInfo() {
		return getName() + &quot; ~ &quot; + getDescription();
	}
}

class Waitress {
	private final MenuComponent allMenus;

	public Waitress(MenuComponent allMenus) {
		this.allMenus = allMenus;
	}

	public String printMenu() {
		return allMenus.show();
	}
}

public class MyComposite {
	public static void main(String[] args) {
		MenuComponent pancakeHouseMenu = new Menu(&quot;PancakeHouseMenu&quot;, &quot;description&quot;);
		MenuComponent dinnerMenu = new Menu(&quot;Diner Menu&quot;, &quot;description&quot;);
		MenuComponent cafeMenu = new Menu(&quot;Cafe Menu&quot;, &quot;description&quot;);

		MenuComponent allMenus = new Menu(&quot;All MENUS&quot;, &quot;description&quot;);
		allMenus.add(pancakeHouseMenu);
		allMenus.add(dinnerMenu);
		allMenus.add(cafeMenu);

		MenuComponent dessertMenu = new Menu(&quot;Dessert Menu&quot;, &quot;description&quot;);
		dinnerMenu.add(dessertMenu);

		pancakeHouseMenu.add(new MenuItem(&quot;K&amp;amp;B&quot;, &quot;description&quot;));
		pancakeHouseMenu.add(new MenuItem(&quot;Y&amp;amp;Z&quot;, &quot;description&quot;));

		Waitress waitress = new Waitress(allMenus);
		System.out.println(waitress.printMenu());
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999242843&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;All MENUS ~ description
PancakeHouseMenu ~ description
K&amp;amp;B,description
Y&amp;amp;Z,description
Diner Menu ~ description
Dessert Menu ~ description
Cafe Menu ~ description&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/83</guid>
      <comments>https://camelact.tistory.com/83#entry83comment</comments>
      <pubDate>Tue, 7 Jun 2022 18:05:18 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Adapter 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/82</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;부서에서도&amp;nbsp;이&amp;nbsp;라이브러리를&amp;nbsp;사용하고&amp;nbsp;있다고&amp;nbsp;가정해&amp;nbsp;보겠습니다.&amp;nbsp;따라서&amp;nbsp;이&amp;nbsp;라이브러리를&amp;nbsp;수정하면&amp;nbsp;다른&amp;nbsp;부서에&amp;nbsp;영향을&amp;nbsp;미칩니다.&amp;nbsp;이&amp;nbsp;경우&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;br /&gt;&lt;br /&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;프레임워크나&amp;nbsp;프로그램에서&amp;nbsp;xxxAdapter라는&amp;nbsp;이름을&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;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;어댑터&amp;nbsp;패턴의&amp;nbsp;주요&amp;nbsp;장점은&amp;nbsp;기존&amp;nbsp;코드를&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;높일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;구성&amp;nbsp;요소의&amp;nbsp;클래스를&amp;nbsp;늘려야&amp;nbsp;하므로&amp;nbsp;복잡성이&amp;nbsp;증가할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;Adapter&amp;nbsp;클래스의&amp;nbsp;경우&amp;nbsp;상속을&amp;nbsp;사용하기&amp;nbsp;때문에&amp;nbsp;유연하지&amp;nbsp;않다. &lt;br /&gt;세미&amp;nbsp;네임드&amp;nbsp;객체&amp;nbsp;Adapter&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adapter pattern.gif&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beQBUx/btrE9RChXSx/QOJigeLtCfgApt7CsX6Xr0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beQBUx/btrE9RChXSx/QOJigeLtCfgApt7CsX6Xr0/img.gif&quot; data-alt=&quot;https://velog.io/@kwj1270/Adapter-pattern&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beQBUx/btrE9RChXSx/QOJigeLtCfgApt7CsX6Xr0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/beQBUx/btrE9RChXSx/QOJigeLtCfgApt7CsX6Xr0/img.gif&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;428&quot; height=&quot;249&quot; data-filename=&quot;adapter pattern.gif&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://velog.io/@kwj1270/Adapter-pattern&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern.core;

interface Duck {
	void quack();
	void fly();
}

class MallardDuck implements Duck {

	@Override
	public void quack() {
		System.out.println(&quot;Quack quack...&quot;);
	}

	@Override
	public void fly() {
		System.out.println(&quot;Fly...&quot;);
	}
}

interface Turkey {
	void gobble();
	void fly();
}

class WildTurkey implements Turkey {

	@Override
	public void gobble() {
		System.out.println(&quot;Gobble gobble...&quot;);
	}

	@Override
	public void fly() {
		System.out.println(&quot;Short distance flight...&quot;);
	}
}

class TurkeyAdapter implements Duck {
	private final Turkey turkey;

	public TurkeyAdapter(Turkey turkey) {
		this.turkey = turkey;
	}

	@Override
	public void quack() {
		turkey.gobble();
	}

	@Override
	public void fly() {
		for (int i = 0; i &amp;lt; 5; i++) {
			turkey.fly();
		}
	}
}

public class MyAdapter {
	public static void main(String[] args) {
		Duck duck = new MallardDuck();
		Turkey turkey = new WildTurkey();

		Duck turkeyAdapter = new TurkeyAdapter(turkey);
		System.out.println(&quot;----Turkey&quot;);
		turkey.gobble();
		turkey.fly();

		System.out.println(&quot;----Duck&quot;);
		testIt(duck);

		System.out.println(&quot;----Turkey Adapter&quot;);
		testIt(turkeyAdapter);
	}

	public static void testIt(Duck duck) {
		duck.quack();
		duck.fly();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999219855&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;----Turkey
Gobble gobble...
Short distance flight...
----Duck
Quack quack...
Fly...
----Turkey Adapter
Gobble gobble...
Short distance flight...
Short distance flight...
Short distance flight...
Short distance flight...
Short distance flight...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/82</guid>
      <comments>https://camelact.tistory.com/82#entry82comment</comments>
      <pubDate>Mon, 6 Jun 2022 18:03:35 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Template Method 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/80</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;만들어집니다. &lt;br /&gt;&lt;br /&gt;추상&amp;nbsp;클래스인&amp;nbsp;AbstractClass는&amp;nbsp;실제로&amp;nbsp;실행을&amp;nbsp;위해&amp;nbsp;호출되는&amp;nbsp;public&amp;nbsp;메소드인&amp;nbsp;templateMethod로&amp;nbsp;정의되며,&amp;nbsp;TemplateMethod에서&amp;nbsp;method1()과&amp;nbsp;method2()의&amp;nbsp;단계로&amp;nbsp;추상&amp;nbsp;메소드가&amp;nbsp;호출된다.&amp;nbsp;이러한&amp;nbsp;추상&amp;nbsp;메소드는&amp;nbsp;abstractClass를&amp;nbsp;상속받아&amp;nbsp;구현된&amp;nbsp;concreteClass에&amp;nbsp;정의되어&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IBM8i/btrE4c2v1NK/8Qy4vIf0ihgkUOmWalhvjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IBM8i/btrE4c2v1NK/8Qy4vIf0ihgkUOmWalhvjK/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_%EB%A9%94%EC%86%8C%EB%93%9C_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IBM8i/btrE4c2v1NK/8Qy4vIf0ihgkUOmWalhvjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIBM8i%2FbtrE4c2v1NK%2F8Qy4vIf0ihgkUOmWalhvjK%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;300&quot; height=&quot;311&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%ED%85%9C%ED%94%8C%EB%A6%BF_%EB%A9%94%EC%86%8C%EB%93%9C_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

abstract class CaffeineBeverage {
	private String userInput;

	final void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		if (customerWantsCondiments()) {
			addCondiments();
		}
	}

	abstract void addCondiments();

	public void pourInCup() {
		System.out.println(&quot;Pouring into cup&quot;);
	}

	abstract void brew();

	public void boilWater() {
		System.out.println(&quot;Boiling water&quot;);
	}

	public boolean customerWantsCondiments() {
		String answer = getUserInput();
		if (answer.toLowerCase().startsWith(&quot;y&quot;))
			return true;
		else
			return false;
	}

	private String getUserInput() {
		return userInput;
	}

	void setUserInput(String userInput) {
		this.userInput = userInput;
	}
}

class Coffee extends CaffeineBeverage {
	String userInput = &quot;&quot;;

	@Override
	void addCondiments() {
		System.out.println(&quot;Adding Sugar and Milk&quot;);
	}

	@Override
	void brew() {
		System.out.println(&quot;Dripping Coffe through filter&quot;);
	}
}

class Tea extends CaffeineBeverage {
	String userInput = &quot;&quot;;

	@Override
	void addCondiments() {
		System.out.println(&quot;Adding Lemon&quot;);
	}

	@Override
	void brew() {
		System.out.println(&quot;Steeping the tea&quot;);
	}
}

public class MyTemplateMethod {
	public static void main(String[] args) {
		CaffeineBeverage coffee = new Coffee();
		coffee.setUserInput(&quot;y&quot;);
		coffee.prepareRecipe();
		
		System.out.println(&quot;&amp;lt;&amp;lt; Next &amp;gt;&amp;gt;&quot;);
		
		CaffeineBeverage tea = new Tea();
		tea.setUserInput(&quot;n&quot;);
		tea.prepareRecipe();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999160833&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Boiling water
Dripping Coffe through filter
Pouring into cup
Adding Sugar and Milk
&amp;lt;&amp;lt; Next &amp;gt;&amp;gt;
Boiling water
Steeping the tea
Pouring into cup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/80</guid>
      <comments>https://camelact.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 4 Jun 2022 17:55:11 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Strategy 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/79</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작을&amp;nbsp;클래스로&amp;nbsp;캡슐화하여&amp;nbsp;동작을&amp;nbsp;동적으로&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;필요할&amp;nbsp;때&amp;nbsp;이를&amp;nbsp;대체하므로&amp;nbsp;동일한&amp;nbsp;문제를&amp;nbsp;다른&amp;nbsp;알고리즘으로&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;즉,&amp;nbsp;전략을&amp;nbsp;쉽게&amp;nbsp;변경할&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;규칙,&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위한&amp;nbsp;알고리즘&amp;nbsp;등 &lt;br /&gt;&lt;br /&gt;전략 &lt;br /&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;지정합니다. &lt;br /&gt;&lt;br /&gt;구체적인&amp;nbsp;전략 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;전략&amp;nbsp;패턴에&amp;nbsp;명시된&amp;nbsp;알고리즘을&amp;nbsp;실제로&amp;nbsp;구현하는&amp;nbsp;클래스 &lt;br /&gt;&lt;br /&gt;문맥 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;전략&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;전략을&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;세터&amp;nbsp;방식('집약적&amp;nbsp;관계')을&amp;nbsp;제공합니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzQode/btrE4WyNr3y/lfJnlrXugDN80wfPT48Pz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzQode/btrE4WyNr3y/lfJnlrXugDN80wfPT48Pz1/img.png&quot; data-alt=&quot;https://m.blog.naver.com/2feelus/220658663151&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzQode/btrE4WyNr3y/lfJnlrXugDN80wfPT48Pz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzQode%2FbtrE4WyNr3y%2FlfJnlrXugDN80wfPT48Pz1%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;137&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://m.blog.naver.com/2feelus/220658663151&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	Duck() {
	}

	public abstract void display();

	public void perfomrFly() {
		flyBehavior.fly();
	}

	public void performQuack() {
		quackBehavior.quack();
	}

	public void swim() {
		System.out.println(&quot;All duck float, even decoys!&quot;);
	}

	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}

	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
}

interface FlyBehavior {
	public void fly();
}

class FlyWithWings implements FlyBehavior {
	@Override
	public void fly() {
		System.out.println(&quot;I'm Flying!!&quot;);
	}
}

class FlyNoWay implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println(&quot;I can't fly&quot;);
	}
}

interface QuackBehavior {
	public void quack();
}

class Quack implements QuackBehavior {
	@Override
	public void quack() {
		System.out.println(&quot;Quack!!&quot;);
	}
}

class MuteQuack implements QuackBehavior {
	@Override
	public void quack() {
		System.out.println(&quot;&amp;lt;&amp;lt; Silence &amp;gt;&amp;gt;&quot;);

	}
}

class MallardDuck extends Duck {
	public MallardDuck() {
		flyBehavior = new FlyWithWings();
		quackBehavior = new Quack();
	}

	@Override
	public void display() {
		System.out.println(&quot;I'm a real Mallard Duck&quot;);

	}
}

public class MyStrategy {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.perfomrFly();

		mallard.setFlyBehavior(new FlyNoWay());
		mallard.setQuackBehavior(new MuteQuack());
		
		mallard.performQuack();
		mallard.perfomrFly();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999142202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Quack!!
I'm Flying!!
&amp;lt;&amp;lt; Silence &amp;gt;&amp;gt;
I can't fly&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <category>Design Pattern</category>
      <category>java</category>
      <category>Strategy Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/79</guid>
      <comments>https://camelact.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 3 Jun 2022 17:53:38 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]State 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/78</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;br /&gt;&lt;br /&gt;장점 &lt;br /&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;수정합니다. &lt;br /&gt;&amp;nbsp; &amp;nbsp;- 상태 패턴을 사용하면 객체의 상태에 따라 조건문을 줄여 코드를 간결하고 가독성 있게 만듭니다. &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&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;증가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IUAYB/btrE9SnF1UX/gUBuvNGHetB1BKS6uKHa2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IUAYB/btrE9SnF1UX/gUBuvNGHetB1BKS6uKHa2k/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%83%81%ED%83%9C_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IUAYB/btrE9SnF1UX/gUBuvNGHetB1BKS6uKHa2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIUAYB%2FbtrE9SnF1UX%2FgUBuvNGHetB1BKS6uKHa2k%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;451&quot; height=&quot;166&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%83%81%ED%83%9C_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

interface State {
	public void insertQuarter();

	public void ejectQuarter();

	public void turnCrank();

	public void dispense();
}

class NoQuarterState implements State {

	GumballMachine gumballMachine;

	public NoQuarterState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println(&quot;insertQuarter&quot;);
		gumballMachine.setState(gumballMachine.getHasQuarterState());
	}

	public void ejectQuarter() {
		System.out.println(&quot;ejectQuarter&quot;);
	}

	public void turnCrank() {
		System.out.println(&quot;turnCrank&quot;);
	}

	public void dispense() {
		System.out.println(&quot;dispense&quot;);
	}

	public String toString() {
		return &quot;NoQuarterState&quot;;
	}
}

class SoldOutState implements State {
	private GumballMachine gumballMachine;

	public SoldOutState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println(&quot;insertQuarter&quot;);
	}

	public void ejectQuarter() {
		System.out.println(&quot;ejectQuarter&quot;);
	}

	public void turnCrank() {
		System.out.println(&quot;turnCrank&quot;);
	}

	public void dispense() {
		System.out.println(&quot;dispense&quot;);
	}

	public String toString() {
		return &quot;toString&quot;;
	}
}

class HasQuarterState implements State {

	private GumballMachine gumballMachine;

	public HasQuarterState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println(&quot;insertQuarter&quot;);
	}

	public void ejectQuarter() {
		System.out.println(&quot;ejectQuarter&quot;);
		gumballMachine.setState(gumballMachine.getNoQuarterState());
	}

	public void turnCrank() {
		System.out.println(&quot;turnCrank&quot;);
		gumballMachine.setState(gumballMachine.getSoldState());
	}

	public void dispense() {
		System.out.println(&quot;dispense&quot;);
	}

	public String toString() {
		return &quot;HasQuarterState&quot;;
	}
}

class SoldState implements State {
	private GumballMachine gumballMachine;

	public SoldState(GumballMachine gumballMachine) {
		this.gumballMachine = gumballMachine;
	}

	public void insertQuarter() {
		System.out.println(&quot;insertQuarter&quot;);
	}

	public void ejectQuarter() {
		System.out.println(&quot;ejectQuarter&quot;);
	}

	public void turnCrank() {
		System.out.println(&quot;turnCrank&quot;);
	}

	public void dispense() {
		gumballMachine.releaseBall();
		if (gumballMachine.getCount() &amp;gt; 0) {
			gumballMachine.setState(gumballMachine.getNoQuarterState());
		} else {
			System.out.println(&quot;Oops!! out of gumballs!!&quot;);
			gumballMachine.setState(gumballMachine.getSoldOutState());
		}
	}

	public String toString() {
		return &quot;GumballMachine&quot;;
	}
}

class GumballMachine {
	State soldOutState;
	State noQuarterState;
	State hasQuarterState;
	State soldState;

	public State getSoldOutState() {
		return soldOutState;
	}

	public State getNoQuarterState() {
		return noQuarterState;
	}

	public State getHasQuarterState() {
		return hasQuarterState;
	}

	public State getSoldState() {
		return soldState;
	}

	State currentState = soldOutState;
	int count = 0;

	public int getCount() {
		return count;
	}

	public GumballMachine(int numberGumaballs) {
		soldOutState = new SoldOutState(this);
		noQuarterState = new NoQuarterState(this);
		hasQuarterState = new HasQuarterState(this);
		soldState = new SoldState(this);

		this.count = numberGumaballs;
		if (numberGumaballs &amp;gt; 0) {
			currentState = noQuarterState;
		}
	}

	public void insertQuarter() {
		currentState.insertQuarter();
	}

	public void ejectQuarter() {
		currentState.ejectQuarter();
	}

	public void turnCrank() {
		currentState.turnCrank();
	}

	public void dispense() {
		currentState.dispense();
	}

	void setState(State state) {
		this.currentState = state;
	}

	void releaseBall() {
		System.out.println(&quot;releaseBall&quot;);
		if (count != 0) {
			count = count - 1;
		}
	}

	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append(&quot;\nMighty Gumball, Inc.&quot;);
		sb.append(&quot;\nJava-enabled Standing Gumball Model #2004&quot;);
		sb.append(&quot;\nInventory: &quot; + count + &quot; gumball&quot;);
		if (count != 1) {
			sb.append(&quot;s&quot;);
		}

		sb.append(&quot;\nMachine is &quot; + currentState + &quot;\n&quot;);
		return sb.toString();
	}
}

public class MyState {
	public static void main(String[] args) {
		GumballMachine gumballMachine = new GumballMachine(5);
		System.out.println(gumballMachine);

		gumballMachine.insertQuarter();
		gumballMachine.turnCrank();

		System.out.println(gumballMachine);

		gumballMachine.insertQuarter();
		gumballMachine.ejectQuarter();
		gumballMachine.turnCrank();
		gumballMachine.dispense();

		System.out.println(gumballMachine);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999122826&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 5 gumballs
Machine is NoQuarterState

insertQuarter
turnCrank

Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 5 gumballs
Machine is GumballMachine

insertQuarter
ejectQuarter
turnCrank
releaseBall

Mighty Gumball, Inc.
Java-enabled Standing Gumball Model #2004
Inventory: 4 gumballs
Machine is NoQuarterState&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <category>Design Pattern</category>
      <category>java</category>
      <category>Programming</category>
      <category>state pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/78</guid>
      <comments>https://camelact.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 2 Jun 2022 17:52:13 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Singleton 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/77</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역&amp;nbsp;변수를&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;하나의&amp;nbsp;객체만&amp;nbsp;생성하고&amp;nbsp;생성된&amp;nbsp;객체를&amp;nbsp;어디서나&amp;nbsp;참조하는&amp;nbsp;패턴 &lt;br /&gt;하나의&amp;nbsp;인스턴스만&amp;nbsp;생성하는&amp;nbsp;역할을&amp;nbsp;하며&amp;nbsp;Getinstance&amp;nbsp;메서드는&amp;nbsp;모든&amp;nbsp;클라이언트에&amp;nbsp;동일한&amp;nbsp;인스턴스를&amp;nbsp;반환하는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&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;CPU에서&amp;nbsp;더&amp;nbsp;좋습니다. &lt;br /&gt;Calendar.getInstance()에&amp;nbsp;대한&amp;nbsp;Java의&amp;nbsp;캘린더&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;없기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;단,&amp;nbsp;Calendar&amp;nbsp;클래스를&amp;nbsp;사용하기&amp;nbsp;위해서는&amp;nbsp;Client&amp;nbsp;프로그램에서&amp;nbsp;new&amp;nbsp;Calendar()를&amp;nbsp;호출하지&amp;nbsp;않도록&amp;nbsp;주의한다. &lt;br /&gt;이를&amp;nbsp;해결하는&amp;nbsp;방법은&amp;nbsp;생성자가&amp;nbsp;외부에서&amp;nbsp;호출되는&amp;nbsp;것을&amp;nbsp;방지하는&amp;nbsp;것입니다. &lt;br /&gt;Calendar&amp;nbsp;클래스의&amp;nbsp;생성자를&amp;nbsp;private로&amp;nbsp;선언합니다. &lt;br /&gt;&lt;br /&gt;문제는&amp;nbsp;여러&amp;nbsp;스레드에서&amp;nbsp;Printer&amp;nbsp;클래스를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;하나&amp;nbsp;이상의&amp;nbsp;인스턴스가&amp;nbsp;생성된다는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;경우에&amp;nbsp;따라&amp;nbsp;경쟁&amp;nbsp;조건이&amp;nbsp;생성됩니다. &lt;br /&gt;메모리와&amp;nbsp;같은&amp;nbsp;동일한&amp;nbsp;자원을&amp;nbsp;사용하기&amp;nbsp;위해&amp;nbsp;2개&amp;nbsp;이상의&amp;nbsp;쓰레드를&amp;nbsp;사용하는&amp;nbsp;현상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Printer&amp;nbsp;인스턴스가&amp;nbsp;아직&amp;nbsp;생성되지&amp;nbsp;않은&amp;nbsp;경우&amp;nbsp;Sweep&amp;nbsp;1은&amp;nbsp;getPrinter&amp;nbsp;메서드의&amp;nbsp;if&amp;nbsp;문을&amp;nbsp;실행하여&amp;nbsp;인스턴스가&amp;nbsp;이미&amp;nbsp;생성되었는지&amp;nbsp;확인합니다.&amp;nbsp;현재&amp;nbsp;프린터&amp;nbsp;변수는&amp;nbsp;NULL입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스레드&amp;nbsp;1이&amp;nbsp;생성자를&amp;nbsp;호출하면&amp;nbsp;스레드&amp;nbsp;2는&amp;nbsp;인스턴스를&amp;nbsp;만들기&amp;nbsp;전에&amp;nbsp;if&amp;nbsp;문을&amp;nbsp;실행하여&amp;nbsp;Printer&amp;nbsp;변수가&amp;nbsp;NULL인지&amp;nbsp;확인합니다.&amp;nbsp;현재&amp;nbsp;프라이머&amp;nbsp;변수는&amp;nbsp;NULL이므로&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;br /&gt;스레드&amp;nbsp;1은&amp;nbsp;스레드&amp;nbsp;2와&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXzLJ/btrE5scUoIN/dwFN9R9TqIzP6faxc9hCK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXzLJ/btrE5scUoIN/dwFN9R9TqIzP6faxc9hCK0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXzLJ/btrE5scUoIN/dwFN9R9TqIzP6faxc9hCK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXzLJ%2FbtrE5scUoIN%2FdwFN9R9TqIzP6faxc9hCK0%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;220&quot; height=&quot;132&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653895274217&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

public class MySingleton {
	private volatile static MySingleton instance = new MySingleton();

	private MySingleton() {
	}

	public static MySingleton getInstance() {
		if (instance == null) {
					instance = new MySingleton();
		}
		
		return instance;
	}
}
// I didn't call at the start of the program, but there are issues allocated to memory.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1653895283959&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

public class MySingleton {
	private volatile static MySingleton instance = null;

	private MySingleton() {
	}

	public synchronized static MySingleton getInstance() {
		if (instance == null) {
					instance = new MySingleton();
		}
		
		return instance;
	}
}
// Synchronized on the method can be locked and slowly slow in multiple thread environments.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

public class MySingleton {
	private volatile static MySingleton instance = null;

	private MySingleton() {
	}

	public static MySingleton getInstance() {
		if (instance == null) {
			synchronized (MySingleton.class) {
				if (instance == null) {
					instance = new MySingleton();
				}
			}
		}
		
		return instance;
	}
}
// NULL checks twice to solve the performance deterioration issues caused by LOCK.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999093435&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1234
1234&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/77</guid>
      <comments>https://camelact.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 1 Jun 2022 17:40:22 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Observer 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/76</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Observer&amp;nbsp;Pattern은&amp;nbsp;Observer의&amp;nbsp;목록,&amp;nbsp;즉&amp;nbsp;Observer의&amp;nbsp;목록을&amp;nbsp;객체에&amp;nbsp;등록하여&amp;nbsp;상태&amp;nbsp;변경이&amp;nbsp;있을&amp;nbsp;때마다&amp;nbsp;객체가&amp;nbsp;메소드&amp;nbsp;등을&amp;nbsp;통해&amp;nbsp;객체에게&amp;nbsp;직접&amp;nbsp;알리도록&amp;nbsp;하는&amp;nbsp;디자인&amp;nbsp;패턴입니다.&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;br /&gt;&lt;br /&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;패턴입니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;기상&amp;nbsp;조건에&amp;nbsp;따라&amp;nbsp;작동해야&amp;nbsp;하는&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;반영하여&amp;nbsp;표시를&amp;nbsp;변경합니다. &lt;br /&gt;피험자는&amp;nbsp;날씨&amp;nbsp;데이터에&amp;nbsp;입력되어&amp;nbsp;여행하고&amp;nbsp;날씨&amp;nbsp;정보를&amp;nbsp;전달합니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&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;br /&gt;객체&amp;nbsp;간의&amp;nbsp;상호&amp;nbsp;의존성을&amp;nbsp;최소화할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다.&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;(Open&amp;nbsp;Closed&amp;nbsp;Principles:&amp;nbsp;Open&amp;nbsp;in&amp;nbsp;Expansion,&amp;nbsp;그리고&amp;nbsp;변경&amp;nbsp;사항은&amp;nbsp;반드시&amp;nbsp;닫아야&amp;nbsp;합니다.) &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;Observer의&amp;nbsp;알림&amp;nbsp;순서를&amp;nbsp;보장할&amp;nbsp;수&amp;nbsp;없습니다. &lt;br /&gt;Observer와&amp;nbsp;Subject의&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;854px-Observer.svg.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q64wd/btrE7C0bdkj/nm48IcOzZKcZMLG3l66GAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q64wd/btrE7C0bdkj/nm48IcOzZKcZMLG3l66GAK/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q64wd/btrE7C0bdkj/nm48IcOzZKcZMLG3l66GAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ64wd%2FbtrE7C0bdkj%2Fnm48IcOzZKcZMLG3l66GAK%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;854&quot; height=&quot;353&quot; data-filename=&quot;854px-Observer.svg.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

import java.util.ArrayList;

interface Subject {
	public void registerObserver(Observer o);

	public void removeObserver(Observer o);

	public void notifyObservers();
}

interface Observer {
	public void update(float temperature, float humidity, float pressure);
}

interface DisplayElement {
	public void display();
}

class WeatherData implements Subject {
	private ArrayList&amp;lt;Observer&amp;gt; observers;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData() {
		observers = new ArrayList&amp;lt;Observer&amp;gt;();
	}

	@Override
	public void registerObserver(Observer o) {
		observers.add(o);

	}

	@Override
	public void removeObserver(Observer o) {
		int i = observers.indexOf(o);
		if (i &amp;gt;= 0)
			observers.remove(i);
	}

	@Override
	public void notifyObservers() {
		for (int i = 0; i &amp;lt; observers.size(); i++) {
			Observer o = observers.get(i);
			o.update(temperature, humidity, pressure);
		}
	}

	public void measurementsChanged() {
		notifyObservers();
	}

	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
}

class CurrentConditionDisplay implements Observer, DisplayElement {
	private float temperature;
	private float humidity;
	private Subject weatherData;

	public CurrentConditionDisplay(Subject weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}

	@Override
	public void display() {
		System.out.println(&quot;CurrentConditionDisplay conditions : &quot; + temperature + &quot;, &quot; + humidity);

	}

	@Override
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		display();
	}
}

class StatisticsDisplay implements Observer, DisplayElement {
	private float temperature;
	private float humidity;
	private Subject weatherData;

	public StatisticsDisplay(Subject weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}

	@Override
	public void display() {
		System.out.println(&quot;StatisticsDisplay conditions : &quot; + temperature + &quot;, &quot; + humidity);

	}

	@Override
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		display();
	}
}

public class MyObserver {
	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();

		CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);
		StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);

		weatherData.setMeasurements(80, 65, 30.f);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999073435&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CurrentConditionDisplay conditions : 80.0, 65.0
StatisticsDisplay conditions : 80.0, 65.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/76</guid>
      <comments>https://camelact.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 31 May 2022 16:40:04 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]MVC 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/72</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC는&amp;nbsp;Model,&amp;nbsp;View,&amp;nbsp;Controller의&amp;nbsp;약자입니다.&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;br /&gt;&lt;br /&gt;위와&amp;nbsp;같이&amp;nbsp;사용자가&amp;nbsp;컨트롤러를&amp;nbsp;조작할&amp;nbsp;때&amp;nbsp;컨트롤러는&amp;nbsp;Model을&amp;nbsp;통해&amp;nbsp;데이터를&amp;nbsp;가져와&amp;nbsp;해당&amp;nbsp;정보를&amp;nbsp;기반으로&amp;nbsp;시각적&amp;nbsp;표현을&amp;nbsp;담당하는&amp;nbsp;View를&amp;nbsp;제어합니다.&amp;nbsp;하나의&amp;nbsp;논리를&amp;nbsp;설명하기&amp;nbsp;위해&amp;nbsp;만든&amp;nbsp;그림이며,&amp;nbsp;MVC&amp;nbsp;패턴의&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같습니다. &lt;br /&gt;&lt;br /&gt;모델 &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;수정하려는&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;없어야&amp;nbsp;합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;변경&amp;nbsp;사항이&amp;nbsp;발생하면&amp;nbsp;변경&amp;nbsp;통지&amp;nbsp;처리&amp;nbsp;방법을&amp;nbsp;구현해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;보다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;모델&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;구성요소를&amp;nbsp;알면&amp;nbsp;안&amp;nbsp;됩니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;변경사항이&amp;nbsp;발생한&amp;nbsp;경우&amp;nbsp;변경통지&amp;nbsp;처리&amp;nbsp;방법을&amp;nbsp;구현해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;제어&amp;nbsp;장치 &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;모델이나&amp;nbsp;뷰에&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;사항을&amp;nbsp;모니터링해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&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;MVC&amp;nbsp;패턴입니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&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;절감합니다. &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;기본&amp;nbsp;기능에&amp;nbsp;대한&amp;nbsp;클래스가&amp;nbsp;많기&amp;nbsp;때문에&amp;nbsp;복잡할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Model과&amp;nbsp;View의&amp;nbsp;완벽한&amp;nbsp;분리가&amp;nbsp;어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;200px-MVC-Process.svg.png&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0AdIP/btrE4VGDAVF/vzPPLtGta5Dwkhdknnc2D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0AdIP/btrE4VGDAVF/vzPPLtGta5Dwkhdknnc2D0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0AdIP/btrE4VGDAVF/vzPPLtGta5Dwkhdknnc2D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0AdIP%2FbtrE4VGDAVF%2FvzPPLtGta5Dwkhdknnc2D0%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;200&quot; height=&quot;220&quot; data-filename=&quot;200px-MVC-Process.svg.png&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

class StudentModel {
	private String rollNo;
	private String name;

	public String getRollNo() {
		return rollNo;
	}

	public void setRollNo(String rollNo) {
		this.rollNo = rollNo;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

class StudentView {
	public void printStudentDetails(String studentName, String studentRollNo) {
		System.out.println(&quot;Student: &quot;);
		System.out.println(&quot;Name: &quot; + studentName);
		System.out.println(&quot;Roll No: &quot; + studentRollNo);
	}
}

class StudentController {
	private StudentModel model;
	private StudentView view;

	public StudentController(StudentModel model, StudentView view) {
		this.model = model;
		this.view = view;
	}

	public void setStudentName(String name) {
		model.setName(name);
	}

	public String getStudentName() {
		return model.getName();
	}

	public void setStudentRollNo(String rollNo) {
		model.setRollNo(rollNo);
	}

	public String getStudentRollNo() {
		return model.getRollNo();
	}

	public void updateView() {
		view.printStudentDetails(model.getName(), model.getRollNo());
	}
}

public class MyMVC {
	public static void main(String[] args) {
		StudentModel model = retriveStudentFromDatabase();

		StudentView view = new StudentView();

		StudentController controller = new StudentController(model, view);

		controller.updateView();
		controller.setStudentName(&quot;John&quot;);
		controller.updateView();
	}

	private static StudentModel retriveStudentFromDatabase() {
		StudentModel student = new StudentModel();
		student.setName(&quot;Robert&quot;);
		student.setRollNo(&quot;10&quot;);
		return student;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999050758&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student: 
Name: Robert
Roll No: 10
Student: 
Name: John
Roll No: 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/72</guid>
      <comments>https://camelact.tistory.com/72#entry72comment</comments>
      <pubDate>Mon, 30 May 2022 11:53:59 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Mediator 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/71</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GOF의&amp;nbsp;정의에&amp;nbsp;따르면&amp;nbsp;mediator&amp;nbsp;패턴은&amp;nbsp;완전히&amp;nbsp;다른&amp;nbsp;객체&amp;nbsp;간의&amp;nbsp;통신이&amp;nbsp;매우&amp;nbsp;복잡한&amp;nbsp;경우&amp;nbsp;mediator를&amp;nbsp;통해&amp;nbsp;객체&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;두&amp;nbsp;객체는&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;br /&gt;&lt;br /&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;br /&gt;서식&amp;nbsp;패널은&amp;nbsp;텍스트의&amp;nbsp;텍스트를&amp;nbsp;수정하고&amp;nbsp;그림&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;수&amp;nbsp;있습니다. &lt;br /&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;br /&gt;&lt;br /&gt;장점: &lt;br /&gt;효율적인&amp;nbsp;리소스&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;필요가&amp;nbsp;없습니다. &lt;br /&gt;중재자&amp;nbsp;구현&amp;nbsp;클래스는&amp;nbsp;나중에&amp;nbsp;더&amp;nbsp;효율적인&amp;nbsp;클래스로&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;불리: &lt;br /&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXtiMi/btrE52qMOPU/OvctevkqoFDb8PkDqU2FYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXtiMi/btrE52qMOPU/OvctevkqoFDb8PkDqU2FYK/img.png&quot; data-alt=&quot;https://always-intern.tistory.com/5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXtiMi/btrE52qMOPU/OvctevkqoFDb8PkDqU2FYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXtiMi%2FbtrE52qMOPU%2FOvctevkqoFDb8PkDqU2FYK%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;302&quot; height=&quot;167&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://always-intern.tistory.com/5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

import java.util.ArrayList;
import java.util.List;

interface IDestination {
	public void receiveEvent(String from, String event);
}

class Display implements IDestination {
	@Override
	public void receiveEvent(String from, String event) {
		System.out.println(&quot;Display : from &quot; + from + &quot; event : &quot; + event);
	}
}

class Log implements IDestination {
	@Override
	public void receiveEvent(String from, String event) {
		System.out.println(&quot;Log : from &quot; + from + &quot; event : &quot; + event);
	}
}

/////////////////////////////////////////////////////////////////////////
interface ISource {
	public void setMediator(Mediator mediator);

	public void eventOccured(String event);
}

class TcpComm implements ISource {
	Mediator mediator;

	@Override
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}

	@Override
	public void eventOccured(String event) {
		System.out.println(&quot;TcpComm event Occured&quot;);
		mediator.onEvent(&quot;TCP comm&quot;, event);
	}
}

class SystemSignal implements ISource {
	Mediator mediator;

	@Override
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}

	@Override
	public void eventOccured(String event) {
		System.out.println(&quot;SystemSignal event Occured&quot;);
		mediator.onEvent(&quot;System&quot;, event);
	}
}

class Mediator {
	List&amp;lt;IDestination&amp;gt; list = new ArrayList&amp;lt;IDestination&amp;gt;();

	public void addDestination(IDestination destination) {
		list.add(destination);
	}

	public void onEvent(String from, String event) {
		for (IDestination each : list) {
			each.receiveEvent(from, event);
		}
	}
}

public class MyMediator {
	public static void main(String[] args) {
		Mediator mediator = new Mediator();
		
		ISource tcp = new TcpComm();
		tcp.setMediator(mediator);
		
		ISource system = new SystemSignal();
		system.setMediator(mediator);
		
		mediator.addDestination(new Display());
		mediator.addDestination(new Log());
		
		tcp.eventOccured(&quot;connected&quot;);
		tcp.eventOccured(&quot;disconnected&quot;);
		
		system.eventOccured(&quot;key input&quot;);
		system.eventOccured(&quot;mouse input&quot;);

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653999030771&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TcpComm event Occured
Display : from TCP comm event : connected
Log : from TCP comm event : connected
TcpComm event Occured
Display : from TCP comm event : disconnected
Log : from TCP comm event : disconnected
SystemSignal event Occured
Display : from System event : key input
Log : from System event : key input
SystemSignal event Occured
Display : from System event : mouse input
Log : from System event : mouse input&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/71</guid>
      <comments>https://camelact.tistory.com/71#entry71comment</comments>
      <pubDate>Fri, 27 May 2022 18:23:59 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Iterator 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/70</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&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;패턴 &lt;br /&gt;Iterator Pattern의 사용은 그 안의 아이템에서 할 수 있지만, 반복할 수 있습니다. &lt;br /&gt;&lt;br /&gt;반복자 &lt;br /&gt;집계의&amp;nbsp;요소를&amp;nbsp;순서대로&amp;nbsp;검색하는&amp;nbsp;인터페이스&amp;nbsp;정의 &lt;br /&gt;&lt;br /&gt;A가&amp;nbsp;List&amp;nbsp;형식이고&amp;nbsp;B가&amp;nbsp;Array라고&amp;nbsp;가정합니다. &lt;br /&gt;이때&amp;nbsp;Iterator&amp;nbsp;패턴을&amp;nbsp;사용하면&amp;nbsp;하나의&amp;nbsp;인터페이스를&amp;nbsp;사용하여&amp;nbsp;두&amp;nbsp;집합을&amp;nbsp;검색할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;각&amp;nbsp;집합을&amp;nbsp;구성하는&amp;nbsp;클래스는&amp;nbsp;반복자가&amp;nbsp;있는&amp;nbsp;인터페이스를&amp;nbsp;상속합니다. &lt;br /&gt;hasNext()는&amp;nbsp;다음&amp;nbsp;항목이&amp;nbsp;있는지&amp;nbsp;확인하는&amp;nbsp;메서드입니다. &lt;br /&gt;next()를&amp;nbsp;통해&amp;nbsp;현재&amp;nbsp;항목을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;500px-Iterator_UML_class_diagram.svg.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kbqa5/btrE8Olt4pz/CJPbrqSHY3TEezkFwROFG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kbqa5/btrE8Olt4pz/CJPbrqSHY3TEezkFwROFG0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EB%B0%98%EB%B3%B5%EC%9E%90_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kbqa5/btrE8Olt4pz/CJPbrqSHY3TEezkFwROFG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbqa5%2FbtrE8Olt4pz%2FCJPbrqSHY3TEezkFwROFG0%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;500&quot; height=&quot;275&quot; data-filename=&quot;500px-Iterator_UML_class_diagram.svg.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EB%B0%98%EB%B3%B5%EC%9E%90_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

import java.util.ArrayList;

interface Iterator {
	boolean hasNext();
	Object next();
	void remove();
}

class MenuItem {
	String name;
	String description;
	boolean vegetarian;
	double price;

	public MenuItem(String name, String description, boolean vegetarian, double price) {
		super();
		this.name = name;
		this.description = description;
		this.vegetarian = vegetarian;
		this.price = price;
	}

	public String getName() {
		return this.name;
	}
}

class DinnerMenuIterator implements Iterator {
	MenuItem[] menuItems;
	int position = 0;

	public DinnerMenuIterator(MenuItem[] menuItems) {
		this.menuItems = menuItems;
	}

	@Override
	public boolean hasNext() {
		if (position &amp;gt;= menuItems.length || menuItems[position] == null)
			return false;
		else
			return true;
	}

	@Override
	public Object next() {
		MenuItem menuItem = menuItems[position];
		position++;
		return menuItem;
	}

	@Override
	public void remove() {
		if (position &amp;lt;= 0) {
			throw new IllegalStateException(&quot;You can't remove blah blah&quot;);
		}
		menuItems[position] = null;
	}
}

interface Menu {
	public Iterator createIterator();
}

class DinnerMenu implements Menu {
	MenuItem[] menuItems = new MenuItem[100];

	public MenuItem[] getMenuItmes() {
		return menuItems;
	}

	@Override
	public Iterator createIterator() {
		return new DinnerMenuIterator(menuItems);
	}

	public void addItem(MenuItem menuItem) {
		for (int i = 0; i &amp;lt; menuItems.length; i++) {
			if (menuItems[i] == null) {
				menuItems[i] = menuItem;
				break;
			}
		}

	}
}

class PancakeHouseMenuIterator implements Iterator {
	ArrayList&amp;lt;MenuItem&amp;gt; menuItems;
	int position = 0;

	public PancakeHouseMenuIterator(ArrayList&amp;lt;MenuItem&amp;gt; menuItems) {
		this.menuItems = menuItems;
	}

	@Override
	public boolean hasNext() {
		if (position &amp;gt;= menuItems.size())
			return false;
		else
			return true;
	}

	@Override
	public Object next() {
		MenuItem menuItem = menuItems.get(position);
		position++;
		return menuItem;
	}

	@Override
	public void remove() {
		if (position &amp;lt;= 0) {
			throw new IllegalStateException(&quot;You can't remove blah blah&quot;);
		}
		menuItems.remove(position);
	}
}

class PancakeHouseMenu implements Menu {
	ArrayList&amp;lt;MenuItem&amp;gt; menuItems = new ArrayList&amp;lt;&amp;gt;();

	public ArrayList&amp;lt;MenuItem&amp;gt; getMenuItmes() {
		return menuItems;
	}

	@Override
	public Iterator createIterator() {
		return new PancakeHouseMenuIterator(menuItems);
	}

	public void addItem(MenuItem menuItem) {
		menuItems.add(menuItem);
	}
}

class Waitress {
	Menu pancakeHouseMenu;
	Menu dinnerMenu;

	public Waitress(Menu pancakeHouseMenu, Menu dinnerMenu) {
		this.pancakeHouseMenu = pancakeHouseMenu;
		this.dinnerMenu = dinnerMenu;
	}

	public void printMenu() {
		Iterator pancakeHouseMenuIterator = pancakeHouseMenu.createIterator();
		Iterator dinnerMenuIterator = dinnerMenu.createIterator();

		printMenu(pancakeHouseMenuIterator);
		printMenu(dinnerMenuIterator);
	}

	private void printMenu(Iterator iterator) {
		while (iterator.hasNext()) {
			MenuItem menuItem = (MenuItem) iterator.next();
			System.out.println(menuItem.getName());
		}
	}
}

public class MyIterator {
	public static void main(String[] args) {
		PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
		pancakeHouseMenu.addItem(new MenuItem(&quot;pancake1&quot;, &quot;pancake&quot;, true, 1));
		pancakeHouseMenu.addItem(new MenuItem(&quot;pancake2&quot;, &quot;pancake&quot;, true, 1));

		DinnerMenu dinnerMenu = new DinnerMenu();
		dinnerMenu.addItem(new MenuItem(&quot;dinner1&quot;, &quot;dinner&quot;, false, 2));
		dinnerMenu.addItem(new MenuItem(&quot;dinner2&quot;, &quot;dinner&quot;, false, 2));
		
		Waitress waitress = new Waitress(pancakeHouseMenu, dinnerMenu);
		waitress.printMenu();
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998980757&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pancake1
pancake2
dinner1
dinner2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-id=&quot;conclusion&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/70</guid>
      <comments>https://camelact.tistory.com/70#entry70comment</comments>
      <pubDate>Thu, 26 May 2022 17:35:05 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Factory Method 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/69</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Factory Method 패턴은 가장 널리 알려진 디자인 패턴 중 하나입니다. &lt;br /&gt;객체를 반복적으로 생성해야 하며, 약간의 차이가 필요한 경우 Factory Method 패턴을 사용합니다. &lt;br /&gt;&lt;br /&gt;Factory Method 패턴은 창의적인 패턴 중 하나입니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;생성&amp;nbsp;패턴은&amp;nbsp;인스턴스&amp;nbsp;생성&amp;nbsp;절차를&amp;nbsp;추상화한&amp;nbsp;패턴이다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;생성&amp;nbsp;패턴에&amp;nbsp;속하는&amp;nbsp;패턴은&amp;nbsp;객체를&amp;nbsp;생성하고&amp;nbsp;합성하는&amp;nbsp;방법이나&amp;nbsp;객체의&amp;nbsp;표현을&amp;nbsp;시스템과&amp;nbsp;분리한다.&amp;nbsp;상속보다&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;br /&gt;&lt;br /&gt;생성&amp;nbsp;패턴에는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;중요한&amp;nbsp;문제가&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;Factory Method 패턴이란? &lt;br /&gt;Factory Method 패턴은 객체를 생성하기 위한 인터페이스를 미리 정의하지만 인스턴스 생성에 대한 클래스의 결정은 서브클래스 측에서 결정하는 패턴입니다. 여러 하위 클래스가 있는 슈퍼 클래스가 있는 경우 들어오는 인수에 따라 하나의 자식 클래스 인스턴스를 반환합니다. &lt;br /&gt;Factory Method 패턴은 클래스의 인스턴스를 서브클래스로 생성하는 시간을 지연시킵니다. &lt;br /&gt;&lt;br /&gt;사용성 &lt;br /&gt;클래스가&amp;nbsp;생성해야&amp;nbsp;하는&amp;nbsp;객체의&amp;nbsp;클래스를&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;원할&amp;nbsp;때 &lt;br /&gt;&lt;br /&gt;Factory Method 패턴의 장점 &lt;br /&gt;Factory Method 패턴은 클라이언트 코드에서 서브클래스의 인스턴스를 제거하여 서로의 종속성을 낮추고 본드를 느슨하게 하며 확장을 쉽게 만듭니다. &lt;br /&gt;&lt;br /&gt;Factory Method 패턴은 클라이언트와 구현 객체 간의 추상화를 제공합니다. &lt;br /&gt;&lt;br /&gt;Factory Method 패턴의 단점 &lt;br /&gt;생성할&amp;nbsp;새&amp;nbsp;개체가&amp;nbsp;증가할&amp;nbsp;때마다&amp;nbsp;Factory&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;300px-FactoryMethod.svg.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhQARA/btrFaOkZ8O0/Rhki0ZWywc4Y8jExvjwRJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhQARA/btrFaOkZ8O0/Rhki0ZWywc4Y8jExvjwRJ0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhQARA/btrFaOkZ8O0/Rhki0ZWywc4Y8jExvjwRJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhQARA%2FbtrFaOkZ8O0%2FRhki0ZWywc4Y8jExvjwRJ0%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;300&quot; height=&quot;177&quot; data-filename=&quot;300px-FactoryMethod.svg.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

import java.util.ArrayList;

abstract class Pizza {
	String name;
	String dough;
	String sauce;
	ArrayList&amp;lt;String&amp;gt; toppings = new ArrayList&amp;lt;String&amp;gt;();

	void prepare() {
		System.out.println(&quot;Preparing &quot; + name);
		System.out.println(&quot;Tossing dough...&quot;);
		System.out.println(&quot;Adding sauce...&quot;);
		System.out.println(&quot;Adding toppings: &quot;);
		for (int i = 0; i &amp;lt; toppings.size(); i++) {
			System.out.println(&quot;   &quot; + toppings.get(i));
		}
	}

	void bake() {
		System.out.println(&quot;Bake for 25 minutes at 350&quot;);
	}

	void cut() {
		System.out.println(&quot;Cutting the pizza into diagonal slices&quot;);
	}

	void box() {
		System.out.println(&quot;Place pizza in official PizzaStore box&quot;);
	}

	public String getName() {
		return name;
	}

	public String toString() {
		StringBuffer display = new StringBuffer();
		display.append(&quot;---- &quot; + name + &quot; ----\n&quot;);
		display.append(dough + &quot;\n&quot;);
		display.append(sauce + &quot;\n&quot;);
		for (int i = 0; i &amp;lt; toppings.size(); i++) {
			display.append((String) toppings.get(i) + &quot;\n&quot;);
		}
		return display.toString();
	}
}

class NYStyleCheesePizza extends Pizza {
	public NYStyleCheesePizza() {
		name = &quot;NYStyleCheesePizza&quot;;
		dough = &quot;Thin Crust Dough&quot;;
		sauce = &quot;Marinara Sauce&quot;;
		toppings.add(&quot;Grated Reggiano Cheese&quot;);
	}
}

class NYStylePepperoniPizza extends Pizza {
	public NYStylePepperoniPizza() {
		name = &quot;NYStylePepperoniPizza&quot;;
		dough = &quot;Thin Crust Dough&quot;;
		sauce = &quot;Marinara Sauce&quot;;
		toppings.add(&quot;Grated Reggiano Cheese&quot;);
	}
}

class ChicagoStyleCheesePizza extends Pizza {
	public ChicagoStyleCheesePizza() {
		name = &quot;ChicagoStyleCheesePizza&quot;;
		dough = &quot;Extra Thick Crust Dough&quot;;
		sauce = &quot;Plum Tomato Sauce&quot;;
		toppings.add(&quot;Shredded Mozzarella Cheese&quot;);
	}

	void cut() {
		System.out.println(&quot;Cutting the pizza into square slices&quot;);
	}
}

class ChicagoStylePepperoniPizza extends Pizza {
	public ChicagoStylePepperoniPizza() {
		name = &quot;ChicagoStylePepperoniPizza&quot;;
		dough = &quot;Extra Thick Crust Dough&quot;;
		sauce = &quot;Plum Tomato Sauce&quot;;
		toppings.add(&quot;Shredded Mozzarella Cheese&quot;);
	}

	void cut() {
		System.out.println(&quot;Cutting the pizza into square slices&quot;);
	}
}

abstract class PizzaStore {
	public Pizza orderPizza(String type) {
		Pizza pizza;

		pizza = createPizza(type); // back to a method call

		pizza.prepare(); // complete methods
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}

	abstract Pizza createPizza(String type);
}

class NYStylePizzaStore extends PizzaStore {
	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals(&quot;cheese&quot;)) {
			pizza = new NYStyleCheesePizza();
		} else if (type.equals(&quot;pepperoni&quot;)) {
			pizza = new NYStylePepperoniPizza();
		}

		return pizza;
	}
}

class ChicagoStylePizzaStore extends PizzaStore {
	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals(&quot;cheese&quot;)) {
			pizza = new ChicagoStyleCheesePizza();
		} else if (type.equals(&quot;pepperoni&quot;)) {
			pizza = new ChicagoStylePepperoniPizza();
		} 
		
		return pizza;
	}
}

public class MyFactory {
	public static void main(String[] args) {
		PizzaStore nyStore = new NYStylePizzaStore();
		PizzaStore chicagoStore = new ChicagoStylePizzaStore();

		Pizza pizza = nyStore.orderPizza(&quot;cheese&quot;);
		System.out.println(&quot;Ethan ordered a &quot; + pizza.getName() + &quot;\n&quot;);

		pizza = chicagoStore.orderPizza(&quot;cheese&quot;);
		System.out.println(&quot;Ethan ordered a &quot; + pizza.getName() + &quot;\n&quot;);

		pizza = nyStore.orderPizza(&quot;pepperoni&quot;);
		System.out.println(&quot;Ethan ordered a &quot; + pizza.getName() + &quot;\n&quot;);

		pizza = chicagoStore.orderPizza(&quot;pepperoni&quot;);
		System.out.println(&quot;Ethan ordered a &quot; + pizza.getName() + &quot;\n&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998955395&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Preparing NYStyleCheesePizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a NYStyleCheesePizza

Preparing ChicagoStyleCheesePizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Ethan ordered a ChicagoStyleCheesePizza

Preparing NYStylePepperoniPizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Grated Reggiano Cheese
Bake for 25 minutes at 350
Cutting the pizza into diagonal slices
Place pizza in official PizzaStore box
Ethan ordered a NYStylePepperoniPizza

Preparing ChicagoStylePepperoniPizza
Tossing dough...
Adding sauce...
Adding toppings: 
   Shredded Mozzarella Cheese
Bake for 25 minutes at 350
Cutting the pizza into square slices
Place pizza in official PizzaStore box
Ethan ordered a ChicagoStylePepperoniPizza&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/69</guid>
      <comments>https://camelact.tistory.com/69#entry69comment</comments>
      <pubDate>Thu, 26 May 2022 16:43:01 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][Math]Arithmetic calculator including parentheses</title>
      <link>https://camelact.tistory.com/68</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There&amp;nbsp;are&amp;nbsp;many&amp;nbsp;calculator&amp;nbsp;programs&amp;nbsp;on&amp;nbsp;the&amp;nbsp;Internet. &lt;br /&gt;However,&amp;nbsp;most&amp;nbsp;of&amp;nbsp;them&amp;nbsp;do&amp;nbsp;not&amp;nbsp;work&amp;nbsp;well&amp;nbsp;or&amp;nbsp;parentheses&amp;nbsp;are&amp;nbsp;not&amp;nbsp;possible. &lt;br /&gt;The&amp;nbsp;program&amp;nbsp;introduced&amp;nbsp;from&amp;nbsp;now&amp;nbsp;on&amp;nbsp;is&amp;nbsp;a&amp;nbsp;calculator&amp;nbsp;that&amp;nbsp;can&amp;nbsp;be&amp;nbsp;parenthesized. &lt;br /&gt;&lt;br /&gt;Change&amp;nbsp;the&amp;nbsp;formula&amp;nbsp;that&amp;nbsp;a&amp;nbsp;person&amp;nbsp;entered&amp;nbsp;into&amp;nbsp;a&amp;nbsp;rear&amp;nbsp;table. &lt;br /&gt;It&amp;nbsp;is&amp;nbsp;taken&amp;nbsp;out&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Stack&amp;nbsp;and&amp;nbsp;switched&amp;nbsp;back&amp;nbsp;to&amp;nbsp;the&amp;nbsp;mid&amp;nbsp;-term&amp;nbsp;mark,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;calculation&amp;nbsp;is&amp;nbsp;performed&amp;nbsp;between&amp;nbsp;them. &lt;br /&gt;&lt;br /&gt;If&amp;nbsp;you&amp;nbsp;use&amp;nbsp;it,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;add&amp;nbsp;the&amp;nbsp;function&amp;nbsp;you&amp;nbsp;want. &lt;br /&gt;For&amp;nbsp;example,&amp;nbsp;it&amp;nbsp;is&amp;nbsp;easy&amp;nbsp;to&amp;nbsp;add&amp;nbsp;SIN&amp;nbsp;(1),&amp;nbsp;SQRT&amp;nbsp;(1),&amp;nbsp;etc. &lt;br /&gt;If&amp;nbsp;the&amp;nbsp;molecule&amp;nbsp;is&amp;nbsp;divided&amp;nbsp;into&amp;nbsp;zero,&amp;nbsp;the&amp;nbsp;error&amp;nbsp;is&amp;nbsp;done.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653454588187&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.test;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CamelActCalculator {
	static Pattern minusPattern = Pattern.compile(&quot;[0-9]{1}[-]{1}[0-9]{1}&quot;);
	static Pattern pattern = Pattern.compile(&quot;[-]?[0-9]*\\.?[0-9]+|\\(|\\)|\\+|-|\\*|/|(abs)|(log10)|(if)|,|&amp;lt;=|&amp;gt;=|&amp;lt;|&amp;gt;|=|(and)|(or)&quot;);

	private static Map&amp;lt;String, Integer&amp;gt; priorityMap = new HashMap&amp;lt;String, Integer&amp;gt;();
	static {
		priorityMap.put(&quot;=&quot;, 1);
		priorityMap.put(&quot;&amp;lt;&quot;, 1);
		priorityMap.put(&quot;&amp;gt;&quot;, 1);
		priorityMap.put(&quot;&amp;lt;=&quot;, 1);
		priorityMap.put(&quot;&amp;gt;=&quot;, 1);
		priorityMap.put(&quot;and&quot;, 1);
		priorityMap.put(&quot;or&quot;, 1);
		priorityMap.put(&quot;+&quot;, 2);
		priorityMap.put(&quot;-&quot;, 2);
		priorityMap.put(&quot;*&quot;, 3);
		priorityMap.put(&quot;/&quot;, 3);
		priorityMap.put(&quot;(&quot;, 0);
	}
	
	public static void main(String[] args) {
		System.out.println(getCalculatedValue(&quot;30+20-21&quot;));
		System.out.println(getCalculatedValue(&quot;-30+20-21&quot;));
		System.out.println(getCalculatedValue(&quot;-30+(-30)&quot;));
		System.out.println(getCalculatedValue(&quot;2.0*abs(-30-(-20*2))+20&quot;));
		System.out.println(getCalculatedValue(&quot;2*abs(-30-abs(-20*2))+20&quot;));
		System.out.println(getCalculatedValue(&quot;2*abs(-30-log10(20*2))+20&quot;));
		System.out.println(getCalculatedValue(&quot;if(10&amp;lt;20,1,2)&quot;));
		System.out.println(getCalculatedValue(&quot;if(10&amp;lt;20,if(11&amp;lt;22,1,2),3)&quot;));
		System.out.println(getCalculatedValue(&quot;if(10+12+abs(20+3-2)&amp;lt;20,1,2)&quot;));
		System.out.println(getCalculatedValue(&quot;if((1=0)&amp;amp;(2=0),0,1)&quot;));
		System.out.println(getCalculatedValue(&quot;if((((1+3=0)and(30+2)))or(2=0),0,1)&quot;));
		System.out.println(getCalculatedValue(&quot;if((1&amp;lt;=0)&amp;amp;(2=0),0,1)&quot;));
		System.out.println(getCalculatedValue(&quot;if((1=0)and(2=0)and(3=0),0,if((1=0)or(2=0)or(3=0),100,100-(4/5)*(6/7)*(8/9)*100))&quot;));
		System.out.println(getCalculatedValue(&quot;-50/-25&quot;));
		System.out.println(getCalculatedValue(&quot;-50/0&quot;));
	}
	
	public static double getCalculatedValue(String param) {
		if(param.contains(&quot;NaN&quot;)) {
			return Double.NaN;
		}
		
		Matcher m = minusPattern.matcher(param);
		while (m.find()) { 	// 30-20 to 30+-20		but cannot allow 30-(20) to 30+-(20) or -30+20 to +-30+20 or 30-abs(20) to 30+-abs(20)
			String word = m.group();
			String replace = word.charAt(0) + &quot;+-&quot; + word.charAt(2);
			param = param.replace(word, replace);
		}
		
		 Queue&amp;lt;String&amp;gt; infixQue = new LinkedList&amp;lt;String&amp;gt;();
		
		m = pattern.matcher(param);
		while (m.find()) {
			String word = m.group();
			
			if(word.equals(&quot;abs&quot;) || word.equals(&quot;log10&quot;)) {
				word = operSpecial(word, m, word.charAt(0)) ;
			} else 	if(word.equals(&quot;if&quot;)) {
				word = operIf(word, m);
			}
			
			infixQue.add(word);
		}
		
		double num = transformPostfix(infixQue);
		if(Double.isNaN(num)) { // can not divide 0
			System.out.println(Double.NaN + &quot; convert to 0&quot;);
			return 0;
		}
		return num;
	}
	
	public static String operIf(String word, Matcher m) {
		Queue&amp;lt;String&amp;gt; conditionQue = new LinkedList&amp;lt;String&amp;gt;();
		Queue&amp;lt;String&amp;gt; trueQue = new LinkedList&amp;lt;String&amp;gt;();
		Queue&amp;lt;String&amp;gt; falseQue = new LinkedList&amp;lt;String&amp;gt;();
		Queue&amp;lt;String&amp;gt; refQue = conditionQue;
		
		int count = 0;
		int que = 0;
		while (m.find()) {
			word = m.group();
			
			if(word.equals(&quot;abs&quot;) || word.equals(&quot;log10&quot;)) {
				word = operSpecial(word, m, word.charAt(0)) ;
			} else 	if(word.equals(&quot;if&quot;)) {
				word = operIf(word, m);
			} else if(word.equals(&quot;,&quot;) &amp;amp;&amp;amp; que == 0) {
				que++;
				refQue = trueQue;
				continue;
			} else if(word.equals(&quot;,&quot;) &amp;amp;&amp;amp; que == 1) {
				que++;
				refQue = falseQue;
				continue;
			} else {
				if (word.equals(&quot;(&quot;)) {
					count++;
					if (count == 1)
						continue;
				}
				if (word.equals(&quot;)&quot;)) {
					count--;
					if (count == 0)
						break;
				}
			}
			
			refQue.add(word);
		}
		
		double num = 0f;
		if(transformPostfix(conditionQue) &amp;gt; 0) {
			num = transformPostfix(trueQue);
		} else {
			num = transformPostfix(falseQue);
		}
		
		return num + &quot;&quot;;
	}
	
	public static String operSpecial(String word, Matcher m, char c) {
		Queue&amp;lt;String&amp;gt; subInfixQue = new LinkedList&amp;lt;String&amp;gt;();
		int count = 0;
		while (m.find()) {
			word = m.group();
			
			if(word.equals(&quot;abs&quot;) || word.equals(&quot;log10&quot;)) {
				word = operSpecial(word, m, word.charAt(0)) ;
			} else 	if(word.equals(&quot;if&quot;)) {
				word = operIf(word, m);
			} else {
				if (word.equals(&quot;(&quot;)) {
					count++;
					if (count == 1)
						continue;
				}
				if (word.equals(&quot;)&quot;)) {
					count--;
					if (count == 0)
						break;
				}
			}
			
			subInfixQue.add(word);
		}

		double num = transformPostfix(subInfixQue);
		
		switch (c) {
		case 'a':
			word = Math.abs(num) + &quot;&quot;;
			break;
		case 'l':
			word = Math.log10(num) + &quot;&quot;;
			break;
		default:
			word = Math.abs(num) + &quot;&quot;;
			break;
		}
		
		return word;
	}

	public static double transformPostfix(Queue&amp;lt;String&amp;gt; param) {
		Stack&amp;lt;String&amp;gt; infixStack = new Stack&amp;lt;String&amp;gt;();
		Queue&amp;lt;String&amp;gt; postfixQue = new LinkedList&amp;lt;String&amp;gt;();
		
		for(String word : param) {
			if (word.equals(&quot;(&quot;)) {
				infixStack.push(word);
			} else if (priorityMap.containsKey(word)) {
				while (true) {
					if (infixStack.isEmpty() || priorityMap.get(infixStack.peek()) &amp;lt; priorityMap.get(word)) {
						infixStack.push(word);
						break;
					} else {
						String popStr = infixStack.pop();
						postfixQue.add(popStr);
					}
				}
			} else if (word.equals(&quot;)&quot;)) {
				while (true) {
					String popStr = infixStack.pop();
					if (popStr.equals(&quot;(&quot;)) {
						break;
					} else {
						postfixQue.add(popStr);
					}
				}
			} else {
				postfixQue.add(word);
			}
		}

		while (infixStack.isEmpty() == false) {
			String popStr = infixStack.pop();
			postfixQue.add(popStr);
		}
		
		double num = calculatePostfix(postfixQue);
		return num;
	}

	public static double calculatePostfix(Queue&amp;lt;String&amp;gt; param) {
		Stack&amp;lt;Double&amp;gt; postfixStack = new Stack&amp;lt;Double&amp;gt;();
		
		double firstVal;
		double secondVal;

		while (param.isEmpty() == false) {
			String word = param.remove();

			if (priorityMap.containsKey(word)) {
				secondVal = postfixStack.pop();
				firstVal = postfixStack.pop();

				switch (word) {
				case &quot;+&quot;:
					postfixStack.push(firstVal + secondVal);
					break;
				case &quot;-&quot;:
					postfixStack.push(firstVal - secondVal);
					break;
				case &quot;*&quot;:
					postfixStack.push(firstVal * secondVal);
					break;
				case &quot;/&quot;:
					postfixStack.push(firstVal / secondVal);
					break;
				case &quot;and&quot;:
					if(firstVal &amp;gt; 0 &amp;amp;&amp;amp; secondVal &amp;gt; 0) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				case &quot;or&quot;:
					if(firstVal &amp;gt; 0 || secondVal &amp;gt; 0) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				case &quot;=&quot;:
					if(firstVal == secondVal) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				case &quot;&amp;lt;&quot;:
					if(firstVal &amp;lt; secondVal) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				case &quot;&amp;gt;&quot;:
					if(firstVal &amp;gt; secondVal) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				case &quot;&amp;lt;=&quot;:
					if(firstVal &amp;lt;= secondVal) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				case &quot;&amp;gt;=&quot;:
					if(firstVal &amp;gt;= secondVal) {
						postfixStack.push(1.);
					} else {
						postfixStack.push(0.);
					}
					break;
				default:
					break;
				}

			} else {
				postfixStack.push(Double.valueOf(word));
			}
		}
		return postfixStack.pop();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998929227&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;29.0
-31.0
-60.0
40.0
160.0
83.20411998265593
1.0
1.0
2.0
1.0
1.0
1.0
39.04761904761905
2.0
-Infinity&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Utility</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/68</guid>
      <comments>https://camelact.tistory.com/68#entry68comment</comments>
      <pubDate>Thu, 26 May 2022 14:25:17 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][블로그에]목차 만들기</title>
      <link>https://camelact.tistory.com/67</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;130&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpddh/btrE5hQdE8v/yh5yQEsA8GR1Wkmp1Yg581/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpddh/btrE5hQdE8v/yh5yQEsA8GR1Wkmp1Yg581/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpddh/btrE5hQdE8v/yh5yQEsA8GR1Wkmp1Yg581/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftpddh%2FbtrE5hQdE8v%2Fyh5yQEsA8GR1Wkmp1Yg581%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;130&quot; height=&quot;300&quot; data-origin-width=&quot;130&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그에 위와같이 글에 목차를 따로두어 클릭하면 책갈피 기능이 수행되는 것을 경험할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;1._제목_H_태그_이해하기&quot; data-ke-size=&quot;size23&quot;&gt;Understanding&amp;nbsp;the&amp;nbsp;title&amp;nbsp;h&amp;nbsp;tag&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H&amp;nbsp;태그를&amp;nbsp;사용하여&amp;nbsp;Tistori&amp;nbsp;또는&amp;nbsp;자신의&amp;nbsp;블로그&amp;nbsp;게시물에&amp;nbsp;자동으로&amp;nbsp;콘텐츠를&amp;nbsp;만듭니다.&amp;nbsp;웹사이트에서&amp;nbsp;제목은&amp;nbsp;H&amp;nbsp;태그를&amp;nbsp;사용합니다.&amp;nbsp;H1이&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;제목이며&amp;nbsp;숫자가&amp;nbsp;클수록&amp;nbsp;중요도가&amp;nbsp;낮아집니다. &lt;br /&gt;H1&amp;nbsp;태그는&amp;nbsp;현재&amp;nbsp;웹사이트에서만&amp;nbsp;사용해야&amp;nbsp;합니다.&amp;nbsp;블로그&amp;nbsp;제목을&amp;nbsp;H1&amp;nbsp;태그로&amp;nbsp;사용하는&amp;nbsp;것을&amp;nbsp;권장합니다.&amp;nbsp;본문에서는&amp;nbsp;H2&amp;nbsp;태그를&amp;nbsp;순서대로&amp;nbsp;사용하는&amp;nbsp;것을&amp;nbsp;권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;2._jQuery_TOC_플러그인_업로드&quot; data-ke-size=&quot;size23&quot;&gt;jQuery&amp;nbsp;toc&amp;nbsp;plugin&amp;nbsp;upload&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트&amp;nbsp;프레임워크인&amp;nbsp;Jquarie를&amp;nbsp;사용하여&amp;nbsp;Tistory&amp;nbsp;목차를&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;Jquarie는&amp;nbsp;JavaScript를&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;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/EcjQN/btrC8CN2Rkk/Cdu3PxkFgkwSWsIuKF3C4k/jquery.toc.min.js?attach=1&amp;amp;knm=tfile.js&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;jquery.toc.min.js&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&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;Click 관리자 메뉴에서 꾸미기 &amp;gt; 스킨 편집 &amp;gt; html 편집 &amp;gt; 파일업로드 in order.&lt;br /&gt;Click the 'Add' button below.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3._자동목차_스크립트_넣기&quot; data-ke-size=&quot;size23&quot;&gt;Put&amp;nbsp;automatic&amp;nbsp;table&amp;nbsp;of&amp;nbsp;contents&amp;nbsp;script&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Click&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;관리자 메뉴에서 스킨 편집 &amp;gt; html 편집&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in order.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You&amp;nbsp;can&amp;nbsp;paste&amp;nbsp;the&amp;nbsp;script&amp;nbsp;at&amp;nbsp;the&amp;nbsp;bottom&amp;nbsp;of&amp;nbsp;the&amp;nbsp;body&amp;nbsp;tag.&lt;/p&gt;
&lt;pre id=&quot;code_1653471411461&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;./images/jquery.toc.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
  $(document).ready(function() {
  $(&quot;#toc&quot;).toc({content: &quot;tt_article_useless_p_margin&quot;, headings: &quot;h2,h3&quot;});
});
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;4._티스토리_자동_목차_CSS_꾸미기&quot; data-ke-size=&quot;size23&quot;&gt;Automatic table of contents css decorating&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And I will decorate the contents of the table of contents. Click 관리자 메뉴에서 꾸미기 &amp;gt; 스킨 편집 &amp;gt; html 편집 &amp;gt; CSS 탭 in order.&lt;br /&gt;And&amp;nbsp;put&amp;nbsp;the&amp;nbsp;bottom&amp;nbsp;CSS&amp;nbsp;code.&amp;nbsp;FONT-SIZES&amp;nbsp;is&amp;nbsp;font&amp;nbsp;size&amp;nbsp;and&amp;nbsp;color&amp;nbsp;is&amp;nbsp;font&amp;nbsp;color.&amp;nbsp;Add&amp;nbsp;the&amp;nbsp;size&amp;nbsp;and&amp;nbsp;color&amp;nbsp;you&amp;nbsp;want.&lt;/p&gt;
&lt;pre id=&quot;code_1653471132054&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.book-toc {
    position: relative;
    width: fit-content;
    border: 0px solid #b0d197;
    padding: 10px 20px 10px 15px;
	  background-color: #fafafa; 
	  color: #333;
    z-index: 1;
}
.book-toc:after {
    content: &quot;&quot;;
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
	  background-color: #fafafa; 
	  color: #333;
    z-index: -1;
    opacity: 0.1;
}
.book-toc p {
 	  font-size: 15px; 
	  padding: 7px 10px 5px; 
	  margin: 0 0 10px; 
	  border-left: 5px solid #666; 
	  background-color: #fafafa; color: #333;
}
#toc * {
    font-size: 20px;
    color: #000 !important;
}
#toc {
    margin-bottom: 0;
}
#toc a:hover {
    color: #000;
}
#toc ul {
    margin-top: 5px;
    margin-bottom: 0px;
}
#toc &amp;gt; li {
    padding-left: 0;
    text-indent: 0;
    margin-bottom: 10px;
	  list-style-type: none;
}

#toc &amp;gt; li &amp;gt; a { 
 	  font-size: 15px; 
	  padding: 7px 10px 5px; 
	  margin: 0 0 10px; 
	  border-left: 5px solid #666; 
	  background-color: #fafafa; 
	  color: #333;
}

#toc &amp;gt; li &amp;gt; ul {
    padding-left: 20px;
    margin-top: 0;
    margin-bottom: 0;
}
#toc &amp;gt; li &amp;gt; ul &amp;gt; li {
    font-size: 0.87em;
    padding-left: 0;
    text-indent: 0;
    margin-bottom: 0;
    margin-top: 5px;
}
#toc &amp;gt; li &amp;gt; ul &amp;gt; li &amp;gt; a {
    font-size: 1em;
    text-decoration:none;
}
#toc &amp;gt; li &amp;gt; ul &amp;gt; li &amp;gt; ul {
    padding-left: 10px;
    margin-top: 0;
    margin-bottom: 0;
}
#toc &amp;gt; li &amp;gt; ul &amp;gt; li &amp;gt; ul &amp;gt; li {
    font-size: 0.87em;
	  list-style-type: none;
    padding-left: 0;
    text-indent: 0;
    margin-bottom: 0;
    margin-top: 3px;
}
#toc &amp;gt; li &amp;gt; ul &amp;gt; li &amp;gt; ul &amp;gt; li &amp;gt; a {
    font-size: 0.875em;
    text-decoration:none;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Blog Management</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/67</guid>
      <comments>https://camelact.tistory.com/67#entry67comment</comments>
      <pubDate>Wed, 25 May 2022 18:40:39 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Decorator 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/65</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데코레이터&amp;nbsp;패턴은&amp;nbsp;음료에&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;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;1.&amp;nbsp;기존&amp;nbsp;코드를&amp;nbsp;수정하지&amp;nbsp;않고&amp;nbsp;데코레이터&amp;nbsp;패턴을&amp;nbsp;통해&amp;nbsp;행동을&amp;nbsp;확장할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;2.&amp;nbsp;구성&amp;nbsp;및&amp;nbsp;위임을&amp;nbsp;통해&amp;nbsp;실행하면서&amp;nbsp;새&amp;nbsp;작업을&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;1.&amp;nbsp;무의미한&amp;nbsp;대상을&amp;nbsp;너무&amp;nbsp;많이&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;2.&amp;nbsp;데코레이터가&amp;nbsp;너무&amp;nbsp;많으면&amp;nbsp;코드가&amp;nbsp;필요&amp;nbsp;이상으로&amp;nbsp;복잡해질&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;다음과 같은 상황에서 데코레이터 패턴을 사용하는 것이 좋습니다. &lt;br /&gt;1.&amp;nbsp;클래스의&amp;nbsp;요소를&amp;nbsp;계속&amp;nbsp;수정하면서&amp;nbsp;사용할&amp;nbsp;구조체가&amp;nbsp;필요한&amp;nbsp;경우 &lt;br /&gt;2.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1hDFS/btrE5R4wBLS/kWLotzZQAqDLt1qRP4csQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1hDFS/btrE5R4wBLS/kWLotzZQAqDLt1qRP4csQ0/img.png&quot; data-alt=&quot;https://dailyheumsi.tistory.com/198&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1hDFS/btrE5R4wBLS/kWLotzZQAqDLt1qRP4csQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1hDFS%2FbtrE5R4wBLS%2FkWLotzZQAqDLt1qRP4csQ0%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;400&quot; height=&quot;317&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://dailyheumsi.tistory.com/198&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653371551981&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

abstract class Beverage {
	protected String description = &quot;Unknown Beverage&quot;;

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

class Espresso extends Beverage {
	public Espresso() {
		this.description = &quot;Espresso&quot;;
	}

	@Override
	public double cost() {
		return 1;
	}
}

class HouseBlend extends Beverage {
	public HouseBlend() {
		this.description = &quot;House Blend&quot;;
	}

	@Override
	public double cost() {
		return 1.5;
	}
}

abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}

class Mocha extends CondimentDecorator {
	private final Beverage beverage;

	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public double cost() {
		return 0.20 + beverage.cost();
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + &quot;, Mocha&quot;;
	}
}

class Whip extends CondimentDecorator {
	private final Beverage beverage;

	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public double cost() {
		return 0.15 + beverage.cost();
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + &quot;, Whip&quot;;
	}
}

public class MyDecorator {
	public static void main(String[] args) {
		Beverage b = new Mocha(new Mocha(new Whip(new HouseBlend())));
		System.out.println(b.getDescription());
		System.out.println(b.cost());
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998884365&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;House Blend, Whip, Mocha, Mocha
2.05&lt;/code&gt;&lt;/pre&gt;
&lt;p data-id=&quot;overview&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Additional Code&amp;nbsp;Example&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You&amp;nbsp;can&amp;nbsp;use&amp;nbsp;Decorator&amp;nbsp;Pattern&amp;nbsp;to&amp;nbsp;create&amp;nbsp;arithmetic&amp;nbsp;calculators.&lt;/p&gt;
&lt;pre id=&quot;code_1653454646087&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.test;

abstract class Base {
	protected float result = 0;

	public float calc() {
		return result;
	}
}

class Number extends Base {
	public Number(float n) {
		this.result = n;
	}
}

abstract class CondimentDecorator extends Base {
	public abstract float calc();
}

class Plus extends CondimentDecorator {
	final Base base1;
	final Base base2;

	public Plus(Base base1, Base base2) {
		this.base1 = base1;
		this.base2 = base2;
	}

	@Override
	public float calc() {
		return base1.calc() + base2.calc();
	}
}

class Minus extends Plus {
	public Minus(Base base1, Base base2) {
		super(base1, base2);
	}

	@Override
	public float calc() {
		return base1.calc() - base2.calc();
	}
}

class Multipl extends Plus {
	public Multipl(Base base1, Base base2) {
		super(base1, base2);
	}

	@Override
	public float calc() {
		return base1.calc() * base2.calc();
	}
}

class Division extends Plus {
	public Division(Base base1, Base base2) {
		super(base1, base2);
	}

	@Override
	public float calc() {
		return base1.calc() / base2.calc();
	}
}

public class MyDecorator {
	public static void main(String[] args) {
		Base a = new Number(3);
		System.out.println(a.calc());
		
		Base b = new Plus(new Number(2), new Number(5));
		System.out.println(b.calc());
		// 		( ( 4 + 2 ) * ( 8 - 1 ) ) / 2
		Base c = new Division(new Multipl(new Plus(new Number(4), new Number(2)), new Minus(new Number(8), new Number(1))), new Number(2));
		System.out.println(c.calc());
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1655556236480&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;3.0
7.0
21.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/65</guid>
      <comments>https://camelact.tistory.com/65#entry65comment</comments>
      <pubDate>Wed, 25 May 2022 13:55:45 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Builder 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/64</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌더&amp;nbsp;패턴은&amp;nbsp;공장에서&amp;nbsp;만드는&amp;nbsp;것보다&amp;nbsp;쉽습니다. &lt;br /&gt;미리&amp;nbsp;디자인북을&amp;nbsp;가져오세요. &lt;br /&gt;모든&amp;nbsp;비행기는&amp;nbsp;같은&amp;nbsp;영역으로&amp;nbsp;나눌&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;Wings,&amp;nbsp;PowerPlant,&amp;nbsp;Avionics,&amp;nbsp;Seats&amp;nbsp;등 &lt;br /&gt;구성&amp;nbsp;요소는&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;br /&gt;다른&amp;nbsp;부품들로&amp;nbsp;구성되어&amp;nbsp;최종적으로&amp;nbsp;조립과정을&amp;nbsp;거쳐&amp;nbsp;완성됩니다. &lt;br /&gt;&lt;br /&gt;장점 &lt;br /&gt;1.&amp;nbsp;필요한&amp;nbsp;데이터만&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;2.&amp;nbsp;유연성을&amp;nbsp;확보할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;3.&amp;nbsp;가독성을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;4.&amp;nbsp;불변성을&amp;nbsp;확보할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;700px-Builder_UML_class_diagram.svg.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmMuGx/btrE5sxaXMx/qZ1Ajm7xyOCgoUE9c2hnJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmMuGx/btrE5sxaXMx/qZ1Ajm7xyOCgoUE9c2hnJ0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmMuGx/btrE5sxaXMx/qZ1Ajm7xyOCgoUE9c2hnJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmMuGx%2FbtrE5sxaXMx%2FqZ1Ajm7xyOCgoUE9c2hnJ0%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;700&quot; height=&quot;240&quot; data-filename=&quot;700px-Builder_UML_class_diagram.svg.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code&amp;nbsp;Example&lt;/h3&gt;
&lt;pre id=&quot;code_1653371551981&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

class AirplaneProduct {
	private String type;
	private float wingspan;
	private String powerplant;
	private int crewSeats;
	private int passengerSeats;
	private String avionics;
	private String customer;

	AirplaneProduct(String customer, String type) {
		this.customer = customer;
		this.type = type;
	}

	public void setWingspan(float wingspan) {
		this.wingspan = wingspan;
	}

	public void setPowerplant(String powerplant) {
		this.powerplant = powerplant;
	}

	public void setAvionics(String avionics) {
		this.avionics = avionics;
	}

	public void setNumberSeats(int crewSeats, int passengerSeats) {
		this.crewSeats = crewSeats;
		this.passengerSeats = passengerSeats;
	}

	public String getCustomer() {
		return customer;
	}

	public String getType() {
		return type;
	}
}

abstract class AirplaneBuilder {
	protected AirplaneProduct airplane;
	protected String customer;
	protected String type;

	public AirplaneProduct getAirplane() {
		return airplane;
	}

	public void createNewAirplane() {
		airplane = new AirplaneProduct(customer, type);
	}

	public abstract void buildWings();

	public abstract void buildPowerplant();

	public abstract void buildAvionics();

	public abstract void buildSeats();
}

class CropDuster extends AirplaneBuilder {
	CropDuster(String customer) {
		super.customer = customer;
		super.type = &quot;Crop Duster v3.4&quot;;
	}

	public void buildWings() {
		airplane.setWingspan(9f);
	}

	public void buildPowerplant() {
		airplane.setPowerplant(&quot;single piston&quot;);
	}

	public void buildAvionics() {
	}

	public void buildSeats() {
		airplane.setNumberSeats(1, 1);
	}
}

class FighterJet extends AirplaneBuilder {
	FighterJet(String customer) {
		super.customer = customer;
		super.type = &quot;F-35 Lightning II&quot;;
	}

	public void buildWings() {
		airplane.setWingspan(35.0f);
	}

	public void buildPowerplant() {
		airplane.setPowerplant(&quot;dual thrust vectoring&quot;);
	}

	public void buildAvionics() {
		airplane.setAvionics(&quot;military&quot;);
	}

	public void buildSeats() {
		airplane.setNumberSeats(1, 0);
	}
}

class AerospaceEngineerDirector {
	private AirplaneBuilder airplaneBuilder;

	public void setAirplaneBuilder(AirplaneBuilder ab) {
		airplaneBuilder = ab;
	}

	public AirplaneProduct getAirplane() {
		return airplaneBuilder.getAirplane();
	}

	public void constructAirplane() {
		airplaneBuilder.createNewAirplane();
		airplaneBuilder.buildWings();
		airplaneBuilder.buildPowerplant();
		airplaneBuilder.buildAvionics();
		airplaneBuilder.buildSeats();
	}
}

public class MyBuilder {
	public static void main(String[] args) {
		AerospaceEngineerDirector aero = new AerospaceEngineerDirector();
		// instantiate each concrete builder (take orders)
		AirplaneBuilder crop = new CropDuster(&quot;Farmer Joe&quot;);
		AirplaneBuilder fighter = new FighterJet(&quot;The Navy&quot;);

		aero.setAirplaneBuilder(crop);
		aero.constructAirplane();
		AirplaneProduct completedCropDuster = aero.getAirplane();

		System.out.println(completedCropDuster.getType() + &quot; is completed and ready for delivery to &quot;
				+ completedCropDuster.getCustomer());

	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998845583&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Crop Duster v3.4 is completed and ready for delivery to Farmer Joe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Builder&amp;nbsp;pattern&amp;nbsp;is&amp;nbsp;provided&amp;nbsp;as&amp;nbsp;a&amp;nbsp;lombok&amp;nbsp;plugin,&amp;nbsp;so&amp;nbsp;it&amp;nbsp;is&amp;nbsp;easy&amp;nbsp;to&amp;nbsp;use.&lt;/p&gt;
&lt;pre id=&quot;code_1653376061768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Import lombok.builder;
...
@Builder (BuilderMethodName = &quot;Newbuilder&quot;, setterPrefix = &quot;set&quot;)
Public Class Node IMPLEETS Serializable {
...
Node.newbuilder (). Build ();
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/64</guid>
      <comments>https://camelact.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 24 May 2022 16:08:17 +0900</pubDate>
    </item>
    <item>
      <title>[ENG][디자인패턴]Bridge 패턴 이론과 설명</title>
      <link>https://camelact.tistory.com/61</link>
      <description>&lt;h3 data-id=&quot;overview&quot; data-ke-size=&quot;size23&quot;&gt;Overview&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다리,&amp;nbsp;즉&amp;nbsp;연결하는&amp;nbsp;패턴입니다. &lt;br /&gt;같은&amp;nbsp;개체에서&amp;nbsp;다른&amp;nbsp;작업을&amp;nbsp;수행해야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;원이&amp;nbsp;있고&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;정보를&amp;nbsp;추가합니다. &lt;br /&gt;수신한&amp;nbsp;색상&amp;nbsp;정보를&amp;nbsp;사용하여&amp;nbsp;다른&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;경우&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;br /&gt;&lt;br /&gt;장점 &lt;br /&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;br /&gt;추상&amp;nbsp;및&amp;nbsp;실제&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;측에&amp;nbsp;영향을&amp;nbsp;미치지&amp;nbsp;않습니다. &lt;br /&gt;&lt;br /&gt;불리 &lt;br /&gt;디자인이&amp;nbsp;복잡해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;750px-Bridge_UML_class_diagram.svg.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZvysV/btrE9RoIhT9/IvB1RDu5StZKPrA7by0Sa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZvysV/btrE9RoIhT9/IvB1RDu5StZKPrA7by0Sa0/img.png&quot; data-alt=&quot;https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A6%AC%EC%A7%80_%ED%8C%A8%ED%84%B4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZvysV/btrE9RoIhT9/IvB1RDu5StZKPrA7by0Sa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZvysV%2FbtrE9RoIhT9%2FIvB1RDu5StZKPrA7by0Sa0%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;750&quot; height=&quot;375&quot; data-filename=&quot;750px-Bridge_UML_class_diagram.svg.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A6%AC%EC%A7%80_%ED%8C%A8%ED%84%B4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Console&amp;nbsp;Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653370338554&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.design.pattern;

interface DrawAPI {
	public void drawCircle(int radius, int x, int y);
}

class RedCircle implements DrawAPI {
	@Override
	public void drawCircle(int radius, int x, int y) {
		System.out.println(&quot;Drawing Circle[ color: red, radius: &quot; + radius + &quot;, x: &quot; + x + &quot;, &quot; + y + &quot;]&quot;);
	}
}

class GreenCircle implements DrawAPI {
	@Override
	public void drawCircle(int radius, int x, int y) {
		System.out.println(&quot;Drawing Circle[ color: green, radius: &quot; + radius + &quot;, x: &quot; + x + &quot;, &quot; + y + &quot;]&quot;);
	}
}

abstract class Shape {
	protected DrawAPI drawAPI;

	protected Shape(DrawAPI drawAPI) {
		this.drawAPI = drawAPI;
	}

	public abstract void draw();
}

class Circle extends Shape {
	private int x, y, radius;

	public Circle(int x, int y, int radius, DrawAPI drawAPI) {
		super(drawAPI);
		this.x = x;
		this.y = y;
		this.radius = radius;
	}

	public void draw() {
		drawAPI.drawCircle(radius, x, y);
	}
}

class MyBridge {
	public static void main(String[] args) {
		Shape redCircle = new Circle(100, 100, 10, new RedCircle());
		Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());

		redCircle.draw();
		greenCircle.draw();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Console Result&lt;/h3&gt;
&lt;pre id=&quot;code_1653998714794&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[ color: green, radius: 10, x: 100, 100]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-id=&quot;conclusion&quot; data-ke-size=&quot;size23&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N/A&lt;/p&gt;</description>
      <category>Java Design Pattern</category>
      <category>bridge pattern</category>
      <author>CamelAct</author>
      <guid isPermaLink="true">https://camelact.tistory.com/61</guid>
      <comments>https://camelact.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 24 May 2022 14:42:10 +0900</pubDate>
    </item>
  </channel>
</rss>