<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>RDH Software's R&amp;amp;D Lab</title>
    <link>https://rdhdevelop.tistory.com/</link>
    <description>RDH Software's R&amp;amp;D Lab에 오신 것을 환영합니다.</description>
    <language>ko</language>
    <pubDate>Mon, 13 Jul 2026 14:41:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>도뇨니</managingEditor>
    <image>
      <title>RDH Software's R&amp;amp;D Lab</title>
      <url>https://tistory1.daumcdn.net/tistory/5642614/attach/a44ddddbc96141e19943b4ec90a1d54c</url>
      <link>https://rdhdevelop.tistory.com</link>
    </image>
    <item>
      <title>Logistic Regression</title>
      <link>https://rdhdevelop.tistory.com/entry/Logistic-Regression</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Logistic Regression이 필요한 이유&lt;/b&gt;&lt;/h2&gt;
&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;일반적으로 선형 회귀 문제를 해결한다하면, 수치형 특징변수 X와 연속된 숫자로 이뤄진 종속변수 Y간의 관계를 선형으로 가정하고 이를 가장 잘 표현 할 수 있는 회귀계수를 추정하는 것이라 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjGF6b/dJMcaa6xbQi/mvZ10d1Ox7wbOqkVgs5Fq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjGF6b/dJMcaa6xbQi/mvZ10d1Ox7wbOqkVgs5Fq1/img.png&quot; data-alt=&quot;일반적인 선형 회귀 문제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjGF6b/dJMcaa6xbQi/mvZ10d1Ox7wbOqkVgs5Fq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjGF6b%2FdJMcaa6xbQi%2FmvZ10d1Ox7wbOqkVgs5Fq1%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;663&quot; height=&quot;266&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반적인 선형 회귀 문제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;이진 분류 문제는 선형적이지 않다. 특징변수 X와, 0과 1로 구성된 범주형 종속변수 Y간의 관계를 추정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EYJBp/dJMcageAuix/hgtguNKqUFRZfcieTNEMw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EYJBp/dJMcageAuix/hgtguNKqUFRZfcieTNEMw0/img.png&quot; data-alt=&quot;이진 분류 문제 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EYJBp/dJMcageAuix/hgtguNKqUFRZfcieTNEMw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEYJBp%2FdJMcageAuix%2FhgtguNKqUFRZfcieTNEMw0%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;401&quot; height=&quot;307&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이진 분류 문제 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 선형회귀로 분석한다면 범주형 자료는 분석하기 어려울 것이다. 이를 해결하기 위해 Logistic Regression이 고안되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmwbqM/dJMcajh27dS/VtLvr12EkmYA5LQJXBW6uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmwbqM/dJMcajh27dS/VtLvr12EkmYA5LQJXBW6uK/img.png&quot; data-alt=&quot;선형회귀로는 범주형 자료분석이 어려움&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmwbqM/dJMcajh27dS/VtLvr12EkmYA5LQJXBW6uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmwbqM%2FdJMcajh27dS%2FVtLvr12EkmYA5LQJXBW6uK%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;408&quot; height=&quot;276&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선형회귀로는 범주형 자료분석이 어려움&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Logistic Regression 개요&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로지스틱 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로지스틱 함수(Logistic function)는 처음에는 빠르게 증가하다가 점점 증가 완만하게 증가하며 한계값에 가까워 지는 S자 모양의 함수다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ncgl/dJMcaftciDz/VYb0rBbig0ZkSVXc3DlU61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ncgl/dJMcaftciDz/VYb0rBbig0ZkSVXc3DlU61/img.png&quot; data-alt=&quot;로지스틱 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ncgl/dJMcaftciDz/VYb0rBbig0ZkSVXc3DlU61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ncgl%2FdJMcaftciDz%2FVYb0rBbig0ZkSVXc3DlU61%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;252&quot; height=&quot;279&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로지스틱 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로지스틱 함수를 사용한다면 이전에 봤던 이진 분류 문제를 해결할 수 있다. 범주형 데이터가 0인지 1인지의 확률을 분석할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byJxDC/dJMcabxygAk/QUbq2XKScuBtPcLzZNi050/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byJxDC/dJMcabxygAk/QUbq2XKScuBtPcLzZNi050/img.png&quot; data-alt=&quot;로지스틱 함수를 통한 이진 분류 문제 해결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byJxDC/dJMcabxygAk/QUbq2XKScuBtPcLzZNi050/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyJxDC%2FdJMcabxygAk%2FQUbq2XKScuBtPcLzZNi050%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;274&quot; height=&quot;232&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로지스틱 함수를 통한 이진 분류 문제 해결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;퍼셉트론&lt;/b&gt;&lt;/h2&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;1306&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AA3c5/dJMcaf7Mi1M/P3OCphiR8EO1BNPz1KKBgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AA3c5/dJMcaf7Mi1M/P3OCphiR8EO1BNPz1KKBgK/img.png&quot; data-alt=&quot;신경망 vs 퍼셉트론&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AA3c5/dJMcaf7Mi1M/P3OCphiR8EO1BNPz1KKBgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAA3c5%2FdJMcaf7Mi1M%2FP3OCphiR8EO1BNPz1KKBgK%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;626&quot; height=&quot;246&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;신경망 vs 퍼셉트론&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&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;입력층은 여러 개의 노드이다. 여기서 첫 번째 노드인 x_0 노드는 바이어스 노드로써, 항상 1이 입력된다. 바이어스 노드는 기준선을 이동시키고, 0이어도 출력 가능하기 위해 필요하다. 입력층의 i 번째 노드는 특성변수 x = (x_1, x_2, ... , x_d)^T의 요소 x_i를 담당한다.&lt;br /&gt;출력층은 한 개의 노드이며 출력층과 입력층은 가중치 w_i를 가진 에지를 통해 연결되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvhh8U/dJMcajh27Hg/onU2poB84uzMazUXBRxGq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvhh8U/dJMcajh27Hg/onU2poB84uzMazUXBRxGq0/img.png&quot; data-alt=&quot;퍼셉트론의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvhh8U/dJMcajh27Hg/onU2poB84uzMazUXBRxGq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvhh8U%2FdJMcajh27Hg%2FonU2poB84uzMazUXBRxGq0%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;236&quot; height=&quot;160&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퍼셉트론의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&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;퍼셉트론은 Net input function과 활성 함수로 구성되어 있다. Net input function은 특징값과 가중치를 곱한 결과를 모두 더한 것이다(아래 수식에서는 s이다). 퍼셉트론의 활성함수로는 계단함수를 사용한다. 활성함수의 최종 출력 y는 +1 또는 -1이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qss19/dJMcagFKMyF/XzTf8WWLDjzbc0fZTw5vZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qss19/dJMcagFKMyF/XzTf8WWLDjzbc0fZTw5vZ0/img.png&quot; data-alt=&quot;퍼셉트론의 동작 수식화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qss19/dJMcagFKMyF/XzTf8WWLDjzbc0fZTw5vZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqss19%2FdJMcagFKMyF%2FXzTf8WWLDjzbc0fZTw5vZ0%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;499&quot; height=&quot;157&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퍼셉트론의 동작 수식화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;적응선형뉴런(ALN)은 퍼셉트론의 얼마나 에러가 심한지 표현 할 수 없다는 단점을 개선한 범주형 자료분석 모델이다. 이 과정에서 퍼셉트론과는 다르게 Quantizer가 사용되었다.&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;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tXKmL/dJMcah5IWRD/AjpPQOFOGry4qQRc1PFtj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tXKmL/dJMcah5IWRD/AjpPQOFOGry4qQRc1PFtj1/img.png&quot; data-alt=&quot;적응선형뉴런과 퍼셉트론의 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tXKmL/dJMcah5IWRD/AjpPQOFOGry4qQRc1PFtj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtXKmL%2FdJMcah5IWRD%2FAjpPQOFOGry4qQRc1PFtj1%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;514&quot; height=&quot;372&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적응선형뉴런과 퍼셉트론의 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALN의 타겟 변수 y도 범주형 변수이므로 퍼셉트론과 마찬가지로 0 또는 1의 값을 가진다. x와 y 사이의 관계를 학습하는 것이 목표라는 점도 동일하다.&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;손실함수 L(w)는 정닶값 pi(z_i) 에서 예측한 값 y_i를 뺀 후 제곱한 결과를 모두 더한 값의 절반을 취하는 것이다. 이 손실함수를 최소화 하는 가중치 w를 구하는 것이 핵심이다. 손실함수를 최소화하는 가중치 w를 대입한 pi(zi)를 pi_hat(zi)로 표기할 때, pi_hat(zi) &amp;gt; h이면 y_hat &amp;nbsp;= 1, 그렇지 않으면 y_hat = 0으로 할당한다(단, h는 threshold 값이다).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVqUcJ/dJMcafGPxJH/V8kSt3JbJEIB4AnVeKhzn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVqUcJ/dJMcafGPxJH/V8kSt3JbJEIB4AnVeKhzn0/img.png&quot; data-alt=&quot;ALN의 손실함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVqUcJ/dJMcafGPxJH/V8kSt3JbJEIB4AnVeKhzn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVqUcJ%2FdJMcafGPxJH%2FV8kSt3JbJEIB4AnVeKhzn0%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;275&quot; height=&quot;40&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ALN의 손실함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Logistic Regression&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start; --darkreader-inline-color: var(--darkreader-text-c8c3bc, #c1bcb4);&quot; data-darkreader-inline-color=&quot;&quot;&gt;Logistic Regression은 ALN의 출력값 해석 문제와 분류 기준 문제를 해결한 버전이다. ALN에서 활성 함수를 사용할 때 &lt;span style=&quot;text-align: start; --darkreader-inline-color: var(--darkreader-text-c1bcb4, #bdb7ae);&quot; data-darkreader-inline-color=&quot;&quot;&gt;Logistic Regression에서는 시그모이드 활성 함수를 사용한다. 이를 통해 0과 1 둘 중 하나로만 예측할수밖에 없었던 ALN의 단점을 &quot;0일 확률 OO%&quot; 처럼 신뢰도까지 예측할 수 있게 되었다. 즉, 각 점주형 변수값을 가질 확률을 p_i를 활용한다는 것이다(p_i = P(y_i = 1 | x_i)).&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MIKxZ/dJMcacXBqrl/PI402gQmBzZJmhPKjSQ4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MIKxZ/dJMcacXBqrl/PI402gQmBzZJmhPKjSQ4Kk/img.png&quot; data-alt=&quot;Logistic Regression과 적응선형뉴런의 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MIKxZ/dJMcacXBqrl/PI402gQmBzZJmhPKjSQ4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMIKxZ%2FdJMcacXBqrl%2FPI402gQmBzZJmhPKjSQ4Kk%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;518&quot; height=&quot;349&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Logistic Regression과 적응선형뉴런의 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 요약하면 다음 표와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 48.488372%; height: 216px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;&lt;b&gt;ALN&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;&lt;b&gt;Logistic&amp;nbsp;Regression&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;실수 전체&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;0~1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;확률 해석&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;불가능&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;분류 기준&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;애매함&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;명확함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;활성화 함수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;선형함수&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;시그모이드 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;비용 함수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;MSE&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;Cross Entrophy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.604037%;&quot;&gt;&lt;b&gt;분류 문제 적합성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.547153%;&quot;&gt;낮음&lt;/td&gt;
&lt;td style=&quot;width: 40.848809%;&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, n 명의 건강검진 결과를 바탕으로 어떤 질병에 걸렸을지 확률을 계산한다고 해 보자. 이 경우,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x_i: i 번째 사람의 건강검진 결과&lt;/li&gt;
&lt;li&gt;y_i: i 번째 사람의 질병 유무&lt;/li&gt;
&lt;li&gt;p_i: i 번째 사람의 건강검진 결과를 바탕으로 추정한, i 번째 사람의 질병 확률&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Log-Odds&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형 회귀에서 예측값의 범위는 &amp;minus;&amp;infin; &amp;le;   &amp;le; &amp;infin; 이다. 그러나 확률의 범위는 0 &amp;le;   &amp;le; 1 이다. 이를 해결하기 위해 log-odds를 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Odds&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Odds란 임의의 사건 A가 발생하지 않을 확률 대비 일어날 확률의 비율이다. Odds의 범위는 0 &amp;le; Odds &amp;le; &amp;infin; 이다. 하지만 우리는 &amp;minus;&amp;infin;까지의 범위를 다뤄야 하기에 여기에 약간 변형이 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW0i2Y/dJMcaayKB6s/5fDsiLIMDbOPCSRF53Tvuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW0i2Y/dJMcaayKB6s/5fDsiLIMDbOPCSRF53Tvuk/img.png&quot; data-alt=&quot;Odds&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW0i2Y/dJMcaayKB6s/5fDsiLIMDbOPCSRF53Tvuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW0i2Y%2FdJMcaayKB6s%2F5fDsiLIMDbOPCSRF53Tvuk%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;364&quot; height=&quot;50&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Odds&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Log-Odds&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 Odds에 log를 취한 값이 Log-Odds이다. Log-Odds의 범위는 &amp;minus;&amp;infin; &amp;le; Log-Odds&amp;nbsp;&amp;le; &amp;infin; 이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bblYMb/dJMcadITl3W/6eZDRoVWPzb4JsTIf2PpX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bblYMb/dJMcadITl3W/6eZDRoVWPzb4JsTIf2PpX1/img.png&quot; data-alt=&quot;Log-Odds&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bblYMb/dJMcadITl3W/6eZDRoVWPzb4JsTIf2PpX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbblYMb%2FdJMcadITl3W%2F6eZDRoVWPzb4JsTIf2PpX1%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;385&quot; height=&quot;48&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Log-Odds&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Log-Odds는 선형회귀의 대상으로 활용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tcdth/dJMcaarY1AT/wmvBBfzy3qnkM11wBumZh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tcdth/dJMcaarY1AT/wmvBBfzy3qnkM11wBumZh1/img.png&quot; data-alt=&quot;Log-Odds를 활용한 활성함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tcdth/dJMcaarY1AT/wmvBBfzy3qnkM11wBumZh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTcdth%2FdJMcaarY1AT%2FwmvBBfzy3qnkM11wBumZh1%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;409&quot; height=&quot;48&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Log-Odds를 활용한 활성함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, logistic regression의 경우  ( ) = 1 / {1+ ^(&lt;span&gt;&amp;minus; )} 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;w의 추정 및 분류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Logistic regression은 손실함수로 음의 로그우도함수를 사용한다. 주어진 &lt;span&gt;&amp;nbsp;&lt;/span&gt; _&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;들에 대해서  _&lt;span&gt; 가 모두 독립이라고 가정하자. 그럴 경우,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbyttd/dJMcadoBCFg/HgMRlR5joYwHSYCRcx2TZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbyttd/dJMcadoBCFg/HgMRlR5joYwHSYCRcx2TZ0/img.png&quot; data-alt=&quot;w의 추정 및 분류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbyttd/dJMcadoBCFg/HgMRlR5joYwHSYCRcx2TZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbyttd%2FdJMcadoBCFg%2FHgMRlR5joYwHSYCRcx2TZ0%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;512&quot; height=&quot;175&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;w의 추정 및 분류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Logistic regression의 실전 활용&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;972&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQlsif/dJMcaaZMBb3/DIBGmRLH6xItOnnmcLwUAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQlsif/dJMcaaZMBb3/DIBGmRLH6xItOnnmcLwUAk/img.png&quot; data-alt=&quot;Step1. 전체 데이터 셋&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQlsif/dJMcaaZMBb3/DIBGmRLH6xItOnnmcLwUAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQlsif%2FdJMcaaZMBb3%2FDIBGmRLH6xItOnnmcLwUAk%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;406&quot; height=&quot;318&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Step1. 전체 데이터 셋&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGE0L9/dJMcajh6Sln/r0XcyxS85Wc0myEaQ2oAB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGE0L9/dJMcajh6Sln/r0XcyxS85Wc0myEaQ2oAB1/img.png&quot; data-alt=&quot;Step2. w값 최적화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGE0L9/dJMcajh6Sln/r0XcyxS85Wc0myEaQ2oAB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGE0L9%2FdJMcajh6Sln%2Fr0XcyxS85Wc0myEaQ2oAB1%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;408&quot; height=&quot;310&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Step2. w값 최적화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMGAt/dJMcaiDwBQb/qMvLWagh25zGkIMuDqy7P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMGAt/dJMcaiDwBQb/qMvLWagh25zGkIMuDqy7P1/img.png&quot; data-alt=&quot;Step3. 분류 예측&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMGAt/dJMcaiDwBQb/qMvLWagh25zGkIMuDqy7P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMGAt%2FdJMcaiDwBQb%2FqMvLWagh25zGkIMuDqy7P1%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;382&quot; height=&quot;310&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Step3. 분류 예측&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;범주가 3개 이상일 경우&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범주가 3개 이상일 경우 손실함수로 Cross entropy를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t6k3E/dJMcafGPzLQ/ko6Be4fRK0ikYcoaMhX9k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t6k3E/dJMcafGPzLQ/ko6Be4fRK0ikYcoaMhX9k1/img.png&quot; data-alt=&quot;범주가 3개 이상일 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t6k3E/dJMcafGPzLQ/ko6Be4fRK0ikYcoaMhX9k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft6k3E%2FdJMcafGPzLQ%2Fko6Be4fRK0ikYcoaMhX9k1%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;458&quot; height=&quot;309&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;범주가 3개 이상일 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Machine Learning</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/49</guid>
      <comments>https://rdhdevelop.tistory.com/entry/Logistic-Regression#entry49comment</comments>
      <pubDate>Mon, 1 Jun 2026 11:31:51 +0900</pubDate>
    </item>
    <item>
      <title>사전과정과 최적화</title>
      <link>https://rdhdevelop.tistory.com/entry/%EC%82%AC%EC%A0%84%EA%B3%BC%EC%A0%95%EA%B3%BC-%EC%B5%9C%EC%A0%81%ED%99%94</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실수 자료로의 전환(Vectorization)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범주형 자료, 텍스트 자료, 이미지 자료 등을 실수로 구성된 &lt;b&gt;[n_sample, n_features]의 형태로 전환, 새로운 특성변수의 생성, 결측 자료의 대체&lt;/b&gt;는 머신러닝 알고리즘 적용을 위한 필수적인 사전과정이며 이를 vectorization이라고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;연속형 자료(continuous data)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실수 자료로의 전환이 필요 없다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 학생 1명의 데이터가 &quot;나이 = 23&quot;, &quot;키 = 175.3&quot;, &quot;몸무게 = 68.2&quot; 라면 이 자체가 이미 [23, 175.3, 68.2] 같은 벡터가 된다.&lt;br /&gt;즉, 연속형 변수는 그냥 모아놓기만 해도 벡터가 되기 때문이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;범주형 자료(categorical data)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범주형 자료는 다음과 같이 &lt;b&gt;카테고리화 되어있는 자료&lt;/b&gt;를 의미한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;색상: 빨강, 파랑, 초록&lt;/li&gt;
&lt;li&gt;도시: 서울, 부산, 인천&lt;/li&gt;
&lt;/ul&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;id 부여 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로, 각각의 도시에 임의로 실수 id를 다음과 같이 부여했다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 17.674419%; height: 125px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;도시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Seoul&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Dubai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;LA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우, 자료를 실수 형태로 전환하긴 했지만 문제가 발생한다. 범주는 도시이므로 크기나 순서 개념이 없지만, 모델은 2가 1보다 크고 3보다 작다고 해석할 수 있기 때문이다. 이를 방지하기 위해 원-핫 인코딩(One-hot Encoding) 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원-핫 인코딩(One-hot Encoding)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원-핫 인코딩은 범주형 자료를&amp;nbsp;&lt;b&gt;해당 범주면 1, 나머지이면 0인 벡터&lt;/b&gt;로 바꾸는 방법이다. 원-핫 인코딩은&amp;nbsp;&lt;b&gt;범주 집합의 크기를 벡터의 차원&lt;/b&gt;으로 한다. 즉, 범주의 개수가 k개라면, 길이가 k인 벡터를 만든다.&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;table style=&quot;border-collapse: collapse; width: 33.255814%; height: 127px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;City1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;City2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;City3&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Seoul: &lt;b&gt;Citiy1&lt;/b&gt;; [1, 0, 0]&lt;/li&gt;
&lt;li&gt;Dubai:&amp;nbsp;&lt;b&gt;City2&lt;/b&gt;; [0, 1, 0]&lt;/li&gt;
&lt;li&gt;LA:&amp;nbsp;&lt;b&gt;City3&lt;/b&gt;; [0, 0, 1]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원-핫 인코딩을 사용하게 된다면 &lt;b&gt;단순하고 직관적&lt;/b&gt;으로 &lt;b&gt;범주 사에이 없는 순서 정보를 넣지 않고&lt;/b&gt;, 모델이&amp;nbsp;&lt;b&gt;범주형 데이터를 숫자 형태로 처리&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 다음과 같은 단점도 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;범주의 개수가 늘어날수록, 벡터의 차원이 증가&lt;/b&gt;한다. 예를 들어, 범주의 개수가 1000개라면 길이 1000짜리 벡터가 필요하다. 게다가 이 벡터는 대부분이 0이고 단 한 칸만 1이라서 비효율적인 저장곤간을 가진다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;범주의 유사도를 표현하지 못&lt;/b&gt;한다. 예를 들어, 강아지와 늑대가 서로 비슷하고, 고양이와 호랑이가 서로 비슷하더라도 원-핫 인코딩에서는 이들은 서로 다른 벡터일 뿐이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;텍스트 자료(text data)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 자료란 글자, 단어, 문장처럼 문자로 이뤄진 데이터이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뉴스 기사&lt;/li&gt;
&lt;li&gt;이메일&lt;/li&gt;
&lt;li&gt;노래 가사&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Bags of Words(BoW)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문장에서 단어가 몇 번 나왔는지만 세어서 문장을 숫자 벡터&lt;/b&gt;로 바꾸는 방법이다. 즉,&amp;nbsp;&lt;b&gt;단어 출현 횟수 기반의 자료 표현&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoW는 통상적으로 다음의 순서로 생성된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;여러 문장에서 등장하는 단어들을 모아 단어 사전을 만든다.&lt;/li&gt;
&lt;li&gt;각 문장마다 사전에 있는 단어가 몇 번 등장했는지 센다.&lt;/li&gt;
&lt;li&gt;그 개수를 벡터로 표현한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 아래 두 문장을 변환해보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장1: &lt;b&gt;나는 사과를 먹었다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;문장2: &lt;b&gt;나는 바나나를 먹었다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 문장에서 사전을 만들면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[나는, 사과를, 바나나를, 먹었다]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 각 문장은 다음처럼 벡터화 할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장1:&amp;nbsp;&lt;b&gt;[1, 1, 0, 1]&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;문장2:&amp;nbsp;&lt;b&gt;[1, 0, 1, 1]&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 42.093023%; height: 107px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&lt;b&gt;나는&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&lt;b&gt;사과를&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&lt;b&gt;바나나를&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;&lt;b&gt;먹었다&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 BoW는&amp;nbsp;&lt;b&gt;단순한 구조&lt;/b&gt;로&amp;nbsp;&lt;b&gt;구현하기 쉽고&lt;/b&gt;,&amp;nbsp;&lt;b&gt;텍스트를 빠르게 숫자 벡터로 변환&amp;nbsp;&lt;/b&gt;할 수 있다. 다만,&amp;nbsp;&lt;b&gt;단어 순서를 반영하지 못하고&lt;/b&gt;,&amp;nbsp;&lt;b&gt;단어 종류가 많아지면 벡터 차원이 매우 커진다&lt;/b&gt;는 단점이 있다. 또한 대부분의 칸이 0인 &lt;b&gt;희소 벡터가 되기 쉽다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;*희소 표현&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희소 표현이란 &lt;b&gt;벡터나 행렬의 값 대부분이 0인 표현 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 단어장에 단어가 5개 들어있다고 하면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서울: [0, 1, 0, 0, 0]&lt;/li&gt;
&lt;li&gt;부산: [0, 0, 1, 0 ,0]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 각 벡터의 길이는 길지만 실제로 의미 있는 값은 1개뿐이다. 나머지는 전부 0이다. 이런 형태가 희소 표현이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희소 표현의 경우 &lt;b&gt;차원이 너무 커질 수 있다는 한계&lt;/b&gt;가 있다. 단어가 10,000개면 벡터 길이도 10,000이 되어야 하는데다가, 대부분의 칸이 0이라서 비효율적인 공간을 차지한다. 또한, &lt;b&gt;유사성을 표시 못한다는 단점&lt;/b&gt;이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;*밀집 표현&lt;/b&gt;&lt;/h4&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;예를 들면, 10,000개의 단어가 있는 단어장에서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원-핫 인코딩(희소 표현): 서울 = [ 0 0 0 0 0 0 1 0 0 0 0 ... 0 ] (10,000 차원)&lt;/li&gt;
&lt;li&gt;밀집표현: 서울 = [0.2 1.8 1.1 -2.1 ... ] (128 차원)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;밀집 표현의 경우&amp;nbsp;&lt;b&gt;차원을 줄일 수 있다&lt;/b&gt;는 장점이 있다. 10,000개의 단어가 있어도 128차원, 300차원 처럼 더 적은 크기로 표현할 수 있다. 그리고&amp;nbsp;&lt;b&gt;단어간 유사성을 표현&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희소 표현과 밀집 표현을 비교하면 다음 표와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 59.30396%; height: 181px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.167548%;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.33157%; text-align: center;&quot;&gt;&lt;b&gt;희소 표현&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.279376%; text-align: center;&quot;&gt;&lt;b&gt;밀집 표현&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.167548%;&quot;&gt;&lt;b&gt;차원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.33157%;&quot;&gt;고차원&lt;/td&gt;
&lt;td style=&quot;width: 38.279376%;&quot;&gt;저차원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.167548%;&quot;&gt;&lt;b&gt;값의 형태&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.33157%;&quot;&gt;주로 0과 1&lt;/td&gt;
&lt;td style=&quot;width: 38.279376%;&quot;&gt;실수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.167548%;&quot;&gt;&lt;b&gt;표현 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.33157%;&quot;&gt;수동적으로 만들기 쉬움&lt;/td&gt;
&lt;td style=&quot;width: 38.279376%;&quot;&gt;데이터로부터 학습&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.167548%;&quot;&gt;&lt;b&gt;의미 표현&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.33157%;&quot;&gt;약한 유사성 표현&lt;/td&gt;
&lt;td style=&quot;width: 38.279376%;&quot;&gt;유리한 유사성 표현&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;워드 임베딩(Word Embedding)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단어를 밀집 벡터로 표현&lt;/b&gt;하는 방식이다. 이 결과로 얻어지는 벡터를&amp;nbsp;&lt;b&gt;임베팅 벡터(embedding vector)&lt;/b&gt;라고 한다. LSA, Word2Vec, FastText, Glove 등 다양한 워드 임베잉 방법론이 존재한다.&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;예를 들어, 단어장에 10,000개의 단어가 있고 이를 원-핫 인코딩으로 표현하면 다음과 같다고 하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서울 = [ 0 0 0 0 0 0 1 0 0 0 0 ... 0 ] (10,000 차원)&lt;/li&gt;
&lt;li&gt;부산 = [ 0 0 0 0 1 0 0 0 0 0 0 ... 0 ] (10,000 차원)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 실수를 사용해 128차원으로 표현한 임베딩 벡터는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서울 = [0.2 1.8 1.1 -2.1 ... ] (128 차원)&lt;/li&gt;
&lt;li&gt;부산 = [1.4 9.3 -2.5 1.1 ... ] (128 차원)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼, 단어를 &lt;b&gt;작은 차원의 실수 벡터로 압축해서 표현&lt;/b&gt;하는 것이 워드 임베딩이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워드 임베딩의 장점은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;차원 감소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대부분의 값이 0이 아니라 실수값으로 채워진 밀집 표현&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단어 간 유사성 반영 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;자료의 표준화 / 정규화&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료간 scale이 다를 경우 이를 맞춰주기 위해 표준화와 정규화를 수행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;표준화(standardization)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 &lt;b&gt;평균을 0, 표준편차를 1&lt;/b&gt;로 만드는 스케일링 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식은 다음과 같다. 원래 값에서 평균(mean)을 빼고 표준편차(stddev)로 나누면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxF1v/dJMcajaLPXl/pFlL5ztSnPHavDlTHTwdHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxF1v/dJMcajaLPXl/pFlL5ztSnPHavDlTHTwdHK/img.png&quot; data-alt=&quot;표준화 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxF1v/dJMcajaLPXl/pFlL5ztSnPHavDlTHTwdHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrxF1v%2FdJMcajaLPXl%2FpFlL5ztSnPHavDlTHTwdHK%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;244&quot; height=&quot;65&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;표준화 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 표준화를 사용할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝에서는 변수마다 값의 크기 범위가 다를 수 있다. 예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키: 170, 180&lt;/li&gt;
&lt;li&gt;연봉: 3000, 5000&lt;/li&gt;
&lt;li&gt;시험점수: 40, 80&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 어떤 변수는 수십, 어떤 변수는 수천 단위일 수 있다. 표준화를 할 경우&amp;nbsp;&lt;b&gt;서로 다른 변수들을 비슷한 기준에서 비교&lt;/b&gt;하고 학습할 수 있게 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정규화(normalization)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터가 [0, 1] 사이에 존재&lt;/b&gt;하도록 만드는 스케일링 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식은 다음과 같다. 현재 값에서 최소값을 빼고 이를 최대값과 최소값의 차로 나눠주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXIEeo/dJMcacbGuHE/UDfOf1xM79RrMrpVRNIcik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXIEeo/dJMcacbGuHE/UDfOf1xM79RrMrpVRNIcik/img.png&quot; data-alt=&quot;정규화 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXIEeo/dJMcacbGuHE/UDfOf1xM79RrMrpVRNIcik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXIEeo%2FdJMcacbGuHE%2FUDfOf1xM79RrMrpVRNIcik%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;287&quot; height=&quot;71&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정규화 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 가장 큰 값은 1, 가장 작은 값은 0이 된다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[10, 20, 30]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 최소값은 10, 최대값은 30이다. 정규화 결과는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10: (10 - 10) / (30 - 10) = &lt;b&gt;0&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;20: (20 - 10) / (30 - 10) = &lt;b&gt;0.5&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;30: (30 - 10) / (30 - 10) = &amp;nbsp;&lt;b&gt;1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규화는 최소값과 최대값에 의존하기에 데이터 안에 &lt;b&gt;극단적으로 큰 값이나 작은 값이 있으면 데이터가 몰릴 수 있다&lt;/b&gt;는 단점이 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;표준화 vs 정규화&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uiKmv/dJMcafM2Xe3/5Zu7jH2Y3TeNOLdLMk5eXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uiKmv/dJMcafM2Xe3/5Zu7jH2Y3TeNOLdLMk5eXK/img.png&quot; data-alt=&quot;표준화(빨강)와 정규화(파랑)의 수행 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uiKmv/dJMcafM2Xe3/5Zu7jH2Y3TeNOLdLMk5eXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuiKmv%2FdJMcafM2Xe3%2F5Zu7jH2Y3TeNOLdLMk5eXK%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;499&quot; height=&quot;358&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;표준화(빨강)와 정규화(파랑)의 수행 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bell-shape(정규분포와 유사한 분포)이거나 이상치가 있는 경우에는 표준화가 더 적절할 수 있으며, 이상치가 있는 경우 이상치를 삭제한 후 정규화를 진행하는 것이 통상적이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;선형적으로 다룰 수 없는 데이터들을 가지고 있는 특성 변수를 활용해서 새로운 특성변수 생성해 추가한다면 선형적으로 다룰 수 있다. 데이터가 단순 직선 관계가 아니라면, 원래 변수 x만 쓰지 말고 x^2, x^3 같은 항도 추가해서 모델의 fitting을 더 높일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 자료는 선형관계가 아니기에 단순히 &lt;b&gt;y = b_0 + b_1 * x&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;572&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sUP0F/dJMcacCLQL7/GkZoWOSuBwRGIwW6KAkM9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sUP0F/dJMcacCLQL7/GkZoWOSuBwRGIwW6KAkM9K/img.png&quot; data-alt=&quot;선형 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sUP0F/dJMcacCLQL7/GkZoWOSuBwRGIwW6KAkM9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsUP0F%2FdJMcacCLQL7%2FGkZoWOSuBwRGIwW6KAkM9K%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;386&quot; height=&quot;387&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선형 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에  ^&lt;span&gt;2&lt;/span&gt;,  ^&lt;span&gt;3&lt;/span&gt;, &amp;hellip;등을 특성변수로 추가하여보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uq3dl/dJMcaiCW9JK/zeRw1jQ1v4RTddG0kGLk6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uq3dl/dJMcaiCW9JK/zeRw1jQ1v4RTddG0kGLk6K/img.png&quot; data-alt=&quot;다항식 모델&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uq3dl/dJMcaiCW9JK/zeRw1jQ1v4RTddG0kGLk6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuq3dl%2FdJMcaiCW9JK%2FzeRw1jQ1v4RTddG0kGLk6K%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;325&quot; height=&quot;426&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다항식 모델&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 특성변수(x^2)를 추가함으로써 비선형 관계도 선형모형 안에서 더 잘 표현할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 원래 데이터만 그대로 쓰는 것이 아니라 &lt;b&gt;새 특성을 만들어 성능을 높일&lt;/b&gt; 수 있는데, 비선형 관계를 직접 비선형 모델로 바꾸지 않고 새로운 &lt;b&gt;특성변수 항을 추가하면 선형모델도 어느정도 다룰 수 있다&lt;/b&gt;는 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결측 자료 대체(imputation)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결측 자료 대체의 핵심은 &lt;b&gt;비어 있는 값을 다른 값으로 채워 넣는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결측 자료&lt;/b&gt;란 말 그디로&amp;nbsp;&lt;b&gt;데이터가 비어 있는 경우&lt;/b&gt;이다. 결측치가 있으면 일부 기계학습 라이브러리(scikit-learn 등)은 데이터를 그대로 처리하지 못한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBG8JG/dJMcafzuLzz/2Y9f5kX4PqjARbrJZyMKb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBG8JG/dJMcafzuLzz/2Y9f5kX4PqjARbrJZyMKb1/img.png&quot; data-alt=&quot;결측 자료의 대체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBG8JG/dJMcafzuLzz/2Y9f5kX4PqjARbrJZyMKb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBG8JG%2FdJMcafzuLzz%2F2Y9f5kX4PqjARbrJZyMKb1%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;504&quot; height=&quot;252&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결측 자료의 대체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결측 자료가 있을 경우 크게 다음 두 가지 문제가 생긴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모델 학습 과정에서 오류가 생길 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해당 행을 무조건 지워버리면 데이터가 너무 줄어들 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 비어 있는 값을 적절한 값으로 채워 넣는 imputation을 사용하는데 대표적인 방법으로는 다음 3가지가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;평균&lt;/b&gt;: 해당 열의 평균값으로 빈칸을 채우는 방법이다. 연속형 자료에서 자주 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;중위수&lt;/b&gt;: &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;값들을 크기순으로 정렬했을 때 가운데 값으로 채운다. 범주형 자료에서 자주 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;최빈수&lt;/b&gt;: &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;가장 자주 등장한 값들로 채운다. 범주형 자료에서 자주 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;손실함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손실 함수란&amp;nbsp;&lt;b&gt;모델의 예측이 실제값과 얼마나 틀렸는지 평가하는 함수&lt;/b&gt;이다. 손실함수의 값이 작아질수록 예측 모델이 명확해진다고 말할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 모델은 처음부터 잘 맞추지 못한다. 그래서 현재 예측이 얼마나 틀렸는지 측정해야 그 틀림을 줄여가는 방향으로 가중치나 파라미터를 수정할 수 있다. 즉, &lt;b&gt;손실함수가 작아지는 방향으로 모델을 갱신&lt;/b&gt;하는 것이다. 이 과정에서 &lt;b&gt;최적화&lt;/b&gt;라는 방법이 사용된다.&lt;/p&gt;
&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;회귀란&amp;nbsp;&lt;b&gt;입력값을 보고 어떤 수치를 예측하는 것&lt;/b&gt;이다. 예를 들면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;집 크기를 보고 집값 예측&lt;/li&gt;
&lt;li&gt;공부 시간을 보고 시험 점수 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제들은 결과가 {0 또는 1}, {고양이 또는 강아지} 같은 범주가 아니라 {4억 2천만원}, {83.5점} 같이&amp;nbsp;&lt;b&gt;연속적인 숫자&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회귀에서의 손실함수는 예측값이 실제값과 얼마나 차이났는지를 확인한다. 이 과정에서 &lt;b&gt;평균제곱오차(MSE)&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;376&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crwsTh/dJMcadVVjmS/KSHKpn1wjPZH5u43riItz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crwsTh/dJMcadVVjmS/KSHKpn1wjPZH5u43riItz0/img.png&quot; data-alt=&quot;평균제곱오차 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crwsTh/dJMcadVVjmS/KSHKpn1wjPZH5u43riItz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrwsTh%2FdJMcadVVjmS%2FKSHKpn1wjPZH5u43riItz0%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;242&quot; height=&quot;81&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;평균제곱오차 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;y_i&lt;/b&gt;: 목적변수 y의 i번째 관측치(진짜 정답)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;y^{hat}_i&lt;/b&gt;: 대응되는 추정치(모델이 도출한 정답)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n&lt;/b&gt;: 배치 또는 총 표본의 크기&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;음수와 양수를 모두 양수로 만들기 위해서다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;큰 오차에겐 더 큰 패널티를 부여하기 위해서다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;손실함수 MSE를 최소화&lt;/b&gt;한다는 것은 &lt;b&gt;관측치 y_i에 추정치 y^{hat}_i가 가까워지게 만드는 것&lt;/b&gt;이다. 다시말해, 주어진 입력 x에 대해 실제 y와 가장 가까운 예측을 하도록 가중치를 찾는 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;b&gt;어느 범주에 속하는지 구분하는 것&lt;/b&gt;이다. 예를 들면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사진이 고양이인지 강아지인지&lt;/li&gt;
&lt;li&gt;이메일이 스팸인지 아닌지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제들의 출력은 숫자 자체가 아니라 &lt;b&gt;어느 범주인가&lt;/b&gt;({고양이 혹은 강아지}, {0 또는 1})이다.&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;분류 모델은 각 범주에 속할 확률(고양이일 확률 70%, 강아지일 확률 30% =&amp;gt; 고양이로 판단)을 출력한다. 이 과정에서&amp;nbsp;&lt;b&gt;Categorical cross entropy&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;464&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s5EnE/dJMcadVVjCy/50uFnYlGCgO5GkzbTHp0B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s5EnE/dJMcadVVjCy/50uFnYlGCgO5GkzbTHp0B0/img.png&quot; data-alt=&quot;Categorical cross entropy 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s5EnE/dJMcadVVjCy/50uFnYlGCgO5GkzbTHp0B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs5EnE%2FdJMcadVVjCy%2F50uFnYlGCgO5GkzbTHp0B0%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;101&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Categorical cross entropy 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;y_ik&lt;/b&gt;: i번째 관측치가 k번째 범주인지 여부&lt;/li&gt;
&lt;li&gt;&lt;b&gt;q_i(k)&lt;/b&gt;: i번째 관측치가 k번째 범주에 속할 확률 &lt;b&gt;추정치&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;c&lt;/b&gt;: 총 범주 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Categorical corss entropy의 핵심은&amp;nbsp;&lt;b&gt;정답 클래스에 높은 확률을 줄수록 손실이 작아진다&lt;/b&gt;라는 것이다. 손&lt;b&gt;실 함수가 작아진다는 것은 y_i의 범주를 더 잘 추정한다&lt;/b&gt;는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음 3개의 범주를 원-핫 벡터로 나타냈다고 하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;범주 1&lt;/b&gt;: y_i = (1, 0, 0)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;범주 2&lt;/b&gt;: y_i = (0, 1, 0)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;범주 3&lt;/b&gt;: y_i = (0, 0, 1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 i가 범주 2에 속한다면 &lt;b&gt;CE_i = -(0 * log(q_i(1)) + 1 * log(q_i(2)) + 0 * log(q_i(3)) = -log(q_i)&lt;/b&gt;이고 이는&amp;nbsp;&lt;b&gt;q_i(2) = 1&lt;/b&gt;일때 가장 작은 손실함수를 가진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;범주가 두 개일 경우의 손실함수는 Binary corss entropy를 주로 사용하며, 그 식은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K41ZB/dJMcajogB32/YDEZMjGFrT504T2e5a2RvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K41ZB/dJMcajogB32/YDEZMjGFrT504T2e5a2RvK/img.png&quot; data-alt=&quot;Binary cross entropy&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K41ZB/dJMcajogB32/YDEZMjGFrT504T2e5a2RvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK41ZB%2FdJMcajogB32%2FYDEZMjGFrT504T2e5a2RvK%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;511&quot; height=&quot;76&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Binary cross entropy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Binary cross entrophy는 categorical cross entrophy의 특수한 경우이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;머신러닝에서 사용하는 손실함수는 통계적으로 의미 있다. 회귀의 MSE와 분류의 Cross Entrophy는 최대 우도법과 연결된다. 즉, 손실 함수를 줄인다는 것은 단순히 오차를 줄이는 것뿐만 아니라, &lt;b&gt;관측된 데이터를 가장 그럴듯하게 설명하는 파라미터를 찾는 것(최대우도법)&lt;/b&gt;과 같다는 의미이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;회귀문제의 경우&lt;/b&gt;&lt;/h4&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;472&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brT6Yp/dJMcaadSQt9/DzwDvljF5QlWkkgSa5B0Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brT6Yp/dJMcaadSQt9/DzwDvljF5QlWkkgSa5B0Xk/img.png&quot; data-alt=&quot;회귀문제의 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brT6Yp/dJMcaadSQt9/DzwDvljF5QlWkkgSa5B0Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrT6Yp%2FdJMcaadSQt9%2FDzwDvljF5QlWkkgSa5B0Xk%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;472&quot; height=&quot;46&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;회귀문제의 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;y_i&lt;/b&gt;: 실제값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;h(x_i; w)&lt;/b&gt;: 모델이 예측한 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt; _i&lt;/b&gt;: 오차항&lt;/li&gt;
&lt;li&gt;오차항은 &lt;b&gt;평균이 0&lt;/b&gt;이고 &lt;b&gt;분산이 &amp;sigma;^2&lt;/b&gt;인 정규분포를 따른다고 가정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 말은 즉슨 다음과 같다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;실제값 = 모델의 예측값 + 랜덤한 오차&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; 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;1008&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfZl0J/dJMcaf7iDRZ/rf9EfwbnN7Xlv7towsE6F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfZl0J/dJMcaf7iDRZ/rf9EfwbnN7Xlv7towsE6F0/img.png&quot; data-alt=&quot;우도함수와 로그우도함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfZl0J/dJMcaf7iDRZ/rf9EfwbnN7Xlv7towsE6F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfZl0J%2FdJMcaf7iDRZ%2Frf9EfwbnN7Xlv7towsE6F0%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;276&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우도함수와 로그우도함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그우도를 최대화 하는 가중치 w는 다음과 같이 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYci33/dJMcafTNaJP/hRAxdjPOIFMBdIWcJFj6Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYci33/dJMcafTNaJP/hRAxdjPOIFMBdIWcJFj6Hk/img.png&quot; data-alt=&quot;로그우도를 최대화하는 가중치  를 찾음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYci33/dJMcafTNaJP/hRAxdjPOIFMBdIWcJFj6Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYci33%2FdJMcafTNaJP%2FhRAxdjPOIFMBdIWcJFj6Hk%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;387&quot; height=&quot;73&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그우도를 최대화하는 가중치  를 찾음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 아래 식을 최소화 하는 것과 동일하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2iB44/dJMcacCLSHE/ztmfeZiEvYdcQ4lRr7tesk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2iB44/dJMcacCLSHE/ztmfeZiEvYdcQ4lRr7tesk/img.png&quot; data-alt=&quot;MSE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2iB44/dJMcacCLSHE/ztmfeZiEvYdcQ4lRr7tesk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2iB44%2FdJMcacCLSHE%2FztmfeZiEvYdcQ4lRr7tesk%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;312&quot; height=&quot;60&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MSE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;결론적으로 &lt;/span&gt;&lt;b&gt;로그 우도를 최대화 하는 것이 MSE(아래 식)를 최소화 하는 것&lt;/b&gt;과 같다. 손실함수 MSE를 최소화 하도록 가중치를 구하는 것은 오차항이 정규분포일때 최대 우도법으로 가중치를 추정하는 것과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 회귀(단, 오차항은 정규분포)에서는 &lt;b&gt;최대우도 추정은 MSE 최소화와 같다&lt;/b&gt;.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;분류문제의 경우&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다항분포(multinomial distribution)을 갖는 확률 변수 y가 있다. 확률 변수 y는 다음을 따른다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i 번째 관측치가 범주 k에 속하면 &lt;b&gt;y_ik = 1,&lt;/b&gt; 속하지 않으면 &lt;b&gt;y_ik = 0&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P(y_ik = 1) = q_i(k)&lt;/b&gt; &amp;lt;- q_ik는 i 번째 데이터가 k 번째 범주에 속할 확률 추정치&lt;/li&gt;
&lt;li&gt;i 번째 관측치가 범주 k로 관측될 확률은 로그최대우도법에 의거 다음 식과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnHQP/dJMcah486tZ/xrisoHJBqwS7g3H2mtBpvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnHQP/dJMcah486tZ/xrisoHJBqwS7g3H2mtBpvK/img.png&quot; data-alt=&quot;최대우도법에 의거하여 도출된 식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnHQP/dJMcah486tZ/xrisoHJBqwS7g3H2mtBpvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnHQP%2FdJMcah486tZ%2FxrisoHJBqwS7g3H2mtBpvK%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;502&quot; height=&quot;216&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최대우도법에 의거하여 도출된 식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 식은 &lt;b&gt;Cross entropy 함수의 음의 값과 같다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;로그우도를 최대화 하는 것은 Cross entropy를 최소화 하는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;최적화&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적화는 &lt;b&gt;손실함수를 가장 작게 만드는 가중치를 찾는 과정&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델은 다음 과정을 반복하며 성능을 높여간다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최초, 임의의 가중치로 시작&lt;/li&gt;
&lt;li&gt;현재 예측이 얼마나 틀렸는지 &lt;b&gt;손실함수로 계산&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;손실이 더 작아지는 방향으로 &lt;b&gt;가중치 수정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;다시 예측&lt;/li&gt;
&lt;li&gt;다시 손실 계산&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 일반화하면 머신러닝에서의 학습 과정은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;예측치와 실제치의 거리를 평가하는 손실함수(loss function)을 도입하여&lt;/li&gt;
&lt;li&gt;통계학에서와 마찬가지로 평균 제곱 오차(mean squared error) 또는 음의 로그 우도 함수와 같은 손실함수를 이용하여&lt;/li&gt;
&lt;li&gt;&lt;b&gt;손실함수를 최소화 하는 가중치를 찾는 과정&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;배치 경사하강법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 데이터&lt;/b&gt;를 사용해서 손실함수의 기울기를 계산한 뒤 가중치를 한 번 갱신하는 방법이다. 예를 들어, 1,000개의 데이터가 있으면 1,000개 전체를 다 본뒤 한 번 업데이트 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 경사하강법은&lt;b&gt; 안정적인 기울기 계산법&lt;/b&gt;을 활용한다. 매번 전체 데이터를 다 써야 해서 &lt;b&gt;계산량이 크며 시간이 오래&lt;/b&gt;걸린다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;확률적 (스토캐스틱) 경사하강법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 1개&lt;/b&gt;만 사용해서 손실을 계산하고 가중치를 갱신하는 방법이다. 예를 들어, 1,000개의 데이터가 있으면 한 개를 보고 업데이트, 또 다른 한 개를 보고 업데이트를 반복하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확률적 (스토캐스틱) 경사하강법은 가벼운 계산을 통해 &lt;b&gt;매우 빠르게&lt;/b&gt; 자주 업데이트 할 수 있지만, &lt;b&gt;수렴이 잘 되지 않을&lt;/b&gt; 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;미니배치 경사하강법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 데이터 중 일부 묶음&lt;/b&gt;을 사용해서 기울기를 계산하고 갱신하는 방법이다. 확률적 기울기 하강법의 단점을 보완하였으며 총 n개의 자료에서 p개의 관측치를 이용하여 최신화 한다. 예를 들어, 1,000개의 데이터가 있고, 배치 크기가 32라고 하면 32개를 한 묶음으로 보고 업데이트 하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미니배치 경사하강법은 &lt;b&gt;확률적 경사하강법보다 더 안정적&lt;/b&gt;이며, 계산 효율과 안정성 사이에서 균형이 좋다.&lt;/p&gt;</description>
      <category>Machine Learning</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/48</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EC%82%AC%EC%A0%84%EA%B3%BC%EC%A0%95%EA%B3%BC-%EC%B5%9C%EC%A0%81%ED%99%94#entry48comment</comments>
      <pubDate>Wed, 15 Apr 2026 01:44:44 +0900</pubDate>
    </item>
    <item>
      <title>파이썬과 머신러닝</title>
      <link>https://rdhdevelop.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EA%B3%BC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;왜 파이썬인가&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;쉬운 문법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 비교적 문법이 간단하다. 즉, &lt;b&gt;문법 자체에 신경을 덜 쓰고 문제 해결에 더 집중&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;높은 생산성&lt;/b&gt;&lt;/h4&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발 속도가 빠르고&lt;/li&gt;
&lt;li&gt;실험을 하기 좋고&lt;/li&gt;
&lt;li&gt;수정과 디버깅도 비교적 편하다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공학/과학을 위한 기능 및 라이브러리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 과학 계산용 생태계가 매우 강하다. 대표적으로 다음의 라이브러리가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;NumPy&lt;/b&gt;: 벡터, 행렬, 수치 계산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SciPy&lt;/b&gt;: 과학 계산, 최적화, 통계&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pandas&lt;/b&gt;: 표 형태 데이터 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Matplotlib&lt;/b&gt;: 시각화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SymPy&lt;/b&gt;: 기호 수학&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기계학습 관련 라이브러리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 기계학습과 딥러닝을 위한 라이브러리가 매우 잘 갖춰져 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;scikit-learn&lt;/b&gt;: 전통적인 머신러닝&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TensorFlow&lt;/b&gt;: 딥러닝&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PyTorch&lt;/b&gt;: 딥러닝&lt;/li&gt;
&lt;li&gt;&lt;b&gt;XGBoost / LightGBM&lt;/b&gt;: 부스팅 기반 모델&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stasmodels&lt;/b&gt;: 통계 모델링&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Tensorflow&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYXtSh/dJMcaaZdbfG/9C6WeTaTTDth5wHUJanaXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYXtSh/dJMcaaZdbfG/9C6WeTaTTDth5wHUJanaXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYXtSh/dJMcaaZdbfG/9C6WeTaTTDth5wHUJanaXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYXtSh%2FdJMcaaZdbfG%2F9C6WeTaTTDth5wHUJanaXK%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;206&quot; height=&quot;114&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글이 개발한 딥러닝 및 &lt;b&gt;머신러닝 모델 개발용 프레임워크&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python, C++, Go, Java, R 등의 언어를 지원한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝에 특화&lt;/b&gt;된 라이브러리다.&lt;/li&gt;
&lt;li&gt;진입장벽이 낮다.&lt;/li&gt;
&lt;li&gt;상대적으로 복잡하다.&lt;/li&gt;
&lt;li&gt;과거에는 널리 사용되었으나 현재는 PyTorch가 연구에서 우세하다(현재는 프로덕션에서 자주 쓰이는 편).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Pytorch&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXst4/dJMcafsGqvk/O6wssirmALPLjHKIOKvOBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXst4/dJMcafsGqvk/O6wssirmALPLjHKIOKvOBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXst4/dJMcafsGqvk/O6wssirmALPLjHKIOKvOBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXst4%2FdJMcafsGqvk%2FO6wssirmALPLjHKIOKvOBK%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;192&quot; height=&quot;55&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이스북이 개발한 &lt;b&gt;직관적인 코드 작성과 동적 계산 그래프를 제공하는 딥러닝 프레임워크&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토치(Torch) 기반으로 개발되었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝에 특화&lt;/b&gt;된 라이브러리다.&lt;/li&gt;
&lt;li&gt;상대적으로 직관적이고 간결하다.&lt;/li&gt;
&lt;li&gt;딥러닝 요소의 커스터마이징이 용이하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재 가장 널리 사용&lt;/b&gt;되는 딥러닝 프레임워크 중 하나다(최근에는 프로덕션에서도 사용이 증가하는 추세).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;JAX&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv1Z7f/dJMcacpcSiX/FqWNlgg2MhqXokp3lmo2w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv1Z7f/dJMcacpcSiX/FqWNlgg2MhqXokp3lmo2w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv1Z7f/dJMcacpcSiX/FqWNlgg2MhqXokp3lmo2w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv1Z7f%2FdJMcacpcSiX%2FFqWNlgg2MhqXokp3lmo2w1%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;198&quot; height=&quot;115&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수치 계산과 자동미분에 강한 머신러닝 라이브러리&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자동미분 계산&lt;/b&gt;으로 딥러닝 학습에 사용 가능하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NumPy랑 비슷하게 코딩 가능&lt;/b&gt;하다.&lt;/li&gt;
&lt;li&gt;GPU/TPU에서 빠르게 동작한다(코드를 컴파일해서 속도를 높임).&lt;/li&gt;
&lt;li&gt;여러 개의 GPU/TPU로 병렬 처리 가능하다.&lt;/li&gt;
&lt;li&gt;PyTorch보다 조금 더 수학적이고 어렵지만 성능이 좋다.&lt;/li&gt;
&lt;li&gt;연구 및 대형 모델(특히 Google 계열)에서 사용이 증가하는 추세다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Scikit-learn&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKlk3h/dJMcacbFqur/pK7b4aQZtryskbd89nkS1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKlk3h/dJMcacbFqur/pK7b4aQZtryskbd89nkS1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKlk3h/dJMcacbFqur/pK7b4aQZtryskbd89nkS1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKlk3h%2FdJMcacbFqur%2FpK7b4aQZtryskbd89nkS1K%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;184&quot; height=&quot;106&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;226&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지도학습, 비지도학습 등&amp;nbsp;&lt;b&gt;다수의 기계학습 기법을 포함&lt;/b&gt;하고 있다.&lt;/li&gt;
&lt;li&gt;데이터 분석에 많이 활용된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝에는 적합하지 않다&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Pandas&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOJvTV/dJMcacvZFgH/dy6YTEakfkv2tNu4cNIS20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOJvTV/dJMcacvZFgH/dy6YTEakfkv2tNu4cNIS20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOJvTV/dJMcacvZFgH/dy6YTEakfkv2tNu4cNIS20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOJvTV%2FdJMcacvZFgH%2Fdy6YTEakfkv2tNu4cNIS20%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;188&quot; height=&quot;62&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표 형태의 데이터를 불러오고 &lt;b&gt;정리하고 분석하는데 특화된 라이브러리&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습위 위해 데이터셋을 처리하는데 많이 사용된다.&lt;/li&gt;
&lt;li&gt;데이터의 회전, 결합 등 &lt;b&gt;데이터셋을 재구성하는 기능&lt;/b&gt;을 제공한다.&lt;/li&gt;
&lt;li&gt;데이터의 &lt;b&gt;인덱싱, 필터링 등을 쉽게 구현할 수 있는 기능&lt;/b&gt;을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Colab&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도 설치 없이 브라우저에서 파이썬과 머신러닝 코드를 실행할 수 있는 구글의 클라우드 *노트북 환경이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfyvhK/dJMcaffcwqw/K5mDi780Ul7jpitBHtky10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfyvhK/dJMcaffcwqw/K5mDi780Ul7jpitBHtky10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfyvhK/dJMcaffcwqw/K5mDi780Ul7jpitBHtky10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfyvhK%2FdJMcaffcwqw%2FK5mDi780Ul7jpitBHtky10%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;183&quot; height=&quot;81&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라우드 기반으로 웹르라우저를 통해 언제든 사용 가능&lt;/li&gt;
&lt;li&gt;환경설정 및 사용 준비가 쉬움&lt;/li&gt;
&lt;li&gt;무료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;노트북 환경&lt;/b&gt;: 코드를 라이브로 실행 및 편집하고 결과를 바로 확인할 수 있는 작업 공간&lt;/p&gt;</description>
      <category>Machine Learning</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/47</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EA%B3%BC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D#entry47comment</comments>
      <pubDate>Mon, 13 Apr 2026 15:36:05 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 기초수학</title>
      <link>https://rdhdevelop.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝에서 수학은 &lt;b&gt;목적함수를 정의&lt;/b&gt;하고, &lt;b&gt;최적화 이론(목적함수의 최저점 도출)을 제공&lt;/b&gt;한다. 또한, 최적화 이론의 규제, 모멘텀, 학습률, 멈춤조건과 같은 제어를 추가하여 &lt;b&gt;알고리즘을 구축&lt;/b&gt;할수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 사용되는 수학적 이론은 크게 다음 3개가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;선형대수&lt;/b&gt;: 학습 모델의 매개변수집합, 데이터, 선형연산의 결합 등을 행렬 또는 텐서로 간결하게 표현 가능하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확률과 통계&lt;/b&gt;: 데이터에 포함된 불확실성을 표현하고 처리하는데 활용된다. 베이즈 이론과 최대 우도 기법을 이용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적화&lt;/b&gt;: 목적함수를 최소화하는 최적해를 찾는데 활용한다. 미분이 주로 활용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;백터와 행렬&lt;/b&gt;&lt;/h2&gt;
&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;b&gt;데이터를 숫자로 표현한 한 줄짜리 배열&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계학습에서는 샘플을 특징 벡터로 표현한다.&lt;/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;다음 벡터는 Iris 데이터에서 꽃받침의 길이, 꽃받침의 너비, 꽃입의 길이, 꽃입의 너비라는 4개의 특징이 각각 5.1, 3.5, 1.4, 0.2인 샘플이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1Wps/dJMcabcISyf/HShRzCP7okV0HqfMLPfCyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1Wps/dJMcabcISyf/HShRzCP7okV0HqfMLPfCyK/img.png&quot; data-alt=&quot;벡터의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1Wps/dJMcabcISyf/HShRzCP7okV0HqfMLPfCyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1Wps%2FdJMcabcISyf%2FHShRzCP7okV0HqfMLPfCyK%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;346&quot; height=&quot;168&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;벡터의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;백터의 내적&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;내적은 &lt;b&gt;같은 위치의 성분끼리 곱한 뒤 모두 더하는 것&lt;/b&gt;입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;&lt;span&gt;a&lt;/span&gt;&lt;/u&gt; &amp;middot; &lt;u&gt;&lt;span&gt;b&lt;/span&gt;&lt;/u&gt; = &lt;u&gt;&lt;span&gt;a&lt;/span&gt;&lt;/u&gt;^T * &lt;u&gt;&lt;span&gt;b&lt;/span&gt;&lt;/u&gt; = &amp;sum; (a_k * b_k)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, &lt;u&gt;x_1&lt;/u&gt; = [5.1, 3.5, 1.4, 0.2]^T와 &lt;u&gt;x_2&lt;/u&gt; = [4.9, 3.0, 1.4, 0.2]^T의 내적 &lt;u&gt;x_1&lt;/u&gt; &lt;span style=&quot;color: #c2c2c2; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;middot; &lt;/span&gt;&lt;u&gt;x_2&lt;/u&gt;는 37.49이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; &lt;u&gt;x_1&lt;/u&gt; &lt;span style=&quot;color: #bbbbbb; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;&lt;u&gt;x_2&lt;/u&gt; = (5.1 *4.9) + (3.5 * 3.0) + (1.4 *1.4) + (0.2 *0.2)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;b&gt;여러 개의 벡터를 담은 것&lt;/b&gt;이다. 행렬에서 열(column)은 세로줄로써 각각의 샘플을 의미하고, 행(row)는 가로줄로써 각각의 특징을 의미한다.&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;다음 행렬은 Iris 데이터에 있는 150개의 샘플을 설계행렬* X로 표현한 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZw0n/dJMcagZpzEd/fAFi9cqLFEiojVH6xC3ZNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZw0n/dJMcagZpzEd/fAFi9cqLFEiojVH6xC3ZNk/img.png&quot; data-alt=&quot;행렬의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZw0n/dJMcagZpzEd/fAFi9cqLFEiojVH6xC3ZNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZw0n%2FdJMcagZpzEd%2FfAFi9cqLFEiojVH6xC3ZNk%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;605&quot; height=&quot;261&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;행렬의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전치행렬이란 행(row)과&amp;nbsp;열(column)을&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;1084&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKigy/dJMcaa5ZzYS/qHtaj5Dw0B44E8xrqtp3X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKigy/dJMcaa5ZzYS/qHtaj5Dw0B44E8xrqtp3X0/img.png&quot; data-alt=&quot;전치행렬의 정의와 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKigy/dJMcaa5ZzYS/qHtaj5Dw0B44E8xrqtp3X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKigy%2FdJMcaa5ZzYS%2FqHtaj5Dw0B44E8xrqtp3X0%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;499&quot; height=&quot;173&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전치행렬의 정의와 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 행렬을 이용하면 수학을 간결하게 표현할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kI7RN/dJMcafsFSiL/PfGHzmA3qFmBVvfRjCv0B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kI7RN/dJMcafsFSiL/PfGHzmA3qFmBVvfRjCv0B1/img.png&quot; data-alt=&quot;다항식의 행렬 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kI7RN/dJMcafsFSiL/PfGHzmA3qFmBVvfRjCv0B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkI7RN%2FdJMcafsFSiL%2FPfGHzmA3qFmBVvfRjCv0B1%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;1240&quot; height=&quot;272&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다항식의 행렬 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*설계행렬: 훈련집합(training set)을 담은 행렬.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;행렬의 곱셈&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span&gt;C&lt;/span&gt;&lt;/u&gt; = &lt;u&gt;&lt;span&gt;AB&lt;/span&gt;&lt;/u&gt; 일때 C_ij = &amp;sum; (a_ik * b_kj)&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;1270&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GbsyJ/dJMcahKOQZP/O3VO4RiFiF5QcAfYze7lV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GbsyJ/dJMcahKOQZP/O3VO4RiFiF5QcAfYze7lV1/img.png&quot; data-alt=&quot;행렬 곱셉의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GbsyJ/dJMcahKOQZP/O3VO4RiFiF5QcAfYze7lV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGbsyJ%2FdJMcahKOQZP%2FO3VO4RiFiF5QcAfYze7lV1%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;1270&quot; height=&quot;108&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;행렬 곱셉의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 행렬곱의 각 원소는 &lt;b&gt;앞 행렬의 한 행&lt;/b&gt;과 &lt;b&gt;뒷 행렬의 한 열&lt;/b&gt;의 내적으로 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬의 곱셈에서는&amp;nbsp;&lt;b&gt;교환법칙이 성립하지 않고&lt;/b&gt;,&amp;nbsp;&lt;b&gt;분배법칙과 결합법칙만이 성립&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특수 행렬&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정사각행렬&lt;/b&gt;: 행의 개수와 열의 개수가 같은 행렬(m = n 인 행렬)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대각행렬&lt;/b&gt;: 주대각선 이외의 모든 원소가 0인 정사각행렬(a_ij = 0 (i != j)인 정사각행렬)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단위행렬&lt;/b&gt;: 주대각선의 원소는 모두 1이고, 나머지 원소는 모두 0인 정사각행렬(a_ij = 1 (i = j), a_ij = 0 (i != j)인 정사각행렬)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대칭행렬&lt;/b&gt;: 전치행렬이 자기 자신과 같은 정사각행렬(A^T = A인 정사각행렬)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMzeB0/dJMcahcXC88/pWhyxqkYyKIn1NN0BzaDt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMzeB0/dJMcahcXC88/pWhyxqkYyKIn1NN0BzaDt0/img.png&quot; data-alt=&quot;특수한 행렬들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMzeB0/dJMcahcXC88/pWhyxqkYyKIn1NN0BzaDt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMzeB0%2FdJMcahcXC88%2FpWhyxqkYyKIn1NN0BzaDt0%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;416&quot; height=&quot;155&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특수한 행렬들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;역행렬&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역행렬이란 &lt;b&gt;어떤 정사각행렬을 곱했을 때 단위행렬이 나오게 하는 행렬&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식으로 쓰면, 행렬 A의 역행렬을 A^(-1)이라 할 때, A * A^(-1) = A^(-1) * A = I이다(여기서, I는 단위행렬).&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;582&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K8RVu/dJMcadVTBWe/99RD61kVewCCIkWuLwzJO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K8RVu/dJMcadVTBWe/99RD61kVewCCIkWuLwzJO0/img.png&quot; data-alt=&quot;역행렬의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K8RVu/dJMcadVTBWe/99RD61kVewCCIkWuLwzJO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK8RVu%2FdJMcadVTBWe%2F99RD61kVewCCIkWuLwzJO0%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;277&quot; height=&quot;58&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;역행렬의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유사 역행렬(persudo inverse)이란 &lt;b&gt;정사각행렬이&lt;span&gt; 아니지만,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;역행렬과&lt;span&gt;&amp;nbsp;&lt;/span&gt;비슷한&lt;span&gt; &lt;/span&gt;역할을&lt;span&gt; &lt;/span&gt;해주는&lt;/b&gt;&lt;span&gt;&lt;b&gt; 행렬&lt;/b&gt;을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;행렬 분해&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 3717은 특성이 보이지 않지만, 3 * 3 * 7 * 59로 소인수 분해를 하면 특성이 보인다. 행렬도 그러하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;고유값 분해&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;행렬을 고유값*과 고유벡터*로 분해하는 것&lt;/b&gt;이다(단, 정사각행렬에서만 적용 가능하다).&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;핵심 식은 &lt;b&gt;A = QDQ^(-1)&lt;/b&gt;이다. 여기서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;A&lt;/b&gt;: 원래 행렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q&lt;/b&gt;: 고유벡터들을 열벡터로 모아 놓은 행렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;D&lt;/b&gt;: 고유값들을 대각선에 넣은 대각행렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q^(-1)&lt;/b&gt;: Q의 역행렬&lt;/li&gt;
&lt;/ul&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;528&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct66Bz/dJMcacvY75g/yIkuRDqhvDHD4CJTSfOwI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct66Bz/dJMcacvY75g/yIkuRDqhvDHD4CJTSfOwI0/img.png&quot; data-alt=&quot;고유값 분해의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct66Bz/dJMcacvY75g/yIkuRDqhvDHD4CJTSfOwI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct66Bz%2FdJMcacvY75g%2FyIkuRDqhvDHD4CJTSfOwI0%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;354&quot; height=&quot;59&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;고유값 분해의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: right; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;*고유값과 고유벡터: 행렬 A가 어떤 벡터 v에 작용했을 때, Av =&lt;span&gt; {lambda} v&lt;/span&gt; 를 만족하는 0이 아닌 벡터 v를 &lt;b&gt;고유벡터&lt;/b&gt;, 그때의 스칼라 {lambda}를 &lt;b&gt;고유값&lt;/b&gt;이라 한다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: right; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #c2c2c2; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;특이값 분해(SVD)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;b&gt;임의의 행렬을 3개의 의미 있는 행렬로 분해하는 것&lt;/b&gt;이다. 데이터의 특성을 분리하고 파악할 때 유용하다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start; --darkreader-inline-color: var(--darkreader-text-000000, #e5e5e5);&quot; data-ke-size=&quot;size16&quot; data-darkreader-inline-color=&quot;&quot;&gt;핵심 식은&amp;nbsp;&lt;b&gt;A =&lt;span&gt;&amp;nbsp;U&amp;sum;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;V^T&amp;sum;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;이다. 여기서,&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;A&lt;/b&gt;: 원래 행렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;U&lt;/b&gt;: 왼쪽 특이벡터들로 이뤄진 행렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;sum;&lt;/b&gt;: 특이값이 들어있는 대각행렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;V^T&lt;/b&gt;: 오른쪽 특이벡터들의 전치행렬&lt;/li&gt;
&lt;/ul&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;858&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/capnA7/dJMcaax9YKp/3FZWbzNmYy3RWUHTqvMBGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/capnA7/dJMcaax9YKp/3FZWbzNmYy3RWUHTqvMBGk/img.png&quot; data-alt=&quot;특이값 분해의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/capnA7/dJMcaax9YKp/3FZWbzNmYy3RWUHTqvMBGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcapnA7%2FdJMcaax9YKp%2F3FZWbzNmYy3RWUHTqvMBGk%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;473&quot; height=&quot;171&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특이값 분해의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;텐서란 3차원 이상의 구조를 가진 숫자 배열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 텐서는 3차원 구조의 RGB 컬러 영상의 예이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAJAfS/dJMcac3LUkb/K9f9YChlXlfTjVaM7VLIG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAJAfS/dJMcac3LUkb/K9f9YChlXlfTjVaM7VLIG0/img.png&quot; data-alt=&quot;3차원 구조의 RGB 컬러 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAJAfS/dJMcac3LUkb/K9f9YChlXlfTjVaM7VLIG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAJAfS%2FdJMcac3LUkb%2FK9f9YChlXlfTjVaM7VLIG0%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;726&quot; height=&quot;432&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3차원 구조의 RGB 컬러 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;놈과 유사도&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;놈&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벡터의 크기, 길이, 세기를 수치로 나타낸 함수&lt;/b&gt;이다. 예를 들어, &lt;u&gt;x&lt;/u&gt; = [3, 4]^T의 길이는 (&lt;b&gt;3&lt;/b&gt;^2 + &lt;b&gt;4&lt;/b&gt;^2)^(1/2)인 5이다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;벡터 크기 측정&lt;/b&gt;: 특징 벡터가 얼마나 큰지 판단&lt;/li&gt;
&lt;li&gt;&lt;b&gt;거리 계산&lt;/b&gt;: 두 벡터 차이의 크기를 재면 거리처럼 사용 가능(예를 들어, 두 벡터 x, y의 거리는 ||x-y||_2이다)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정규화&lt;/b&gt;: 모델이 너무 복잡해지는 것을 막기 위해 가중치 크기를 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유사도&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 벡터가 얼마나 비슷한가를 나타낸 값&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코사인 유사도&lt;/b&gt;는 &lt;b&gt;두 벡터 사이 각도의 코사인&lt;/b&gt;값이다.&lt;/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;718&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3XrD/dJMcaax9YQd/GjWvcZ86YyT8i5evQ8RvLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3XrD/dJMcaax9YQd/GjWvcZ86YyT8i5evQ8RvLk/img.png&quot; data-alt=&quot;코사인 유사도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3XrD/dJMcaax9YQd/GjWvcZ86YyT8i5evQ8RvLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3XrD%2FdJMcaax9YQd%2FGjWvcZ86YyT8i5evQ8RvLk%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;365&quot; height=&quot;61&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코사인 유사도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코사인 유사도가,&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1에 가까우면: 방향이 매우 비슷&lt;/li&gt;
&lt;li&gt;0에 가까우면: 서로 직교&lt;/li&gt;
&lt;li&gt;-1에 가까우면: 방향이 반대&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 볼 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;b&gt;벡터&lt;/b&gt;는&amp;nbsp;&lt;b&gt;원점에서 어떤 점까지 가는 화살표&lt;/b&gt;이다. 예를 들어, a = [1 2]^T라면, 원점 (0, 0)에서 (1, 2)까지 가는 화살표가 벡터 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;벡터 &lt;u&gt;a&lt;/u&gt;와 벡터 &lt;u&gt;b&lt;/u&gt;의 선형결합 &lt;u&gt;c&lt;/u&gt;,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pV6Eh/dJMcahKORVl/ODrOxmQnLXgJkJu0fIbXY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pV6Eh/dJMcahKORVl/ODrOxmQnLXgJkJu0fIbXY1/img.png&quot; data-alt=&quot;기저벡터 a와 b의 선형결합&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pV6Eh/dJMcahKORVl/ODrOxmQnLXgJkJu0fIbXY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpV6Eh%2FdJMcahKORVl%2FODrOxmQnLXgJkJu0fIbXY1%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;156&quot; height=&quot;27&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기저벡터 a와 b의 선형결합&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이다. 이러한 선형결합으로 만들어지는 공간을 &lt;b&gt;벡터공간&lt;/b&gt;이라 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCo4S0/dJMcaa5ZAYU/SCxxiPquff8D4KzP9mDDk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCo4S0/dJMcaa5ZAYU/SCxxiPquff8D4KzP9mDDk0/img.png&quot; data-alt=&quot;벡터의 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCo4S0/dJMcaa5ZAYU/SCxxiPquff8D4KzP9mDDk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCo4S0%2FdJMcaa5ZAYU%2FSCxxiPquff8D4KzP9mDDk0%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;217&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;벡터의 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&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;280&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw3zE4/dJMcaffbZqi/zbEykeLbUxEbeKTku07Au0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw3zE4/dJMcaffbZqi/zbEykeLbUxEbeKTku07Au0/img.png&quot; data-alt=&quot;기저벡터와 벡터공간&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw3zE4/dJMcaffbZqi/zbEykeLbUxEbeKTku07Au0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw3zE4%2FdJMcaffbZqi%2FzbEykeLbUxEbeKTku07Au0%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;171&quot; height=&quot;176&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기저벡터와 벡터공간&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림에는 a = (2, 1)^T, b = (1, 3)^T가 주어져 있다. 그리고 그림 위에 2a + b, -1.5a + b, -a -b, a - 2b같은 점들이 찍혀 있다. 이 뜻은, 이 점들이 모두 &lt;span&gt;&lt;b&gt;&amp;alpha;a + &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;beta;&lt;/span&gt;b 꼴&lt;/b&gt;로 만들어 질수 있다는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;정규직고 기저&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt; 벡터&lt;/b&gt;를 살펴보자. 길이가 1이고 서로 직각인 두 벡터를 &lt;b&gt;정규직고 기저벡터&lt;/b&gt;라고 한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnWFGy/dJMcagE9Kht/ZuY86yIebRA3u9rYB5yYW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnWFGy/dJMcagE9Kht/ZuY86yIebRA3u9rYB5yYW0/img.png&quot; data-alt=&quot;정규직교 기저벡터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnWFGy/dJMcagE9Kht/ZuY86yIebRA3u9rYB5yYW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnWFGy%2FdJMcagE9Kht%2FZuY86yIebRA3u9rYB5yYW0%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;183&quot; height=&quot;187&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정규직교 기저벡터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정규&lt;/b&gt;: 길이가 1&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;직교&lt;/b&gt;: 서로 수직&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 기저를 쓰면 어떤 벡터든 아주 쉽게 표현할 수 있다. 예를 들어, 4a + 5b = 4 * [1, 0]^T + 5 * [0 1]^T = [4 5]^T이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;확률과 통계&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계 학습이 처리할 데이터는 불확실한 세상에서 발생하므로, 불확실성을 다루는 확률과 통계를 잘 활용해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;확률변수&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;확률실험의 결과를 숫자로 대응시키는 변수&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 윷을 던질 때 나올 수 있는 경우의 수는 5개(도, 개, 걸, 윷, 모)이다. 이때, 다섯 가지 경우를 다음처럼 정의할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도가 나오면 X = 1&lt;/li&gt;
&lt;li&gt;개가 나오면 X = 2&lt;/li&gt;
&lt;li&gt;걸가 나오면 X = 3&lt;/li&gt;
&lt;li&gt;윷가 나오면 X = 4&lt;/li&gt;
&lt;li&gt;모가 나오면 X = 5&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, X가 확률 변수이다. 즉, {도, 개, 걸, 윷, 모}라는 결과를 {1, 2, 3, 4, 5}라는 &lt;b&gt;숫자로 바꿔주는 규칙이 확률 변수&lt;/b&gt;이다. 단, X의 정의역은 {도, 개, 걸, 윷, 모}이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;확률 분포&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확률 분포란 &lt;b&gt;확률변수가 취할 수 있는 값과 그 값이 나타날 확률의 대응 관계를 나타내는 함수 또는 모델&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 윷놀이 상황에서의 확률분포는 &lt;b&gt;윷을 한번 던졌을 때 확률 변수 X가 {도, 개, 걸, 윷, 모} 중 무엇이 되는지에 대한 분포&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서처럼 확률변수를 X = {1, 2, 3, 4, 5}로 두면 이 확률분포는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도가 나왔을 때: P(X = 1) = 4/16&lt;/li&gt;
&lt;li&gt;개가 나왔을 때: P(X = 2) = 6/ 16&lt;/li&gt;
&lt;li&gt;걸가 나왔을 때: P(X = 3) = 4/16&lt;/li&gt;
&lt;li&gt;윷가 나왔을 때: P(X = 4) = 1/16&lt;/li&gt;
&lt;li&gt;모가 나왔을 때: P(X = 5) = 1/16&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 바로 &lt;b&gt;이산확률분포&lt;/b&gt;이고, 더 정확히는 &lt;b&gt;확률질량함수(PMF)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;b&gt;전체 확률의 합은 1&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 4/16 + 6/16 + 4/16 + 1/16 + 1/16 = &lt;b&gt;1&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;778&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwEtVS/dJMcaiiDr9P/SCLMKFq2wt0Hrd80mgMaU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwEtVS/dJMcaiiDr9P/SCLMKFq2wt0Hrd80mgMaU1/img.png&quot; data-alt=&quot;이산/연속적 경우에서의 확률분포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwEtVS/dJMcaiiDr9P/SCLMKFq2wt0Hrd80mgMaU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwEtVS%2FdJMcaiiDr9P%2FSCLMKFq2wt0Hrd80mgMaU1%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;514&quot; height=&quot;239&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이산/연속적 경우에서의 확률분포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;확률 벡터&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확률벡터는 &lt;b&gt;각 성분이 확률로 이루어져 있고, 모든 성분의 합이 1인 벡터&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 윷놀이 상황에서의 확률벡터는 &lt;b&gt;p = [4/16, 6/16, 4/16, 1/16, 1/16]^T &lt;/b&gt;(5차원)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 결과를 관측한 뒤, 원인에 대한 확률을 갱신하는 공식&lt;/b&gt;이다. 즉, 어떤 데이터 x를 관측했을 때 가설 y가 맞을 확률을 다시 계산하는 것이다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bglHhz/dJMcagylg4D/Y8ICHvWcDLW1cjZyyjxKY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bglHhz/dJMcagylg4D/Y8ICHvWcDLW1cjZyyjxKY0/img.png&quot; data-alt=&quot;베이즈 정리의 공식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bglHhz/dJMcagylg4D/Y8ICHvWcDLW1cjZyyjxKY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbglHhz%2FdJMcagylg4D%2FY8ICHvWcDLW1cjZyyjxKY0%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;303&quot; height=&quot;83&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;베이즈 정리의 공식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 항의 의미는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;P(y): 사전확률&lt;/b&gt;; 데이터를 보기 전, 사건 y가 일어날 것이라고 믿는 확률.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P(x | y): 우도&lt;/b&gt;; y가 참일때, x가 관측될 확률&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P(x): 증거&lt;/b&gt;; x가 실제로 관측횔 전체 확률&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P(y | x): 사후 확률&lt;/b&gt;; y를 관측한 뒤, x가 참일 확률&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 다음의 예제를 풀어보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;하얀 공이 나왔다는 사실만 알고 3개의 병 중 어느 병에서 나왔는지 모르는데, 어느 병인지 추정하라.&lt;/blockquote&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzcQdt/dJMcaaSthL6/IKizPVnFwKA1oDxoBITkIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzcQdt/dJMcaaSthL6/IKizPVnFwKA1oDxoBITkIk/img.png&quot; data-alt=&quot;위 질문을 베이즈 정리를 통해 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzcQdt/dJMcaaSthL6/IKizPVnFwKA1oDxoBITkIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzcQdt%2FdJMcaaSthL6%2FIKizPVnFwKA1oDxoBITkIk%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;459&quot; height=&quot;56&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 질문을 베이즈 정리를 통해 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 가지의 경우에 대해 확률을 계산하면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oFUVL/dJMcaadRsS1/82nV2nKuKeJLdvVzDhNhkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oFUVL/dJMcaadRsS1/82nV2nKuKeJLdvVzDhNhkk/img.png&quot; data-alt=&quot;3번 병일 확률이 가장 높다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oFUVL/dJMcaadRsS1/82nV2nKuKeJLdvVzDhNhkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoFUVL%2FdJMcaadRsS1%2F82nV2nKuKeJLdvVzDhNhkk%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;357&quot; height=&quot;248&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3번 병일 확률이 가장 높다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;y^{hat}&lt;/b&gt;: 모델이 최종적으로 예측한 값&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;argmax_y&lt;/b&gt;: 여러 y 후보 중 값을 가장 크게 만드는 y를 고른다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기계 학습에 활용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iris 데이터 분률 문제를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징 벡터 x, 부류 y &amp;isin; {setosa, versicolor, virginica} =&amp;gt; y^{hat} = argmax_y P(y | x)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HTW5r/dJMcacCKrFf/hBkyntjR66BnU1h0h5kD1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HTW5r/dJMcacCKrFf/hBkyntjR66BnU1h0h5kD1k/img.png&quot; data-alt=&quot;붓꽃의 부류 예측 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HTW5r/dJMcacCKrFf/hBkyntjR66BnU1h0h5kD1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHTW5r%2FdJMcacCKrFf%2FhBkyntjR66BnU1h0h5kD1k%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;652&quot; height=&quot;69&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;붓꽃의 부류 예측 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사후 확률 P(y | x)를 직접 추정하는 일은 거의 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 베이즈 정리를 이용해 이를 추정한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 우도 추정은&amp;nbsp;&lt;b&gt;관측된 데이터가 가장 그럴듯하게 나오도록 만드는 매개변수 &amp;Theta;를 추정하는 문제&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;1098&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl8iiq/dJMcaju36Hz/HXrkhIF9muK03OQVRpLJx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl8iiq/dJMcaju36Hz/HXrkhIF9muK03OQVRpLJx0/img.png&quot; data-alt=&quot;매개변수가 감춰진 여러 가지 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl8iiq/dJMcaju36Hz/HXrkhIF9muK03OQVRpLJx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl8iiq%2FdJMcaju36Hz%2FHXrkhIF9muK03OQVRpLJx0%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;631&quot; height=&quot;231&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;매개변수가 감춰진 여러 가지 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최대 우도법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 데이터 집합 X가 있다고 가정하자,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCZz3/dJMcagZpPnm/Puqc8cL6Kw6b6kYHmcgKEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCZz3/dJMcagZpPnm/Puqc8cL6Kw6b6kYHmcgKEk/img.png&quot; data-alt=&quot;데이터 집합 X&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCZz3/dJMcagZpPnm/Puqc8cL6Kw6b6kYHmcgKEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCZz3%2FdJMcagZpPnm%2FPuqc8cL6Kw6b6kYHmcgKEk%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;361&quot; height=&quot;30&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 집합 X&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 X가 주어졌을 때, X를 발생시켰을 가능성을 최대로 하는 매개변수 &amp;Theta; = { q_3 }의 값을 찾아보자.&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;384&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rSCXY/dJMcaju36XV/QEnJAi3KMarOubnzkeEXrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rSCXY/dJMcaju36XV/QEnJAi3KMarOubnzkeEXrk/img.png&quot; data-alt=&quot;문제를 수식으로 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rSCXY/dJMcaju36XV/QEnJAi3KMarOubnzkeEXrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrSCXY%2FdJMcaju36XV%2FQEnJAi3KMarOubnzkeEXrk%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;249&quot; height=&quot;70&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문제를 수식으로 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 일반화 하면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4qfJK/dJMcaarorLy/BubOy5CKPiKnBWMqSNgK1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4qfJK/dJMcaarorLy/BubOy5CKPiKnBWMqSNgK1k/img.png&quot; data-alt=&quot;최대 우도법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4qfJK/dJMcaarorLy/BubOy5CKPiKnBWMqSNgK1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4qfJK%2FdJMcaarorLy%2FBubOy5CKPiKnBWMqSNgK1k%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;376&quot; height=&quot;58&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최대 우도법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치가 너무 클 경우 로그를 사용해도 좋다,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0bWek/dJMcabDPzyo/KhaN0PhWIK1h1TMcJZKa3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0bWek/dJMcabDPzyo/KhaN0PhWIK1h1TMcJZKa3k/img.png&quot; data-alt=&quot;수치 문제를 피하기 위해 로그를 사용한 최대 우도법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0bWek/dJMcabDPzyo/KhaN0PhWIK1h1TMcJZKa3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0bWek%2FdJMcabDPzyo%2FKhaN0PhWIK1h1TMcJZKa3k%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;611&quot; height=&quot;59&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수치 문제를 피하기 위해 로그를 사용한 최대 우도법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;평균&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균은&amp;nbsp;&lt;b&gt;데이터들의 중심 위치&lt;/b&gt;이며&amp;nbsp;&lt;b&gt;전체 데이터를 대표하는 평균값이다.&lt;/b&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;268&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg1Ay4/dJMcaipqjNp/OJXl6QGHH87P6kWTglQIDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg1Ay4/dJMcaipqjNp/OJXl6QGHH87P6kWTglQIDK/img.png&quot; data-alt=&quot;평균&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg1Ay4/dJMcaipqjNp/OJXl6QGHH87P6kWTglQIDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg1Ay4%2FdJMcaipqjNp%2FOJXl6QGHH87P6kWTglQIDK%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;154&quot; height=&quot;76&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;평균&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;분산&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산은 &lt;b&gt;데이터가 평균으로부터 얼마나 퍼져 있는지를 나타내는 값&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식은 다음과 같다,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8lu5f/dJMb99MJ9Xi/9l1cj9P2x7x5tKiC5OkIc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8lu5f/dJMb99MJ9Xi/9l1cj9P2x7x5tKiC5OkIc1/img.png&quot; data-alt=&quot;분산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8lu5f/dJMb99MJ9Xi/9l1cj9P2x7x5tKiC5OkIc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8lu5f%2FdJMb99MJ9Xi%2F9l1cj9P2x7x5tKiC5OkIc1%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;227&quot; height=&quot;69&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;분산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;평균 벡터&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 1차원이 아니라 벡터일 경우는 어떨까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ea8aGz/dJMcaju37qe/XKpyc8vLs7x1ZIK5DzJio1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ea8aGz/dJMcaju37qe/XKpyc8vLs7x1ZIK5DzJio1/img.png&quot; data-alt=&quot;평균 벡터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ea8aGz/dJMcaju37qe/XKpyc8vLs7x1ZIK5DzJio1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fea8aGz%2FdJMcaju37qe%2FXKpyc8vLs7x1ZIK5DzJio1%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;131&quot; height=&quot;84&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;평균 벡터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 식은 1차원 평균 공식과 형태는 같지만 x_i는 이제 숫자가 아니라 벡터이다. 따라서, 결과 또한 벡터이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공분산 행렬&lt;/b&gt;&lt;/h4&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;370&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BziNd/dJMcaiCVLVp/vkBvMX16lOCmKMewqDA390/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BziNd/dJMcaiCVLVp/vkBvMX16lOCmKMewqDA390/img.png&quot; data-alt=&quot;공분산 행렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BziNd/dJMcaiCVLVp/vkBvMX16lOCmKMewqDA390/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBziNd%2FdJMcaiCVLVp%2FvkBvMX16lOCmKMewqDA390%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;228&quot; height=&quot;64&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공분산 행렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;(x_i - &amp;mu;)&lt;/b&gt;: 평균에서 얼마나 벗어났는지 나타내는 벡터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;(x_i -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mu;)^T&lt;/b&gt;&lt;/b&gt;: 그 전치&lt;/li&gt;
&lt;/ul&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6Kh62/dJMcafsF9Hv/Ov5bE4UQjCeBH2Rwy5fg3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6Kh62/dJMcafsF9Hv/Ov5bE4UQjCeBH2Rwy5fg3k/img.png&quot; data-alt=&quot;공분산 행렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6Kh62/dJMcafsF9Hv/Ov5bE4UQjCeBH2Rwy5fg3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6Kh62%2FdJMcafsF9Hv%2FOv5bE4UQjCeBH2Rwy5fg3k%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;394&quot; height=&quot;97&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공분산 행렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 각 원소의 의미는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;대각 원소: 각 특징의 분산&lt;/b&gt;; &amp;sigma;_11, &amp;sigma;_22, ... , &amp;sigma;_dd / &amp;sigma;_1^2, &amp;sigma;_2^2, ... , &amp;sigma;_d^2&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비대각 원소: 공분산&lt;/b&gt;; &amp;sigma;_ij&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;베르누이 분포&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번의 시행에서 성공(x = 1) 확률 p이고, 실패(x = 0) 확률이 1 - p인 분포이다.&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;674&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIQ7PN/dJMcagkOCFA/we4VtwGyLG0sadQehqemJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIQ7PN/dJMcagkOCFA/we4VtwGyLG0sadQehqemJ1/img.png&quot; data-alt=&quot;베르누이 분포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIQ7PN/dJMcagkOCFA/we4VtwGyLG0sadQehqemJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIQ7PN%2FdJMcagkOCFA%2Fwe4VtwGyLG0sadQehqemJ1%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;401&quot; height=&quot;69&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;베르누이 분포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이항분포&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공 확률이 p인 베르누이 실험을 m번 수행할 때 성공할 횟수의 확률분포이다.&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;816&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L71Mk/dJMcajofhpl/mEwaE6DdKD7TpPWXuzD1y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L71Mk/dJMcajofhpl/mEwaE6DdKD7TpPWXuzD1y0/img.png&quot; data-alt=&quot;이항 분포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L71Mk/dJMcajofhpl/mEwaE6DdKD7TpPWXuzD1y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL71Mk%2FdJMcajofhpl%2FmEwaE6DdKD7TpPWXuzD1y0%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;477&quot; height=&quot;48&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이항 분포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가우시안 분포&lt;/b&gt;&lt;/h4&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;602&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oBsOs/dJMcagkOEz0/t5kBAMg9AkArqUxmjtcEY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oBsOs/dJMcagkOEz0/t5kBAMg9AkArqUxmjtcEY1/img.png&quot; data-alt=&quot;가우시안 분포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oBsOs/dJMcagkOEz0/t5kBAMg9AkArqUxmjtcEY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoBsOs%2FdJMcagkOEz0%2Ft5kBAMg9AkArqUxmjtcEY1%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;440&quot; height=&quot;79&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가우시안 분포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esKPfj/dJMcagSF2Fj/rKm8jgDefzIEaVSVpdJtDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esKPfj/dJMcagSF2Fj/rKm8jgDefzIEaVSVpdJtDK/img.png&quot; data-alt=&quot;가우시안 분포의 그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esKPfj/dJMcagSF2Fj/rKm8jgDefzIEaVSVpdJtDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesKPfj%2FdJMcagSF2Fj%2FrKm8jgDefzIEaVSVpdJtDK%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;611&quot; height=&quot;164&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가우시안 분포의 그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;최적화 이론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적화란&amp;nbsp;&lt;b&gt;가능한 선택들 중에서 목적함수 값을 가장 좋게*&lt;/b&gt;&lt;b&gt; 만드는 해를 찾는 것&lt;/b&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;482&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsRwMZ/dJMcaflVOol/t9V1ZgfhcKgLHIUR34wNVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsRwMZ/dJMcaflVOol/t9V1ZgfhcKgLHIUR34wNVk/img.png&quot; data-alt=&quot;최적화 문제의 수학적 표현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsRwMZ/dJMcaflVOol/t9V1ZgfhcKgLHIUR34wNVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsRwMZ%2FdJMcaflVOol%2Ft9V1ZgfhcKgLHIUR34wNVk%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;312&quot; height=&quot;75&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최적화 문제의 수학적 표현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 항이 의미하는 바는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;f(x): 목적함수&lt;/b&gt;; 줄이거나 늘리고 싶은 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;x: 결정변수(벡터)&lt;/b&gt;; 조정할 수 있는 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;Omega;: 가능해집합&lt;/b&gt;; x가 가질 수 있는 허용 범위&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적해&lt;/b&gt;: 목적함수 f를 최소화(혹은 최대화)하는 x&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예시 문제를 살펴보자&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문제1.&lt;br /&gt;minimize x^2 - 2x + 1&lt;br /&gt;subject to x &amp;isin; [-2, 2]&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 목적함수를 정리하면 &lt;b&gt;x^2 - 2x + 1 = (x - 1)^2&lt;/b&gt;이며 이 함수의 최소값은 &lt;b&gt;x = 1&lt;/b&gt;일때다. 이는 구간 [-2, 2]내에 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;최적해는 x* = 1&lt;/b&gt;, 최솟값은 f(1) = 0이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문제2.&lt;br /&gt;minimize x^2 - 2x + 1&lt;br /&gt;subject to x &amp;isin; [-6, -2]&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;마찬가지로 목적함수는 &lt;b&gt;(x - 1)^2&lt;/b&gt;이다. 최소값을 가지는 &lt;b&gt;x = 1&lt;/b&gt;은 구간 내에 없으므로 구간 [-6, -2]에서 이에 가장 가까운 값인 &lt;b&gt;x = -2가 최적해&lt;/b&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;blockquote data-ke-style=&quot;style2&quot;&gt;문제3. (선형회귀)&lt;br /&gt;n개의 점 (x_1, y_1), ... , (x_n, y_n) 이 있다.&lt;br /&gt;위의 점을 가장 적은 오차로 표현하는 직선 y = ax + b를 찾아라.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 데이터 점에서 예측값은 &lt;b&gt;ax_i + b&lt;/b&gt;이고, 실제값은 &lt;b&gt;y_i&lt;/b&gt;이다. 따라서, 오차는 &lt;b&gt;(ax_i + b ) &amp;nbsp;- y_i&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;318&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9VdF2/dJMcaakB7CC/LXG7RtRh6quAFhguCxw9a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9VdF2/dJMcaakB7CC/LXG7RtRh6quAFhguCxw9a1/img.png&quot; data-alt=&quot;평균제곱오차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9VdF2/dJMcaakB7CC/LXG7RtRh6quAFhguCxw9a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9VdF2%2FdJMcaakB7CC%2FLXG7RtRh6quAFhguCxw9a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;169&quot; height=&quot;66&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;평균제곱오차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;문제의 정답은 평균제곱오차를 최소화하는 직선의 매개변수(결정변수) a, b를 찾는 것이며, 이는 다음과 같다,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Cgrq/dJMcaaroxkt/NwUFEdqI14f1L5zPpfN3F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Cgrq/dJMcaaroxkt/NwUFEdqI14f1L5zPpfN3F1/img.png&quot; data-alt=&quot;평균제곱오차의 최적해&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Cgrq/dJMcaaroxkt/NwUFEdqI14f1L5zPpfN3F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Cgrq%2FdJMcaaroxkt%2FNwUFEdqI14f1L5zPpfN3F1%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;276&quot; height=&quot;73&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;평균제곱오차의 최적해&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;가장 좋게&lt;/b&gt;는 문제에 따라 다른데, 어떤 경우(예: 오차, 손실)는 &lt;b&gt;최소화&lt;/b&gt;가 목표이다. 그리고 어떤 경우(예: 이익, 확률)는 &lt;b&gt;최대화&lt;/b&gt;가 목표이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&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;기계학습 모델은 보통 어떤 매개변수 &amp;theta;를 가진다. 예를 들어, 선형회귀에서는&amp;nbsp;&lt;b&gt;y = ax + b&lt;/b&gt; 에서 매개변수는 a, b이고 매개변수공간은 2차원이다. 다만 특징공간은 1차원이다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uVV64/dJMcahD1mbX/YBueVC0rpmgImfqUlm4jf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uVV64/dJMcahD1mbX/YBueVC0rpmgImfqUlm4jf0/img.png&quot; data-alt=&quot;기계학습이 해야할 일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uVV64/dJMcahD1mbX/YBueVC0rpmgImfqUlm4jf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuVV64%2FdJMcahD1mbX%2FYBueVC0rpmgImfqUlm4jf0%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;53&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기계학습이 해야할 일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;theta;&lt;/b&gt;: 모델의 매개변수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;J(&amp;theta;)&lt;/b&gt;: 목적함수 또는 손실함수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;argmin_&amp;theta;&lt;/b&gt;: &amp;theta; 값을 가장 작게 만드는 &amp;theta;를 찾는 연산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;theta;^{hat}&lt;/b&gt;: 최적이라고 선택된 매개변수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 손실함수 &lt;b&gt;J(&amp;theta;)를 최소로 만드는 매개변수&amp;nbsp;&amp;theta;를 찾아라는 뜻&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;낱낱탐색 알고리즘&lt;/b&gt;&lt;/h4&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;450&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmTw2F/dJMcajhv3Sf/9R9443D5YM1GZ2WqYqhdw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmTw2F/dJMcajhv3Sf/9R9443D5YM1GZ2WqYqhdw0/img.png&quot; data-alt=&quot;최적해 탐색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmTw2F/dJMcajhv3Sf/9R9443D5YM1GZ2WqYqhdw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmTw2F%2FdJMcajhv3Sf%2F9R9443D5YM1GZ2WqYqhdw0%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;260&quot; height=&quot;148&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최적해 탐색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림에서 목적함수 J(x)는 여러 골짜기를 가졌다. x^{hat}은 &lt;b&gt;전체 구간에서 가장 작은 진짜 최저점 &lt;/b&gt;전체 최적해다. x_2, x_4는 &lt;b&gt;주변만 보면 가장 작지만 전체적으로 보면 더 작은 곳이 따로 있을 수 있는&amp;nbsp;&lt;/b&gt;지역 최적해이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;낱낱탐색은 모든 가능한 해를 다 만들어, 각각의 J(&amp;theta;)를 계산한 뒤 가장 작은 것을 고르는 방법이다.&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가능한 해를 전부 만든다.&lt;/li&gt;
&lt;li&gt;각각의 목적함수 값을 계산한다.&lt;/li&gt;
&lt;li&gt;가장 작은 값을 주는 해를 고른다.&lt;/li&gt;
&lt;/ol&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;무작위 탐색 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무작위 탐색은 다음과 같은 순서로 수행된다,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;해를 무작위로 하나 뽑는다.&lt;/li&gt;
&lt;li&gt;그 해의 목적함수 값을 계산한다.&lt;/li&gt;
&lt;li&gt;지금까지 본 것 중 가장 좋은 해를 저장한다.&lt;/li&gt;
&lt;li&gt;이 과정을 반복한다.&lt;/li&gt;
&lt;/ol&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;경사하강법 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경사하강법 알고리즘은 모든 점을 보지 않고 &lt;b&gt;현재 위치에서 더 좋아지는 방향을 따라 조금씩 이동하는 방식&lt;/b&gt;이다. 기계학습이 실제로 사용하는 전형적 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경사하강법 알고리즘은 다음과 같은 순서로 수행된다,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;난수로 초기 매개변수 &amp;theta;를 정한다.&lt;/li&gt;
&lt;li&gt;J(&amp;theta;)가 작아지는 방향 d_&amp;theta;를 구한다.&lt;/li&gt;
&lt;li&gt;그 방향으로 &amp;theta;를 업데이트 한다(반복).&lt;/li&gt;
&lt;li&gt;멈춤 조건을 만족하면 종료한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDySzp/dJMcahjMixi/rQNmXDQktUGb6rMARzgcb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDySzp/dJMcahjMixi/rQNmXDQktUGb6rMARzgcb1/img.png&quot; data-alt=&quot;미분을 이용한 경사하강법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDySzp/dJMcahjMixi/rQNmXDQktUGb6rMARzgcb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDySzp%2FdJMcahjMixi%2FrQNmXDQktUGb6rMARzgcb1%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;576&quot; height=&quot;473&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미분을 이용한 경사하강법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;미분에 의한 최적화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 미분의 식은 다음과 같다,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO8dXx/dJMcagylorL/2kdeKGEsNuUWna82bqIvq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO8dXx/dJMcagylorL/2kdeKGEsNuUWna82bqIvq1/img.png&quot; data-alt=&quot;1차 미분의 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO8dXx/dJMcagylorL/2kdeKGEsNuUWna82bqIvq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO8dXx%2FdJMcagylorL%2F2kdeKGEsNuUWna82bqIvq1%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;337&quot; height=&quot;73&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차 미분의 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 다음을 의미한다,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 f(x)의 순간 기울기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;f(x) &amp;gt; 0&lt;/b&gt;: 함수가 증가 중&lt;/li&gt;
&lt;li&gt;&lt;b&gt;f(x) &amp;lt; 0&lt;/b&gt;: 함수가 감소 중&lt;/li&gt;
&lt;li&gt;&lt;b&gt;f(x) = 0&lt;/b&gt;: 기울기가 0인 지점, 극값 후보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f'(x)는 함수의 기울기, 즉 값이 커지는 방향을 지시하는데, &lt;b&gt;-f'(x)의 방향으로 갈수록 목적함수의 최저점이 존재&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;644&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPR5s/dJMcafGeLXa/LdLVKwc1dlfmj0keYqk501/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPR5s/dJMcafGeLXa/LdLVKwc1dlfmj0keYqk501/img.png&quot; data-alt=&quot;미분 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPR5s/dJMcafGeLXa/LdLVKwc1dlfmj0keYqk501/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPR5s%2FdJMcafGeLXa%2FLdLVKwc1dlfmj0keYqk501%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;343&quot; height=&quot;181&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미분 예제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;편미분&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;변수가 여러개인 함수의 미분&lt;/b&gt;이다. 미분값이 이루는 벡터를&amp;nbsp;&lt;b&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;1046&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMUqFH/dJMcahRyB9f/UNqgfPOH7qTqTjM98jTQvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMUqFH/dJMcahRyB9f/UNqgfPOH7qTqTjM98jTQvk/img.png&quot; data-alt=&quot;편미분의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMUqFH/dJMcahRyB9f/UNqgfPOH7qTqTjM98jTQvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMUqFH%2FdJMcahRyB9f%2FUNqgfPOH7qTqTjM98jTQvk%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;543&quot; height=&quot;84&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;편미분의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝에서는 매개변수 집합 &amp;Theta;에 많은 변수가 있으므로 편미분을 사용한다.&lt;/p&gt;</description>
      <category>Machine Learning</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/46</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99#entry46comment</comments>
      <pubDate>Mon, 13 Apr 2026 15:03:31 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 개요</title>
      <link>https://rdhdevelop.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B0%9C%EC%9A%94</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인공지능이란&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;인공지능&lt;/span&gt;(Artificial Intelligence, AI)&lt;span&gt;은&lt;/span&gt; &lt;span&gt;쉽게&lt;/span&gt; &lt;span&gt;말해&lt;/span&gt; &lt;span&gt;&lt;b&gt;컴퓨터로&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;만들어진&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span&gt;&lt;b&gt;지능&lt;/b&gt;이다&lt;/span&gt;. &lt;span&gt;이는&lt;/span&gt; &lt;span&gt;사람에&lt;/span&gt; &lt;span&gt;의해&lt;/span&gt; &lt;span&gt;통상적으로&lt;/span&gt; &lt;span&gt;수행되는&lt;/span&gt; &lt;span&gt;지적인&lt;/span&gt; &lt;span&gt;작업을&lt;/span&gt; &lt;span&gt;자동화하는&lt;/span&gt; &lt;span&gt;것을&lt;/span&gt; &lt;span&gt;목표&lt;/span&gt;(Chollet, 2018)&lt;span&gt;로&lt;/span&gt; &lt;span&gt;한다&lt;/span&gt;. &lt;span&gt;인공지능은&lt;/span&gt; &lt;span&gt;통계적&lt;/span&gt; &lt;span&gt;머신러닝&lt;/span&gt;(statistical machine learning)&lt;span&gt;과&lt;/span&gt; &lt;span&gt;딥러닝&lt;/span&gt;(deep learning)&lt;span&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인공지능의 역사&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1950 ~ 1980년대: 부호적 AI(symbolic AI, 명시적 규칙을 부여하여 자동화 한 AI)에 치중&lt;/b&gt;하였다. 하지만, 부호적 AI는 다양한 인지적 오류/차이가 존재하는 인지 영역(이미지 처리, 자연어 해석 등)에서 한계를 드러내었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1957년: 퍼셉트론(perceptron, 기계적 학습규칙을 기초로 한 선형분류기법)의 등장으로 딥러닝 연구가 시작&lt;/b&gt;되었다. 하지만, 퍼셉트론은 XOR 조차 처리하지 못한다는 점에서 한계가 드러났다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1980년:&lt;/b&gt; 비션형 함수의 도입으로 &lt;b&gt;손실함수를 최소화&lt;/b&gt; 하는 학습법을 연구하기 시작하였다.&lt;/li&gt;
&lt;/ul&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;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;부호적 AI&lt;/b&gt;: 규칙을 입력하고 해답을 출력하는 구조.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;머신러닝&lt;/b&gt;&lt;span&gt;: &lt;/span&gt;데이터와&lt;span&gt; &lt;/span&gt;해답을&lt;span&gt; &lt;/span&gt;입력하고&lt;span&gt; &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;둘의&lt;span&gt; &lt;/span&gt;관계를&lt;span&gt; &lt;/span&gt;규명하며&lt;span&gt; &lt;/span&gt;통계적&lt;span&gt; &lt;/span&gt;규칙을&lt;span&gt; &lt;/span&gt;출력하는&lt;span&gt; &lt;/span&gt;구조&lt;span&gt;(&lt;/span&gt;손실함수를&lt;span&gt; &lt;/span&gt;최소화&lt;span&gt;(&lt;/span&gt;이&lt;span&gt; &lt;/span&gt;과정에서&lt;span&gt; &lt;/span&gt;오차의&lt;span&gt; &lt;/span&gt;제곱합&lt;span&gt;, &lt;/span&gt;로그&lt;span&gt; &lt;/span&gt;우도함수&lt;span&gt; &lt;/span&gt;사용&lt;span&gt;) &lt;/span&gt;함으로써&lt;span&gt; &lt;/span&gt;성능을&lt;span&gt; &lt;/span&gt;높힘&lt;span&gt;).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인공신경망&lt;/b&gt;&lt;span&gt;: 인간의 뇌 신경망을 모방해 만든 머신러닝 모델. 여러개의 &amp;nbsp;노드(뉴런)들이 층(layer) 형태로 연결되어 데이터를 처리하고 학습함. 입력층에서 데이터를 받아, 은닉층에서 특징을 추출하고, 출력층에서 결과 출력.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;딥러닝&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 인공신경망을 여러 층으로 깊게 쌓아 복잡한 패턴을 학습하는 머신러닝 방법.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이들의&lt;span&gt; &lt;/span&gt;관계를&lt;span&gt; &lt;/span&gt;정의하면&lt;span&gt; &lt;/span&gt;다음&lt;span&gt; &lt;/span&gt;그림과&lt;span&gt; &lt;/span&gt;같다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqUrIC/dJMcabw2cBs/TN2y59YMgZTejjUdqdZ32K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqUrIC/dJMcabw2cBs/TN2y59YMgZTejjUdqdZ32K/img.png&quot; data-alt=&quot;인공지능의 분류 및 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqUrIC/dJMcabw2cBs/TN2y59YMgZTejjUdqdZ32K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqUrIC%2FdJMcabw2cBs%2FTN2y59YMgZTejjUdqdZ32K%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;1672&quot; height=&quot;1416&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인공지능의 분류 및 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전통적 통계학 vs 통계적 머신러닝&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;중점&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전통적 통계학&lt;/b&gt;: 통계적 규칙(출력결과)의 통계적 추론*에 중점을 둠&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: 일반화 과정*을 통해 통계적 추론이 불가능한 데이터 적응 문제 해결에 중점&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*통계적 추론&lt;/b&gt;: 모형의 타당성 검증, 모형에 포함된 모수 추정량과 예측량에 대한 통계적/수학적 성질을 규명하는 것&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;머신러닝의 일반화(generalization) 과정: &lt;/b&gt;데이터를 학습데이터(training data)를 통해 모형을 설정하고 모수를 추정한 후 never-seen-before 데이터인 시험데이터(test data)를 통해 성능 점검&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전통적 통계학&lt;/b&gt;: 통계학을 다변량, 시계열, 범주형 등으로 &lt;b&gt;자료의 특성에 따라&lt;/b&gt; 분류/세분화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;y(목적변수)의 관측 여부에 따라&lt;/b&gt; 지도학습, 비지도학습으로 분류&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;통계적 머신러닝 vs 딥러닝&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데이터 크기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;중/소 크기&lt;/b&gt;. 데이터의 크기가 매우 클 때 적용하기 어려움&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝&lt;/b&gt;: &lt;b&gt;빅데이터&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;하드웨어&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;중급&lt;/b&gt;. 데이터의 크기가 커짐에 따라 추정해야 할 모수가 증가하지 않으면 모형의 정밀도가 일정 수준에 머물러 있음(추정해야 할 모수가 커져도 특성변수(x 변수의 수)의 선택/변환/생성에 한계.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝&lt;/b&gt;: &lt;b&gt;고성능(GPU 요구)&lt;/b&gt;. 간단하고 명확한 방법을 스스로 특성변수를 선택/변환/생성.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;분석자료 형태&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;2차원 텐서*&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝&lt;/b&gt;: &lt;b&gt;2차원 이상 텐서&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;텐서&lt;/b&gt;; 0차원 텐서: 실수, 1차원 텐서: 벡터, 2차원 텐서: 행렬, 3차원/4차원 텐서: 이미지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최적화(손실함수(예측치와 실측치 사이의 척도)를 최소화 하는 과정)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;모든 데이터 이용&lt;/b&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝&lt;/b&gt;: &lt;b&gt;batch(배치, 전체 데이터 중 일부) 활용&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;모형&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;매우 많음&lt;/b&gt;. 데이터의 형태와 성격, 연구목적에 특화된 모형을 제공해야 함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;머신러닝&lt;/b&gt;: &lt;b&gt;3개&lt;/b&gt;. 크게 MLP, CNN, RNN의 모형만 이해하면 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특성변수의 정규화 및 표준화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: 선택. 모형의 적합도와 해석에 용이성에 의거하여 달라짐.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;머신러닝&lt;/b&gt;: &lt;b&gt;필요&lt;/b&gt;. 최적화를 위해 필수적.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해석여부&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;통계적 머신러닝&lt;/b&gt;: &lt;b&gt;간단함&lt;/b&gt;. 특성변수와 목적변수 y의 관계가 비교적 간단하게 나타남.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;딥러닝&lt;/b&gt;: &lt;b&gt;불가능&lt;/b&gt;. 특성변수와 선형결합과 비선형변환을 반복적으로 사용하여 해석 불가능.&lt;/li&gt;
&lt;/ul&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi8MX7/dJMcabX70Sx/uK49YqBAv1pfF4pvzMneGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi8MX7/dJMcabX70Sx/uK49YqBAv1pfF4pvzMneGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi8MX7/dJMcabX70Sx/uK49YqBAv1pfF4pvzMneGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi8MX7%2FdJMcabX70Sx%2FuK49YqBAv1pfF4pvzMneGk%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;472&quot; height=&quot;304&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;480&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRiItB/dJMcadVTA03/yKAh49HziVDZGKfawR3fWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRiItB/dJMcadVTA03/yKAh49HziVDZGKfawR3fWk/img.png&quot; data-alt=&quot;자료의 크기에 따른 정밀도 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRiItB/dJMcadVTA03/yKAh49HziVDZGKfawR3fWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRiItB%2FdJMcadVTA03%2FyKAh49HziVDZGKfawR3fWk%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;852&quot; height=&quot;432&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자료의 크기에 따른 정밀도 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;머신러닝의 분류&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;지도학습 vs 비지도학습 vs 강화학습&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;지도학습(Supervised learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;labeled data 또는 해답자료 y가 있는 자료를 대상으로 하는 방법&lt;/b&gt;이다. y의 예측이 주 목적이다.&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;해답 y가 관측되므로 도출된 패턴의 정밀도 점검이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;분류학습(classification)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;y가 범주형 변수(categorical variable)일 경우이다.&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;예를 들어보면, e-mail이 스팸인지 아닌지를 구분, 손글씨 인식, 얼굴 인식 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;회귀학습(regression)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;y가 연속형 변수(continuous variable)일 경우이다.&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 style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*입력자료 x: 특성, 속성, 공변량을 의미&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*해답자료 y: 출력, 반응 변수를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;비지도학습(Unsupervised learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해답인 y가 존재하지 않는 자료를 대상으로 하는 방법&lt;/b&gt;이다. 자료에 숨겨진 구조를 찾고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 해답인 y가 없기 때문에 찾아낸 구조나 패턴의 정밀도 검증이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 방법에는 &lt;b&gt;군집&lt;/b&gt;(clustering, x변수의 유사성을 이용해 표본을 몇 개의 그룹으로 분류)과 &lt;b&gt;잠재요인추출&lt;/b&gt;(latent factor extraction, x에서 관측되지 않은 잠재요인을 추출해 내는 방법)이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;강화학습(Reinforcement learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주어진 환경에 의해 시스템의 성능을 향상시키는 머신러닝 방법&lt;/b&gt;이다. 어떤 행동을 했을 대 받는 봇아에 따라 미래의 행동을 바꿔 가는 매커니즘을 기본 아이디어로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강화학습은 게임이나 로봇 공학에 주로 사용된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;전체학습 vs 배치학습&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전체학습&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체자료를 이용해 손실함수를 최소화 &lt;/b&gt;하는 방법이다. 주로 통계적 머신러닝에서 사용되는 최적화 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;배치학습(batch learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전체 자료를 일정한 크기의 배치단위로 나누어 역전파를 통해 손실함수를 최소화&lt;/b&gt; 하는 방법이다. 딥러닝은 이러한 배치학습을 기본으로 한다. 왜냐하면 통계적 머신러닝과 달리 딥러닝 손실함수는 국소최소(local minimum)와 안장점(saddle point)가 존재하여 이를 피해 최적화를 실행하기 위해서다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사례기반 vs 모형기반&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사례기반(Instance-based learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특성변수 X를 기반으로 관측치 x 주변에 가장 많은 클래스로 관측치 x의 클래스를 부여한다든지 하는 등의 학습 방법이다. 자료 자체가 모형이기 때문에 학습 자료를 계속해서 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbESl0/dJMcaciqQYc/vIVHevsJWdeOMhodLF6Yo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbESl0/dJMcaciqQYc/vIVHevsJWdeOMhodLF6Yo0/img.png&quot; data-alt=&quot;사례기반 분석의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbESl0/dJMcaciqQYc/vIVHevsJWdeOMhodLF6Yo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbESl0%2FdJMcaciqQYc%2FvIVHevsJWdeOMhodLF6Yo0%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;1600&quot; height=&quot;974&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사례기반 분석의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;모형기반(Model-based learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 함수 f를 이용해 f(x)를 y의 예측치로 하는 학습 방법&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;1752&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7EGc/dJMcabcIScR/0NngEkCcBh0ybjImNDZXKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7EGc/dJMcabcIScR/0NngEkCcBh0ybjImNDZXKk/img.png&quot; data-alt=&quot;모형기반 분석의 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7EGc/dJMcabcIScR/0NngEkCcBh0ybjImNDZXKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7EGc%2FdJMcabcIScR%2F0NngEkCcBh0ybjImNDZXKk%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;1752&quot; height=&quot;916&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모형기반 분석의 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;머신러닝의&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;분석&lt;/b&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;절차&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Step1. 자료의 사전 정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서는 &lt;b&gt;주어진 자료를 실수로 구성된 텐서로 전환&lt;/b&gt;하는 것 부터 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, &lt;b&gt;결측치 및 이상치, 불균형자료를 처리&lt;/b&gt;한다. 머신러닝 모형은 직접 결측치(missing data)를 처리할수 없으므로 이들을 대체(imputation) 하거나 제외시킨다.&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;One-hot vectorization, Word2Vec, Glove(natural language) 등의 &lt;b&gt;데이터의 벡터화&lt;/b&gt; 작업을 수행하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수들의 특성을 파악하여 &lt;b&gt;분석의 조건과 모형기준을 선택&lt;/b&gt;하는데 이 과정에서 &lt;b&gt;자료의 정규화* 및 표준화*&lt;/b&gt;를 통해 성능을 높일 수 있다.&lt;/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;이후, 통계학의 표본추출(sampling) 기법을 통해 데이터셋을 &lt;b&gt;학습 데이터(training dataset)와 시험 데이터(test dataset)로 분할&lt;/b&gt;한다. 학습데이터에서는 분석모형의 선택과 모수추정을 하게 되고, 시험 데이터에서는 학습 데이터에서 추정된 모형의 성능(generalization performance)을 측정하여 과대적합(overfitting)/과소적합(underfitting) 여부를 판단한다.&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*정규화(normalization): 특성변수의 값을 0 ~ 1의 값으로 치환하는 것&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*표준화(standardization): 특성변수를 평균이 0, 분산이 1을 갖도록 변환하는 것&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Step2. 학습&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 학습의 과정에서 선택할 수 있는 모델은 다음과 같다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Na&amp;iuml;ve Bayesian&lt;/li&gt;
&lt;li&gt;Logistic analysis&lt;/li&gt;
&lt;li&gt;Linear discriminant analysis (LDA)&lt;/li&gt;
&lt;li&gt;Support vector machine (SVM)&lt;/li&gt;
&lt;li&gt;Decision tree&lt;/li&gt;
&lt;li&gt;K-nearest neighbors&lt;/li&gt;
&lt;li&gt;..etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;회귀&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ordinary least squares&lt;/li&gt;
&lt;li&gt;Ridge regression&lt;/li&gt;
&lt;li&gt;LASSO&lt;/li&gt;
&lt;li&gt;Elastic net linear regression&lt;/li&gt;
&lt;li&gt;KNN with decision tree&lt;/li&gt;
&lt;li&gt;Kernelized SVM&lt;/li&gt;
&lt;li&gt;..etc&lt;/li&gt;
&lt;/ul&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;학습 데이터를 2개 이상의 batch(분할 데이터)로 나눈다.&lt;/li&gt;
&lt;li&gt;이 배치를 이용하여 손실함수를 줄이는 방향으로 모수를 최신화한다(interation).&lt;/li&gt;
&lt;li&gt;1 에폭(epoch) 최신화(모든 배치 최신화 완료)를 완료하면 이를 반복한다.&lt;/li&gt;
&lt;li&gt;여러번의 에폭을 통해 모델의 성능을 최대화 했다는 것은 모델의 정밀도가 원하는 수준까지 도달했다는 것을 의미한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 2단계를 더 자세히 살펴보면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2.1 Training 데이터를 이용하여 참값과 예측값의 거리로 정의되는 손실함수를 계산하고, 이 함수에 대한 모수의 미분 값에 아주 작은 값을 곱한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2.2 전 단계의 모수값에 앞에서 산출된 값을 차감하여 모수를 갱신한다(경사하강법).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2.3 손실함수가 최소가 되도록 위의 과정을 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2.4 Validation 데이터는 *초모수를 선택할 때 사용하며 학습 과정에서 과대적합 문제를 파악할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;*초모수: 모수를 결정하는 상위 수준의 모수&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Step3. 평가 및 예측&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습의 마지막 단계이다. 학습 및 검증에 사용되지 않은 시험 데이터(test data)를 통해 이뤄진다.&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;학습한 모형에 대해, 학습데이터에서의 손실함수값과 시험데이터에서의 손실함수 값의 차이(generalization error)로 모형을 평가한다.&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;과대적합(overfitting)이 발생했을 경우, 자료의 크기를 증가시켜 해결할 수 있다. 이가 어려울 경우, 모수에 제한을 두는 규제화(regularization)이나 앙상블학습(ensemble learning)을 통해 모형을 단순화 하여 해결할 수 있다.&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;통계적 기계학습의 경우 L1* 또는 L2* 규제화를 통해 과대적합(overfitting)을 해결하며 딥러닝의 경우 L1, L2 규제화, batch normalization*, dropout*, downsizing* 등을 통해 과대적합(overfitting)을 해결한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step1-3의 일련의 과정을 도식화하면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;1378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFy6rr/dJMcaaZcCe5/P47JWaLJ57EiAtBmgmdaW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFy6rr/dJMcaaZcCe5/P47JWaLJ57EiAtBmgmdaW1/img.png&quot; data-alt=&quot;머신러닝의 분석 절차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFy6rr/dJMcaaZcCe5/P47JWaLJ57EiAtBmgmdaW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFy6rr%2FdJMcaaZcCe5%2FP47JWaLJ57EiAtBmgmdaW1%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;1208&quot; height=&quot;1378&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;1378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;머신러닝의 분석 절차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine Learning</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/45</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EA%B0%9C%EC%9A%94#entry45comment</comments>
      <pubDate>Sun, 12 Apr 2026 22:17:03 +0900</pubDate>
    </item>
    <item>
      <title>상속</title>
      <link>https://rdhdevelop.tistory.com/entry/%EC%83%81%EC%86%8D</link>
      <description>&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 상속이란&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;상속(Inheritance)을 통해 자식 클래스는 부모 클래서의 멤버를 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPj2Md/dJMcahi08bt/k0oi3KitAJsK1GEiWYr5U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPj2Md/dJMcahi08bt/k0oi3KitAJsK1GEiWYr5U0/img.png&quot; data-alt=&quot;멤버 상속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPj2Md/dJMcahi08bt/k0oi3KitAJsK1GEiWYr5U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPj2Md%2FdJMcahi08bt%2Fk0oi3KitAJsK1GEiWYr5U0%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;1462&quot; height=&quot;570&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;멤버 상속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;상속을 사용하면 코드의 중복을 줄일수 있고 개발 시간이 줄어든다. 다음 A와 B 클래스를 살펴보자.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;A.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770273087594&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class A {
	int field1;
	void method1() { ... }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;B.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770273121619&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class B extends A {
	String field2;
    void method2() { ... }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;실행문&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770273170314&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;B b = new B();
b.field1 = 10;
b.method1();

b.field2 = &quot;홍길동&quot;;
b.method2();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;실행문에서의 B 객체는 A로 부터 물려받은 필드와 메소드를 사용 할 수 있다. 만약 field2의 수정만 필요하다면 B.java만을 수정함으로써 수정에 필요한 리소스를 최소화 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;다만, 상속을 해도 자식은 부모의 모든 멤버를 물려받는 것은 아니다. private 접근 제한을 갖는 필드와 메소드는 상속대상에서 제외된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 클래스 상속&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;상속은 아래와 같이 extends 를 통해 이뤄진다.&lt;/p&gt;
&lt;pre id=&quot;code_1770273319500&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class 자식클래스 extends 부모클래스 {
	//필드
    //생성자
    //메소드
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;다만 java는 다른 언어와 달리 다중 상속을 허용하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1770273354888&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class 자식클래스 extends 부모클래스1, 부모클래스2 { //불가능하다
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 부모 생성자 호출&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;모든 객체는 클래스의 생성자를 호출해야만 생성된다. 부모 객체도 예외는 아닌데, 부모 객체를 생성하기 위한 부모 생성자는 자식 생성자의 맨 첫줄에서 호출된다. 생성자가 명시적으로 선언되지 않았다면 컴파일러는 다음과 같이 기본 생성자를 생성한다(직접 선언할 경우도 다음과 같이 작성하면 된다).&lt;/p&gt;
&lt;pre id=&quot;code_1770273641639&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;자식클래스(매개변수 선언, ... ) {
	super(매개값, ... );
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;부모 클래스에 기보 생성자가 없고 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 super를 통해 명시적으로 호출해야 한다. 이를 응용한 다음의 코들르 살펴보자.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;부모 클래스&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770273759898&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class People {
	public String name;
    public String ssn;
    
    public People(String name, String ssn) {
    	this.name = name;
        this.ssn = ssn;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;자식 클래스&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770273797150&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Student extends People {
	public int studentNo;
    
    public Student(String name, String ssn, int studentNo) {
    	super(name, ssn);
        this.studentNo = studentNo;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;자식 객체 이용&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770274098438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StudentExample {
	public static void main(String[] args) {
    	Student student = new Student(&quot;홍길동&quot;, &quot;123456-1234567&quot;, 1);
        
        //부모에서 물려받은 필드
        System.out.println(&quot;name : &quot; + student.name);
        System.out.println(&quot;ssn : &quot; + student.ssn);
        
        //Student 클래스의 필드
        System.out.println(&quot;studentNo : &quot; + student.studentNo);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 메소드 재정의&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;부모 클래스의 모든 메소드가 자식 클래스에서 활용하기에 딱 맞게 작성되었다면 좋겠지만, 그렇지 못할 때가 많다. 그럴 경우 자식 클래스에서는 부모 클래스의 메소드를 오버라이딩(Overriding) 함으로써 자식 클래스에서 더 활용하기 좋도록 만든다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 @Override&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;메소드가 오버라이딩 되었다면 부모 객체의 메소드는 숨겨지고, 자식 객체의 오버라이딩된 메소드가 호출된다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;메소드를 오버라이딩 할 때는 다음 규칙에 의거하여 작성해야 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다.&lt;br /&gt;2. 접근 제한을 더 강하게 오버라이딩 할 수 없다(ex. 부모가 public 인 경우 오버라이딩 시 default나 private 불가).&lt;br /&gt;3. 새로운 예외를 throws 할 수 없다.&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 super&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;자식 클래스에서 숨겨진 부모 클래스의 메소드를 사용할 경우 명시적으로 super 키워드를 붙여서 호출할 수 있다. 다음의 예시를 살펴보자.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Airplane.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770274587889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Airplane {
	public void land() {
    	System.out.println(&quot;착륙합니다.&quot;);
    }
    
    public void fly() {
    	System.out.println(&quot;비행합니다.&quot;);
    }
    
    public void takeOff() {
    	System.out.println(&quot;이륙합니다.&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;SupersonicAirplane.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770274973377&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SutersonicAirplane extends Airplane {
	public static final int NORMAL = 1;
    public static final int SUPERSONIC = 2;
    
    public int flyMode = NORMAL;
    
    @Override
    public void fly() {
    	if(flyMode == SUPERSONIC) {
        	System.out.println(&quot;초음속 비행합니다.&quot;);
        } else {
        	//Airplane 객체의 fly 메소드 호출
        	super.fly();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. final 클래스와 final 메소드&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1 final 클래스&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 선언 시 final 키워드를 붙이면 해당 클래스를 상속할 수 없게 된다. 즉 final 클래스는 부모 클래스가 될 수 없다는 뜻이다.&lt;/p&gt;
&lt;pre id=&quot;code_1770293939580&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final class ClassName { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 final 메소드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 선언 시 final 키워드를 붙이면 해당 메소드는 오버라이딩 할 수없는 메소드가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1770294011955&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final 리턴타입 메소드(매개변수, ... ) { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 타입 변환과 다형성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성이란 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 이런 다형성을 위해 자바는 자식 클래스가 부모 클래스로 타입 변환을 허용한다. 즉, 부모 타입에 모든 자식 객체가 대입될 수 있는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.1 자동 타입 변환(Promotion)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 타입 변환은 프로그램 실행 도중에 자동적으로 일어난다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;부모클래스 변수 = 자식클래스타입;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 자식클래스타입이 부모클래스의 타입으로 자동 형변환 된다. 예를 들어, 다음 두 클래스를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Animal.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770387929802&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal {
	void sound() { System.out.println(&quot;동물 소리&quot;); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Dog.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770387981272&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Dog extends Animal {
	@Override
    void sound() { System.out.println(&quot;멍멍&quot;); }
    
    void wagTail() { System.out.println(&quot;꼬리 흔들기&quot;); }
}&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;위 코드에서 Animal과 Dog 클래스는 상속 관계를 이루고 있다. Dog 클래스로부터 Dog 객체를 생성하고 이것을 Animal 변수에 대입하면 자동 타입 변환이 일어난다.&lt;/p&gt;
&lt;pre id=&quot;code_1770388094006&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Dog dog = new Dog();
Animal animal = dog;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Dog는 Animal로 업케스팅이 일어난다. 이 말은 즉, dog가 가리키는 객체 참조를 Animal 타입 변수인 animal에 넣기 위해 그 참조를 Animal로 취급한다는 뜻이다. Dog가 부모 타입으로 해석 되는 것이다. dog 변수와 animal 변수는 둘다 같은 Dog 객체를 가리킨다.&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;i&gt;Parent.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770388627370&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Parent {
	public void method1() {
    	System.out.println(&quot;Parent-method1()&quot;);
    }
    
    public void method2() {
    	System.out.println(&quot;Parent-method2()&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Child.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770388667345&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Child extends Parent {
	@Override
    public void method2() {
    	System.out.println(&quot;Child-method2()&quot;);
    }
    
    public void method3() {
    	System.out.println(&quot;Child-method3()&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;ChildExample.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770388735066&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ChildExample {
	public static void main(String[] args) {
    	Child child = new Child();
        
        Parent parent = child;
        parent.method1();
        parent.method2();	//Override 된 메소드가 호출됨
        //parent.method3(); //호출 불가능
    }
}&lt;/code&gt;&lt;/pre&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;1140&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnh5uJ/dJMcaaqEmlW/BbPSmnZX8mMl8hJvST1g7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnh5uJ/dJMcaaqEmlW/BbPSmnZX8mMl8hJvST1g7k/img.png&quot; data-alt=&quot;Parent와 Child간 메소드 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnh5uJ/dJMcaaqEmlW/BbPSmnZX8mMl8hJvST1g7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnh5uJ%2FdJMcaaqEmlW%2FBbPSmnZX8mMl8hJvST1g7k%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;1140&quot; height=&quot;488&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Parent와 Child간 메소드 호출&lt;/figcaption&gt;
&lt;/figure&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;1568&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FU8oQ/dJMcagqQ62V/Kf3mgLjXiFJBiAn6LeIDUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FU8oQ/dJMcagqQ62V/Kf3mgLjXiFJBiAn6LeIDUk/img.png&quot; data-alt=&quot;비유를 통한 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FU8oQ/dJMcagqQ62V/Kf3mgLjXiFJBiAn6LeIDUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFU8oQ%2FdJMcagqQ62V%2FKf3mgLjXiFJBiAn6LeIDUk%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;1568&quot; height=&quot;750&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비유를 통한 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.2 매개 변수의 다형성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 타입 변환은 주로 메소드를 호출할 때 발생한다. 예를 들어 다음과 같이 Driver 클래스가 있다고 하자.&lt;/p&gt;
&lt;pre id=&quot;code_1770389365181&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Driver {
	void drive(Vehicle vehicle) {
    	vehicle.run();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;drive 메소드를 정상적으로 호출한다면 다음과 같을 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1770389411512&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Driver driver = new Driver();
Vehicle vehicle = new Vehicle();
driver.drive(vehicle);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 다음 코드와 같이 Vehicle이 아닌 그의 자식 클래스인 Bus를 넘겨주도록 하자.&lt;/p&gt;
&lt;pre id=&quot;code_1770389484531&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Driver driver = new Driver();
Bus bus = new Bus();
dirver.drive(bus); // 자동 타입 변환 발생: &quot;Vehicle vehicle = bus&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 알 수 있는 점은, 매개 변수 타입이 클래스인 경우 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다. 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과는 달라진다(매개 변수의 다형성).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.3 강제 타입 변환(Casting)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강제 타입 변환은 부모 타입을 자식 타입으로 변환하는 것을 말한다.&lt;/p&gt;
&lt;pre id=&quot;code_1770389641922&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Parent.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770389751488&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Parent {
	public String field1;
    
    public void method1() {
    	System.out.println(&quot;Parent-method1()&quot;);
    }
    
    public void method2() {
    	System.out.println(&quot;Parent-method2()&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Child.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770389791676&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Child extends Parent {
	public String field2;
    
    public void method3() {
    	System.out.println(&quot;Child-method3()&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;ChildExample.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770390045866&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ChildExample {
	public static void main(String[] args) {
    	Parent parent = new Child();	//자동 타입 변환
        parent.field1 = &quot;data1&quot;;
        parent.method1();	//실행 결과: Parent-method1()
        parent.method2();	//실행 결과: Parent-method2()
        //parent.field = &quot;data2&quot;;	//실행 불가능
        //parent.method3();			//실행 불가능
        
        Child child = (Child) parent;
        child.field2 = &quot;yyy&quot;;	//실행 결과: (가능)
        child.method3();		//실행 결과: Child-method3()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 강제 타입 변환은 자식 타입이 부모 타입으로 변환되어 잇는 상태에서만 가능하기 때문에 다음과 같이 부모 타입의 변수가 부모 객체를 참조할 경우 자식 타입으로 변환할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1770390158057&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Parent parent = new Parent();
Child child = (Child) parent;	//강제 타입 변환을 할 수 없다&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.4 객체 타입 확인(instanceof)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 객체가 어떤 클래스의 인스턴스인지 확인하려면 instanceof 연산자를 통해 확인 가능하다.&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;instanceof 연산자의 좌항은 객체가 오고, 우항은 타입이 온다. 좌항의 객체가 우항의 인스턴스이면 true를 산출하고 그렇지 않으면 false를 산출한다.&lt;/p&gt;
&lt;pre id=&quot;code_1770390241777&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean result = 좌항(객체) instanceof 우항(타입)&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;메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;InstanceofExample.java&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770390446144&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class InstanceofExample {
	public static void method1(Parent parent) {
    	if (parent instanceof Child) { //Child 타입으로 변환이 가능한지 확인
        	Child child = (Child) parent;
            System.out.println(&quot;method1 - Child로 변환 성공&quot;);
        } else {
        	System.out.println(&quot;method1 - Child로 변환 실패&quot;);
        }
    }
    
    ...
        
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 추상 클래스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다. 이러한 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라 한다. 실체 클래스는 추상 클래스를 상속하는 관계를 가진다. 예를 들어, 추상 클래스 Animal.class와 실체 클래스 Bird.class, Insect.class, Fish.class가 있다고 하자. Bird.class, Insect.class, Fish.class는 Animal.class를 상속한다.&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;추상 클래스는 new 연산자를 통해 인스턴스를 생성할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1770294297481&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Animal animal = new Animal();&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;blockquote data-ke-style=&quot;style2&quot;&gt;1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적&lt;br /&gt;2. 실체 클래스를 작성할 때 시간 절약&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7.1 추상 클래스 선언&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상 클래스는 abstract 키워드를 통해 선언할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1770294422112&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public abstract class ClassName {
	//필드
    //생성자
    //메소드
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7.2 추상 메소드와 오버라이딩&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 살펴본 Animal 추상 클래스에서 sound()라는 울음소리 메소드를 정의했다고 하자. 그러나 실체 클래스마다 울음소리가 달라져야 한다. 이를 위해 추상 클래스에 sound() 를 작성하지 않자고 하니, 각 실체 클래스가 sound()를 깜빡하고 작성하지 않으면 어떡하지 하는 불안감이 생긴다. 이를 위해 추상 클래스는 추상 메소드를 선언할 수 있도록 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1770294585689&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public abstract calss Animal {
	publc abstract void sound();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 자식 클래스는 이 추상 메소드를 반드시 사용해야 한다. 이때 오버라이딩을 통해 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1770294682647&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Dog extands Animal {
	public Dong() {
    	this.kind = &quot;포유류&quot;;
    }
    
    @Override
    public void sound() {
    	System.out.println(&quot;멍멍&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Science/Java</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/44</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EC%83%81%EC%86%8D#entry44comment</comments>
      <pubDate>Sat, 7 Feb 2026 00:07:40 +0900</pubDate>
    </item>
    <item>
      <title>클래스</title>
      <link>https://rdhdevelop.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4</link>
      <description>&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1. 객체 지향 프로그래밍&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;객체 지향 프로그래밍(OOP; Object Oriented Programming)이란 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 뜻한다. 현실 세계에서도 어떤 제품을 만들 때 부품을 하나씩 조립해서 완성된 제품을 만드는 것과 동일하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.1 객체란&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;객체(Object)란 물리적/추상적으로 존재하는 것 중 자신의 속성을 가지고 다른 객체들과 구분 가능한 것을 말한다. 예를 들면, 물리적으로는 사람, 자동차 등이 있고 추상적으로는 주문, 수업 등이 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 객체는 &lt;b&gt;필드(field, &lt;/b&gt;속성&lt;b&gt;)&lt;/b&gt;과 &lt;b&gt;메소드(method, &lt;/b&gt;동작&lt;b&gt;)&lt;/b&gt;으로 구성되어 있다. 예를 들면, 사람이라는 객체는 이름, 나이 등의 속성을 가지고 있다. 속성으로는 웃다, 일하다 등이 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;현실 세계의 객체는 객체 모델링(Object Modeling)을 통해 소프트웨어 객체로 설계되어진다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.2 객체의 상호작용과 관계&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;객체는 각각 독립적으로 존재하고, 다른 객체들과 서로 메소드 호출하며 상호작용한다. 메소드 호출은 다음과 같이 도트 연산자를 활용하여 사용할 수 있다. 도트 연산자는 객체의 필드와 메소드에 접근할 때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769590645239&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;리턴값 = 객체.메소드(매개값1, 매개값2 ... );&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&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;1246&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrWPB/dJMcaajOHWP/rmaGPwvDYKW1xEvkGoi0i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrWPB/dJMcaajOHWP/rmaGPwvDYKW1xEvkGoi0i0/img.png&quot; data-alt=&quot;자동차를 구성하는 부품 객체들의 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrWPB/dJMcaajOHWP/rmaGPwvDYKW1xEvkGoi0i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrWPB%2FdJMcaajOHWP%2FrmaGPwvDYKW1xEvkGoi0i0%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;1246&quot; height=&quot;976&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자동차를 구성하는 부품 객체들의 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;여기서 엔진, 타이어, 핸들은 &lt;b&gt;집합 관계&lt;/b&gt;이다. 사람은 자동차를 사용하므로 사람과 자동차는 &lt;b&gt;사용 관계&lt;/b&gt;이다. 그리고 기계(상위)와 자동차(하위)는 &lt;b&gt;상속 관계&lt;/b&gt;이다(상속 관계는 상위(부모) 객체를 기반으로 하여 하위(자식) 객체를 생성하는 관계이다).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.3 객체 지향 프로그래밍의 특징&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.3.1 캡슐화&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;캡슐화란 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 제공하는 필드와 메소드만을 이용할 수 있다. 이때 접근 제한자(Access Modifier)를 사용한다. &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이는 외부의 잘못된 사용으로 인해 객체가 손상되지 안도록 보호하기 위함이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP2Dp1/dJMcacBWnhf/KSR3476R3hImW1jaqdK6u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP2Dp1/dJMcacBWnhf/KSR3476R3hImW1jaqdK6u0/img.png&quot; data-alt=&quot;캡슐화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP2Dp1/dJMcacBWnhf/KSR3476R3hImW1jaqdK6u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP2Dp1%2FdJMcacBWnhf%2FKSR3476R3hImW1jaqdK6u0%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;1218&quot; height=&quot;580&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;캡슐화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.3.2 상속&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;부모(상위) 객체는 자기가 가지고 있는 필드와 메소드를 자식(하위) 객체에게 물려준다. 자식 객체는 부모가 물려준 부모의 필드와 메소드를 사용할 수 있게 된다. &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이를 통해 하위 객체는 더 쉽고 빠른 개발이 가능하다. 코드의 재사용성 또한 증가한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.3.3 다형성&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 잇는 성질을 다형성이라 한다. 얘를 들어 자동차를 설계할 때 타이어 인터페이스 타입을 적용 했다면, 적용된 인터페이스를 구현한 타이어들은 어떤 것이든 장착 가능하다..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3nkS1/dJMcabpuJVu/pzckUwVsLWMPgocAQo5HJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3nkS1/dJMcabpuJVu/pzckUwVsLWMPgocAQo5HJK/img.png&quot; data-alt=&quot;다형성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3nkS1/dJMcabpuJVu/pzckUwVsLWMPgocAQo5HJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3nkS1%2FdJMcabpuJVu%2FpzckUwVsLWMPgocAQo5HJK%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;1370&quot; height=&quot;828&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다형성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2. 객체와 클래스&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이러한 객체는 설계도를 바탕으로 만들어진다. 자바에서는 이 설계도를 &lt;b&gt;클래스(class)&lt;/b&gt;라고 한다. 클레스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다. 클래스를 통해 만들어진 객체를 해당 클래스의&amp;nbsp;&lt;b&gt;인스턴스(instance)&lt;/b&gt;라고 한다. 각각의 자동차 객체는 자동차 클래스의 인스턴스인 셈이다. 이렇게 인스턴스를 만드는 과정을 인스턴스화라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3. 클래스 선언&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스 이름의 작성 규칙은 다음 테이블을 따른다. 클래스 이름은 영어든 한국어든 상관 없으나 통상적으로 영어로 작성한다. 이 과정에서 첫 글자는 대문자, 나머지는 캐멀 케이스를 따른다.&lt;/span&gt;&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 style=&quot;width: 50%;&quot;&gt;&lt;b&gt;작성 규칙&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;예&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;하나 이상의 문자로 구성&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Car, SportsCar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;첫 번째 글자는 숫자 불가&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Car (O)&lt;br /&gt;3Car (X)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;'$', '_' 외 특수 문자는 사용 불가&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;$Car, _Car (O)&lt;br /&gt;@Car, #Car (X)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;자바 키워드 사용 불가&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;int (x)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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_1769591663440&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ClassName {
}&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_1769591765306&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Car {

}

class Tire {

}&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;두 개이상의 클래스가 선언된 소스 파일을 컴파일 하면 바이트 코드 파일(.class)은 클래스를 선언 한 개수만큼 생긴다. 소스 파일은 클래스 선언을 담고 있는 저장 단위일 뿐 클래스 자체가 아니기 때문이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;4. 객체 생성과 클래스 변수&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스는 다음과 같이 &lt;b&gt;new&lt;/b&gt; 연산자를 통해 사용할 수 있다. new는 클래스로부터 객체를 생성시키는 연산자이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769591867322&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new ClassName();&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;new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다. 이후 객체의 주소를 반환한다. 이 주소를 참조 타입인 클래스 변수에 저장해 두면 변수를 통해 객체를 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1769591956964&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ClassName Var;
Var = new ClassName();&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_1769592039297&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Student {
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1769592125715&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class StudentExample {
	public static void main(String[] args) {
    	Student s1 = new Student();
        System.out.println(&quot;s1 변수가 Student 객체를 참조합니다.&quot;);
        
        Student s2 = new Student();
        System.out.println(&quot;s2 변수가 또 다른 Student 객체를 참조합니다.&quot;);
    }
}&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;이 코드가 실행되면 메모리에 클래스 변수와 객체가 생성된다. Student 클래스는 하나지만 new 연산자를 사용한 만큼 객체가 메모리에 생성된다. 이렇게 생성된 s1, s2는 Student의 인스턴스다.&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;이 코드에서 Student 클래스는&amp;nbsp;&lt;b&gt;라이브러리(API)&lt;/b&gt; 용이다. 다른 클래스에서 이용될 목적으로 설계되었기 때문이다. 그리고 StudentExample은&amp;nbsp;&lt;b&gt;실행 클래스&lt;/b&gt;이다. 물론 Student에 main() 메소드를 작성해서 실행 클래스로 만들 수 있다. 가급적이면 두 클래스는 서로 분리하여 작성해야 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;5. 클래스의 구성 멤버&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;클래스의 구성 멤버로는 &lt;b&gt;필드(Field)&lt;/b&gt;, &lt;b&gt;생성자&lt;/b&gt;&lt;b&gt;(Constructor)&lt;/b&gt;, &lt;b&gt;메소드(Method)&lt;/b&gt;가 있다. 이 구성 멤버들은 생략되거나 복수 개가 작성될 수도 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5ayFe/dJMcaia5sgU/LVrmBWMXQ5jmaK3bD4XAR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5ayFe/dJMcaia5sgU/LVrmBWMXQ5jmaK3bD4XAR0/img.png&quot; data-alt=&quot;클래스의 구성 멤버&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5ayFe/dJMcaia5sgU/LVrmBWMXQ5jmaK3bD4XAR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5ayFe%2FdJMcaia5sgU%2FLVrmBWMXQ5jmaK3bD4XAR0%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;1510&quot; height=&quot;750&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스의 구성 멤버&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;6. 필드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다. 선언 형태는 변수와 비슷하지만 엄연히 변수와는 구분된다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;6.1 필드 선언&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;필드는 클래스 중괄호 블록 내라면 어디든지 선언가능하다. 하지만, 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없다(이때는 모두 로컬 변수가 된다). 필드의 타이븡로는 기본 타입(byte, int, ...)와 참조 타입(배열, 클래스, 인터페이스)이 모두 올 수 있다. 초기값이 지정되지 않은 필드들은 다음 테이블에 따라 기본 초기값을 가진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 162px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 26.860465%; height: 18px;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.139535%; height: 18px;&quot;&gt;&lt;b&gt;데이터 타입&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;&lt;b&gt;초기값&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 90px;&quot;&gt;
&lt;td style=&quot;width: 12.790698%; height: 126px;&quot; rowspan=&quot;3&quot;&gt;기본 타입&lt;/td&gt;
&lt;td style=&quot;width: 14.069767%; height: 90px;&quot;&gt;정수 타입&lt;/td&gt;
&lt;td style=&quot;width: 48.139535%; height: 90px;&quot;&gt;byte&lt;br /&gt;char&lt;br /&gt;short&lt;br /&gt;int&lt;br /&gt;long&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 90px;&quot;&gt;0&lt;br /&gt;\u0000 (빈 공백)&lt;br /&gt;0&lt;br /&gt;0&lt;br /&gt;0L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.069767%; height: 18px;&quot;&gt;실수 타입&lt;/td&gt;
&lt;td style=&quot;width: 48.139535%; height: 18px;&quot;&gt;float&lt;br /&gt;double&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;0.00F&lt;br /&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 14.069767%; height: 18px;&quot;&gt;논리 타입&lt;/td&gt;
&lt;td style=&quot;width: 48.139535%; height: 18px;&quot;&gt;boolean&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 26.860465%; height: 18px;&quot; colspan=&quot;2&quot;&gt;참조 타입&lt;/td&gt;
&lt;td style=&quot;width: 48.139535%; height: 18px;&quot;&gt;배열&lt;br /&gt;클래스(String 포함)&lt;br /&gt;인터페이스&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 18px;&quot;&gt;null&lt;br /&gt;null&lt;br /&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;6.2 필드 사용&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;필드를 사용한다는 것은 필드값을 읽고, 변경하는 것을 말한다. 클래스 내부에서는 단순히 필드 이름으로 읽고 변경하면 되지만, 외부에서는 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다. 다음 예시를 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Car.java&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769594328186&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Car {
	//필드
    String company = &quot;현대자동차&quot;;
    String model = &quot;그랜저&quot;;
    String color = &quot;검정&quot;;
    int maxSpeed = 350;
    int speed;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;CarExample.java&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769594477302&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CarExample {
	public static void main(String[] args) {
    	//객체 생성
      	Car myCar = new Car();
        
        //필드값 읽기
        System.out.println(&quot;제작회사 : &quot; + myCar.company);
        System.out.println(&quot;모델명 : &quot; + myCar.model);
        System.out.println(&quot;색상 : &quot; + myCar.color);
        System.out.println(&quot;최고속도 : &quot; + myCar.maxSpeed);
        System.out.println(&quot;현재속도 : &quot; + myCar.speed);
        
        //필드값 변경
        myCar.speed = 60;
        System.out.println(&quot;수정된 속도 : &quot; + myCar.speed);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;실행 결과&lt;/i&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;제작회사 : 현대자동차&lt;br /&gt;모델명 : 그랜저&lt;br /&gt;색상 : 검정&lt;br /&gt;최고속도 : 350&lt;br /&gt;현재속도 : 0&lt;br /&gt;수정된 속도 : 60&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;7. 생성자&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;생성자는 new 연산자로 호출되는 특별한 중괄호 블록이다. 생성자는 객체 생성 시 필드를 초기화 하거나 메소드를 호출하는 등의 초기화 역할을 담당한다.생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입도 없다.&lt;/span&gt;&lt;span style=&quot;color: #000000; 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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;7.1 기본 생성자&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다. 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 다음과 같이 중괄호 블록 내용이 비어있는 기본 생성자(Default Constructor)를 바이트 코드에 자동 추가한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769594678506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[public] ClassName() {}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;7.2 생성자 선언&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;생성자의 기본 형태는 다음과 같다. 메소드와 비슷한 모양을 가지고 있으나 리턴 타입이 없고 클래스 이름과 동일하다. 생성자 내부에는 객체 초기화 코드가 작성되는데, 일반적으로 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용 전 초기화 작업을 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769594838209&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ClassName(param ...) {
	//객체의 초기화 코드
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 Car 생성자를 호출 할 때 세 개의 값을 제공한다고 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1769594963179&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Car myCar = new Car(&quot;그랜저&quot;, &quot;검정&quot;, 300);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; 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: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;모델명과 색상 두 개의 매개값은 String 타입이고 최고 속도는 int 타입이다. 세 매개값을 생성자가 받기 위해서는 다음과 같이 생성자가 선언되어야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769595030544&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Car {
	//생성자
    Car(String model, String color, int maxSpeed) { ... }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출하여 객체를 생성해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769595154252&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CarExample {
	public static void main(String[] args) {
    	Car myCar = new Car(&quot;그랜저&quot;, &quot;검정&quot;, 300);	//기본 생성자 호출 (O)
        Car myCar = new Car();	//기본 생성자 호출 (X)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;7.3 필드 초기화&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다. 만약 다른 값으로 초기화를 하고 싶다면 다음 두 가지 방법을 사용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 필드를 선언할 때 초기값을 준다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;다음 코드에서 k1과 k2 객체를 생성하면 k1과 k2 객체의 nation 필드에는 모두 대한민국이 저장되어 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769595663874&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Korean {
	String nation = &quot;대한민국&quot;;
    String name;
    String ssn;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1769595690673&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Korean k1 = new Korean();
Korean k2 = new Korean();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하지만 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화를 해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2. 생성자에서 초기값을 준다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;위 코드에서 name과 ssn 필드 값을 객체 생성 시점에 부여하도록 해보자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769595867852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Korean {
	//필드
    String nation = &quot;대한민국&quot;;
    String name;
    String ssn;
    
    //생성자
    public Korean(String name, String ssn) {
    	//this.필드 = 매개변수
        this.name = name;
        this.ssn = ssn;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1769595954001&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Korean k1 = new Korean(&quot;홍길동&quot;, &quot;011231-3928531&quot;);
Korean k2 = new Korean(&quot;김영희&quot;, &quot;020102-4543880&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;7.4 생성자 오버로딩&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Car의 예시로 돌아가보자. 외부에서 제공되는 데이터로 Car 객체를 만들 때, 모든 정보가 제공되지 않을 수 있다. 어떤 업체는 모델명과 색상만을 제공하고, 어떤 업체는 최고속도만을 알려줄 수 있다. 이렇게 제약 조건에서도 Car 객체를 생성할 수 있어야 한다. 이를 위해 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 &lt;b&gt;오버로딩(Overloading)&lt;/b&gt; 기능을 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769596424984&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Car {
	Car() { ... }
    Car(String model) { ... }
    Car(String model, String color) { ... }
    Car(String model, String color, int maxSpeed) { ... }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;다만 다음과 같이 매개변수 이름만 바꾸는 것은 오버로딩이 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769596488000&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Car(String model, String color) { ... }
Car(String color, String model) { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;생성자가 오버로딩 되어 있을 경우 다양한 방법으로 Car 객체를 생성해 보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769596595696&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Car car1 = new Car();
Car car2 = new Car(&quot;그랜저&quot;);
Car car3 = new Car(&quot;그랜저&quot;, &quot;흰색&quot;);
Car car4 = new Car(&quot;그랜저&quot;, &quot;흰색&quot;, 300);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;7.5 다른 생성자 호출&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;생성자 오버로딩이 많아질 경우 중복 코드가 발생할 수 있다. 이 때 &lt;b&gt;this()&lt;/b&gt; 코드를 활용하여 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 잇는 생성자를 호출하는 방식으로 개선할 수 있다.&amp;nbsp;&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;i&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;중복 코드&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769596780157&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Car(String model) {
	this.model = model;
    this.color = &quot;은색&quot;;
    this.maxSpeed = 250;
}

Car(String model, String color) {
	this.model = model;
    this.color = color;
    this.maxSpeed = 250;
}

Car(String model, String color, int maxSpeed) {
	this.model = model;
    this.color = color;
    this.maxSpeed = maxSpeed;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;개선된 코드&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769596889472&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Car() {
}

Car(String model) {
	this(model, &quot;은색&quot;, 250);
}

Car(String model, String color) {
	this(model, color, 250);
}

Car(Sring model, String color, int maxSpeed) {
	this.model = model;
    this.color = color;
    this.maxSpeed = maxSpeed;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;8. 메소드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;메소드는 객체의 동작에 해당되는 중괄호 블록이다. 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다. 메소드는 필드를 읽고 수정하기도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 한다. 객체 간의 데이터 전달 수단으로 사용되며 외부로부터 파라미터를 받을수도 있고, 실행 후에는 리턴할 수도 있다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;8.1 메소드 선언&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;메소드는 메소드 선언부(method signature)와 실행부로 구성된다.&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;1204&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HITsx/dJMcadAMwY2/OjepKfisSMiAZuXnSR2g31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HITsx/dJMcadAMwY2/OjepKfisSMiAZuXnSR2g31/img.png&quot; data-alt=&quot;메소드의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HITsx/dJMcadAMwY2/OjepKfisSMiAZuXnSR2g31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHITsx%2FdJMcadAMwY2%2FOjepKfisSMiAZuXnSR2g31%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;1204&quot; height=&quot;650&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메소드의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;8.1.1 반환 타입&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;리턴 값이 있을 경우에는 리턴해주는 값의 타입으로 선언하면 된다. 이때 return 문은 반드시 존재해야 하며, return 문이 실행되면 메소드는 즉시 종료된다. 리턴 값이 없을 경우에는, 메소드를 void로 선언하면 된다. 이때는 return 문이 있어도 되고 없어도 된다. return 문을 사용할 경우 마찬가지로 메소드가 즉시 종료된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;8.1.2 메소드 이름&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;메소드 이름은 다음의 규칙과 컨벤션을 따른다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 숫자로 시작할 수 없다&lt;br /&gt;2. '$', '_'를 제외한 특수 문자를 사용할 수 없다&lt;br /&gt;3. 관례적으로 메소드 이름은 소문자로 시작한다&lt;br /&gt;4. 관례적으로 캐멀 케이스를 따른다&lt;/blockquote&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;*매개변수의 개수를 모를 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;매게 변수의 개수를 모르는 경우 다음 코드와 같이 배열 타입으로 선언하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769597437970&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int sum1(int[] values) { ... }

int[] values = {1, 2, 3};
int result = sum1(values);
int result = sum(new int[] {1, 2, 3, 4, 5});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8.2 메소드 호출&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드는 클래스 내외부의 호출에 의해 실행된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8.2.1 클래스 내부에서 호출&lt;/b&gt;&lt;/h4&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;i&gt;클래스 내부에서 호출&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769598002740&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Calculator {
	int plus(int x, int y) {
    	int result = x + y;
        return result;
    }
    
    double avg(int x, int y) {
    	double sum = plus(x, y);
        double result = sum / 2;
        return result;
    }
    
    void execute() {
    	double result = avg(7, 10);
        println(&quot;실행결과: &quot; + result);
    }
    
    void println(String message) {
    	System.out.println(message);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8.2.2 클래스 외부에서 호출&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클래스 외부에서 호출할 경우에는 우선 클래스로부터 객체를 생성한 뒤, 참조 변수를 통해 메소드를 호출해야 한다. 메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문이다. 위 계산기를 실행시켜 보자.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;execute() 실행&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769598072077&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CalculatorExample {
	public static void main(String[] args) {
    	Calcuator myCal = new Calcuator();
        myCal.execute();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8.3 메소드 오버로딩&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 내 같은 이름의 메소드를 여러 개 선언하는 것을&amp;nbsp;&lt;b&gt;메소드 오버로딩(method overloading)&lt;/b&gt;이라 한다. 메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;메소드 오버로딩&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769598387330&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Calculator {
	//정사각형의 넓이 구하기
    double areaRectangle(double width) {
    	return width * width;
    }
    
    //직사각형의 넓이 구하기
    double areaRectangle(double width, double height) {
    	return width * height;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;실행&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769598480359&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class CalculatorExample {
	public static void main(String[] args) {
    	Calculator myCal = new Calculator();
        
        //정사각형
        double result1 = myCal.areaRectangle(10);
        
        //직사각형
        double result2 = myCal.areaRectangle(10, 20);       
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;9. 정적 멤버와 static&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;정적(static)의 사전적 의미는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;br /&gt;형용사&amp;nbsp;&lt;br /&gt;1. (변화&amp;middot;움직임이 없이) 고정된[고정적인]&lt;br /&gt;2. 정지 상태의static pressure 정압(靜壓)&amp;nbsp;&lt;/blockquote&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: #000000; text-align: start;&quot;&gt;정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 상요할 수 있는 필드와 메소드이다. 정적 멤버는 인스턴스 멤버가 아니기에 클래스 멤버로 불리기도 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;9.1 정적 멤버 선언&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;정적 필드와 정적 메소드는 &lt;b&gt;static 키워드&lt;/b&gt;를 붙임으로서 선언한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769959669620&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ClassName {
	//정적 필드
    static 타입 필드(초기값);
    
    //정적 메소드
    static 리턴타입 메소드(param1, ... ) {
    }
}&lt;/code&gt;&lt;/pre&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_1769959814038&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Calculator {
	String color; 				//계산기별로 색깔이 다를 수 있다.
    static double pi = 3.14;	//파이값은 항상 동일하다.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;메소드의 경우에는 인스턴스 필드를 통해 실행해야 하는 메소드면 인스턴스 메소드로 선언하고, 인스턴스 필드를 사용하지 않는다면 정적 메소드로 선언하는 것이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769960970899&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Calculator {
	String color;	//인스턴스 필드
    void setColor(String color) { this.color = color; }	//인스턴스 메소드
    static int plus(int x, int y) { return x + y; }		//정적 메소드
    static int minus(int x, int y) { return x - y; }	//정적 메소드
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Calcuator 클래스의 색상을 변경하는 메소드는 인스턴스 필드를 사용하기에 인스턴스 메소드로 선언해야 한다. 그러나 셈 기능은 외부에서의 매개값을 가지고 수행하므로 정적 메소드로 선언하는 것이 좋다.&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&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 data-ke-size=&quot;size16&quot;&gt;정적 메소드는 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한 this 키워드도 사용 불가능하다. 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다. 이는 추후에 설명할 정적 블록과 main() 메소드에도 동일하게 적용된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;9.2 정적 멤버 사용&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;정적 멤버는 도트 연산자로 접근한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769961052274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(5, 10);

Calculator myCal = new Calculator();
int result3 = myCal.minus(10, 5);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;9.3 정적 초기화 블록&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;정적 필드는 필드 선언과 동시에 초기값을 주는 것이 일반적이다. 그러나 필드 선언 이후에 초기화를 해야 할 경우에는 정적 블록을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769961342275&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Television {
	static String company = &quot;Samsung&quot;;
    static String model = &quot;OLED&quot;;
    static String info;
    
    static {
    	info = company + &quot;-&quot; + model;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;정적 블록은 클래스가 로딩될 때 자동으로 실행되며, 클래스 내부에 여러개가 선언되어도 상관없다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9.4 싱글톤&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 프로그램에서 단 하나의 객체만 만들도록 보장하고 어디서든 그 하나의 객체에 접근할수 있도록 하는 디자인 패턴*을 &lt;b&gt;싱글톤&lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*디자인 패턴: 개발하면서 발생하는 반복적인 문제들을 어떻게 해결할 것인지에 대한 해결 방안으로 실제 현업에서 비즈니스 요구 사항을 프로그래밍으로 처리하면서 만들어진 다양한 해결책 중에서 많은 사람들이 인정한 모범 사례&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글톤을 만들기 위해서는 private 접근 제한자를 통해 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. 그리고 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화한다. 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막는다. 대신 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769961798183&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ClassName {
	//정적 필드
    private static 클래스 singleton = new 클래스();
    
    //생성자
    private 클래스() { ... }
    
    //정적 메소드
    static 클래스 getInstance() {
    	return singleton;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 외부에서 다음과 같이 접근 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1769961878846&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* ClassName obj = new ClassName();	//컴파일 에러 */
ClassName obj = ClassName.getInstance();&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;10. final 필드와 상수&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;final의 사전적 의미는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;final &amp;nbsp;&lt;/b&gt;&lt;br /&gt;형용사&lt;br /&gt;1. 마지막의&lt;br /&gt;2. 최종적인&lt;br /&gt;명사&lt;br /&gt;3. 결승전&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다는 뜻이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769962174732&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Calculator {
	final String type = &quot;arabic&quot;
    String color;
    
    public Calculator(String color) {
    	this.color = color;
    }
}&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;객체마다 저장할 필요가 따로 없는 e나 PI 같은 불변의 값은 상수(static final)로 저장한다. 상수(static final)은 객체마다 저장되지 않고 클래스에만 포함된다. 마찬가지로 초기값이 한번 정해지면 변경할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1769962332627&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Earth {
	//관례적으로 상수 이름은 모두 대문자를 사용한다.
	static final double EARTH_RADIOUS = 6400;
    static final double PI = 3.142;
    static final double EARTH_AREA;
    
    static {
    	EARTH_AREA = 4 * PI * EARTH_RADIOUS * EARTH_RADIOUS;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 다음과 같이 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769962382051&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println(&quot;지구의 반지름 : &quot; Earth.EARTH_RADIOUS + &quot;km&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;11. 패키지&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;패키지는 일종의 파일 시스템 폴더이다. 여러개의 클래스를 체계적으로 관리하기 위해 사용하는데, 패키지는 클래스를 유일하게 만들어 주는 식별자 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769962640901&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 상위패키지.하위패키지;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이러한 패키지의 작명 방식은 다음과 규칙을 따른다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 숫자로 시작할 수 없다.&lt;br /&gt;2. '_', '$'를 제외한 특수문자를 사용할 수 없다.&lt;br /&gt;3. java로 시작할 수 없다.&lt;br /&gt;4. 모두 소문자로 작성하는 것이 관례이다.&lt;br /&gt;5. 중복을 피하기 위해 회사의 도메인 이름을 활용하는 것이 관례이다(마지막에는 프로젝트 이름을 붙여준다).&lt;/blockquote&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; text-align: start;&quot;&gt;11.1 import 문&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;같은 패키지에 속하는 클래스는 조건 없이 사용할 수 있지만 다른 패키지에 속하는 클래스를 사용하려면 다음 두 가지 방법중 하나를 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 패키지와 클래스를 모두 기술하기
&lt;pre id=&quot;code_1769962803450&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mycompany.project;

public class Car {
	com.nexen.Tire tire = new com.nexen.Tire()'
}​&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2. import 문을 사용하기&lt;br /&gt;
&lt;pre id=&quot;code_1769962865037&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.mycompany.project;

import com.nexen.Tire;
//또는 import com.nexen.*;

public class Car {
	Tire tire = new Tire();
}​&lt;/code&gt;&lt;/pre&gt;
*은 패키지에 속하는 모든 클래스를 의미한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 1번 방식보다 2번 방식이 훨씬 간결해서 import를 사용한다. 다만 서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import 되어 있을 경우 1번 방식을 사용한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;12. 접근 제한자&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;라이브러리를 설계하다보면 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나, 객체의 특정 데이터를 보호하기 위해 해당 필등 ㅔ접근하지 못하도록, 특정 메소드를 호출하지 못하도록 제한 할 필요가 있다. 이때 접근 제한자(Access Modifier)를 사용한다.&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: #000000; text-align: start;&quot;&gt;접근 제한자는 다음 네 가지 종류가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 10%; height: 18px;&quot;&gt;&lt;b&gt;접근 제한&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.186047%; height: 18px;&quot;&gt;&lt;b&gt;적용 대상&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.465116%; height: 18px;&quot;&gt;&lt;b&gt;접근 불가 클래스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.348837%; height: 18px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 10%; height: 18px;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 24.186047%; height: 18px;&quot;&gt;클래스, 필드, 생성자, 메소드&lt;/td&gt;
&lt;td style=&quot;width: 25.465116%; height: 18px;&quot;&gt;없음&lt;/td&gt;
&lt;td style=&quot;width: 40.348837%; height: 18px;&quot;&gt;외부 클래스가 자유롭게 사용할 수 있는 공개 멤버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 10%; height: 18px;&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 24.186047%; height: 18px;&quot;&gt;필드, 생성자, 메소드&lt;/td&gt;
&lt;td style=&quot;width: 25.465116%; height: 18px;&quot;&gt;자식 클래스가 아닌 다른 패키지에 소속된 클래스&lt;/td&gt;
&lt;td style=&quot;width: 40.348837%; height: 18px;&quot;&gt;같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 10%; height: 16px;&quot;&gt;private&lt;/td&gt;
&lt;td style=&quot;width: 24.186047%; height: 16px;&quot;&gt;필드, 생성자, 메소드&lt;/td&gt;
&lt;td style=&quot;width: 25.465116%; height: 16px;&quot;&gt;모든 외부 클래스&lt;/td&gt;
&lt;td style=&quot;width: 40.348837%; height: 16px;&quot;&gt;외부에 노출되지 않는 멤버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 10%; height: 18px;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;width: 24.186047%; height: 18px;&quot;&gt;클래스, 필드, 생성자, 메소드&lt;/td&gt;
&lt;td style=&quot;width: 25.465116%; height: 18px;&quot;&gt;다른 패키지에 소속된 클래스&lt;/td&gt;
&lt;td style=&quot;width: 40.348837%; height: 18px;&quot;&gt;같은 패키지에 소속된 클레스에서만 사용할 수 있는 멤버. 위 세가지 접근 제한자가 적용 안됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;12.1 클래스의 접근 제한&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스에 적용할 수 있는 접근 제한자는 public와 default인데 다음과 같이 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769964134083&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//default 접근 제한
class ClassName { ... }

//public 접근 제한
public class ClassName { ... }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;12.1.1 default 접근 제한&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;클래스 선언 시 publi를 생략했다면 default 접근 제한을 가진다. 이때 같은 패키지에서는 아무 제한 없이 사용 가능하지만 다른 패키지에서는 사용 불가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;12.1.2 public 접근 제한&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스가 public 접근 제한을 가지게 되면 같은 패키지 뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다. 인터넷으로 배포되는 라이브러리 클래스들은 모두 이러한 public 접근 제한을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;12.2 생성자의 접근 제한&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;객체를 생성하기 위해선 new 연산자를 통해 생성자를 호출해야 한다. 하지만 생성자가 어떤 접근 권한을 갖느냐에 따라 호출 가능 여부가 결정된다.&lt;/span&gt;&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 style=&quot;width: 9.96124%;&quot;&gt;&lt;b&gt;접근 제한자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.961239%;&quot;&gt;&lt;b&gt;생성자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.07752%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.96124%;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 9.961239%;&quot;&gt;클래스(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.07752%;&quot;&gt;모든 패키지에서 아무런 제한 없이 생성자를 호출 가능하다. 생성자가 public 이라면 클래스도 public를 가지는 것이 일반적이다. 클래스가 default 라면 생성자가 public 이더라도 같은 패키지 내에서만 생성자 호출이 가능하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.96124%;&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 9.961239%;&quot;&gt;클래스(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.07752%;&quot;&gt;default와 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할수 있도록 한다. 다만 default와는 다르게 다른 패키지에 속한 클래스가 해당 클래스의 자식이면 생성자를 호출할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.96124%;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;width: 9.961239%;&quot;&gt;클래스(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.07752%;&quot;&gt;생성자를 선언할 때 public 또는 private를 생략했다면 default 를 가지게 되다. 같은 패키지 내에서는 제한 없이 생성자 호출 가능하나, 다른 패키지에서는 생성자를 호출할 수 없다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.96124%;&quot;&gt;private&lt;/td&gt;
&lt;td style=&quot;width: 9.961239%;&quot;&gt;클래스(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.07752%;&quot;&gt;생성자를 호출하지 못하도록 제한한다. 따라서 클래스 외부에서 new 를 통해 객체를 만들 수 없다. 클래스 내부에서만 가능하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;12.3 필드와 메소드의 접근 제한&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필드와 메소드 또한 접근 제한을 가진다.&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 style=&quot;width: 10.310077%;&quot;&gt;&lt;b&gt;접근 제한자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.263566%;&quot;&gt;&lt;b&gt;생성자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 80.426356%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.310077%;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 9.263566%;&quot;&gt;필드&lt;br /&gt;메소드(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.426356%;&quot;&gt;모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용 가능하다. 필드와 메소드가 public 일 경우 클래스도 통상적으로 public이다. 클래스가 default 라면 같은 패키지 안에서만 클래스가 사용되어야 하기 때문이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.310077%;&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 9.263566%;&quot;&gt;필드&lt;br /&gt;메소드(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.426356%;&quot;&gt;default와 마찬가지로 같은 패키지 내 클래스에서 필드와 메소드를 사용가능하다. 다만 default와는 다르게 다른 패키지에 속한 클래스가 해당 클래스의 자식이면 필드와 메소드를 사용할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.310077%;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;width: 9.263566%;&quot;&gt;필드&lt;br /&gt;메소드(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.426356%;&quot;&gt;필드와 메소드를 선언할 때 public 또는 private를 생략했다면 default 를 가지게 되다. 같은 패키지 내에서는 제한 없이 필드와 메소드를 사용 가능하나, 다른 패키지에서는 필드와 메소드를 사용할 수 없다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.310077%;&quot;&gt;private&lt;/td&gt;
&lt;td style=&quot;width: 9.263566%;&quot;&gt;필드&lt;br /&gt;메소드(...)&lt;/td&gt;
&lt;td style=&quot;width: 80.426356%;&quot;&gt;필드와 메소드를 사용하지 못하도록 제한한다. 클래스 내부에서만 가능하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;13. Getter와 Setter 메소드&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;일반적으로 객체 지향 프로그래밍에서는 객체의 무결성 보호를 위해 외부에서 직접적으로 제한 하는 것을 막는다. 대신의 Getter와 Setter 메소드를 통해 외부에서 접근할 수 있도록 한다.&lt;/span&gt;&lt;span style=&quot;color: #000000; 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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;자동차의 예시에서 속도가 음수로 입력될 경우 이를 검증하여 set 하는 코드는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769965472234&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Car {
	//필드
    private int speed;
    private boolean stop;
    
    //생성자
    private Car;
    
    //Getter
    public int getSpeed() {
    	return speed;
    }
    
    //Setter
    public int setSpeed(int speed) {
    	if (speed &amp;lt; 0) {
        	this.speed = 0;
            return;
        } else {
        	this.speed = speed;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; 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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스를 선언할 때 가능하다면 필드를 private로 선언하여 외부로부터 보호하고 필드에 대한 Setter와 Getter 메소드를 사용해서 필드값을 안전하게 변경 및 사용하는것이 좋다.&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: #000000; text-align: start;&quot;&gt;*필드 타입이 boolean일 경우 Getter는 get으로 시작하지 않고 is로 시작하는 것이 관례다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769965527859&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean isStop() {
	return stop;
}

publiv void setStop(boolean stop) {
	this.stop = stop;
    this.speed = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;14. 어노테이션&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;어노테이션은 컴파일 시 컴파일 과정과 실행 과정에서 어떻게 처리될지를 알려주는 일종의 메타데이터다. 어노테이션은 다음 세 가지 용도로 사용된다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공&lt;br /&gt;2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성하도록 정보 제공&lt;br /&gt;3. 실행 시 특정 기능을 실행하도록 정보 제공&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;대표적인 어노테이션은 @Override이다. 이는 메소드가 오버라이드(재정의) 된 것이라고 컴파일러에게 알려주어 컴파일러는 오버라이드 검사를 하도록 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;14.1 어노테이션 타입 정의와 적용&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;어노테이션은 다음과 같이 정의할 수 있다. 예시로 String 타입의 엘리먼트와 int 타입의 엘리먼트를 선언했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769965825637&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public @interface AnnotationName {
	String element1();
    int element2() default 5;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정의된 어노테이션은 다음과 같이 코드에 적용 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1769965895270&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AnnotationName(element1=&quot;값&quot;, element2=3);
//또는 @AnnotationName(element1=&quot;값&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;element1은 기본 엘리먼트이기 때문에 값을 반드시 기술해야 한다. 이때 기본 엘리먼트 선언인 value()를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769965976612&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public @interface AnnotationName {
	String value();
    int element2() default 5;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이때는 다음과 같이 값만 기술할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769966022566&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AnnotationName(&quot;값&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;만약 value 엘리먼트와 다른 엘리먼트의 값을 동시에 주고 싶다면 다음과 같이 정상적인 방법으로 저장하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769966073633&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AnnotationName(value=&quot;값&quot;, element2=3);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;14.2 어노테이션 적용 대상&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;@Target 어노트에션을 통해 어노테이션이 적용될 대상을 지정 가능하다. 어노테이션을 적용할 수 있는 대상은 java.lang.annotation.ElementTyep에 열거 상수로 다음 테이블과 같이 정의되어있다.&lt;/span&gt;&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 style=&quot;width: 50%;&quot;&gt;&lt;b&gt;ElementType 열거 상수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;적용 대상&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;TYPE&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;클래스, 인터페이스, 열거타입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;ANNOTATION_TYPE&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;어노테이션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;FIELD&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;필드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;CONSTRUCTOR&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;생성자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;METHOD&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;메소드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;LOCAL_VARIABLE&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;로컬 변수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;PACKAGE&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;패키지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 다음과 같이 어노테이션을 정의할 경우,&lt;/p&gt;
&lt;pre id=&quot;code_1769966315762&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotationName {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;클래스, 필드, 메소드만 어노테이션을 적용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769966401646&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AnnotationName
public class ClassName {
	@AnnotationName
    private String fieldName;
    
    //@AnnotationName
    private ClassName() { } //생성자에는 적용 불가
    
    @AnnotationName
    public void methodName() { }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;14.3 어노테이션 유지 정책&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;어노테이션은 용도에 따라 어노테이션을 어디까지 유지할지 지정해야 한다. 이러한 어노테이션 유지 정책은 쉽게 말해 소스상에만 유지할 건지, 컴파일된 클래스까지 유지할 건지, 런타임 시에도 유지할 건지 지정해 주는 역할을 한다. 어노테이션 유지 정책은 java.lang.annotation.RetentionPolicy에 다음 테이블과 같이 정의돼있다.&lt;/span&gt;&lt;/span&gt;&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 style=&quot;width: 22.55814%;&quot;&gt;&lt;b&gt;RetentionPolicy 열거 상수&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.44186%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.55814%;&quot;&gt;SOURCE&lt;/td&gt;
&lt;td style=&quot;width: 77.44186%;&quot;&gt;소스상에서만 어노테이션 정보를 유지한다. 소스 코드 분석 시만 의미 있으며 바이트 코드에는 정보가 안 남는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.55814%;&quot;&gt;CLASS&lt;/td&gt;
&lt;td style=&quot;width: 77.44186%;&quot;&gt;바이트 코드 파일까지 어노테이션 정보를 유지한다. 다만, 리플렉션을 통해 어노테이션 정보를 얻을 수는 없다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.55814%;&quot;&gt;RUNTIME&lt;/td&gt;
&lt;td style=&quot;width: 77.44186%;&quot;&gt;바이트 코드 파일까지 어노테이션 정보를 유지하며 리플렉션을 통해 런타임 시 어노테이션 정보를 얻을 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&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;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;어노테이션 유지 정책을 지정할때에는 @Retention 어노테이션을 사용한다. 다음은 런타임 유지 정책을 적용한 어노테이션이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1769966767326&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Science/Java</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/43</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4#entry43comment</comments>
      <pubDate>Mon, 2 Feb 2026 02:27:11 +0900</pubDate>
    </item>
    <item>
      <title>광고보다 강력한 MPR(마케팅PR)의 힘: 신뢰와 비용 효율성</title>
      <link>https://rdhdevelop.tistory.com/entry/%EA%B4%91%EA%B3%A0%EB%B3%B4%EB%8B%A4-%EA%B0%95%EB%A0%A5%ED%95%9C-MPR%EB%A7%88%EC%BC%80%ED%8C%85PR%EC%9D%98-%ED%9E%98-%EC%8B%A0%EB%A2%B0%EC%99%80-%EB%B9%84%EC%9A%A9-%ED%9A%A8%EC%9C%A8%EC%84%B1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. MRP&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MPR이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MPR이란&amp;nbsp;&lt;b&gt;마케팅 목표를 달성하기 위해 PR의 전략과 전술을 이용&lt;/b&gt;하는 것이다. 기업은 신뢰받을 수 있는 커뮤니케이션 채널을 통해 회사와 제품을 소비자들의 필요&amp;middot;관심&amp;middot;욕구와 합치시킴으로써 만족과 구매를 유도해 낸다(IMC의 전략 중 하나).&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;MPR의 목적 &lt;b&gt;(1) 기업의 상품&amp;middot;서비스의 인지도를 높이고&lt;/b&gt; &lt;b&gt;(2) 구매를 자극&lt;/b&gt;하며 (&lt;b&gt;3) 커뮤니케이션을 촉진&lt;/b&gt;(브랜드에 대한 호의적 태도 상기)하고 &lt;b&gt;(4) 소비자와 기업 브랜드 간 관계를 만들어 가는 것&lt;/b&gt;이다. 기존에 마케팅은 광고를 통해 제품&amp;middot;서비스의 정보를 제공했다면, MPR은 뉴스와 같은 미디어가 보도하도록 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 문화콘텐츠와 PR&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문화콘텐츠의 의의&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문화콘텐츠란&amp;nbsp;&lt;b&gt;문화적 요소가 체화된 창의가 있는 문화상품&lt;/b&gt;으로 정의할 수 있다(손상희, 2016). 문화콘텐츠는 기본적으로 상품의 속성을 지닌다(-&amp;gt; 소비자가 일정한 대가를 지불하고 이용). 이에, &lt;b&gt;상품&amp;middot;서비스에서 호라용되는 광고 PR과 같은 전략적 커뮤니케이션이 필요&lt;/b&gt;하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문화콘텐츠는 &lt;b&gt;그 자체로 산업적으로 활용&lt;/b&gt;될 뿐만 아니라 디지털 미디어 시대에는 &lt;b&gt;산업의 연관효과가 확대되는 창구효과&lt;/b&gt;를 기대할 수 있다. 일례로, 오징어게임은 넷플릭스 공개를 시작으로 지상파 판권 판매, 게임 개발, 관련 상품 라이선싱, 시즌2 제작 등으로 확대했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문화 콘텐츠는&amp;nbsp;&lt;b&gt;대면 콘텐츠&lt;/b&gt;(공연, 스포츠 등)과&amp;nbsp;&lt;b&gt;비대면 콘텐츠&lt;/b&gt;(방송, 영화, 게임 등)으로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소비자는 문화콘텐츠를 대할 때, 문화콘텐츠는 소비에서 돈보다 시간이 중요한 역할을 하기 때문에, &lt;b&gt;먼저 경험한 소비자의 의견이 매우 중요&lt;/b&gt;한 정보원으로 작용한다. 문화콘텐츠는 일반적으로 &lt;b&gt;경험재로서의 성격&lt;/b&gt;을 가진다(-&amp;gt; &lt;b&gt;바이럴 마케팅 가능&lt;/b&gt;(ex. 영화의 예고편, 게임의 체험판)). 문화콘텐츠는 가격보다는 &lt;b&gt;소비자의 경험과 인식&lt;/b&gt;같은 측면이 복합적으로 고려된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공연콘텐츠와 PR&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공연콘텐츠 PR 커뮤니케이션은 &lt;b&gt;공연콘텐츠 자체를 대상으로 하는 경우&lt;/b&gt;와&amp;nbsp;&lt;b&gt;기업이 자사의 브랜드나 제품&amp;middot;서비스를 공연콘텐츠로 활용하는 경우&lt;/b&gt;로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장공연의 티켓 구매를 유도하기 위해 라이브 스트리밍 공연을 서비스 했는데, 실제 구매율이 높아졌다. 또한 공연이 뮤지컬이 되는 등의 &lt;b&gt;창구효과&lt;/b&gt;도 기대할 수 있다.&lt;/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;lt;슈퍼콘서트&amp;gt;라는 공연콘텐츠를 통해 새로운 PR 커뮤니케이션을 개발하고 지속시켜 자사 서비스의 소비자층에게 어필했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;영화콘텐츠와 PR&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영화 콘텐츠는 다음과 같은 두 가지의 특성을 지닌다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;소비의 비경합성&lt;br /&gt;&lt;/b&gt;한 명의 소비자가 해당 제품&amp;middot;서비스를 소비해도 다른사람이 함께 소비하는제 지장이 없다(ex. 극장에서는 300명이 동시에 같은 영화를 본다).&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;경험재&lt;/b&gt;&lt;br /&gt;실제 경험을 통해서만 가치를 알 수 있다(-&amp;gt; 영화 마케팅은 예고편 제작에 심혈을 기울이는 이유).&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 미디어를 상대로 공보를 적극적으로 활용해야 한다(ex. 영화 소개 기사, 시사회, 배우 인터뷰 등)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 스폰서십과 PR&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스폰서십의 의의&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스폰서십은 &lt;b&gt;기업이 이익을 위해 행하는 후원 활동&lt;/b&gt;으로&amp;nbsp;&lt;b&gt;재정적 지원을 하거나 특정 주체를 도와주는 모든 행위&lt;/b&gt;를 의미한다. 기업은 스폰서십을 통해&amp;nbsp;&lt;b&gt;기업의 이미지와 인지도를 높이고, 기업 구성원들에게는 동기를 부여하며,&lt;/b&gt;&amp;nbsp;스폰서십을 통해 &lt;b&gt;효과적인 PR 커뮤니케이션&lt;/b&gt;을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스폰서십은&amp;nbsp;다음의 3가지 장점을 가진다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;스폰서십의 장점&lt;br /&gt;&lt;/b&gt;(1) 기업의 이미지&amp;middot;브랜드를 자연스럽게 노출&lt;br /&gt;(2) 기업에 대한 평가를 호의적&amp;middot;긍정적으로 유도&lt;br /&gt;(3) 기업 브랜드의 구매의도&amp;middot;구매율 향상&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; CSR 스폰서십은 기업이 사회로부터 많은 혜택을 받았기 때문에 일부를 사회에 환원해야 한다는 기업의 사회적 인식이 강조되면서 증가했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스포츠 스폰서십&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스포츠 스폰서십이란 &lt;b&gt;기업이 자사의 이미지&amp;middot;브랜드 인지도를 높이고 구매를 유도하기 위해 스포츠 선수&amp;middot;팀을 후원&lt;/b&gt;하는 활동이다. 기업의 입장에서는 인기 있는 &lt;b&gt;스프츠경기 및 관련 콘텐츠에 자사 PR/마케팅 커뮤니케이션을 활용하여 인지도&amp;middot;호감도를 높일&lt;/b&gt; 수 있어 효과적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 들어,&lt;b&gt;&amp;nbsp;여가 활동에 대한 관심&amp;middot;참여가 증가&lt;/b&gt;하고&amp;nbsp;&lt;b&gt;스포츠 경기의 시청률이 높으&lt;/b&gt;며&amp;nbsp;&lt;b&gt;정보기술의 발달(거의 모든 스포츠 중계 가능)&lt;/b&gt;과&amp;nbsp;&lt;b&gt;뉴미디어의 등장&lt;/b&gt;으로 인해 스포츠 스폰서십이 증가하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스포츠 스폰서십의 유형은 다음 4가지가 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;스포츠 스폰서십 유형&lt;br /&gt;&lt;/b&gt;(1) 개별 선수 후원: 선수 개인별로 재정적&amp;middot;스포츠 용품 지원을 통해 후원(ex. 나이키-조던, 아디다스-손흥민)&lt;br /&gt;(2) 스포츠 팀 후원: 팀스포츠로 이루어진 종목의 경우 자주 사용&lt;br /&gt;(3) 스포츠 단체에 대한 후원: 스포츠 협회나 연맹에 기업이 재정적&amp;middot;스포츠 용품 지원(ex. KT-대한축구협회)&lt;br /&gt;(4) 스포츠 이벤트에 대한 후원: 올림픽과 월드컵 조직위원회 같은 스포츠 이벤트에 대한 지원(ex. 삼성-올림픽)&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문화예술 스폰서십 - 메세나&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세나란&amp;nbsp;&lt;b&gt;기업이 &lt;u&gt;문화예슬 지원&lt;/u&gt;을 통해 사회에 공헌하고 국가 경쟁력에 기여하는 활동&lt;/b&gt;을 의미한다. 즉, 메세나는 &lt;b&gt;(1)기업과 예술의 동반발전을 위해 상호 협력&amp;middot;지원하는 공익적 활동&lt;/b&gt;이고&amp;nbsp;&lt;b&gt;(2)기업의 사회적 책임경영에 있어 필요한 전략적 활동&lt;/b&gt;이다. 또한&amp;nbsp;&lt;b&gt;(3)기업이 문화 CSR을 통해 국가 문화예술 발전에 기여하는 중추적 역할&lt;/b&gt;을 하게 하고&amp;nbsp;&lt;b&gt;(4)경영자원으로써 기업문화를 구축하기 위한 문화예술협력 활동을 위한 후원 활동&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문화예술을 파트너십으로 생각하고 적극적으로 활용하여 &lt;b&gt;기업&amp;middot;소비자&amp;middot;문화예술계가 함께 상생할 수 있는 PR 커뮤니케이션 전략&lt;/b&gt;으로서 메세나 활동이 인정받고 있다. 또한, 기입장에서도 수익을 크게 기대할 수 없는 문화예술분야에 대한 지원은 기업의 &lt;b&gt;사회적 책임을 다하는 일&lt;/b&gt;이며, &lt;b&gt;문화예술계 발전에 이바지하는 착한 기업이라는 인식&lt;/b&gt;을 심어줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이에, 한국메세나협회는 문화예술 후원을 체계적으로 할 수 있도록 도와준다.&lt;/p&gt;</description>
      <category>마케팅</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/42</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EA%B4%91%EA%B3%A0%EB%B3%B4%EB%8B%A4-%EA%B0%95%EB%A0%A5%ED%95%9C-MPR%EB%A7%88%EC%BC%80%ED%8C%85PR%EC%9D%98-%ED%9E%98-%EC%8B%A0%EB%A2%B0%EC%99%80-%EB%B9%84%EC%9A%A9-%ED%9A%A8%EC%9C%A8%EC%84%B1#entry42comment</comments>
      <pubDate>Sat, 24 Jan 2026 19:06:29 +0900</pubDate>
    </item>
    <item>
      <title>조건문과 반복문 / 참조 타입</title>
      <link>https://rdhdevelop.tistory.com/entry/%EC%A1%B0%EA%B1%B4%EB%AC%B8%EA%B3%BC-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 조건문과 반복문&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 조건문&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조건문이란 개발자가 작성한 코드를 조건에 따라 코드의 실행 흐름을 다르게 동작하도록 제어하는 것이다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.1.1 if 문&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;if 문은 다음과 같이 정의하여 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769163578213&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (조건식) {
	//조건식이 참일 때 실행되는 블록
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.1.2 if-else 문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if-else 문은 조건식의 결과에 따라 참인 블록을 실행하느 조건문이다. 위에서부터 순서대로 실행되며 if문의 조건식이 true이면 해당 블록이 실행되고 false이면 다음 블록을 검사하여 똑같은 단계를 반복한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769163708895&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (조건식 1) {
	//조건식 1이 참일 경우
} else if (조건식 2) {
	//조건식 2가 참일 경우
} else if (조건식 3) {
	//조건식 3이 참일 경우
} else {
	//위의 모든 조건식이 참이 아닐 경우
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.1.3 switch 문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;switch문은 if문과 다르게 변수가 어떤 값을 갖느냐에 다라 실행문이 결장된다. 더욱 간결한 코딩이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1769163870851&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;switch (입력 변수) {
	case 값_1:
    	값_1과 일치하면 실행
        break;
	case 값_2:
    	값_2와 일치하면 실행
        break;
	case 값_3:
    	값_3과 일치하면 실행
        break;
    default:
    	일치하는 case가 없을 때
        break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;break를 사용하지 않을 경우 switch 문을 못 벗어날 수 있기 때문에 아래 예시처럼 전략적으로 사용하여야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769163950063&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Scanner;

public class SwitchOverlapCase {
    static Scanner userInput = new Scanner(System.in);
    public static void main(String[] args) {
        System.out.print(&quot;포지션을 입력하시오 : &quot;);
        String position = userInput.nextLine();

        switch(position) {
            case &quot;공격수&quot; :
                System.out.println(&quot;전방 배치&quot;);
                break;
            case &quot;수비수&quot; :
            case &quot;골키퍼&quot; :
                System.out.println(&quot;후방 배치&quot;);
                break;
            default :
                System.out.println(&quot;중앙 배치&quot;);
                break;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조건문은 아래와 같이 중첩 사용도 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1769163973570&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (조건식1) {
    switch (입력 변수) {
        case 1 : 
            if (조건식2) {
            }
        break;
        ...
    }
} else if {
		...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 반복문&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문은 어떤 작업을 반복적으로 실행하고 싶을 때 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2.1 for 문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 횟수를 알고 있을 때 for 문을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769164365400&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (초기화식; 조건식; 증감식;) {
	//실행 블록
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2.2 while 문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에 따라 반복할 때 사용한다. 아래 코드에서 조건식이 참일 경우 실행문을 반복하고, 거짓일 경우 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769164448872&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (조건식) {
	//실행 블록
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건식에는 주로 비교 연산식, 논리 연삭식이 사용된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2.3 do-while 문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;do-while 문은 while 문과 유사하나 조건을 나중에 검사한다. 블록 내부 실행문을 우선 실행하고 조건식의 결과에 따라 반복 실행 여부를 결정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769164535663&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
	//실행 블록
} while (조건식);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2.4 break&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for, while, do-while, switch 문의 실행을 중지할 때 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769164653010&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (true) {
	i++;
    if (i &amp;gt; 6) {
    	break;
    }
}&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;*이중 이상의 중첩문일 경우 break-label을 사용하여 빠져나올 수 있다. 아래 코드는 label을 Outter로 선언하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1769164803233&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) throws Exception {
	Outter;
    for (char upper = 'A'; upper &amp;lt;= 'Z'; upper++) {
    	for (char lower = 'a'; lower &amp;lt;= 'z'; lower++) {
        	System.out.println(upper + &quot;-&quot; + lower);
            if (lower == g) {
            	break Outter;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2.5 continue&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;continue는 for 문, while 문, do-while 문에서만 사용된다. for 문의 증감 식이나 while, do-while 문의 조건식으로 이동한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769164895993&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 1; i &amp;lt;= 10; i++) {
	if (i % 2 != 0) {
    	continue;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 참조 타입&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1 메모리 사용 영역&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 참조 타입에 대해 알아보기에 앞서 우선 JVM이 사용하는 메모리 영역에 대해 알아보자. JVM은 다음 그림과 같이 OS에게 할당받은 메모리 영역을 세부 영역으로 구분하여 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAmtFe/dJMcabXixxq/jGY74j2rBHQVAkukGBgNIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAmtFe/dJMcabXixxq/jGY74j2rBHQVAkukGBgNIK/img.png&quot; data-alt=&quot;JVM Runtime Data Area&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAmtFe/dJMcabXixxq/jGY74j2rBHQVAkukGBgNIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAmtFe%2FdJMcabXixxq%2FjGY74j2rBHQVAkukGBgNIK%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;1422&quot; height=&quot;1112&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;1112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JVM Runtime Data Area&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메소드 영역(Method Area)&lt;/b&gt;에는 코드에서 사용되는 클래스들을 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다. 메소드 영역은 JVM이 시작할 때 생성되는 모든 스래드가 공유하는 영역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;힙 영역(Heap Area)&lt;/b&gt;에는 객체와 배열이 생성되는 영역이다. 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. JVM에서는 쓰레기 수집기(Garbage Collector)를 가동시켜 의미없는 객체(참조하는 변수나 필드가 없는)를 힙 영역에서 자동으로 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JVM 스택 영역(JVM Stack Area)&lt;/b&gt;은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. JVM 스택은 메소드를 호출할 때마다 프레임(Frame)을 푸시하고 메소드가 종료되면 해당 프레임을 팝하는 동작을 수행한다. 이러한 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 푸시되거나 팝된다.&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 참조 변수의 ==, != 연산&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 타입의 변수의 값은 힙 영역의 객체 주소이다. 동일한 객체를 참조하고 있을 경우 == 연산의 결과는 참이고 != 연산의 결과는 거짓이다. 아래 그림에서 refVar1과 refVar2는 서로 다른 객체를 참조 하고 있으므로 == 연산의 결과는 거짓, != 연산의 결과는 참이다. 반면, refVar2와 refVar3은 서로 같은 객체를 참조하고 있으므로 == 연산의 결과는 참, != 연산의 결과는 거짓이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFnR2/dJMcacu8pMn/kiLkzJvPkh3ZPCUz8LQQq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFnR2/dJMcacu8pMn/kiLkzJvPkh3ZPCUz8LQQq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFnR2/dJMcacu8pMn/kiLkzJvPkh3ZPCUz8LQQq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFnR2%2FdJMcacu8pMn%2FkiLkzJvPkh3ZPCUz8LQQq0%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;1302&quot; height=&quot;716&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.3 null과 NullPointerException&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다(null로 초기화 된 참조 변수는 스택 영역에 생성도니다). null 또한 == 연산과 != 연산을 통해 값을 비교할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바는 프로그램 실행 도중에 발생하는 오류를 &lt;b&gt;예외(Excpetion)&lt;/b&gt;라고 부른다. 참조 변수를 사용하며 가장 많이 발생하는 예외 중 하나로&amp;nbsp;&lt;b&gt;NullPointerException&lt;/b&gt;이 있다. 이는 참조 타입 변수가 null 값을 가지고 있을 때, 이 참조 타입 변수를 사용할 경우 발생한다. 참조할 객체가 없으므로 사용할 수가 없는 것이다. 다음과 같은 상황에서 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769246963834&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] intArr = null;
intArr[0] = 10;	//NPE 발생&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.4 배열 타입과 열거 타입&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5.4.1 배열 타입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열은 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터의 인덱스를 부여해 놓은 자료구조이다. 배열의 선언은 다음 두 가지로 진행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1769247052323&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 변수는 참조 변수에 속한다. 배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 객체를 참조하게 된다(null 참조가 가능하다).&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_1769247216164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] fruits = { &quot;Apple&quot;, &quot;Banna&quot;, &quot;Cherry&quot; };
fruits[1] = &quot;Abocado&quot;;&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_1769247281206&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] fruits;
furits = { &quot;Apple&quot;, &quot;Banna&quot;, &quot;Cherry&quot; }; //컴파일 에러&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;이와 같은경우에는 new 연산자를 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1769247335610&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] fruits = null;
fruits = new String[] { &quot;Apple&quot;, &quot;Banna&quot;, &quot;Cherry&quot; };&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;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 style=&quot;width: 19.263566%;&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;&lt;b&gt;데이터 타입&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%;&quot;&gt;&lt;b&gt;초기값&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.263566%;&quot;&gt;기본 타입(정수)&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;byte[]&lt;br /&gt;char[]&lt;br /&gt;short[]&lt;br /&gt;int[]&lt;br /&gt;long[]&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%;&quot;&gt;0&lt;br /&gt;'\u0000'&lt;br /&gt;0&lt;br /&gt;0&lt;br /&gt;0L&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.263566%;&quot;&gt;기본 타입(실수)&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;float[]&lt;br /&gt;double[]&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%;&quot;&gt;0.0F&lt;br /&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.263566%;&quot;&gt;기본 타입(논리)&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;boolean[]&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%;&quot;&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.263566%;&quot;&gt;참조 타입&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;클래스[]&lt;br /&gt;인터페이스[]&lt;/td&gt;
&lt;td style=&quot;width: 33.333333%;&quot;&gt;null&lt;br /&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 길이는 배열 객체의 length 필드를 읽으면 된다. 이때 도트 연산자가 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1769247520290&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Arr.length;&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_1769247725564&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] strArr = new String[3];
strArr[0] = &quot;Java&quot;;
strArr[1] = &quot;C++&quot;;
strArr[2] = &quot;C#&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EJiEY/dJMcaihOWSw/hqw3ivLW1uKFyp0PspoPa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EJiEY/dJMcaihOWSw/hqw3ivLW1uKFyp0PspoPa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EJiEY/dJMcaihOWSw/hqw3ivLW1uKFyp0PspoPa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJiEY%2FdJMcaihOWSw%2Fhqw3ivLW1uKFyp0PspoPa0%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;692&quot; height=&quot;406&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇기에 String[] 배열의 항목도 결국 String 변수와 동일하게 취급되어야 한다. String[] 배열 항목 간에 문자열을 비교하기 위해서는 == 연산자 대신 equlas() 메소드를 사용하여야 한다(== 는 객체의 번지 비교이기 때문이다!).&lt;/p&gt;
&lt;pre id=&quot;code_1769247896452&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] strArr = new String[3];
strArr[0] = &quot;Java&quot;;
strArr[1] = &quot;Java&quot;;
strArr[2] = new String(&quot;Java&quot;);

System.out.println( strArr[0] == strArr[1] );	    //true(같은 객체 참조)
System.out.println( strArr[1] == strArr[2] ); 		//false(다른 객체 참조)
System.out.println( strArr[0].equals(strArr[1]) );  //true(문자열이 동일)&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;배열의 복사는 for 문을 사용하거나 System.arraycopy() 메소드를 통해 진행된다. 예를 들어 원본 배열이 arr1이고 새 배열이 arr2라 하자. arr1의 모든 항목을 arr2에 복사하려면 다음과 같이 메소드를 호출하여야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1769248139387&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
System.arraycopy(arr1, 0, arr2, arr1.length);&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;b&gt;5.4.2 열거 타입&lt;/b&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;열거 타입을 선언하기 위해서는 먼저 열거 타입의 이름을 정하고 열거 타입 이름으로 소스 파일(.java)를 생성해야 한다. 컨벤션으로는 첫 문자는 대문자로 하고 나머지는 소문자로 하며 캐멀 케이스를 따른다. 열거 상수는 모두 대문자로 작성하고 띄어쓰기는 _로 표기하는 것이 것이 컨벤션이다.&lt;/p&gt;
&lt;pre id=&quot;code_1769248326086&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURADAY,
    SUNDAY,
}&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_1769248411556&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Week today;
Week reservationDay;&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;i&gt;열거타입.열거상수&lt;/i&gt; 형식으로 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1769248463334&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Week today = Week.MONDAY;
Week reservationDay = null;&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;열거 타입 변수 today에 대해 살펴보자. 이는 스택 영역에서 생성된다. today에 저장되는 값은 Week.MONDAY 열거 상수가 참조하는 객체의 번지이다. 따라서 today와 Week.MONDAY는 서로 같은 Week 객체를 참조하게 된다. 그렇기 때문에 다음 연산 결과는 true이다.&lt;/p&gt;
&lt;pre id=&quot;code_1769248624450&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;today == Week.MONDAY&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Science/Java</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/41</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EC%A1%B0%EA%B1%B4%EB%AC%B8%EA%B3%BC-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%B0%B8%EC%A1%B0-%ED%83%80%EC%9E%85#entry41comment</comments>
      <pubDate>Sat, 24 Jan 2026 18:57:33 +0900</pubDate>
    </item>
    <item>
      <title>자바 시작하기 / 변수와 타입, 연산자</title>
      <link>https://rdhdevelop.tistory.com/entry/%EC%9E%90%EB%B0%94-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B3%80%EC%88%98%EC%99%80-%ED%83%80%EC%9E%85-%EC%97%B0%EC%82%B0%EC%9E%90</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 자바란&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바는 1995년 선 마이크로시스템즈(Sun Microsystems)에서 개발 된 후 지금까지 전세계적으로 다양한 분야에서 사용되고 있는 프로그래밍 언어이다. 초기의 자바는 가전 제품에 탑재할 프로그래밍 언어로 개발되었지만, 지금은 스마트폰을 비롯해서 각종 장비와 데스크톱에서 실행되는 어플리케이션, 그리고 금융, 공공, 대기업 등의 엔터프라이즈 기업 환경에서 실행되는 서버 애플리케이션을 개발하는 중추적인 언어로 자리매김하고 있다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.1 자바의 특징&lt;/h3&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;높은 이식성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이식성이란 서로 다른 실행 환경을 가진 시스템 간 프로그램을 옮겨 실행할 수 있는 것을 말한다(ex. MS윈도우에서 실행되는 프로그램을 UNIX에서 실행할 수 있다 &amp;rarr; 높은 이식성). 자바 언어는 JRE(자바 실행 환경)이 설치 된 모든 운영체제에서 실행가능하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;객체 지향성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체 지향 프로그래밍이란 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나로 연결해서 전체 프로그램을 온성하는 기법을 말한다. 자바는 100% 객체 지향 언어이다. 객체를 만들기 위해 설계도인 클래스를 작성하고, 객체와 객체를 연결한다. 이 과정에서 캡슐화, 상속, 다형성 등 다양한 기능을 지원한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수적 스타일 코딩&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바는 람다식을 지원하여, 간결한 코드로 프로그래밍 할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동 메모리 관리&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;C언어는 malloc(), free() 등을 이용하여 개발자가 직접 객체와 메모리를 관리한다. 하지만, 자바는 이 작업을 스스로 수행한다. 개발자는 직접 메모리에 접근할 수 없도록 설계되었기 때문이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다양한 어플리케이션 개발 가능&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바는 윈도우, 리눅스, 유닉스, 맥 등 거의 모든 운영체제에서 실행되는 프로그램을 개발할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쉬운 멀티 스레드(Multi-thread) 구현&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;하나의 프로그램이 동시에 여러 가지 작업을 처리해야 할 경우, 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분류하여 병렬 처리해야 할 경우 멀티 스레드 프로그래밍이 필요하다. 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있어 이러한 멀티 스레드를 쉽게 구현할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적 로딩 지원&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바 어플리케이션은 여러 객체가 서로 연결되어 실행되는데, 이 객체들은 클래스로부터 생성된다. 어플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성하는 방식을 채택하기 때문에 빠른 실행시간과 쉬운 유지보수성을 가진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;막강한 오픈소스 라이브러리&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자바 프로그램에서 사용하는 오픈소스 라이브러리는 방대하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.2 JVM(Java Virtual Machine)&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Java는 완전한 기계어가 아닌, 중간 단계의 바이트 코드이다. 따라서 OS는 Java를 바로 실행할 수 없고, 이 바이트코드를 해석하고 실행할 수 있도록 하는 가상의 운영체제인 JVM을 필요로 한다. OS별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에 OS별로 별도의 프로그램을 개발하는 것보다 OS와 프로그램을 중계하는 JVM을 두어 여러 운영체제에서 동일한 실행 결과가 나오도록 설계한 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckqqnI/dJMb996fo5v/DzCKaPpAEULHqzyohKBYh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckqqnI/dJMb996fo5v/DzCKaPpAEULHqzyohKBYh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckqqnI/dJMb996fo5v/DzCKaPpAEULHqzyohKBYh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckqqnI%2FdJMb996fo5v%2FDzCKaPpAEULHqzyohKBYh0%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;1292&quot; height=&quot;974&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.3 자바 프로그램 개발 프로세스&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바 프로그램의 개발은 다음과 같은 순서로 진행되어야 한다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.1) .java 소스 파일 작성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.2) 컴파일러(java.exe)로 바이트 코드 파일(.class) 생성&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Step.3) JVM 구동 명령어(java.exe)로 실행&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바 프로그램을 개발하기 위해서는 우선 파일 확장명이 .java인 텍스트 파일을 생성하고 프로그램 소르를 작성한다. 이렇게 만들어진 파일을 자바 소스 파일이라고 한다. 작성 완료된 자바 소스 파일은 컴파일러(java.exe)로 컴파일해야 한다. 컴파일이 성공되면 확장명이 .class인 바이트 코드 파일이 생성된다. 예를 들어, 명령 프롬포트에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://hello.java/&quot;&gt;Hello.java&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;소스 파일을 다음과 같이 컴파일하면 Hello.class 파일이 생성된다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;javac Hello.java
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바이트 코드 파일은 완전한 기계어가 아니므로 단독으로 실행할 수 없고 JVM이 실행되어야 한다. JVM을 구동시키는 명령어는 javac.exe이다. 예를 들어, Hello.class라는 바이트 코드 파일을 java.exe로 실행하려면 명령 프롬포트에서 다음과 같이 입력하고 엔터를 누르면 된다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;java Hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 변수&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램은 작업을 처리하는 과정에서 필요에 따라 데이터를 메모리에 저장한다. 이대 변수를 사용하는데, 변수는 값을 저장할 수 있는 메모리의 공간을 의미한다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.1 변수의 선언&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변수를 사용하기 위해서는 먼저 변수를 선언해야 한다. 변수 선언은 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;/* [타입] [변수이름] */
int age;
double x, y, z;
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변수의 이름은 다음과 같은 규칙을 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규칙예시&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;첫 번째 글자는 문자이거나 &amp;lsquo;&amp;amp;&amp;rsquo;, &amp;lsquo;_&amp;rsquo;이어야 한다(숫자 X).&lt;/td&gt;
&lt;td&gt;가능: price, $price, _comNam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;불가능: 1v, @speed&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;영어 대소문자가 구분된다&lt;/td&gt;
&lt;td&gt;firstName와 firstname은 다름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;첫 문자는 영어 소문자로 시작하는 것이 관례이다. 다른 단어가 붙을 경우 첫 문자를 대문자로 한다.&lt;/td&gt;
&lt;td&gt;maxSpeed, firstName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;길이의 제한은 없다&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자바 예약어는 사용할 수 없다&lt;/td&gt;
&lt;td&gt;아래 표 참조&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바는 다음 표에 언급되어 있는 예약어를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분류예약어&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;기본 데이터 타입&lt;/td&gt;
&lt;td&gt;boolean, byte, char, short, int, long, float, double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;접근 지정자&lt;/td&gt;
&lt;td&gt;private, protected, public&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;클래스 관련&lt;/td&gt;
&lt;td&gt;class, abstract, interface, extends, implements, enum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;객체 관련&lt;/td&gt;
&lt;td&gt;new instanceof, this, super, null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메소드 관련&lt;/td&gt;
&lt;td&gt;void, return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제어문 관련&lt;/td&gt;
&lt;td&gt;if, else, switch, case, default, for, do, while, break, continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;논리값&lt;/td&gt;
&lt;td&gt;true, false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;예외 처리 관련&lt;/td&gt;
&lt;td&gt;try, catch, finally, throw, throws&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기타&lt;/td&gt;
&lt;td&gt;transient, volatile, package, import, synchronized, native, final, static, strictfp, assert&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.2 변수의 사용&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.2.1 변수값 저장&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변수에 값을 저장힐 때는 대입 연산자(=)를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;int score;    //변수 선언
score = 90;   //값 저장

int age = 15; //초기값을 선언삼과 동시에 저장할 수도 있다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값을 리터럴(literal)이라고 한다. 리터럴은 수학적으로 상수(constant)와 같은 의미지만 프로그램에서 상수는 &amp;ldquo;한 번 지정하면 변경할 수 없는 변수&amp;rdquo;라는 뜻을 기자고 있기에 &amp;lsquo;리터럴&amp;rsquo;이라는 용어를 통해 따로 구분한다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정수 리터럴&lt;/b&gt;(byte, char, short, int, long)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;0, 75, -100 //소수점이 없는 정수 리터럴은 10진수로 간주한다
02, -04     //0으로 시작되는 리터럴은 8진수로 간주한다
0x5, 0xAC08 //0x 또는 0X로 시작하고 [0-9][A-F][a-f]로 구성된 리터럴은 16진수로 간주한다
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실수 리터럴&lt;/b&gt;(float, double)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;0.25, -3.14 //소수점이 있는 리터럴은 10진수 실수로 간주한다
0.12E-5     //E 또는 e가 있는 리터럴은 10진수 지수와 가수로 구분한다
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자 리터럴&lt;/b&gt;(char)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;1c&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;'A', '한'   //작은 따옴표(')로 묶인 텍스는 하나의 문자 리터럴로 간주한다
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 리터럴&lt;/b&gt;(String)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;1c&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;&quot;Apple&quot;, &quot;탭 만큼 이동 \\t 합니다.&quot; //큰 따옴표(&quot;)로 묶인 텍스트는 문자열 리터럴로 간주한다
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;논리 리터럴&lt;/b&gt;(boolean)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;true, false //ture와 false는 논리 리터럴로 간주한다
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.2.2 변수의 사용 범위&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; 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;1398&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQbkaU/dJMcafMaN58/KOnIN1nn7ZBApwg18LlI61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQbkaU/dJMcafMaN58/KOnIN1nn7ZBApwg18LlI61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQbkaU/dJMcafMaN58/KOnIN1nn7ZBApwg18LlI61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQbkaU%2FdJMcafMaN58%2FKOnIN1nn7ZBApwg18LlI61%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;1398&quot; height=&quot;800&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수를 선언할 때에는 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다. 만약 제어문 내에서 잠깐 사용되는 변수라면 제어문 내에서 선언하는 것이 좋다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.3 데이터 타입&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.3.1 Primitive 타입과 Reference 타입&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바에서 데이터 타입은 크게 Primitive 타입과 Reference 타입으로 나뉜다. Primitive type은 정수, 실수, 문자 등 실제 데이터를 저장하는 값이고, Reference type은 Object의 참조 주소를 저장하는 타입으로써, 메모리 번지 값을 통해 Object를 참조한다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Primitive Type는 null을 담을 수 없다. 하지만 Reference Tyep는 Null을 담을 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;	int i = null;            //불가능
	Integer integer = null;  //가능
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Primitive Type는 제네릭 타입에서 사용할 수 없다. 하지만 Reference Type는 제네릭 타입에서 사용 가능하다.&lt;/p&gt;
&lt;pre class=&quot;lasso&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;List&amp;lt;int&amp;gt; i;            //불가능
List&amp;lt;Integer&amp;gt; integer;  //가능
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.3.2 정수 타입&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정수형 데이터 타입의 자료형과 메모리 범위는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형메모리범위&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;byte&lt;/td&gt;
&lt;td&gt;1byte&lt;/td&gt;
&lt;td&gt;-128 ~ 127 (-2^7 ~ 2^7 - 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;2byte&lt;/td&gt;
&lt;td&gt;-32,768 ~ 32,767 (-2^15 ~ 2^15 - 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;4byte&lt;/td&gt;
&lt;td&gt;-2,147,483,648 ~ 2,147,483,647 (-2^31 ~ 2^31 - 1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;8byte&lt;/td&gt;
&lt;td&gt;-2^63 ~ 2^63 - 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정수형 리터럴은 다음과 같이 정수형 변수에 할당할 수 있다. 단, long 타입의 변수에 정수형 리터럴을 접미사 L을 붙여주어야 한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;byte byteVar = 123;
short shortVar = 12345;
int intVar = 123456789;
long longVar = 12345678910L;
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자료형이 가질 수 있는 최댓값 초과의 리터럴이 할당된 경우 오버플로우가 발생한다(&amp;rarr; 이때 해당 타입의 최솟값으로 순환). 이와 반대로 자료형이 가질 수 있는 최솟값 미만의 리터럴이 할당된 경우 언더플로우가 발생한다(&amp;rarr; 이때 해당 타입의 최댓값으로 순환)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LL1v4/dJMcahJZnf1/WfsNCk7hQsOJwR3BRhOax1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LL1v4/dJMcahJZnf1/WfsNCk7hQsOJwR3BRhOax1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LL1v4/dJMcahJZnf1/WfsNCk7hQsOJwR3BRhOax1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLL1v4%2FdJMcahJZnf1%2FWfsNCk7hQsOJwR3BRhOax1%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;1370&quot; height=&quot;328&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1769163389540&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 오버플로우 */
byte num = 127;
system.out.println(++num); //출력 결과: -128

/* 언더플로우 */
byte num = -128;
system.out.println(--num); //출력 결과: 127&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.3.3실수 타입&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바에서 실수를 나타내는 데이터 타입은 float형과 double형 두 가지로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형메모리범위정밀도&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;float&lt;/td&gt;
&lt;td&gt;4 byte&lt;/td&gt;
&lt;td&gt;음수: -3.4 * 10^38 ~ -1.4 * 10^-45&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;양수: 1.4 * 10^45 ~ 3.4 * 10^38&lt;/td&gt;
&lt;td&gt;7자리&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;8 byte&lt;/td&gt;
&lt;td&gt;음수: -1.8 * 10^308 ~ 4.9 * 10^-324&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;양수: 4.9 * 10^-324 ~ 1.8 * 10^308&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실수형 리터럴은 다음과 같이 할당할 수 있다. 단, float 타입의 변수의 실수형 리터럴을 할당할 때는 접미사 f를 붙여주어야 한다. double 타입 또한 접미사 d를 붙여 표현이 가능하지만, 일반적으로 생략한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;float pi = 3.14f;
double pi = 3.14;
double pi = 3.14d;
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실수 타입에서 오버플로우는 해당 타입의 최댓값 초과 혹은 최솟값 미만의 리터럴이 할당되었을 때 발생하며, 이때 값은 무한대가 된다. 실수 타입에서 언더플로우는 값이 음의 범위의 최댓값 또는 양의 범위의 최솟값을 넘어갔을 때 발생하며, 이때 값은 0이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ABMbY/dJMcaajMm1I/fGGGZGgH6dqnrMPZStBvP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ABMbY/dJMcaajMm1I/fGGGZGgH6dqnrMPZStBvP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ABMbY/dJMcaajMm1I/fGGGZGgH6dqnrMPZStBvP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FABMbY%2FdJMcaajMm1I%2FfGGGZGgH6dqnrMPZStBvP0%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;1380&quot; height=&quot;348&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 연산자와 연산식&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;연산자란 어떤 기능 또는 어떤 객체에 계산과 같은 처리를 수행하는 문자 또는 기호이다. Java에서의 연산자는 크게 단항, 이항, 삼항, 대입 연산자로 나뉜다. 피연산자는 연산자의 작업 대상으로 변수, 상수, 수식 등이 그 예이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;연산의 방향과 우선순위는 다음 표와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위연산자피연산자연산 방향&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;0&lt;/td&gt;
&lt;td&gt;( ) 괄호 혹 연산자&lt;/td&gt;
&lt;td&gt;다양&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;증감(++, &amp;mdash;), 부호(+, -), 비트(~), 논리(!)&lt;/td&gt;
&lt;td&gt;단항&lt;/td&gt;
&lt;td&gt;&amp;larr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;산술(* . / %)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;산술(+, -)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;쉬프트(&amp;gt;&amp;gt;, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;&amp;gt;)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;비교(&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, instead)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;비교(==, !=)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;논리(&amp;amp;)&lt;/td&gt;
&lt;td&gt;이항(단항)&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;논리(^)&lt;/td&gt;
&lt;td&gt;이항(단항)&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;논리(&lt;/td&gt;
&lt;td&gt;)&lt;/td&gt;
&lt;td&gt;이항(단항)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;논리(&amp;amp;&amp;amp;)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;논리(&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;조건(? :)&lt;/td&gt;
&lt;td&gt;삼항&lt;/td&gt;
&lt;td&gt;&amp;rarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;대입(=, +=, -=, *=, /=, %=, &amp;amp;=, ^=,&lt;/td&gt;
&lt;td&gt;=, &amp;lt;&amp;lt;=, &amp;gt;&amp;gt;=, &amp;gt;&amp;gt;&amp;gt;=)&lt;/td&gt;
&lt;td&gt;이항&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음과 같은 식이 있다고 하자(단, x와 y는 변수)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;x &amp;gt; 0 &amp;amp;&amp;amp; y &amp;lt; 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 비교 연산(&amp;gt;, &amp;lt;)이 먼저 수행된 후 논리(&amp;amp;&amp;amp;)연산이 처리된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; 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;1400&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNBwMc/dJMcadHxzko/gdhpKkxuCtRFEEmEALSP4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNBwMc/dJMcadHxzko/gdhpKkxuCtRFEEmEALSP4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNBwMc/dJMcadHxzko/gdhpKkxuCtRFEEmEALSP4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNBwMc%2FdJMcadHxzko%2FgdhpKkxuCtRFEEmEALSP4k%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;1400&quot; height=&quot;408&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Computer Science/Java</category>
      <author>도뇨니</author>
      <guid isPermaLink="true">https://rdhdevelop.tistory.com/40</guid>
      <comments>https://rdhdevelop.tistory.com/entry/%EC%9E%90%EB%B0%94-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B3%80%EC%88%98%EC%99%80-%ED%83%80%EC%9E%85-%EC%97%B0%EC%82%B0%EC%9E%90#entry40comment</comments>
      <pubDate>Fri, 23 Jan 2026 19:17:04 +0900</pubDate>
    </item>
  </channel>
</rss>