<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hello World!</title>
    <link>https://0yeonjae2.tistory.com/</link>
    <description>소프트웨어학부 졸업생의 공부 &amp;amp; 활동 블로그</description>
    <language>ko</language>
    <pubDate>Wed, 26 Aug 2026 10:52:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>최연재</managingEditor>
    <image>
      <title>Hello World!</title>
      <url>https://tistory1.daumcdn.net/tistory/5212186/attach/26348f17a2e7410a9153b4381f7fc7f7</url>
      <link>https://0yeonjae2.tistory.com</link>
    </image>
    <item>
      <title>[❄️회고] 대학교 졸업했습니다 </title>
      <link>https://0yeonjae2.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 정말 오랜만에 올리는 글입니다. 제목 그대로 대학을 졸업했습니다. &lt;span style=&quot;color: #333333;&quot;&gt;졸업한 지금&amp;nbsp;&lt;/span&gt;생각해 보면&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;어느 학기보다 8학기가 가장 힘들고 지쳤던 것 같습니다. &lt;/span&gt;여러 일을 겪고, 여러 도전을 했으며 그 결과 취업준비도 종지부를 찍게 되었습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;취업과 관련된 이야기는 추후 별도의 글로 올릴 예정이라 이번 글에서는 대학 졸업에 대한 이야기만 해보겠습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #d9e5ff;&quot;&gt;입학&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 22학번으로 숙명여자대학교 소프트웨어융합전공에 입학했습니다. 그때까지만 해도 여전히 코로나 상황으로 인해 대면 입학식을 하지 못했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QlZ3v/dJMcaiCmfzo/dAtCtYjzSn9kplfQIJhHc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QlZ3v/dJMcaiCmfzo/dAtCtYjzSn9kplfQIJhHc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QlZ3v/dJMcaiCmfzo/dAtCtYjzSn9kplfQIJhHc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQlZ3v%2FdJMcaiCmfzo%2FdAtCtYjzSn9kplfQIJhHc1%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;1080&quot; height=&quot;674&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전까지 말한 적은 없었는데 면접형 수석으로 대학에 붙었었습니다! 졸업까지 했으니 한 번 언급해봅니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dad9ff;&quot;&gt;학기별 후기&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학기가 끝날 때마다 간단하게 회고를 적었는데, 성적과 함께 학기별 수강 후기를 적어보겠습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  1학년 1학기 (2022-1학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/42hCP/dJMcajuBrcL/iXrLe1Beqgsc7oBNR0k2AK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/42hCP/dJMcajuBrcL/iXrLe1Beqgsc7oBNR0k2AK/img.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;526&quot; style=&quot;width: 62.3797%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/42hCP/dJMcajuBrcL/iXrLe1Beqgsc7oBNR0k2AK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F42hCP%2FdJMcajuBrcL%2FiXrLe1Beqgsc7oBNR0k2AK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z7Brf/dJMcajuBrcM/xbU4F5JdiFV22V3VI05fO0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z7Brf/dJMcajuBrcM/xbU4F5JdiFV22V3VI05fO0/img.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot; style=&quot;width: 36.4575%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z7Brf/dJMcajuBrcM/xbU4F5JdiFV22V3VI05fO0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ7Brf%2FdJMcajuBrcM%2FxbU4F5JdiFV22V3VI05fO0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;4.3/4.3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 대학원에 가는 걸 목표로 대학에 입학했었기에 성적에 신경을 썼었습니다. 이때 4.3으로&amp;nbsp; &lt;a href=&quot;https://www.sookmyung.ac.kr/kr/university-life/achievement02.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;학기 최우등생&lt;/span&gt;&lt;/a&gt;&amp;nbsp;상장을 받았습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; 1학년 2학기 (2022-2학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xABL3/dJMcaa5wXBt/nZ9WcsS4KK1mczP766EZcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xABL3/dJMcaa5wXBt/nZ9WcsS4KK1mczP766EZcK/img.png&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;404&quot; style=&quot;width: 60.5532%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xABL3/dJMcaa5wXBt/nZ9WcsS4KK1mczP766EZcK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxABL3%2FdJMcaa5wXBt%2FnZ9WcsS4KK1mczP766EZcK%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;639&quot; height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qdhPe/dJMcaaqVNRS/kK9SgbqDln168gZPFjhcp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qdhPe/dJMcaaqVNRS/kK9SgbqDln168gZPFjhcp0/img.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot; style=&quot;width: 38.284%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qdhPe/dJMcaaqVNRS/kK9SgbqDln168gZPFjhcp0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqdhPe%2FdJMcaaqVNRS%2FkK9SgbqDln168gZPFjhcp0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;4.3/4.3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1학기까지는 코로나로 인해 비대면이 혼용되었는데, 해당 학기부터 전면 대면수업으로 진행되었습니다. 이때까지도 교양을 많이 수강했는데 제 대학생활 중 가장 좋아했던 교양인 &amp;lt;신화의 이해&amp;gt;를 들었습니다. 그리스 로마 신화를 다루고 신화 속 이야기의 의미를 배우는 수업인데 제가 그리스 로마 신화를 어릴 때부터 많이 읽어서 더욱 재밌었습니다. 당시 중간고사를 잘 봤는데 교수님께서 &quot;중간고사 서술형을 잘 썼던데 수강생들 앞에서 읽어줄 수 있는지&quot; 여쭤보시기도 했습니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;학기우등생으로 상장을 받았습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  2학년 1학기 (2023-1학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJGA5/dJMcaiibggd/pBppIhvGCj59ZzgI8tOYHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJGA5/dJMcaiibggd/pBppIhvGCj59ZzgI8tOYHK/img.png&quot; data-alt=&quot;4.2/4.3 (4.45/4.5)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJGA5/dJMcaiibggd/pBppIhvGCj59ZzgI8tOYHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJGA5%2FdJMcaiibggd%2FpBppIhvGCj59ZzgI8tOYHK%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;730&quot; height=&quot;396&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4.2/4.3 (4.45/4.5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2학년 때부터 본격적으로 동아리 활동을 많이 하기 시작했습니다. 이때 처음으로 A0를 받았는데 아쉽다기보다는 성적에 대한 부담을 내려놓았던 것 같습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; 2학년 2학기 (2023-2학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efj0zP/dJMcahp3AIt/toZKZhLSjE6AKgogFc9EUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efj0zP/dJMcahp3AIt/toZKZhLSjE6AKgogFc9EUK/img.png&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;563&quot; style=&quot;width: 63.0294%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efj0zP/dJMcahp3AIt/toZKZhLSjE6AKgogFc9EUK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fefj0zP%2FdJMcahp3AIt%2FtoZKZhLSjE6AKgogFc9EUK%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;991&quot; height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R2y4t/dJMcagdCx27/gYbYxfUjGkSSF2Aniroe51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R2y4t/dJMcagdCx27/gYbYxfUjGkSSF2Aniroe51/img.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot; style=&quot;width: 35.8078%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R2y4t/dJMcagdCx27/gYbYxfUjGkSSF2Aniroe51/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR2y4t%2FdJMcagdCx27%2FgYbYxfUjGkSSF2Aniroe51%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;4.24/4.3 (4.47/4.5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4학년을 제외하고 1학기와 4학기가 가장 적은 학점을 들은 학기입니다. 이전 학기보다 시간이 남아서 제 진로에 대해서 고민을 많이 했습니다.&amp;nbsp;이때까지는 대학원만 생각하며 다른 활동을 안 했었는데, 다양한 분야로부터의 도전을 계획했습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;제가 학기 성적을 기준으로 우등생 상장을 받은 마지막 학기이기도 합니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; ️ 3학년 1학기 (2024-1학기)&lt;/h4&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;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEU3at/dJMcahcvj7B/RDvjXltTos39sen0iRzVW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEU3at/dJMcahcvj7B/RDvjXltTos39sen0iRzVW1/img.png&quot; data-alt=&quot;4.12/4.3 (4.41)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEU3at/dJMcahcvj7B/RDvjXltTos39sen0iRzVW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEU3at%2FdJMcahcvj7B%2FRDvjXltTos39sen0iRzVW1%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;836&quot; height=&quot;472&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4.12/4.3 (4.41)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 학기는 ALGOS 동아리 회장으로 SMUPC 출제 및 총괄을 학기 내내 병행하면서 6전공을 했습니다. 당시 회장이라는 직책에서 오는 부담도 있었고, 화목 시간표가 9-6 전공 4개였습니다. 그래서 학교 어디에서든지 앉기만 하면 1분 안에 잠드는 스킬을 얻었고, 커피도 정말 많이 마셨던 학기입니다. 동기랑 공강 때마다 소파 찾아서 자고, 출퇴근길 지하철에 힘들었던 기억이 많이 납니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;중간고사 일주일 전에 심한 열몸살감기에 걸려서 시험 직전 주말에 병원 가서 주사 맞고 시험기간 내내 아팠습니다. 그래서 몇 과목 중간고사 성적이 개인적으로 아쉬웠기에 기말을 진짜 열심히 준비했었습니다.&amp;nbsp; 최종적으로는 위와 같은 성적을 받았습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;❄️ 3학년 2학기 (2024-2학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT34hm/dJMcagkmj0Q/bj1ymNe00gLc4Me4FmWSS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT34hm/dJMcagkmj0Q/bj1ymNe00gLc4Me4FmWSS1/img.png&quot; data-alt=&quot;4.15/4.3 (4.43/4.5)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT34hm/dJMcagkmj0Q/bj1ymNe00gLc4Me4FmWSS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT34hm%2FdJMcagkmj0Q%2Fbj1ymNe00gLc4Me4FmWSS1%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;748&quot; height=&quot;413&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4.15/4.3 (4.43/4.5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;제 인생에 3학년 1학기만큼 힘든 학기는 없을 거라 생각했는데 2학기에는 ALGOS, ICPC Sinchon 2개의 동아리에서 회장을 맡았습니다. 학기 중에 대회를 주최한 건 아니었고, 3-1학기에 비해 과목을 적게 들어서 괜찮을 거라고 생각했는데, 3-1학기의 여파가 영향을 미친 학기였습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;중간고사 기간에 또 감기에 걸렸고, 시험 내내 편두통이 심했습니다. 중간고사 마지막 일정이 하루에 두 과목을 보는 일정이었는데, 첫 과목을 보고 머리가 너무 아파서 두 번째 시험 강의실을 잘못 찾아갔습니다. 시험 시작 3분 전에 알아서 바로 짐 챙겨서 강의실 옮겨가서 시험을 봤습니다. 인원을 나눠서 보는 시험이라 바로 옆 강의실인 덕분에 지각입실 등의 문제는 없었는데, 시험 끝나고 동기들이 괜찮냐고 많이 걱정해 줬습니다. 시험에 모든 기력을 다 쓰고 기숙사 돌아오자마자 긴장 풀려서 코피 터졌습니다. 결과적으로는 이 날 봤던 두 과목 모두 A+ 나왔습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;기말고사 기간에는 학회 일들도 겹쳐서 일주일 내내 하루 수면량 2시간 + 1일 1 식 하면서 공부했습니다. 종강이 21일 토요일이었는데 오후 12시에 기말고사를 보고 바로 도서관에 가서 프로젝트 팀플수업 최종 정리를 했습니다. 오후 8시에 최종 보고서 내고 밤 10시부터 학회 회의가 있어서 기숙사 가는 길에 서브웨이 하나 포장해 가서 회의 끝나고 먹었던 기억이 납니다. 시험 보기 전 아침에 찹쌀볼 하나 먹은 뒤 처음 먹는 밥이었는데 배도 안 고파서 절반 먹지도 못했습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;⛄4학년 1학기 (2025-1학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X9FAt/dJMcachYQGd/J99XWPPqUjtgL2Gs2FsPW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X9FAt/dJMcachYQGd/J99XWPPqUjtgL2Gs2FsPW0/img.png&quot; data-alt=&quot;4.13/4.3 (4.42/4.5)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X9FAt/dJMcachYQGd/J99XWPPqUjtgL2Gs2FsPW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX9FAt%2FdJMcachYQGd%2FJ99XWPPqUjtgL2Gs2FsPW0%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;969&quot; height=&quot;515&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4.13/4.3 (4.42/4.5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3학년을 힘들게 보내서 4학년 때는 힘을 뺐습니다. 졸업프로젝트와 SMUPC 출제를 병행한 학기였습니다. 제가 지금까지 들었던 모든 전공 중 가장 어렵다고 말할 수 있는 컴파일러를 들었는데, 과제하다가 스스로가 답답해서 울었습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;☃️4학년 2학기 (2025-2학기)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dROPVx/dJMcaibrtuV/gQs2YyhRVMdG6cvzafHYIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dROPVx/dJMcaibrtuV/gQs2YyhRVMdG6cvzafHYIK/img.png&quot; data-alt=&quot;4.05/4.3 (4.35/4.5)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dROPVx/dJMcaibrtuV/gQs2YyhRVMdG6cvzafHYIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdROPVx%2FdJMcaibrtuV%2FgQs2YyhRVMdG6cvzafHYIK%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;951&quot; height=&quot;452&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4.05/4.3 (4.35/4.5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막이라 12학점을 들었습니다. 사실 6학기까지 120학점을 들어서 졸업학점은 10학점만 남았었는데 욕심을 내서 4학년을 보냈습니다. 딥러닝개론 중간을 미끄러져서 기말고사로 복구하려고 노력을 많이 했습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1학년 때의 성적 덕분에 한동안 전체 석차 1등이었는데 최종 2등으로 마무리합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by3lhH/dJMcaaqVOPf/1hSjOI5hOhVR0kk7AvAtS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by3lhH/dJMcaaqVOPf/1hSjOI5hOhVR0kk7AvAtS0/img.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;188&quot; style=&quot;width: 71.5884%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by3lhH/dJMcaaqVOPf/1hSjOI5hOhVR0kk7AvAtS0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby3lhH%2FdJMcaaqVOPf%2F1hSjOI5hOhVR0kk7AvAtS0%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;905&quot; height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eQ0cwB/dJMcagq8hDz/G279lKpiVVJ98Ic2Z796R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eQ0cwB/dJMcagq8hDz/G279lKpiVVJ98Ic2Z796R0/img.png&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;161&quot; style=&quot;width: 27.2488%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eQ0cwB/dJMcagq8hDz/G279lKpiVVJ98Ic2Z796R0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeQ0cwB%2FdJMcagq8hDz%2FG279lKpiVVJ98Ic2Z796R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;295&quot; height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #d9d6ff;&quot;&gt;졸업&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 2월 20일에 졸업을 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdqMHU/dJMcabXFAzc/XKTaAo9IkHLZOor6VVnF91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdqMHU/dJMcabXFAzc/XKTaAo9IkHLZOor6VVnF91/img.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1707&quot; style=&quot;width: 45.2258%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdqMHU/dJMcabXFAzc/XKTaAo9IkHLZOor6VVnF91/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdqMHU%2FdJMcabXFAzc%2FXKTaAo9IkHLZOor6VVnF91%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;1080&quot; height=&quot;1707&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTBSJH/dJMb99ZSCte/h8vcR4qh0tt2QvjHcKpdw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTBSJH/dJMb99ZSCte/h8vcR4qh0tt2QvjHcKpdw1/img.jpg&quot; data-origin-width=&quot;3060&quot; data-origin-height=&quot;4080&quot; style=&quot;width: 53.6114%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTBSJH/dJMb99ZSCte/h8vcR4qh0tt2QvjHcKpdw1/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTBSJH%2FdJMb99ZSCte%2Fh8vcR4qh0tt2QvjHcKpdw1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3060&quot; height=&quot;4080&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&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;5355&quot; data-origin-height=&quot;3570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXlSk/dJMcadA6Q7F/0Tv0vQjrhA5jQjDPTX6lI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXlSk/dJMcadA6Q7F/0Tv0vQjrhA5jQjDPTX6lI0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXlSk/dJMcadA6Q7F/0Tv0vQjrhA5jQjDPTX6lI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXlSk%2FdJMcadA6Q7F%2F0Tv0vQjrhA5jQjDPTX6lI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5355&quot; height=&quot;3570&quot; data-origin-width=&quot;5355&quot; data-origin-height=&quot;3570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ROKuC/dJMcadA6Q7H/XDORivhIWksjtOPw674gsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ROKuC/dJMcadA6Q7H/XDORivhIWksjtOPw674gsk/img.jpg&quot; data-origin-width=&quot;4672&quot; data-origin-height=&quot;7008&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ROKuC/dJMcadA6Q7H/XDORivhIWksjtOPw674gsk/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FROKuC%2FdJMcadA6Q7H%2FXDORivhIWksjtOPw674gsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4672&quot; height=&quot;7008&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpw70F/dJMcahXSOra/4Yh4FLEoZ3ECHaoVXPKbuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpw70F/dJMcahXSOra/4Yh4FLEoZ3ECHaoVXPKbuk/img.jpg&quot; data-origin-width=&quot;4672&quot; data-origin-height=&quot;7008&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpw70F/dJMcahXSOra/4Yh4FLEoZ3ECHaoVXPKbuk/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpw70F%2FdJMcahXSOra%2F4Yh4FLEoZ3ECHaoVXPKbuk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4672&quot; height=&quot;7008&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pi96C/dJMcacvw3Y2/6KxuXFxMe4uyVJqIFUyO1k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pi96C/dJMcacvw3Y2/6KxuXFxMe4uyVJqIFUyO1k/img.jpg&quot; data-origin-width=&quot;2864&quot; data-origin-height=&quot;3818&quot; style=&quot;width: 49.4208%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pi96C/dJMcacvw3Y2/6KxuXFxMe4uyVJqIFUyO1k/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpi96C%2FdJMcacvw3Y2%2F6KxuXFxMe4uyVJqIFUyO1k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2864&quot; height=&quot;3818&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdjVeb/dJMcahXSOpp/DNGAQnes56n6ttr4sma6TK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdjVeb/dJMcahXSOpp/DNGAQnes56n6ttr4sma6TK/img.jpg&quot; data-origin-width=&quot;2926&quot; data-origin-height=&quot;3901&quot; style=&quot;width: 49.4164%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdjVeb/dJMcahXSOpp/DNGAQnes56n6ttr4sma6TK/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdjVeb%2FdJMcahXSOpp%2FDNGAQnes56n6ttr4sma6TK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2926&quot; height=&quot;3901&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;이렇게 제 대학생활이 끝났네요! 숙명에서의 4년이 정말 행복했고, 멋진 퀸송이가 될 수 있게 저도 노력하겠습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>활동/대학생활</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/427</guid>
      <comments>https://0yeonjae2.tistory.com/427#entry427comment</comments>
      <pubDate>Sun, 8 Mar 2026 14:34:19 +0900</pubDate>
    </item>
    <item>
      <title>[ 자격증/정보처리기사] 2025년 정보처리기사 2회 필기/실기 합격 후기</title>
      <link>https://0yeonjae2.tistory.com/417</link>
      <description>&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 시험 정보&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;- 시험명 : 2025년 정기 기사 2회 (필기) [정보처리기사], 2025년 정기 기사 2회 (실기) [정보처리기사]&lt;br&gt;- 시험일 : 2025.05.10. , 2025.07.19.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mj9eq/btsPBGKy112/9b5LOZYVfqtVVUKx7EH6JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mj9eq/btsPBGKy112/9b5LOZYVfqtVVUKx7EH6JK/img.png&quot; data-alt=&quot;필기 합격 후 응시자격을 증명하는 서류를 제출하셔야 합니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mj9eq/btsPBGKy112/9b5LOZYVfqtVVUKx7EH6JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmj9eq%2FbtsPBGKy112%2F9b5LOZYVfqtVVUKx7EH6JK%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;945&quot; height=&quot;527&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필기 합격 후 응시자격을 증명하는 서류를 제출하셔야 합니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&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;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;워낙 유명한 자격증이고 대학교 4학년이 되었으니 응시 자격이 주어져서 응시 여부에 대한 고민은 없었습니다. 전공자라면 대부분 취득하는 자격증이기도 하고, 배운 내용을 복습할 좋은 기회라고 생각해서 응시했습니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✍️공부 기록 - 필기&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;필기의 경우 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000214718930?LINK=NVB&amp;amp;NaPm=ct%3Dmdkcnzw8%7Cci%3Dbbed14087497a9775a582d579667fb763c111c9c%7Ctr%3Dboksl1%7Csn%3D5342564%7Chk%3D2cfc475281f44802cea3e35befca087ec9a393bd&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;시나공 기출문제집&lt;/span&gt;&lt;/a&gt;을 구매했습니다. 공부기간은 3일 이하이고, 문제은행의 비중이 꽤 돼서 기출 문제집만 풀어봤습니다.&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZMkUA/dJMb9Wk0pRO/PuavJPaBRiTsAklCXmcc8K/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZMkUA/dJMb9Wk0pRO/PuavJPaBRiTsAklCXmcc8K/tfile.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1052&quot; style=&quot;width: 47.1589%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZMkUA/dJMb9Wk0pRO/PuavJPaBRiTsAklCXmcc8K/tfile.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZMkUA%2FdJMb9Wk0pRO%2FPuavJPaBRiTsAklCXmcc8K%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;1052&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TTdlY/dJMb9Wk0pRN/qxzd2lIbIX3sZnJdrZi0P1/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TTdlY/dJMb9Wk0pRN/qxzd2lIbIX3sZnJdrZi0P1/tfile.jpg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;960&quot; style=&quot;width: 51.6783%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TTdlY/dJMb9Wk0pRN/qxzd2lIbIX3sZnJdrZi0P1/tfile.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTTdlY%2FdJMb9Wk0pRN%2Fqxzd2lIbIX3sZnJdrZi0P1%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 시험 후기 - 필기&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;5월 10일 아침 시험으로 선린인터넷고등학교에서 응시했습니다! 신분증, 수험표, 필통을 챙겨서 출발했습니다. 참고로, 정보처리기사 필기는 &lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;시험 기간 내에 응시 가능한 일정 리스트가 주어지고, 리스트 내에서 선택해서 접수 가능&lt;/span&gt;&lt;/b&gt;합니다. 또한 시험지역에 따라 분할접수하니 본인 지역을 잘 확인하여 열리는 시간에 맞게 접수하시면 됩니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0xNeZ/dJMb9XYwf5l/5q5ZFA3Cf60dmmBhqpIA2k/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0xNeZ/dJMb9XYwf5l/5q5ZFA3Cf60dmmBhqpIA2k/tfile.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0xNeZ/dJMb9XYwf5l/5q5ZFA3Cf60dmmBhqpIA2k/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0xNeZ%2FdJMb9XYwf5l%2F5q5ZFA3Cf60dmmBhqpIA2k%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;900&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;필기는 CBT라 컴퓨터실에서 응시하게 됩니다. 비가 많이 오는 날이라 바닥이 미끄러울까 걱정했는데 선린인터넷고등학교 컴퓨터실은 학교에 구비된 슬리퍼를 신고 들어가는 형태라 쾌적했습니다 &lt;br&gt;&lt;br&gt;시험의 경우 100문제를 풀면 되는데, 이론 쪽은 문제은행 형식이라 빠르게 풀 수 있었습니다. &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdkSNu/btsQyaRNy3Q/SskvkiOoDKukkOyMIpThwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdkSNu/btsQyaRNy3Q/SskvkiOoDKukkOyMIpThwK/img.png&quot; data-alt=&quot;무난하게 합격했습니다ㅎㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdkSNu/btsQyaRNy3Q/SskvkiOoDKukkOyMIpThwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdkSNu%2FbtsQyaRNy3Q%2FSskvkiOoDKukkOyMIpThwK%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;1296&quot; height=&quot;381&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무난하게 합격했습니다ㅎㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✍️공부 기록 - 필기&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;실기를 위해 이론 비중이 크고, 최신 기출이 포함된 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000215623877&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;시나공 기본서&lt;/span&gt;&lt;/a&gt;를 구매해서 2주 정도 공부했습니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;저는 손으로 써야 암기가 되는 편이라 한 번에 제대로 공부한다는 마음으로 이론 필기에 큰 비중을 두었습니다. 개념의 경우 한글 + 영어 풀네임 + 영어 축약 이름 전부 다 한 번씩은 보시는 걸 추천합니다.&lt;br&gt;&lt;br&gt;자료구조 + 프로그래밍 언어 파트는 전공자라 별도로 공부하지 않았고 이론서에 수록된 문제는 풀지 않았습니다. 최종적으로는 하루에 1~3개의 챕터를 공부하고 시험 전날에 기출문제집을 풀었습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JN2Bg/dJMb88lsrGl/nprBg7kZcQLpMh4HOd4CRk/tfile.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JN2Bg/dJMb88lsrGl/nprBg7kZcQLpMh4HOd4CRk/tfile.jpg&quot; data-alt=&quot;열품타 기록입니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JN2Bg/dJMb88lsrGl/nprBg7kZcQLpMh4HOd4CRk/tfile.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJN2Bg%2FdJMb88lsrGl%2FnprBg7kZcQLpMh4HOd4CRk%2Ftfile.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;252&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;열품타 기록입니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;실질적으로 공부한 기간은 위 사진보다 적은데 기간 내에 졸업프로젝트 개발도 조금씩 하고, 소설도 5권 정도 읽었습니다. 시험 당일(19일)에는 일찍 일어나서 1시간 정도 필기를 읽어봤습니다.&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b01edq/btsPCjnPnX0/9szckNdDu071BlS5YAT17k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b01edq/btsPCjnPnX0/9szckNdDu071BlS5YAT17k/img.jpg&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;773&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b01edq/btsPCjnPnX0/9szckNdDu071BlS5YAT17k/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb01edq%2FbtsPCjnPnX0%2F9szckNdDu071BlS5YAT17k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNHxyv/btsPBkntz4k/a2c1qErNRtsc5ErIVcf4S0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNHxyv/btsPBkntz4k/a2c1qErNRtsc5ErIVcf4S0/img.jpg&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;773&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNHxyv/btsPBkntz4k/a2c1qErNRtsc5ErIVcf4S0/img.jpg&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNHxyv%2FbtsPBkntz4k%2Fa2c1qErNRtsc5ErIVcf4S0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 시험 후기 - 실기&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;필기에 이어 실기 시험 당일에도 비가 많이 왔습니다. 참고로 실기의 경우에는 &lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;시험을 보는 날이 하나로 고정이고, 미리 확인 가능&lt;/span&gt;&lt;/b&gt;합니다!&lt;br&gt;&amp;nbsp;&lt;br&gt;실기의 경우 본가인 대전에서 응시했습니다. 신분증, 필통, 수험표를 챙겨서 용전중학교에 다녀왔습니다. 시험방식이 시험지를 받아서 볼펜으로 푸는 형태이기에 컴퓨터실이 아닌 평범한 반에서 진행되며 볼펜을 꼭 챙기셔야 합니다!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoZeM/btsPBF5XYXl/TucNMZoPhJ8aFU7hGK2r8K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoZeM/btsPBF5XYXl/TucNMZoPhJ8aFU7hGK2r8K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoZeM/btsPBF5XYXl/TucNMZoPhJ8aFU7hGK2r8K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqoZeM%2FbtsPBF5XYXl%2FTucNMZoPhJ8aFU7hGK2r8K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;773&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;비가 와서 신발 위에 덧신을 신고 해당하는 고사장에서 시험을 봤습니다. 시험 문제는 20문제, 시험 시간은 2시간 30분, 시험 시작 후 1시간부터 퇴실이 가능합니다. 문제를 생각해보면 이론의 경우 기출과 유사한 문제가 꽤 나왔습니다. 프로그래밍 파트는 2022년~2024년 기출보다는 어려웠습니다. (끝나고 후기를 찾아보니 2025년 1회보다는 쉬웠다고 합니다.)&amp;nbsp; &lt;br&gt;&lt;br&gt;프로그래밍 파트는 주로 C, Java코드를 보고 출력문의 출력결과를 묻는 문제입니다. C에서는 주로 구조체, 포인터를 다루고, Java는 상속관계, static 이 나오는 편인 것 같습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;참고로 실기 문제지가 큰 편인데 한 페이지 내 상단에는 문제, 하단에는 연습할 수 있는 란이 넉넉하게 주어집니다. 문제지 내 답란에 답을 적으면 되고, 시험지를 걷어가는 시험이라 답안지와 시험지가 별도로 있는 시험은 아닙니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;9월 12일에 최종 결과가 나왔고 한 번에 합격했습니다!&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBcmnS/btsQzmDUqtr/CS0pzjI9XfVPzxhkLBl4X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBcmnS/btsQzmDUqtr/CS0pzjI9XfVPzxhkLBl4X0/img.png&quot; data-alt=&quot;2개 틀렸네요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBcmnS/btsQzmDUqtr/CS0pzjI9XfVPzxhkLBl4X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBcmnS%2FbtsQzmDUqtr%2FCS0pzjI9XfVPzxhkLBl4X0%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;1276&quot; height=&quot;316&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2개 틀렸네요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;전공에서 배운 내용을 한 번 전체적으로 복습할 수 있어서 좋았습니다.&amp;nbsp;&amp;nbsp;이제 기사 자격증 보유자가 되었어요!&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSz4V/btsQArSIYca/aNLdX932x9Q1jzo6xANSW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSz4V/btsQArSIYca/aNLdX932x9Q1jzo6xANSW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSz4V/btsQArSIYca/aNLdX932x9Q1jzo6xANSW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSz4V%2FbtsQArSIYca%2FaNLdX932x9Q1jzo6xANSW1%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;1334&quot; height=&quot;473&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;최근에는 영어 자격증 공부 중인데 결과가 잘 나오면 후기를 올리겠습니다.&lt;/p&gt;</description>
      <category>활동/자격증, 시험</category>
      <category>실기</category>
      <category>정보처리기사</category>
      <category>필기</category>
      <category>합격후기</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/417</guid>
      <comments>https://0yeonjae2.tistory.com/417#entry417comment</comments>
      <pubDate>Sat, 13 Sep 2025 22:22:42 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍언어론 ] 6장 자료형</title>
      <link>https://0yeonjae2.tistory.com/416</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)&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;6.1 자료형 개요&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 자료형의 의미&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;/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;h4 data-ke-size=&quot;size20&quot;&gt;2) 기본 자료형&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사전 정의된 기본 자료형 : boolean, char, int, float, double, ...&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;/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;3) 부분 타입 (subtype)&lt;/h4&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;기반 타입(base type)의 일부분 값들로 정의된 자료형&lt;/li&gt;
&lt;li&gt;기반 타입의 모든 연산을 부분 타입에 적용 가능&lt;/li&gt;
&lt;li&gt;Ada, Pascal&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;6.2 복합 타입&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 타입 구성자&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;배열 타입 (Array type)&lt;/li&gt;
&lt;li&gt;리스트 타입 (List type)&lt;/li&gt;
&lt;li&gt;레코드 타입 (Record type)&lt;/li&gt;
&lt;li&gt;공용체 (Union type)&lt;/li&gt;
&lt;li&gt;포인터 타입 (Pointer type)&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;2) 구조체(레코드) 타입&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;struct in c&lt;/li&gt;
&lt;li&gt;record in Pascal, Ada, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C++의 class&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C의 struct를 확장&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;h4 data-ke-size=&quot;size20&quot;&gt;3) 배열 타입&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;/li&gt;
&lt;li&gt;배열 요소(element), 인덱스&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;li&gt;행 우선(row major order) 배치 : 행부터 배치&lt;/li&gt;
&lt;li&gt;열 우선(column major order) 배치 : 열부터 배치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C의 배열 : 배열의 크기가 정적 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java의 배열&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자료형[] 배열이름 or 자료형 배열이름[]&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;h4 data-ke-size=&quot;size20&quot;&gt;4) 리스트 (list)&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;/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;- 부분 리스트 (slicing)&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;ex) python ➡️ list[start:end]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java의 ArrayList&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;Java의 ArrayList : 동적 배열이며, 다양한 타입의 객체를 저장할 수 있음.&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;5) 포인터 타입 (pointer type)&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;pre id=&quot;code_1756557150470&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;T *p; // 포인터 변수 선언
p = E; // 포인터 변수에 대입
*p = E; // 포인터가 참조하는 변수에 대입&lt;/code&gt;&lt;/pre&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;malloc(n) : 크기 n의 메모리 할당 및 시작 주소 반환&lt;/li&gt;
&lt;li&gt;&amp;amp;x : 변수 x의 포인터 (주소)&lt;/li&gt;
&lt;li&gt;*p : 포인터 변수 p에 저장된 포인터 주소 참조&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;6) 재귀 타입 (Recursive type)&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.3 형 변환&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 자동 형변환 (automatic type conversion)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자동으로 형을 변환하는 묵시적 형변환 (implicit type conversion)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이항 연산에서 두 피연산자의 자료형이 다른 경우 (C/C++, Java)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 확정 변환 (widening conversion)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표현 범위가 더 넓은 쪽으로 변환하는 상향 변환 (promotion)&lt;/li&gt;
&lt;li&gt;Java에서 자동 형변환은 거의 대부분 확장 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 축소 변환 (narrowing conversion)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 확장변환의 반대로 표현 범위가 더 작은 자료형으로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대입 변환 (assignment conversion)&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;축소 변환인 경우에는 자동으로 수행되지 않음.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;예외적으로 int 상수에 대해서 byte, short, char에 대입할 때 정보 손실이 없으면 자동 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 형변환 연산자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 타입 캐스팅 연산자 (type casting operator) 또는 캐스트(cast)&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;/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;- 정보 손실 발생 가능&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;6.4 타입과 언어 분류&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 정적 타입 언어 (statically typed language)&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 data-ke-size=&quot;size16&quot;&gt;- Java, C, C++, FORTRAN, Pascal, Scala&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;2) 동적 타입 언어&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 data-ke-size=&quot;size16&quot;&gt;- Perl, Python, Scheme, JavaScript&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 타입 규칙 (typing rule)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 타입 규칙 (typing rule)&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;- 강한 타입 언어 (strongly typed language)&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;Java, C#, Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 약한 타입 언어 (weakly typed language)&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;C, C++, PHP, JavaScript, Perl&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전공과목 정리/프로그래밍언어론</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/416</guid>
      <comments>https://0yeonjae2.tistory.com/416#entry416comment</comments>
      <pubDate>Sun, 31 Aug 2025 09:44:02 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍언어론 ] 5장 의미론</title>
      <link>https://0yeonjae2.tistory.com/415</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)&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;5.0 의미론&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 의미론의 개요&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;- 소프트웨어의 정확한 명세&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소프트웨어 시스템에 대한 검증 혹은 추론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컴파일러 혹은 해석기 작성의 기초&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 의미론의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작동 의미론 (Operational Semantics)&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;- 표기 의미론 (Denotational Semantics)&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;- 공리 의미론 (Axiomatic Semantics)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램의 시작 상태와 종료 상태를 논리적 선언(assertion) 형태로 정의하여 설명&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;5.1 수식의 의미&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 수식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태에서 수식의 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- V : (State, Expr) &amp;rarr; Value&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;2) 연산자 우선순위&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;h4 data-ke-size=&quot;size20&quot;&gt;3) 연산자 결합성&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 결합성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 좌결합 (left associative)&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;좌순환 규칙(left recursive rule)으로 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 우결합 (right associative)&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;우순환 규칙(right recursive rule)으로 표현&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;1028&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TGt0v/btsP36bJlUr/7h04BCfXuj2Nvl9I6J0z81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TGt0v/btsP36bJlUr/7h04BCfXuj2Nvl9I6J0z81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TGt0v/btsP36bJlUr/7h04BCfXuj2Nvl9I6J0z81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTGt0v%2FbtsP36bJlUr%2F7h04BCfXuj2Nvl9I6J0z81%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;1028&quot; height=&quot;708&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 구조적 프로그래밍&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 구조적 프로그래밍&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;goto문을 사용하지 않고 시작과 끝 지점이 일정한 구조적 구문 사용&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 계산함수든 순차, 서택, 반복의 3가지 제어 구조로 표현 가능&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;935&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb8A8a/btsP246nys1/jCqGZ3W2FJZUNNk5DQdl2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb8A8a/btsP246nys1/jCqGZ3W2FJZUNNk5DQdl2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb8A8a/btsP246nys1/jCqGZ3W2FJZUNNk5DQdl2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb8A8a%2FbtsP246nys1%2FjCqGZ3W2FJZUNNk5DQdl2k%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;935&quot; height=&quot;527&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;527&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;h4 data-ke-size=&quot;size20&quot;&gt;2) 설탕 구문 (Syntactic sugar)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그래밍 편의를 위해 제공하는 부가적인 문장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;do while 문 ➡️ while문 사용&lt;/li&gt;
&lt;li&gt;for 문 ➡️ while문 사용&lt;/li&gt;
&lt;li&gt;switch문 ➡️ if문 사용&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;5.3 문장의 의미&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 작동 의미론 (Operational Semantics)&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;/li&gt;
&lt;li&gt;실행 과정을 상태 변환 (state transform) 과정으로 설명&lt;/li&gt;
&lt;li&gt;각 문장 s마다 상태 변환 함수 정의&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;2) 문장의 의미&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문장 S의 의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장 S가 전상태 s를 후상태 s'으로 변경시킨다.&lt;/li&gt;
&lt;li&gt;상태 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 변환 함수 (state transform function)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eval : (State, Statement)&amp;nbsp;&amp;rarr; State&lt;/li&gt;
&lt;li&gt;Eval(s,S) = s' for each statement S&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 대입문, 복합문의 의미&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGAnfz/btsP2F0fQnk/WKKa5MtFSBkjeQVv2s5w3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGAnfz/btsP2F0fQnk/WKKa5MtFSBkjeQVv2s5w3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGAnfz/btsP2F0fQnk/WKKa5MtFSBkjeQVv2s5w3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGAnfz%2FbtsP2F0fQnk%2FWKKa5MtFSBkjeQVv2s5w3k%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;1066&quot; height=&quot;763&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) let 문&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 변수를 위한 엔트리를 실행 전상태 s에 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 상태에서 문장 S를 실행&lt;/li&gt;
&lt;li&gt;실행이 끝나면
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선언된 변수는 유효하지 않으므로 실행 수 상태 s'에서 해당 엔트리 제거&lt;/li&gt;
&lt;li&gt;이 상태가 let문을 실행한 후의 상태&lt;/li&gt;
&lt;/ul&gt;
&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;1473&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EM0z4/btsP46aWObL/gcMrbntY6dzPUZRGJVbl50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EM0z4/btsP46aWObL/gcMrbntY6dzPUZRGJVbl50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EM0z4/btsP46aWObL/gcMrbntY6dzPUZRGJVbl50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEM0z4%2FbtsP46aWObL%2FgcMrbntY6dzPUZRGJVbl50%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;1473&quot; height=&quot;463&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 조건문의 의미&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/51F9U/btsP25jUR1Y/86l7oFo5Nwbyz7I8wgKIa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/51F9U/btsP25jUR1Y/86l7oFo5Nwbyz7I8wgKIa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/51F9U/btsP25jUR1Y/86l7oFo5Nwbyz7I8wgKIa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F51F9U%2FbtsP25jUR1Y%2F86l7oFo5Nwbyz7I8wgKIa0%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;1877&quot; height=&quot;584&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5) 반복문의 의미&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdV3aR/btsP4cW7ua5/MpmfzKjrw0jg1VzkATgef0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdV3aR/btsP4cW7ua5/MpmfzKjrw0jg1VzkATgef0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdV3aR/btsP4cW7ua5/MpmfzKjrw0jg1VzkATgef0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdV3aR%2FbtsP4cW7ua5%2FMpmfzKjrw0jg1VzkATgef0%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;1503&quot; height=&quot;434&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.4 언어 S의 인터프리터&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 인터프리터&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;프로그램의 AST를 순회(traverse)하면서 수식의 값을 계산하고 문장의 의미에 따라 각 문장에 대한 해석(interpret)을 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인터프리터 함수 Eval : (Statement, State) &amp;rarr; State&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;2) print 문 구현&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(Print p, State state) {
    System.out.println(V(p.expr, state));
    return state; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) read 문 구현&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(Read r, State state) {
    if (r.id.type == Type.INT) {
        int i = sc.nextInt();
        state.set(r.id, new Value(i));
    } 

    if (r.id.type == Type.BOOL) {
        boolean b = sc.nextBoolean();   
        state.set(r.id, new Value(b));
    }

    return state;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 복합문 구현&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(Stmts ss, State state) {
    for (Stmt s : ss.stmts) {
        state = Eval(s, state);
    }
    return state;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5) if 문 구현&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;State Eval(If c, State state) {
    if (V(c.expr, state).boolValue( ))
        return Eval(c.stmt1, state);
    else
        return Eval(c.stmt2, state);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6) while 문 구현&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(While l, State state) {
    if (V(l.expr, state).boolValue( ))
        return Eval(l, Eval(l.stmt, state));
    else 
        return state;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전공과목 정리/프로그래밍언어론</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/415</guid>
      <comments>https://0yeonjae2.tistory.com/415#entry415comment</comments>
      <pubDate>Sat, 30 Aug 2025 09:13:15 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍언어론 ] 4장 변수 및 유효범위</title>
      <link>https://0yeonjae2.tistory.com/414</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)&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;4.1 변수 선언&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 변수 선언과 유효범위&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수 선언 : 사용 전 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수의 유효범위 (scope) : 선언된 변수가 유효한(사용될 수 있는) 프로그램 내의 범위/영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정적 유효범위(Static scope) 규칙&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;h4 data-ke-size=&quot;size20&quot;&gt;2) 변수 선언&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수 id는 &amp;lt;type&amp;gt;타입 변수이며 초기화가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수 id는 지역 변수로 유효범위는 선언된 블록 내이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;stmt&amp;gt;&amp;nbsp;&amp;rarr; ... | let &amp;lt;decls&amp;gt; in &amp;lt;stmts&amp;gt; end;&lt;br /&gt;&amp;lt;decls&amp;gt; &amp;rarr; {&amp;lt;type&amp;gt; id [=&amp;lt;expr&amp;gt;];}&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 블록의 중첩&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- let 블록 내의 문장 S에 다시 let 블록이 나타날 수 있다.&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;4) 언어 S의 전역 변수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지역 변수 : let문 내에서 선언된 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전역 변수 : let문 밖에서 선언된 변수&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;5) 타입 없는 변수 선언&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동적 타입 언어 (dynamically typed language)&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;Lisp/Scheme, JavaScript, Python 등&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;4.2 블록 구조 언어&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 블록&lt;/h4&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;서로 연관된 선언문과 실행문들을 묶어놓은 프로그래밍 단위&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중괄호 : C&lt;/li&gt;
&lt;li&gt;begin-end : Ada&lt;/li&gt;
&lt;li&gt;프로시저 또는 함수 : C, Pascal 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 블록 구조 언어&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 data-ke-size=&quot;size16&quot;&gt;- 프로그램의 오류 발생 ➡️ 범위가 블록 단위로 한정되므로 수정이 쉬워짐.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 블록의 첨가, 수정, 삭제 등이 용이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 블록 내에 선언된 변수들은 그 안에서만 유효하며 실행이 종료되면 기존에 선언되었던 변수들은 모두 무효화됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자로 하여금 변수의 사용과 기억장소의 할당에 대한 경계를 명확히 할 수 있음.&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;3) C언어의 유효범위 규칙&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;/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;- 전역 변수의 유효 범위 : 선언된 지점 ~ 파일 끝까지&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;4.3 변수의 상태와 의미&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 변수의 의미&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;- 대입문의 예&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x = x + 1;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오른쪽 변수 x의 의미 : 메모리 위치에 저장된 값 (r-value)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽 변수 x의 의미 : 메모리 위치 (l-value)&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;2) 상태&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 (state) : 변수들의 현재 값&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;State = Identifier &amp;rarr; Value&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 s에서 변수 값 : s(x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 갱신 : s' = s[y ↦&amp;nbsp; v]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s'(x) = s(x) if x != y&lt;/li&gt;
&lt;li&gt;s'(x) = v if x == y&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 수식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태에서 수식의 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- V(State, Expr) &amp;rarr; Value&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;4) 문장의 의미&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문장 S의 의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장 S가 상태 s를 후상태 s'으로 변경시킨다.&lt;/li&gt;
&lt;li&gt;상태 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 변환 함수 (state transform function)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eval : (State, Statement) &amp;rarr; State&lt;/li&gt;
&lt;li&gt;Eval(s, S) = s' for each statement S&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;각 문장 S마다 상태 변환 함수 정의&lt;/li&gt;
&lt;li&gt;프로그램의 실행 과정을 상태 변환 과정으로 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ex)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대입문 id = E
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Eval(s, id) = s[id ↦ V(s, E)]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;복합문 S;S
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Eval(s, S1;S2) = Eval(Eval(s, S1), S2)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.4 변수의 유효범위 관리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 블록 구조를 위한 상태 관리&lt;/h4&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;블록 내에 선언된 변수는 유효해짐&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;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;블록 내의 선언된 변수들은 더 이상 유효하지 않음&lt;/li&gt;
&lt;li&gt;블록 내의 선언된 변수들의 상태 정보를 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태(state)를 스택(stack) 형태로 유지 관리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UULsB/btsQaMq2216/94EogSh14TCTFwquR2bpCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UULsB/btsQaMq2216/94EogSh14TCTFwquR2bpCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UULsB/btsQaMq2216/94EogSh14TCTFwquR2bpCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUULsB%2FbtsQaMq2216%2F94EogSh14TCTFwquR2bpCK%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;1385&quot; height=&quot;667&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1385&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.5 구현&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 상태 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상태 구현 : 변수의 값을 나타내는 &amp;lt;변수 이름, 값&amp;gt; 쌍들의 집합으로 표현&lt;/p&gt;
&lt;pre id=&quot;code_1756386588541&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Pair {
   Identifier id;
   Value val;
   
   Pair (Identifier id, Value v) {
     this.id = id;
     this.val = v;
   }
}&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_1756386723659&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class State extends Stack&amp;lt;Pair&amp;gt; {
    // 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 수식의 값 계산&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Value V(Expr e, State state) {
    if (e instanceof Value) 
        return (Value) e;

    if (e instanceof Identifier) {
        Identifier v = (Identifier) e;
        return (Value)(state.get(v));
 }

    if (e instanceof Binary) {
        Binary b = (Binary) e;
        Value v1 = V(b.expr1, state);
        Value v2 = V(b.expr2, state);
        return binaryOperation (b.op, v1, v2); 
    }

    if (e instanceof Unary) {
        Unary u = (Unary) e;
        Value v = V(u.expr, state);
        return unaryOperation(u.op, v); 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Value binaryOperation(Operator op, Value v1, Value v2) {
    switch (op.val) {
    case &quot;+&quot;:
        return new Value(v1.intValue() + v2.intValue());
    // ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 대입문 실행&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(Assignment a, State state) {
    Value value = V(a.expr, state);
    return state.set(a.id, value);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) let 문 실행&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(Let l, State state) {
    State s = allocate(l.decls, state);
    s = Eval(l.stmts,s);
    return free(l.decls, s);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5) let 블록 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- allocate 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;State allocate (Decls ds, State state) { ... }&lt;/li&gt;
&lt;li&gt;선언된 변수들을 위한 엔트리들을 상태에 추가&lt;/li&gt;
&lt;li&gt;엔트리 추가 함수 : State push(Identifier id, Value val)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- free 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;State free (Decls ds, State state) { ... }&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;h4 data-ke-size=&quot;size20&quot;&gt;6) 전역 변수 선언&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;State Eval(Command c, State state) {
    if (c instanceof Decl) {
        Decls decls = new Decls();
        decls.add((Decl) c);
        return allocate(decls, state);
    }

    if (c instanceof Stmt)
        return Eval((Stmt) c, state);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전공과목 정리/프로그래밍언어론</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/414</guid>
      <comments>https://0yeonjae2.tistory.com/414#entry414comment</comments>
      <pubDate>Fri, 29 Aug 2025 23:23:41 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍언어론 ] 3장 언어 설계와 파서 구현</title>
      <link>https://0yeonjae2.tistory.com/413</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)&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;3.1 프로그래밍 언어 S&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 샘플 프로그래밍 언어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대화형 인터프리터 방식으로 동작 가능&lt;br /&gt;- 블록 중첩을 허용&lt;br /&gt;- 실행 전에 타입 검사를 수행하는 강한 타입 언어&lt;br /&gt;- 어휘분석기, 파서, AST, 타입 검사기, 인터프리터 순차 구현&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 언어 S의 문법&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;lt;program&amp;gt;&amp;nbsp;&amp;rarr; {&amp;lt;command&amp;gt;}&lt;br /&gt;&amp;lt;command&amp;gt; &amp;rarr; &amp;lt;decl&amp;gt; | &amp;lt;stmt&amp;gt; | &amp;lt;function&amp;gt;&lt;br /&gt;&amp;lt;decl&amp;gt; &amp;rarr; &amp;lt;type&amp;gt; id [= &amp;lt;expr&amp;gt;];&lt;br /&gt;&amp;lt;stmt&amp;gt; &amp;rarr; id = &amp;lt;expr&amp;gt;;&lt;br /&gt;| '{' &amp;lt;stmts&amp;gt; '}'&lt;br /&gt;| if (&amp;lt;expr&amp;gt;) then &amp;lt;stmt&amp;gt; [else &amp;lt;stmt&amp;gt;]&lt;br /&gt;| while (&amp;lt;expr&amp;gt;) &amp;lt;stmt&amp;gt;&lt;br /&gt;| read id; | print &amp;lt;expr&amp;gt;; | let &amp;lt;decls&amp;gt; in &amp;lt;stmts&amp;gt; end;&lt;br /&gt;&lt;br /&gt;&amp;lt;stmts&amp;gt; &amp;rarr; {&amp;lt;stmt&amp;gt;}&lt;br /&gt;&amp;lt;decls&amp;gt; &amp;rarr; {&amp;lt;decls&amp;gt;}&lt;br /&gt;&amp;lt;type&amp;gt; &amp;rarr; int | bool | string&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 프로그래밍 언어 S&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 S의 프로그램 : 명령어(&amp;lt;command&amp;gt;)들로 구성&lt;br /&gt;- 명령어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수 선언 : &amp;lt;decl&amp;gt;&lt;/li&gt;
&lt;li&gt;함수 정의 : &amp;lt;function&amp;gt;&lt;/li&gt;
&lt;li&gt;실행 문장 : &amp;lt;stmt&amp;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;대입문, 조건 if문, 반복 while문&lt;/li&gt;
&lt;li&gt;입력 read문, 출력 print문&lt;/li&gt;
&lt;li&gt;복합문 : 괄호로 둘러싸인 일련의 실행 문장들&lt;/li&gt;
&lt;li&gt;let문 : 지역 변수 선언과 일련의 실행 문장들&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수 선언 : 정수, 부울, 스트링 타입&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 추상 구문 트리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 파서와 AST&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVIAVq/btsP2BpZhWS/kinDgLahtETUDzVezVe1bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVIAVq/btsP2BpZhWS/kinDgLahtETUDzVezVe1bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVIAVq/btsP2BpZhWS/kinDgLahtETUDzVezVe1bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVIAVq%2FbtsP2BpZhWS%2FkinDgLahtETUDzVezVe1bk%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;667&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어휘 분석기 (lexical analyzer)&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;- 파서(parser)&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;해당 입력의 AST를 생성해 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추상 구문 트리 (abstract syntax tree ; AST)&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;- 인터프리터 (intepreter)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 문장의 AST를 순회하면서 각 문장의 의미에 따라 해석하여 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 유도 트리&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yxGLk/btsP4ADnfV7/ZTl4tUBWkcoulrmKCzQAoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yxGLk/btsP4ADnfV7/ZTl4tUBWkcoulrmKCzQAoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yxGLk/btsP4ADnfV7/ZTl4tUBWkcoulrmKCzQAoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyxGLk%2FbtsP4ADnfV7%2FZTl4tUBWkcoulrmKCzQAoK%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;1280&quot; height=&quot;526&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 추상 구문 트리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 스트링의 구문 구조를 추상적으로 보여주는 트리&lt;br /&gt;- 실제 유도 트리에 나타나는 세세한 정보를 모두 나타내지는 않음&lt;br /&gt;- 수식의 AST :&amp;nbsp; 연산을 중심으로 요약해서 표현&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 수식의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이항(Binary) 수식과 단항연산(Unary) 수식으로 구분하여 구현&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJUvao/btsP2uEp1eM/OkSMNVI1Gc9nSRXFRjsXxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJUvao/btsP2uEp1eM/OkSMNVI1Gc9nSRXFRjsXxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJUvao/btsP2uEp1eM/OkSMNVI1Gc9nSRXFRjsXxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJUvao%2FbtsP2uEp1eM%2FOkSMNVI1Gc9nSRXFRjsXxk%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;666&quot; height=&quot;220&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Binary extends Expr { // 이항 연산 수식의 AST 구현
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Operator op;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Expr expr1, expr2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Binary (Operator o, Expr e1, Expr e2) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;op = o; expr1 = e1, expr2 = e2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;- 식별자(Identifier), 값(Value)도 하나의 수식이 될 수 있다.&lt;br /&gt;- Expr = Identifier | Value | Binary | Unary&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5) 변수 선언의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문법 : &amp;lt;type&amp;gt; id = &amp;lt;expr&amp;gt;&lt;br /&gt;- AST : Type type;&amp;nbsp; Identifier id; Expr expr;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cumJSk/btsP2xVsuHy/DhMSnXPKrwJh9DiUG7kc30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cumJSk/btsP2xVsuHy/DhMSnXPKrwJh9DiUG7kc30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cumJSk/btsP2xVsuHy/DhMSnXPKrwJh9DiUG7kc30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcumJSk%2FbtsP2xVsuHy%2FDhMSnXPKrwJh9DiUG7kc30%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;269&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6) 대입문 Assignment의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문법 : id = &amp;lt;expr&amp;gt;;&lt;br /&gt;- AST : Assignment = Identfier id; Expr expr&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Assignment extends Stmt {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Identifier id;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array ar = null;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Expr expr;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assignment (Identifier t, Expr e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id = t;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;expr = e;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&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;776&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0cWb/btsP4jBRF9N/Ovzmbya02TfltEVUEmoeq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0cWb/btsP4jBRF9N/Ovzmbya02TfltEVUEmoeq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0cWb/btsP4jBRF9N/Ovzmbya02TfltEVUEmoeq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0cWb%2FbtsP4jBRF9N%2FOvzmbya02TfltEVUEmoeq1%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;273&quot; height=&quot;176&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7) Read 문, Print 문의 AST&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;read id;&lt;/li&gt;
&lt;li&gt;print &amp;lt;expr&amp;gt;;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AST&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;1077&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VIxUw/btsP13G4AsE/n0OHPlKBcJNVZXssKKzHrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VIxUw/btsP13G4AsE/n0OHPlKBcJNVZXssKKzHrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VIxUw/btsP13G4AsE/n0OHPlKBcJNVZXssKKzHrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVIxUw%2FbtsP13G4AsE%2Fn0OHPlKBcJNVZXssKKzHrk%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;559&quot; height=&quot;267&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8) 복합문의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문법 : &amp;lt;stmts&amp;gt; &amp;rarr; {&amp;lt;stmt&amp;gt;}&lt;br /&gt;- AST : Stmts = Stmt*&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Stmts extends Stmt {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public ArrayList&amp;lt;Stmt&amp;gt; stmts = new ArrayList&amp;lt;Stmt&amp;gt;();
}&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;1098&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M0PHR/btsP4r7Izrl/JbcyK0cq6EZ6P4rcfyrg6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M0PHR/btsP4r7Izrl/JbcyK0cq6EZ6P4rcfyrg6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M0PHR/btsP4r7Izrl/JbcyK0cq6EZ6P4rcfyrg6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM0PHR%2FbtsP4r7Izrl%2FJbcyK0cq6EZ6P4rcfyrg6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;212&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9) If 문의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문법 : if (&amp;lt;expr&amp;gt;) then &amp;lt;stmt&amp;gt; [else &amp;lt;stmt&amp;gt;]&lt;br /&gt;- AST : Expr expr; Stmt stmt1; Stmt stmt2&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aitny/btsP4eUVPH4/awZbj5Cm5cVhPd8gWwfnu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aitny/btsP4eUVPH4/awZbj5Cm5cVhPd8gWwfnu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aitny/btsP4eUVPH4/awZbj5Cm5cVhPd8gWwfnu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAitny%2FbtsP4eUVPH4%2FawZbj5Cm5cVhPd8gWwfnu0%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;426&quot; height=&quot;252&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10) While 문의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문법 : while (&amp;lt;expr&amp;gt;) &amp;lt;stmt&amp;gt;&lt;br /&gt;- AST : Expr expr; Stmt stmt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x8SBq/btsP33Tz8Aj/k2KA1tILWsPVQmzJVKNeuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x8SBq/btsP33Tz8Aj/k2KA1tILWsPVQmzJVKNeuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x8SBq/btsP33Tz8Aj/k2KA1tILWsPVQmzJVKNeuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx8SBq%2FbtsP33Tz8Aj%2Fk2KA1tILWsPVQmzJVKNeuk%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;286&quot; height=&quot;216&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11) Let 문의 AST&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문법 : let &amp;lt;decls&amp;gt; in &amp;lt;stmts&amp;gt; end&lt;br /&gt;- AST : Decls decls; Stmts stmts;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHnLyF/btsP3aFrxTb/kg3hzCrQqe5NXirWKgiIOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHnLyF/btsP3aFrxTb/kg3hzCrQqe5NXirWKgiIOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHnLyF/btsP3aFrxTb/kg3hzCrQqe5NXirWKgiIOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHnLyF%2FbtsP3aFrxTb%2Fkg3hzCrQqe5NXirWKgiIOK%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;266&quot; height=&quot;171&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.3 어휘 분석기 구현&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 어휘분석과 토큰&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어휘분석 (lexical analysis)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 프로그램을 읽어들여 토큰(token)으로 분리&lt;/li&gt;
&lt;li&gt;어휘 분석기(lexical analyzer) 또는 스캐너(scanner)&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;li&gt;식별자 (identifier)&lt;/li&gt;
&lt;li&gt;상수 리터럴 (constant)&lt;/li&gt;
&lt;li&gt;예약어 (keyword)&lt;/li&gt;
&lt;li&gt;연산자 (operator)&lt;/li&gt;
&lt;li&gt;구분자 (delimiter)&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;2) 예약어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예약어 또는 키워드 : 언어에서 미리 그 의미와 용법이 지정되어 사용되는 단어&lt;br /&gt;ex)&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;BOOL(&quot;bool&quot;),TRUE(&quot;true&quot;), FALSE(&quot;false&quot;), IF(&quot;if&quot;), THEN(&quot;then&quot;), STRING(&quot;string&quot;),
WHILE(&quot;while&quot;), VOID(&quot;void&quot;),  FUN(&quot;fun&quot;), RETURN(&quot;return&quot;), LET(&quot;let&quot;),
IN(&quot;in&quot;), END(&quot;end&quot;), READ(&quot;read&quot;), PRINT(&quot;print&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 식별자&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;ID : 변수 혹은 함수의 이름을 나타내며 토큰 이름&lt;/li&gt;
&lt;li&gt;식별자 : 첫 번째는 문자이고 이어서 0개 이상의 문자 혹은 숫자들로 이루어진 스트링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정규식(regular expression) 형태로 표현&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ID : letter(letter | digit)*&lt;/li&gt;
&lt;li&gt;letter = [a-zA-Z]&lt;/li&gt;
&lt;li&gt;digit = [0-9]&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;4) 정규식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-정의 1 : M과 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 : 문자 x&lt;/li&gt;
&lt;li&gt;M | N : M 또는 N&lt;/li&gt;
&lt;li&gt;MN : M 다음에 N이 나타나는 집합&lt;/li&gt;
&lt;li&gt;M* : M이 0번 이상 반복됨&lt;/li&gt;
&lt;li&gt;M+ : MM*을 나타내며 M이 한 번 이상 반복&lt;/li&gt;
&lt;li&gt;M? : M이 0번 또는 1번 나타남&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;h4 data-ke-size=&quot;size20&quot;&gt;5) 연산자/구분자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연산자&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;ASSIGN(&quot;=&quot;), EQUAL(&quot;==&quot;),  LT(&quot;&amp;lt;&quot;), LTEQ(&quot;&amp;lt;=&quot;), GT(&quot;&amp;gt;&quot;),  
GTEQ(&quot;&amp;gt;=&quot;),  NOT(&quot;!&quot;),    NOTEQ(&quot;!=&quot;), PLUS(&quot;+&quot;), MINUS(&quot;-&quot;), 
MULTIPLY(&quot;*&quot;), DIVIDE(&quot;/&quot;), AND(&quot;&amp;amp;&quot;), OR(&quot;|&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구분자&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;LBRACE(&quot;{&quot;), RBRACE(&quot;}&quot;), LBRACKET(&quot;[&quot;), RBRACKET(&quot;]&quot;),
LPAREN(&quot;(&quot;), RPAREN(&quot;)&quot;), SEMICOLON(&quot;;&quot;), COMMA(&quot;,&quot;), EOF(&quot;&amp;lt;&amp;lt;EOF&amp;gt;&amp;gt;&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6) 토큰 구현&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;enum Token {
     BOOL(&quot;bool&quot;),CHAR(&quot;char&quot;), ELSE(&quot;else&quot;), FALSE(&quot;false&quot;), FLOAT(&quot;float&quot;), 
     STRING(&quot;string&quot;), IF(&quot;if&quot;), INT(&quot;int&quot;),  TRUE(&quot;true&quot;), WHILE(&quot;while&quot;), 
     RETURN(&quot;return&quot;), VOID(&quot;void&quot;), FUN(&quot;fun&quot;),  THEN(&quot;then&quot;), LET(&quot;let&quot;), 
     IN(&quot;in&quot;), END(&quot;end&quot;), READ(&quot;read&quot;), PRINT(&quot;print&quot;), DO(&quot;do&quot;),  FOR(&quot;for&quot;), 
     EOF(&quot;&amp;lt;&amp;lt;EOF&amp;gt;&amp;gt;&quot;), 
     LBRACE(&quot;{&quot;), RBRACE(&quot;}&quot;), LBRACKET(&quot;[&quot;), RBRACKET(&quot;]&quot;),
     LPAREN(&quot;(&quot;), RPAREN(&quot;)&quot;), SEMICOLON(&quot;;&quot;), COMMA(&quot;,&quot;),
     ASSIGN(&quot;=&quot;), EQUAL(&quot;==&quot;),  LT(&quot;&amp;lt;&quot;), LTEQ(&quot;&amp;lt;=&quot;), GT(&quot;&amp;gt;&quot;),  
     GTEQ(&quot;&amp;gt;=&quot;),  NOT(&quot;!&quot;),    NOTEQ(&quot;!=&quot;), PLUS(&quot;+&quot;), MINUS(&quot;-&quot;), 
     MULTIPLY(&quot;*&quot;), DIVIDE(&quot;/&quot;), AND(&quot;&amp;amp;&quot;), OR(&quot;|&quot;), ID(&quot;&quot;), 
     NUMBER(&quot;&quot;), STRLITERAL(&quot;&quot;); 

    private String value; 

    private Token (String v) {
        value = v;
    }

    public String value( ) { return value; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7) 어휘분석기 getToken 메소드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- getToken() 메소드 : 호출될 때마다 다음 토큰(token)을 인식하여 리턴&lt;br /&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 문자가 숫자인 한 계속해서 읽어 정수리터럴을 인식하고 이를 나타내는 NUMBER 토큰을 리턴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 나머지는 읽은 문자에 따라 연산자, 구분자 등을 인식하여 리턴&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8) 어휘 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Lexer&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.4 파서 구현&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 파서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 스트링을 명령어 단위로 파싱하면서 AST를 생성해 반환&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Commond command()
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;명령어(변수 선언, 함수 정의, 문장)를 읽고 파싱하면서 해당 AST를 구성하여 반환한다.&lt;/li&gt;
&lt;li&gt;&amp;lt;command&amp;gt;&amp;nbsp;&amp;rarr; &amp;lt;decl&amp;gt; | &amp;lt;stmt&amp;gt; | &amp;lt;function&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Decl decl() : 변수 선언을 읽고 파싱하면서 해당 AST를 구성하여 반환&lt;/li&gt;
&lt;li&gt;Stmt stmt() : 각 문장을 읽고 파싱하면서 해당 AST를 구성하여 반환&lt;/li&gt;
&lt;li&gt;Expr expr() : 수식을 읽고 파싱하면서 해당 AST를 구성하여 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class Parser {
    Token token;   
    Lexer lexer;
    
    public Parser(Lexer scan) { 
        lexer = l;		  
        token = lexer.getToken(); 
    }
    
    public static void main(String args[]) {
        parser  = new Parser(new Lexer());
        System.out.print(&quot;&amp;gt;&amp;gt; &quot;);
        do {
            command = parser.command();
            System.out.print(&quot;\n&amp;gt;&amp;gt; &quot;);
        } while (true);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 파서 구현 : 명령어&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public Command command() {
    // &amp;lt;command&amp;gt; -&amp;gt;  &amp;lt;decl&amp;gt; | &amp;lt;function&amp;gt; | &amp;lt;stmt&amp;gt;
    if (isType()) {
	    Decl d = decl();
	    return d;
    }
    if (token == Token.FUN) {
	    Function f = function();
	    return f;
    }

    if (token != Token.EOF) {
	    Stmt s = stmt();
        return s;
    }
    
    return null;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 파서 구현 : 변수 선언&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private Decl decl() {
    // &amp;lt;decl&amp;gt;  -&amp;gt; &amp;lt;type&amp;gt; id [=&amp;lt;expr&amp;gt;]; | &amp;lt;type&amp;gt; id[n]
    Type t = type();
    String id = match(Token.ID);
    Decl d = null;

    if (token == Token.ASSIGN) {
        match(Token.ASSIGN);
        Expr e = expr();
        d = new Decl(id, t, e);
    } 
    else d = new Decl(id, t);

    match(Token.SEMICOLON);
    return d;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) Statment 파싱&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private Stmt stmt() {
    // &amp;lt;stmt&amp;gt; -&amp;gt; &amp;lt;block&amp;gt; | &amp;lt;assignment&amp;gt; | &amp;lt;ifStmt&amp;gt; | &amp;lt;whileStmt&amp;gt; | ...
    Stmt s = new Empty();
    switch (token) {
    case ID:    // assignment
        s = assignment(); return s;
    case LBRACE:          
        match(Token.LBRACE);      
        s = stmts();
        match(Token.RBRACE);    
        return s;
    case IF:    // if statement 
        s = ifStmt(); return s;   
    case WHILE:      // while statement 
        s = whileStmt(); return s;
    case LET:  // let statement 
        s = letStmt(); return s;
    ...
    default:  
        error(&quot;Illegal stmt&quot;); return null; 
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5) 파서 구현 : Assignment 문&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private Stmt assignment() { 
    // &amp;lt;assignment&amp;gt; -&amp;gt; id = &amp;lt;expr&amp;gt;;
    Identifier id = new Identifier(match(Token.ID));
    match(Token.ASSIGN);
    Expr e = expr();
    match(Token.SEMICOLON);
    if (ar == null) return new Assignment(id, e);
    return new Assignment(ar, e);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6) match 함수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 토큰을 매치하고 다음 토큰을 읽는다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private String match(Token t) {
    String value = token.value();
    if (token == t)
        token = lexer.getToken();
    else
        error(t);
    return value;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7) 파서 구현 : 복합문&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private Stmts stmts () { // &amp;lt;stmts&amp;gt; -&amp;gt; {&amp;lt;stmt&amp;gt;} 
    Stmts ss = new Stmts();
    while((token != Token.RBRACE) &amp;amp;&amp;amp; (token != Token.END))
        ss.stmts.add(stmt());
    return ss;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8) 파서 구현 : If 문&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private If ifStmt () { // &amp;lt;ifStmt&amp;gt; -&amp;gt; if (&amp;lt;expr&amp;gt;) then &amp;lt;stmt&amp;gt; [else &amp;lt;stmt&amp;gt;]
    match(Token.IF);
    match(Token.LPAREN);
    Expr e = expr();
    match(Token.RPAREN);
    match(Token.THEN);
    Stmt s1 = stmt();
    Stmt s2 = new Empty();
    if (token == Token.ELSE){
        match(Token.ELSE);
        s2 = stmt();
    }
    return new If(e, s1, s2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9) 파서 구현 : While 문&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private While whileStmt () {
    // &amp;lt;whileStmt&amp;gt; -&amp;gt; while (&amp;lt;expr&amp;gt;) &amp;lt;stmt&amp;gt;
    match(Token.WHILE);
    match(Token.LPAREN);
    Expr e = expr();
    match(Token.RPAREN);

    Stmt s1 = stmt();
    return new While(e, s1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10) let-문 파싱&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;private Let letStmt () {
    // &amp;lt;letStmt&amp;gt; -&amp;gt; let &amp;lt;decls&amp;gt; in &amp;lt;block&amp;gt; end
    match(Token.LET);
    Decls ds = decls();
    match(Token.IN);
    Stmts ss = stmts();
    match(Token.END);
    match(Token.SEMICOLON);
    return new Let(ds, null, ss);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11) 파서 구현 : 수식&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private Expr aexp () {
    // &amp;lt;aexp&amp;gt; -&amp;gt; &amp;lt;term&amp;gt; { + &amp;lt;term&amp;gt; | - &amp;lt;term&amp;gt; }
    Expr e = term();
    while (token == Token.PLUS || token == Token.MINUS) {
        Operator op = new Operator(match(token));
        Expr t = term();
        e = new Binary(op, e, t);
    }
    return e;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12) 파서 구현 : term 함수&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private Expr term () { // &amp;lt;term&amp;gt; -&amp;gt; &amp;lt;factor&amp;gt; { * &amp;lt;factor&amp;gt; | / &amp;lt;factor&amp;gt;}
    Expr t = factor();
    while (token == Token.MULTIPLY || token == Token.DIVIDE) {
        Operator op = new Operator(match(token));
        Expr f = factor();
        t = new Binary(op, t, f);
    }
    return t;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;13) 파서 구현 : factor 함수&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;private Expr factor() { 
    // &amp;lt;factor&amp;gt; -&amp;gt; [-](id | id'['&amp;lt;expr&amp;gt;']' | &amp;lt;call&amp;gt; | literal | '('&amp;lt;aexp&amp;gt; ')')
    Operator op = null;
    if (token == Token.MINUS)
        op = new Operator(match(Token.MINUS));

    Expr e = null;
    switch(token) {
        case ID:
            Identifier v = new Identifier(match(Token.ID));
            e = v;
            break;
        case LPAREN:
            match(Token.LPAREN);
            e = aexp();
            match(Token.RPAREN);
            break;
        default:
            error(&quot;Identifier | Literal&quot;);
    }

    if (op != null)
        return new Unary(op, e);
    else return e;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>전공과목 정리/프로그래밍언어론</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/413</guid>
      <comments>https://0yeonjae2.tistory.com/413#entry413comment</comments>
      <pubDate>Sat, 23 Aug 2025 06:36:31 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍언어론 ] 2장 구문법 (Syntax)</title>
      <link>https://0yeonjae2.tistory.com/408</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)&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;2.1 구문 및 구문법&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 구문법 (Syntax)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문장 혹은 프로그램을 작성하는 방법&lt;br /&gt;- 자연어(영어, 한국어)의 문법처럼 프로그래밍 언어의 구문법이 있다.&lt;br /&gt;- 프로그래밍 언어의 이론적 기초&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 재귀적 정의 : 이진수의 구문법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 숫자(D)는 0, 1 중 하나이다.&lt;br /&gt;- 이진수 구성 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;숫자(D)는 이진수(N)이다.&lt;/li&gt;
&lt;li&gt;이진수(N) 다음에 숫자(D)가 오면 이진수(N)이다.&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;1190&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8kbYK/btsP3dt4uqZ/jq0rAABqcWTjM50TDvDeh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8kbYK/btsP3dt4uqZ/jq0rAABqcWTjM50TDvDeh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8kbYK/btsP3dt4uqZ/jq0rAABqcWTjM50TDvDeh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8kbYK%2FbtsP3dt4uqZ%2Fjq0rAABqcWTjM50TDvDeh1%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;1190&quot; height=&quot;771&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vvVih/btsP2FEmhNA/2aCkFrqgjdFhWmSXKUcDG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vvVih/btsP2FEmhNA/2aCkFrqgjdFhWmSXKUcDG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vvVih/btsP2FEmhNA/2aCkFrqgjdFhWmSXKUcDG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvvVih%2FbtsP2FEmhNA%2F2aCkFrqgjdFhWmSXKUcDG1%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;739&quot; height=&quot;472&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 수식의 구문법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTqs0/btsP29SKuqy/nLDmI6tuQGWnVgLBho7KTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTqs0/btsP29SKuqy/nLDmI6tuQGWnVgLBho7KTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTqs0/btsP29SKuqy/nLDmI6tuQGWnVgLBho7KTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTqs0%2FbtsP29SKuqy%2FnLDmI6tuQGWnVgLBho7KTk%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;613&quot; height=&quot;432&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5) 프로그래밍 언어의 구문 구조&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KP6ZK/btsPZTLa4YS/ou7V6Mrm3qgDcoFi8MLmqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KP6ZK/btsPZTLa4YS/ou7V6Mrm3qgDcoFi8MLmqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KP6ZK/btsPZTLa4YS/ou7V6Mrm3qgDcoFi8MLmqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKP6ZK%2FbtsPZTLa4YS%2Fou7V6Mrm3qgDcoFi8MLmqK%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;1202&quot; height=&quot;812&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6) 문맥-자유 문법 CFG&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRJ5q/btsP07Wb5HN/EKl1Kc2I4fJFGfJ4pzyvkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRJ5q/btsP07Wb5HN/EKl1Kc2I4fJFGfJ4pzyvkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRJ5q/btsP07Wb5HN/EKl1Kc2I4fJFGfJ4pzyvkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRJ5q%2FbtsP07Wb5HN%2FEKl1Kc2I4fJFGfJ4pzyvkK%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;1152&quot; height=&quot;812&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 넌터미널 심볼은 보통 대문자로, 터미널 심볼은 소문자로 표기&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7) 생성 규칙&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciadlU/btsP1sZ7BCj/KwxZgHsKriw4GvXI7LVkwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciadlU/btsP1sZ7BCj/KwxZgHsKriw4GvXI7LVkwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciadlU/btsP1sZ7BCj/KwxZgHsKriw4GvXI7LVkwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciadlU%2FbtsP1sZ7BCj%2FKwxZgHsKriw4GvXI7LVkwk%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;1366&quot; height=&quot;377&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.2 유도&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 유도 (Derivation)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 구문검사 : 입력된 문장 혹은 프로그램이 문법에 맞는지 검사하는 것&lt;br /&gt;- 입력된 스트링이 문법에 맞는지 검사하려면 문법으로부터 유도(derivation)해 보아야 함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJSYeD/btsPZ04BZhx/Q7kiKdSyup3SozXV7GQOSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJSYeD/btsPZ04BZhx/Q7kiKdSyup3SozXV7GQOSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJSYeD/btsPZ04BZhx/Q7kiKdSyup3SozXV7GQOSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJSYeD%2FbtsPZ04BZhx%2FQ7kiKdSyup3SozXV7GQOSk%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;1437&quot; height=&quot;641&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 좌측 유도와 우측 유도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 좌측 유도 (leftmost derivation)&lt;br /&gt;: 각 직접 유도 단계에서 가장 왼쪽 넌터미널을 선택하여 이를 대상으로 생성 규칙을 적용&lt;br /&gt;&amp;nbsp;&lt;br /&gt;- 우측 유도 (rightmost derivation)&lt;br /&gt;: 각 직접 유도 단계에서 가장 오른쪽 넌터머널을 선택하여 이를 대상으로 생성 규칙을 적용&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 문법 G 언어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문법 G에 의해서 정의되는 언어 L(G)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문법 G에 의해서 유도되는 모든 스트링들의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 유도 트리 (Derivation Tree)&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;/li&gt;
&lt;li&gt;유도 트리 = 파스 트리 = 구문 트리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유도는 시작 심볼로부터 시작하여 연속적으로 직접 유도&lt;br /&gt;- 좌측 유도와 우측 유도 모두 같은 파스 트리를 가짐&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.3 모호성 (Ambiguity)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 모호성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모호한 문법 (ambiguous grammer)&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;2) 모호성 처리 방법 1&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문법 재작성 : 원래 언어와 같은 언어를 정의하면서 모호하지 않도록 문법 재작성&lt;br /&gt;- 예 :&amp;nbsp; 우선순위를 적용하여 모호하지 않도록 재작성&lt;br /&gt;&amp;nbsp;&lt;br /&gt;(1) 모호성 예 : The Dangling Else&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2bKFW/btsP262MPlu/Sjyho41KarV74Wd36F8ZQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2bKFW/btsP262MPlu/Sjyho41KarV74Wd36F8ZQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2bKFW/btsP262MPlu/Sjyho41KarV74Wd36F8ZQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2bKFW%2FbtsP262MPlu%2FSjyho41KarV74Wd36F8ZQK%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;940&quot; height=&quot;623&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 모호성 처리 방법 2&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 언어 구문 일부 변경 : 원래 언어와 약간 다른 언어를 정의하도록 언어의 구문을 일부 변경하여 모호하지 않는 문법 작성&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.4 BNF와 구문 다이어그램&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) BNF/EBNF&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3wRhQ/btsP0e2BxLN/cmFq8KvY1JKqTKmwK9cfFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3wRhQ/btsP0e2BxLN/cmFq8KvY1JKqTKmwK9cfFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3wRhQ/btsP0e2BxLN/cmFq8KvY1JKqTKmwK9cfFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3wRhQ%2FbtsP0e2BxLN%2FcmFq8KvY1JKqTKmwK9cfFK%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;1229&quot; height=&quot;747&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd70Wo/btsP202zz6l/5kYJkHPAqB77j1hNqaFLjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd70Wo/btsP202zz6l/5kYJkHPAqB77j1hNqaFLjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd70Wo/btsP202zz6l/5kYJkHPAqB77j1hNqaFLjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd70Wo%2FbtsP202zz6l%2F5kYJkHPAqB77j1hNqaFLjk%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;1081&quot; height=&quot;830&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 구문 다이어그램&lt;/h4&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;각 생성 규칙을 다이어그램으로 표현&lt;/li&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; EBNF에서 중괄호로 나타낸 반복 -&amp;gt; 다이어그램에서는 루프를 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPlyaA/btsP1ujh7FO/YDnkRZKuOwqLnSK1G1MNR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPlyaA/btsP1ujh7FO/YDnkRZKuOwqLnSK1G1MNR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPlyaA/btsP1ujh7FO/YDnkRZKuOwqLnSK1G1MNR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPlyaA%2FbtsP1ujh7FO%2FYDnkRZKuOwqLnSK1G1MNR0%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;1592&quot; height=&quot;761&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.5 재귀 하강 파서&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 재귀 하강 파싱 (recursive-descent parsing)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파싱 : 입력 스트링을 유도하여 문법에 맞는지 검사&lt;br /&gt;- 파서 : 입력 스트링을 유도하여 문법에 맞는지 검사하는 프로그램&lt;br /&gt;- 재귀 하강 파서의 기본 원리 : 입력 스트링을 좌측 유도(leftmost derivation)하도록 문법으로부터 직접 파서 프로그램을 만듦&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 재귀 하강 파싱 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 넌터미널 : 하나의 프로시저(함수, 메소드)를 구현한다.&lt;br /&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;match(문자); : 다음 입력 심볼(토큰)이 문자와 일치하는지 검사&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;3) 예제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수식을 재귀-하강 파싱&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;int getToken() { // 다음 토큰 (수 or 문자)을 읽어서 리턴
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (true) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	try {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch = input.read();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (ch == ' ' || ch == '\t' || ch == '\r');
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if (Character.isDigit(ch)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	value = number();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;input.unread(ch);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return NUMBER;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else return ch;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (IOException e) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	System.err.println(e);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

void match(int c) { // 현재 토큰 확인 후 다음 토큰 읽기
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (token == c) token = getToken();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else error();
}

void expr(void) { // &amp;lt;expr&amp;gt; -&amp;gt; &amp;lt;term&amp;gt; { + &amp;lt;term&amp;gt;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;term();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (token == '+') {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	match('+');
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;term();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
}

void command(void) { // &amp;lt;command&amp;gt; -&amp;gt; &amp;lt;expr&amp;gt; '\n'
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int result = expr();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (token == '\n') 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	printf(&quot;The result is %d\n&quot;, result);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else error();
}

void parse(void) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token = getToken();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command();
}

main() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parse();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 수식 값 계산기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수식 값 계산 : 재귀 하강 파싱하면서 동시에 수식의 값을 계산&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;int expr(void) { // &amp;lt;expr&amp;gt; -&amp;gt; &amp;lt;term&amp;gt; { + &amp;lt;term&amp;gt;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int result = term();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (token == '+') {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	match('+');
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result += term();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return result;
}
 
int term(void) { // &amp;lt;term&amp;gt; -&amp;gt; &amp;lt;factor&amp;gt; {* &amp;lt;factor&amp;gt;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int result = factor();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (token == '*') {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match('*');
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result *= factor();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전공과목 정리/프로그래밍언어론</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/408</guid>
      <comments>https://0yeonjae2.tistory.com/408#entry408comment</comments>
      <pubDate>Fri, 22 Aug 2025 09:53:05 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래밍언어론 ] 1장 서론</title>
      <link>https://0yeonjae2.tistory.com/407</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 프로그래밍 언어란?&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1)&amp;nbsp; 프로그래밍언어&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 계산 과정을 기계가 읽을 수 있고 사람이 읽을 수 있도록 기술하기 위한 일종의 표기법&lt;br /&gt;- 계산 (computation) : 데이터 조작, 텍스트 처리, 알고리즘&lt;br /&gt;- 기계 읽기 (machine readability) : 효율적인 번역 또는 실행&lt;br /&gt;- 사람 읽기 (human readability) : 프로그래밍 편의성, 컴퓨터 연산들의 이해하기 쉬운 추상화&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 프로그래밍 언어의 중요성&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;절차형(명령헝) 언어 (procedural langauge)&lt;/li&gt;
&lt;li&gt;함수형 언어 (functional langauge)&lt;/li&gt;
&lt;li&gt;논리 언어 (logic language)&lt;/li&gt;
&lt;li&gt;객체지향 언어 (object-oriented language)&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;1.2 프로그래밍언어의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 프로그래밍 패러다임&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명령형 프로그래밍 (imperative programming)&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;언어 : C, pascal, Ada, Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 함수형 프로그래밍 (functional programming)&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;언어 : Lisp, Scheme, ML, Haskell&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 논리 프로그래밍 (logic programming)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정형 논리 (formal logic)를 기반으로 한 프로그래밍&lt;/li&gt;
&lt;li&gt;프로그램은 문제에 대한 사실/규칙을 표현하는 논리 문장&lt;/li&gt;
&lt;li&gt;언어 : Prolog&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체지향 프로그래밍 (object-oriented programming)&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;언어 : C++, Java, C#, Objective-C, Swift, Python, Visual Basic&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 함수형 언어 (Functional language)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본 모델 : 수학 함수를 기반으로 하는 언어&lt;br /&gt;- 프로그램 : 매개변수로 입력을 받아 처리한 후에 반환값을 출력하는 함수&lt;br /&gt;- 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 정의 (definition)&lt;/li&gt;
&lt;li&gt;함수 호출 (application)&lt;/li&gt;
&lt;li&gt;매개변수 (parameter)&lt;/li&gt;
&lt;li&gt;반환값 (return value)&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;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;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;- 예시 : Lisp, Scheme, ML, Haskell&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 논리 언어 (Logic language)&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;p -&amp;gt; q 형태의 술어 논리(predicate logic)를 기반으로 함&lt;/li&gt;
&lt;li&gt;선언적으로 프로그래밍하는 언어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램 : 문제를 해결하는 방법보다 문제가 무엇인지 논리 문장들로 표현&lt;br /&gt;- 증명하는 것을 계산하는 것으로 간주&lt;br /&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;- 장점&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;- Prolog&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;인공지능, 자연어 처리 등의 분야에서 많이 사용&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 객체지향 언어 (Object-oriented language)&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;/li&gt;
&lt;li&gt;객체 개념을 기반으로 하는 프로그래밍 스타일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체 (object) : 속성과 관련 행동(함수, 메소드)들의 모음으로 표현&lt;br /&gt;- 계산과정 (computation) : 객체들 사이의 상호 작용 (메소드 호출)&lt;br /&gt;- 클래스 (class)&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;객체는 클래스의 한 실체(instance)&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;1.3 프로그래밍 언어의 역사&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 1950년대 : 고급 프로그래밍 언어의 시작&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; FORTRAN (FORmula TRANslation)&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;주요 기능 : 배열 (array), FOR 반복문, 분기 IF-문 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- COBOL (COmmon Business-Oriented Langauge)&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;- LISP (List Processor)&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;재귀호출 (recursive call)이 매우 일반적임&lt;/li&gt;
&lt;li&gt;LISP와 후속 언어 Scheme은 인공지능 분야에서 많이 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 1960년대 : 프로그래밍 언어의 다양성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Algol60/68&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;Pascal, C, Modula-2, Ada 같은 현대의 명령어 언어에 영향을 줌&lt;/li&gt;
&lt;li&gt;주요 특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구조적 문장, begin-end 블록&lt;/li&gt;
&lt;li&gt;자유 양식 (free format), 변수의 타입 선언&lt;/li&gt;
&lt;li&gt;재귀 호출, 값 전달 매개변수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Algol68&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Algol60을 향상하여 더 표현력 있고 이론적으로 완전히 일관성 있는 구조를 생성하려고 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PL/I&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적이고 보편적인 언어, 즉 모든 언어를 통합하는 언어
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;FORTRAN, COBOL, Algol60의 가장 좋은 특징을 모두 결합&lt;/li&gt;
&lt;li&gt;병행성과 예외처리 기능 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배우기도 어렵고 사용하는 데 오류 발생이 많음
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;너무 복잡해서 언어 기능들 사이에서 예측할 수 없는 상호작용이 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Simula-67&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최초의 객체지향 언어로 모의실험(simulation)을 위해 설계됨&lt;/li&gt;
&lt;li&gt;객체와 클래스 개념을 소개함으로써 공헌함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BASIC&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순한 언어로 PC로 이전되어 교육용 언어로 많이 사용됨&lt;/li&gt;
&lt;li&gt;이후 마이크로소프트사에 의해 Visual Basic 형태로 발전됨.&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;3) 1970년대 : 단순성 및 새로운 언어의 추구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PASCAL&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;교육용 언어로 Algol의 아이디어를 작고, 단순하고, 효율적이고 구조화된 언어로 세련되게 만듦&lt;/li&gt;
&lt;li&gt;대표적인 블록 구조 언어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C 언어&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;기계에 대해 많은 접근을 제공하는 중급 언어 (middle-level)&lt;/li&gt;
&lt;li&gt;모든 컴퓨터 시스템에서 사용할 수 있도록 설계된 언어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Prolog&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;- Scheme : 더 형식적이고 람다 계산에 더 가깝게 설계된 향상된 LISP 버전&lt;br /&gt;- ML : Pascal과 가까운 구문을 가지고 다형 타입 검사 매커니즘을 제공하는 함수형 언어&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) 1980년대 : 추상 자료형과 객체 지향&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ada&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미 국방성(DoD)의 후원으로 개발된 영향력 있고 포괄적인 언어&lt;/li&gt;
&lt;li&gt;주요 기능
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;패키지 (추상 자료형), 태스크(병행 프로그래밍 기능)&lt;/li&gt;
&lt;li&gt;예외처리 등과 같은 새로운 기능을 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Modula-2&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;Pascal처럼 가능한 한 작고 단순한 언어로 설계&lt;/li&gt;
&lt;li&gt;주요 기능
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;모듈 (추상 자료형), 코루틴 (부분적인 병행성)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Smalltalk&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;Ruby, Objective-C, Java, Python, Scala 등의 언어에 영향을 줌&lt;/li&gt;
&lt;li&gt;최초로 GUI를 제공하는 언어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C++&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C언어를 확장함.&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;C언어의 구조체 - 클래스 형태로 확장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;C언어의 효율성을 유지하면서도 객체지향 프로그래밍 가능&lt;/li&gt;
&lt;li&gt;포인터와 같은 C언어의 중요한 특징을 그대로 포함하고 있음.&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;5) 1990년대 : 인터넷 언어와 새로운 시도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Python&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;대화형 인터프리터 방식의 프로그래밍 언어&lt;/li&gt;
&lt;li&gt;플랫폼 독립성, 객체지향, 동적 타입(dynamic type)&lt;/li&gt;
&lt;li&gt;교육용 및 빅데이터를 비롯한 다양한 분야에서 응용되고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java&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;플랫폼 독립성 : 컴파일된 바이트 코드가 JVM이 설치된 어느 플랫폼에서도 실행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JavaScript&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;Node.js와 같은 런타임 환경과 같이 서버 프로그래밍에서도 사용&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;6) 2000년대 : 새로운 미래를 향하여&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C#&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java를 모방한 마이크로소프트 버전&lt;/li&gt;
&lt;li&gt;닷넷 프레임워크를 기반으로 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Scala&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;자바 바이트코드를 사용하기 때문에 JVM에서 실행 가능&lt;/li&gt;
&lt;li&gt;Java 언어와 호환 : 대부분의 자바 API를 그대로 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Objective-C와 Swift&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Swift는 기존의 Mac용 언어인 Objective-C와 함께 공존&lt;/li&gt;
&lt;li&gt;Objective-C처럼 LLVM으로 빌드되고 같은 런타임 시스템을 공유&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.4 추상화와 명령형 언어의 발전&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 프로그래밍 언어 발전 과정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컴퓨터 : Von Neuman model computer (폰 노이만 모델 컴퓨터)&lt;br /&gt;- 초창기 프로그램 : 컴퓨터에 명령하는 기계어 명령어들로 작성&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) Von Neuman 모델 컴퓨터&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlmDtp/btsP1Y5uG9N/8CeqKFgUxNkEPwR2I8eBq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlmDtp/btsP1Y5uG9N/8CeqKFgUxNkEPwR2I8eBq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlmDtp/btsP1Y5uG9N/8CeqKFgUxNkEPwR2I8eBq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlmDtp%2FbtsP1Y5uG9N%2F8CeqKFgUxNkEPwR2I8eBq1%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;1284&quot; height=&quot;626&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그램 내장 방식 컴퓨터&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;stored-program computer&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU sequentially execute instructions in memory&lt;/li&gt;
&lt;li&gt;PC : 다음 실행할 명령어를 가리키는 레지스터&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;li&gt;instructions operate on values stored in memory&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컴퓨터 프로그램 실행 : CPU의 인출-해석-실행 (fetch-decode-execute) 주기 반복&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU는 메모리 내에 저장되어 있는 프로그램의 명령어를 한 번에 하나씩 가져와서 해석하고 실행&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;1232&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx1GVL/btsP2gx4fZD/KUYMucDdnCBVtBkefCMbDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx1GVL/btsP2gx4fZD/KUYMucDdnCBVtBkefCMbDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx1GVL/btsP2gx4fZD/KUYMucDdnCBVtBkefCMbDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx1GVL%2FbtsP2gx4fZD%2FKUYMucDdnCBVtBkefCMbDk%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;1232&quot; height=&quot;670&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;670&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;h4 data-ke-size=&quot;size20&quot;&gt;3) 명령형 언어 (Imperative language)&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;Imperative programming languages began by imitating and abstracting the opreations of von Neuman model computer&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;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;h4 data-ke-size=&quot;size20&quot;&gt;4) 추상화 (Abstraction)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 추상화 : 실제적이고 구체적인 개념들을 요약하여 보다 높은 수준의 개념을 유도하는 과정&lt;br /&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;(1) 데이터 추상화 (Data Abstraction)&lt;br /&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;기본 데이터 관련 요약&lt;/li&gt;
&lt;li&gt;ex.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;변수 (variable) : 데이터 값을 저장하는 메모리 위치&lt;/li&gt;
&lt;li&gt;자료형 (data type) : 값들의 종류에 대한 이름&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&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;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;(2) 제어 추상화 (Control Abstraction)&lt;br /&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;몇 개의 기계어 명령어들을 하나의 문장으로 요약&lt;/li&gt;
&lt;li&gt;대입문&lt;/li&gt;
&lt;li&gt;goto 문 : jump 명령어의 요약&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;- 예&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;if-문, switch-문&lt;/li&gt;
&lt;li&gt;for-문, while-문&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;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;선언 : 일련의 계산 과정을 하나의 이름으로 요약해서 정의&lt;/li&gt;
&lt;li&gt;호출 : 이름과 실 매개변수를 이용하여 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) 추상 자료형 (Abstract Data Type)&lt;br /&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Modula-2의 모듈&lt;/li&gt;
&lt;li&gt;Ada의 패키지&lt;/li&gt;
&lt;li&gt;C++, Java 등의 클래스&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;1.5 프로그래밍 언어의 정의 및 구현&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) (프로그래밍) 언어 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어휘 구조 (lexical structure) : 언어 구조에서 사용하는 단어의 구조, 철자법&lt;br /&gt;- 구문법 (syntax)&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;Context-free grammer in BNF(Backus-Naur Form)&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;li&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;2) 프로그래밍 언어 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로그래밍 언어 구현 : 입력 프로그램 ➡️ Syntax ➡️ Semantics ➡️ Interpret/Compile&lt;br /&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;그 의미에 맞게 동작하도록 해석 or 기계어 명령어들로 번역&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;903&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uDbxv/btsP5hDiTxT/h8iChRsglPVaFzhtkwy3pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDbxv/btsP5hDiTxT/h8iChRsglPVaFzhtkwy3pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDbxv/btsP5hDiTxT/h8iChRsglPVaFzhtkwy3pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDbxv%2FbtsP5hDiTxT%2Fh8iChRsglPVaFzhtkwy3pK%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;903&quot; height=&quot;928&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>전공과목 정리/프로그래밍언어론</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/407</guid>
      <comments>https://0yeonjae2.tistory.com/407#entry407comment</comments>
      <pubDate>Thu, 21 Aug 2025 20:49:16 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 14기✍️] 회고록 : 6주동안의 딥러닝 학습을 마치며</title>
      <link>https://0yeonjae2.tistory.com/406</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XpdRq/btsPR90CNRO/kUri923AVy53Xt83OHi1R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XpdRq/btsPR90CNRO/kUri923AVy53Xt83OHi1R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XpdRq/btsPR90CNRO/kUri923AVy53Xt83OHi1R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXpdRq%2FbtsPR90CNRO%2FkUri923AVy53Xt83OHi1R0%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;677&quot; height=&quot;317&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼공학습단을 10기부터 참여해서 어느덧 5번째 활동이었습니다!&amp;nbsp; 대학교 2학년 여름방학에 시작한 활동이었는데 벌써 4학년 여름방학을 맞이하다니 시간이 참 빠른 것 같습니다.&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; 책을 선택해서 6주동안 공부했습니다. 6주동안의 커리큘럼을 마쳤지만, 책을 완전히 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;다들 수고 많으셨습니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvBC0G/btsPR6bAWDU/CXwT6LM57pjAV1AEKfnTZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvBC0G/btsPR6bAWDU/CXwT6LM57pjAV1AEKfnTZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvBC0G/btsPR6bAWDU/CXwT6LM57pjAV1AEKfnTZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvBC0G%2FbtsPR6bAWDU%2FCXwT6LM57pjAV1AEKfnTZK%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;1021&quot; height=&quot;777&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>활동/PS, 스터디</category>
      <category>혼공학습단</category>
      <category>회고</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/406</guid>
      <comments>https://0yeonjae2.tistory.com/406#entry406comment</comments>
      <pubDate>Wed, 13 Aug 2025 17:14:08 +0900</pubDate>
    </item>
    <item>
      <title>[혼공학습단 14기 혼만딥 ] 혼자 만들면서 공부하는 딥러닝 week6</title>
      <link>https://0yeonjae2.tistory.com/403</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  기본 숙제&lt;/b&gt;&lt;/h3&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Ch.04(04-2) KerasNLP 또는 허깅페이스 BERT 모델로 영화 리뷰 감성 분석 후 결과 캡처하기&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;/b&gt;&lt;/h3&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Ch.04(04-2) 감성 분석에 사용된 토큰화 과정 살펴보고 입력과 출력 비교해 보기&lt;/blockquote&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;  토큰화가 일어나는 코드&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;prep_data = classifier.preprocessor(feature)&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;  토큰화 입력 : 원래 문장의 앞 100글자 출력&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;print(feature.numpy()[:100])&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byAczu/btsPwr9mC8i/y9n5SR2XpzOKsq7RZuvAiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byAczu/btsPwr9mC8i/y9n5SR2XpzOKsq7RZuvAiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byAczu/btsPwr9mC8i/y9n5SR2XpzOKsq7RZuvAiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyAczu%2FbtsPwr9mC8i%2Fy9n5SR2XpzOKsq7RZuvAiK%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;757&quot; height=&quot;73&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;  토큰화 출력 : 토큰 ID 출력&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;print(len(prep_data['token_ids']), prep_data['token_ids'][:10])
prep_data['token_ids'][-10:]&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bru4dS/btsPv5SVsZe/IbhIel8pgIzsVEBLDG8lrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bru4dS/btsPv5SVsZe/IbhIel8pgIzsVEBLDG8lrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bru4dS/btsPv5SVsZe/IbhIel8pgIzsVEBLDG8lrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbru4dS%2FbtsPv5SVsZe%2FIbhIel8pgIzsVEBLDG8lrK%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;792&quot; height=&quot;129&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;  토큰화 출력 : 토큰 ID ➡️ 토큰 (단어) 변환&lt;/span&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;tokens = []
for id in prep_data['token_ids'][:10]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tokens.append(bert_tokenizer.id_to_token(id))
print(tokens)&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uPqKS/btsPwyNZ6ct/K9iNHWjjXPLGAplm8Ud5u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uPqKS/btsPwyNZ6ct/K9iNHWjjXPLGAplm8Ud5u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uPqKS/btsPwyNZ6ct/K9iNHWjjXPLGAplm8Ud5u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuPqKS%2FbtsPwyNZ6ct%2FK9iNHWjjXPLGAplm8Ud5u1%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;635&quot; height=&quot;131&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;  토큰화 출력 :&lt;span style=&quot;color: #333333;&quot;&gt; 토큰 ➡️ ID 확인 (역변환)&lt;/span&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;for token in tokens:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(bert_tokenizer.token_to_id(token), end=' ')&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyyXwm/btsPxKUeEqA/vZX8gSGJlyWRcjvPZriET1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyyXwm/btsPxKUeEqA/vZX8gSGJlyWRcjvPZriET1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyyXwm/btsPxKUeEqA/vZX8gSGJlyWRcjvPZriET1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyyXwm%2FbtsPxKUeEqA%2FvZX8gSGJlyWRcjvPZriET1%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;494&quot; height=&quot;88&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;  직접 문자열 토큰화 테스트&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;bert_tokenizer.tokenize('&quot;pandemonium&quot; is a horror movie')&lt;/code&gt;&lt;/pre&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbsigN/btsPwDIx6XH/ic7jdX8mALGNtVKIxqoQK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbsigN/btsPwDIx6XH/ic7jdX8mALGNtVKIxqoQK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbsigN/btsPwDIx6XH/ic7jdX8mALGNtVKIxqoQK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbsigN%2FbtsPwDIx6XH%2Fic7jdX8mALGNtVKIxqoQK1%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;624&quot; height=&quot;108&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Chap04-1 트랜스포머 인코더 모델 이해하기&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;1. 어텐션 매커니즘&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;1) 어텐션&lt;br&gt;- 모델에 입력된 데이터의 모든 단어들 중에서 특정 단어와 관련이 높은 단어에 집중해 데이터를 처리하도록 설계된 기법&lt;br&gt;- 셀프 어텐션 (self attention) : 문장의 모든 단어가 서로를 참고해 각각 다른 단어와의 관련성을 파악하는 방법&lt;br&gt;- 멀티 헤드 어텐션 (multi-head attention) : 여러 개의 셀프 어텐션(헤드)을 동시에 수행해 이 관련성을 다양한 관점에서 깊이 이해할 수 있도록 확장&lt;br&gt;- 문맥 벡터(context vector) : 기계 번역에서 인코더 RNN은 먼저 입력된 문장을 처리해 최종 은닉 상태(hidden state)로 만듦&lt;br&gt;- 디코더 RNN이 인코더로부터 받은 문맥 벡터를 이용해 새로운 문장(번역된 문장)을 만듦.&lt;br&gt;&amp;nbsp;&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;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7aig6/btsPwtdOsq0/6QMzD043FgrVtKEzKcFlw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7aig6/btsPwtdOsq0/6QMzD043FgrVtKEzKcFlw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7aig6/btsPwtdOsq0/6QMzD043FgrVtKEzKcFlw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7aig6%2FbtsPwtdOsq0%2F6QMzD043FgrVtKEzKcFlw1%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;613&quot; height=&quot;388&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 긴 문장일수록 문맥 벡터만으로는 오래된 단어의 정보를 기억하기 어려움 = 그레이디언트가 타임스텝에 걸쳐 전파되며 점점 약해짐&lt;br&gt;- 인코더의 마지막 타임스텝에서 얻은 은닉 상태뿐만 아니라 인코더의 모든 은닉 상태를 디코더가 텍스트를 생성할 때마다 참고하도록 만듦. = &lt;b&gt;&lt;span style=&quot;color: #EE2323;&quot;&gt;디코더가 모든 타임스텝에서 인코더의 은닉 상태를 참고해 문맥 벡터를 만듦.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfAKvW/btsPw0IR211/qx9VCW6gS9uCaZP4o0kfqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfAKvW/btsPw0IR211/qx9VCW6gS9uCaZP4o0kfqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfAKvW/btsPw0IR211/qx9VCW6gS9uCaZP4o0kfqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfAKvW%2FbtsPw0IR211%2Fqx9VCW6gS9uCaZP4o0kfqK%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;335&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NFJQA/btsPv8Vfxl0/orIOslfSKjaOH8otouDs01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NFJQA/btsPv8Vfxl0/orIOslfSKjaOH8otouDs01/img.png&quot; data-alt=&quot;관련 수식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NFJQA/btsPv8Vfxl0/orIOslfSKjaOH8otouDs01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNFJQA%2FbtsPv8Vfxl0%2ForIOslfSKjaOH8otouDs01%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;569&quot; height=&quot;381&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관련 수식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 트랜스포머 (transformer)&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XHZJf/btsPxiJkZUr/kfkM6hVPyjtDYlD0uTw17K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XHZJf/btsPxiJkZUr/kfkM6hVPyjtDYlD0uTw17K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XHZJf/btsPxiJkZUr/kfkM6hVPyjtDYlD0uTw17K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXHZJf%2FbtsPxiJkZUr%2FkfkM6hVPyjtDYlD0uTw17K%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;1354&quot; height=&quot;382&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;2) 셀프 어텐션&lt;br&gt;- 입력 토큰 : 모델에 입력하련느 텍스트를 잘게 나눈 단위&lt;br&gt;- 임베딩 : 신경망이 입력토큰을 처리할 수 있도록 고정 크기의 벡터로 변환&lt;br&gt;➡️ 디코더의 은닉 상태 없이 입력 토큰만으로 어텐션 점수를 계산하기 때문에 셀프 어텐션이라 함.&lt;br&gt;- 스케일드 점곱 어텐션을 사용함.&amp;nbsp;&lt;br&gt;1️⃣ 입력을 세 개의 다른 벡터로 변환&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;li&gt;값 : 이 정볼르 제공하면 어떤 결과가 나오는지 ; 실제 정보의 내용&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ 벡터 간 관계 (유사도) 및 최종 결과 계산&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;li&gt;각 단어에 계산된 중요도를 확률처럼 확인할 수 있도록 소프트맥스 함수에 통과시켜 합이 1이 되도록 어텐션 함수를 정규화&lt;/li&gt;&lt;li&gt;마지막으로 계산된 어텐션 점수와 값 벡터를 곱함.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwnQTf/btsPwD8x51B/tFmNqUUqYF5kWlzYXatnwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwnQTf/btsPwD8x51B/tFmNqUUqYF5kWlzYXatnwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwnQTf/btsPwD8x51B/tFmNqUUqYF5kWlzYXatnwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwnQTf%2FbtsPwD8x51B%2FtFmNqUUqYF5kWlzYXatnwk%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;689&quot; height=&quot;258&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3) 멀티 헤드 어텐션&lt;br&gt;1️⃣ 어텐션 계산 : 각각의 헤드가 독립적으로 셀프 어텐션을 수행하고, 각 헤드에서 계산된 출력을 하나로 연결&lt;br&gt;2️⃣ 최종 변환 : 하나로 연결될 멀티 헤드 어텐션의 결과를 밀집층에 통과시켜 원본 임베딩 크기로 변환&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laKRk/btsPuYzpKca/PGURHDJrR7Hv36HBjdByKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laKRk/btsPuYzpKca/PGURHDJrR7Hv36HBjdByKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laKRk/btsPuYzpKca/PGURHDJrR7Hv36HBjdByKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaKRk%2FbtsPuYzpKca%2FPGURHDJrR7Hv36HBjdByKk%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;737&quot; height=&quot;337&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;2. 위치 인코딩과 층 정규화&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;1) 순서 정보 더하기 - 위치 인코딩 (PE; Positional Encoding)&lt;br&gt;- 토큰과 토큰 사이의 거리르 감지하지 못함 ➡️ 단어의 순서에 대한 정보를 보완하기 위해 토큰 임베딩에 위치 인코딩 추가&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhw4qd/btsPv55mntX/bk6QKGiOMwPQR7PpIlaTKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhw4qd/btsPv55mntX/bk6QKGiOMwPQR7PpIlaTKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhw4qd/btsPv55mntX/bk6QKGiOMwPQR7PpIlaTKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhw4qd%2FbtsPv55mntX%2Fbk6QKGiOMwPQR7PpIlaTKk%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;862&quot; height=&quot;673&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDxHb8/btsPwrNW0Pq/rTGER3uv7KBaqystNCsxdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDxHb8/btsPwrNW0Pq/rTGER3uv7KBaqystNCsxdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDxHb8/btsPwrNW0Pq/rTGER3uv7KBaqystNCsxdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDxHb8%2FbtsPwrNW0Pq%2FrTGER3uv7KBaqystNCsxdK%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;579&quot; height=&quot;217&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;2) 훈련 안정화하기 - 층 정규화 (layer normalization)&lt;br&gt;-&amp;nbsp; 배치 단위가 아니라 각 샘플의 특성을 정규화&lt;br&gt;- 텍스트 시퀸스에 있는 토큰마다 정규화하는 것으로 자연어 처리 작업에 더욱 적합&lt;/p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDvxqH/btsPvrOWzHZ/yleEEpDUCtEcLlQ6Ckh2Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDvxqH/btsPvrOWzHZ/yleEEpDUCtEcLlQ6Ckh2Qk/img.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;538&quot; style=&quot;width: 45.9708%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDvxqH/btsPvrOWzHZ/yleEEpDUCtEcLlQ6Ckh2Qk/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDvxqH%2FbtsPvrOWzHZ%2FyleEEpDUCtEcLlQ6Ckh2Qk%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;541&quot; height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CU5VU/btsPvYFpQ2G/4c158PsYIwPWPcbPw3Cgkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CU5VU/btsPvYFpQ2G/4c158PsYIwPWPcbPw3Cgkk/img.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;390&quot; style=&quot;width: 52.8664%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CU5VU/btsPvYFpQ2G/4c158PsYIwPWPcbPw3Cgkk/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCU5VU%2FbtsPvYFpQ2G%2F4c158PsYIwPWPcbPw3Cgkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;3. 트랜스포머 인코더 모델 만들기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPfdBX/btsPv0QNHWt/Lo0KtUWufdKhNGkDgzsap0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPfdBX/btsPv0QNHWt/Lo0KtUWufdKhNGkDgzsap0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPfdBX/btsPv0QNHWt/Lo0KtUWufdKhNGkDgzsap0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPfdBX%2FbtsPv0QNHWt%2FLo0KtUWufdKhNGkDgzsap0%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;1710&quot; height=&quot;736&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티 헤드 어텐션층 다음에는 과대적합을 막기 위해 훈련 단계에서 뉴런의 일부를 무작위로 비활성화하는 드룹아웃 층이 놓임&lt;br&gt;- 드롭아웃층의 출력은 어텐션의 입력과 더해져 층 정규화를 통과함&lt;br&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;br&gt;- 원본 트랜스포머 모델은 어텐션층에서 소프트맥스 함수의 출력에도 드롭아웃을 적용 ; 어텐션 드롭아웃&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba0cF9/btsPwvbK6qx/m2snHBy1gGSxytwO72Znl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba0cF9/btsPwvbK6qx/m2snHBy1gGSxytwO72Znl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba0cF9/btsPwvbK6qx/m2snHBy1gGSxytwO72Znl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba0cF9%2FbtsPwvbK6qx%2Fm2snHBy1gGSxytwO72Znl0%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;550&quot; height=&quot;322&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Chap04-2 전이 학습으로 영화 리뷰 텍스트의 감정 분류하기&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;1. 트랜스포머 인코더 기반 언어 이해 모델 - BERT&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;- BERT : 트랜스포머 인코더 기반의 대규모 언어 모델 (LLM)&lt;br&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;span style=&quot;color: #333333;&quot;&gt;마스크드 언어 모델링(MLM)&lt;/span&gt; : 입력 데이터의 일부 토큰을 가린(마스킹) 다음, 모델이 가려진 단어를 예측&lt;/li&gt;&lt;li&gt;다음 문장 예측(NSP) : 두 문장이 제시됐을 때 두 번째 문장이 첫 번째 문장에 이어지는 다음 문장인지를 예측&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;- 백본(backbone) : 학습된 출력 벡터를 기반으로 수행되는 별도의 분류기&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6hFeN/btsPvUi1wbX/aHLDTnIQkg5uEXzVK8JCRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6hFeN/btsPvUi1wbX/aHLDTnIQkg5uEXzVK8JCRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6hFeN/btsPvUi1wbX/aHLDTnIQkg5uEXzVK8JCRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6hFeN%2FbtsPvUi1wbX%2FaHLDTnIQkg5uEXzVK8JCRk%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;853&quot; height=&quot;278&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;- KerasNLP&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1LEpT/btsPwwVRc9f/61WvY2n2JdLKDnUk9AoYMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1LEpT/btsPwwVRc9f/61WvY2n2JdLKDnUk9AoYMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1LEpT/btsPwwVRc9f/61WvY2n2JdLKDnUk9AoYMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1LEpT%2FbtsPwwVRc9f%2F61WvY2n2JdLKDnUk9AoYMK%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;414&quot; height=&quot;203&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUJ28/btsPvYFpYsu/eJ4xZ20KJ7Gr6H3qNkdUPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUJ28/btsPvYFpYsu/eJ4xZ20KJ7Gr6H3qNkdUPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUJ28/btsPvYFpYsu/eJ4xZ20KJ7Gr6H3qNkdUPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUJ28%2FbtsPvYFpYsu%2FeJ4xZ20KJ7Gr6H3qNkdUPK%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;627&quot; height=&quot;803&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch0PiY/btsPvhS3qBN/9yPqJCJkEY5s5Fti9aDGP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch0PiY/btsPvhS3qBN/9yPqJCJkEY5s5Fti9aDGP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch0PiY/btsPvhS3qBN/9yPqJCJkEY5s5Fti9aDGP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch0PiY%2FbtsPvhS3qBN%2F9yPqJCJkEY5s5Fti9aDGP1%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;922&quot; height=&quot;662&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;2. KerasNLP로 영화 리뷰 텍스트의 감성 분류하기&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;(1) KerasNLP로 BERT 모델 로드하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3eteZ/btsPwJOfaa5/fDMkCKpaR6zeLufW5Hbbok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3eteZ/btsPwJOfaa5/fDMkCKpaR6zeLufW5Hbbok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3eteZ/btsPwJOfaa5/fDMkCKpaR6zeLufW5Hbbok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3eteZ%2FbtsPwJOfaa5%2FfDMkCKpaR6zeLufW5Hbbok%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;1055&quot; height=&quot;535&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDw7OH/btsPwDnbvqq/EyEQyiTQp26Nfgiqhquvs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDw7OH/btsPwDnbvqq/EyEQyiTQp26Nfgiqhquvs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDw7OH/btsPwDnbvqq/EyEQyiTQp26Nfgiqhquvs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDw7OH%2FbtsPwDnbvqq%2FEyEQyiTQp26Nfgiqhquvs1%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;1159&quot; height=&quot;682&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;(2) BERT 모델 미세튜닝하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H82ol/btsPv55mMLd/Yg9YG7vku5SeBWKlBl7lGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H82ol/btsPv55mMLd/Yg9YG7vku5SeBWKlBl7lGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H82ol/btsPv55mMLd/Yg9YG7vku5SeBWKlBl7lGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH82ol%2FbtsPv55mMLd%2FYg9YG7vku5SeBWKlBl7lGk%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;1363&quot; height=&quot;433&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuJdDX/btsPv5dxlp3/20Kw7YyFOfYh7NI0em95f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuJdDX/btsPv5dxlp3/20Kw7YyFOfYh7NI0em95f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuJdDX/btsPv5dxlp3/20Kw7YyFOfYh7NI0em95f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuJdDX%2FbtsPv5dxlp3%2F20Kw7YyFOfYh7NI0em95f0%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;1137&quot; height=&quot;498&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TPkCG/btsPwvCODca/9kDzBi1kE42ykw3fJ6pxJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TPkCG/btsPwvCODca/9kDzBi1kE42ykw3fJ6pxJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TPkCG/btsPwvCODca/9kDzBi1kE42ykw3fJ6pxJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTPkCG%2FbtsPwvCODca%2F9kDzBi1kE42ykw3fJ6pxJk%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;1143&quot; height=&quot;705&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceY1z5/btsPwLedDK9/zZJPhUagb87gsvaHojyc4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceY1z5/btsPwLedDK9/zZJPhUagb87gsvaHojyc4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceY1z5/btsPwLedDK9/zZJPhUagb87gsvaHojyc4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceY1z5%2FbtsPwLedDK9%2FzZJPhUagb87gsvaHojyc4K%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;803&quot; height=&quot;219&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;(3) 텍스트 전처리하기 - BERT 토크나이저&lt;br&gt;- 토큰화 : 언어 모델이 텍스트 문자열을 모델이 처리할 수 있는 작은 부분(토큰)으로 분리하는 과정&lt;br&gt;- 어휘사전 : 고유한 토큰의 집합&lt;br&gt;- 토크나이저 : 토큰화를 수행하는 방법 또는 객체&amp;nbsp;&lt;br&gt;- BERT 토크나이저는 워드피스 토큰화를 사용&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKjEYJ/btsPwE0BcyV/P7GwBs0SQQADpPK0ngA191/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKjEYJ/btsPwE0BcyV/P7GwBs0SQQADpPK0ngA191/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKjEYJ/btsPwE0BcyV/P7GwBs0SQQADpPK0ngA191/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKjEYJ%2FbtsPwE0BcyV%2FP7GwBs0SQQADpPK0ngA191%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;788&quot; height=&quot;125&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baYghJ/btsPwCBNT87/yc6fGOpP895OAi2L8xsQEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baYghJ/btsPwCBNT87/yc6fGOpP895OAi2L8xsQEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baYghJ/btsPwCBNT87/yc6fGOpP895OAi2L8xsQEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaYghJ%2FbtsPwCBNT87%2Fyc6fGOpP895OAi2L8xsQEk%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;800&quot; height=&quot;412&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlZwsu/btsPuZ595OG/UqVwUrshZ1p5CKZLxbNXU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlZwsu/btsPuZ595OG/UqVwUrshZ1p5CKZLxbNXU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlZwsu/btsPuZ595OG/UqVwUrshZ1p5CKZLxbNXU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlZwsu%2FbtsPuZ595OG%2FUqVwUrshZ1p5CKZLxbNXU0%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;791&quot; height=&quot;225&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;3. 허깅페이스로 영화 리뷰 텍스트의 감성 분류하기&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;1) 네이버 영화 리뷰 데이터셋 준비하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQOpZ6/btsPwARvtqc/YCPXGHyD1DbGauap14OLGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQOpZ6/btsPwARvtqc/YCPXGHyD1DbGauap14OLGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQOpZ6/btsPwARvtqc/YCPXGHyD1DbGauap14OLGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQOpZ6%2FbtsPwARvtqc%2FYCPXGHyD1DbGauap14OLGk%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;1437&quot; height=&quot;636&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1755&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CJ0j1/btsPwZ4tzL6/3rfoR4LkkMSyBdw7RGJL60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CJ0j1/btsPwZ4tzL6/3rfoR4LkkMSyBdw7RGJL60/img.png&quot; data-alt=&quot;여기에서 에러가 났었는데 !pip install -U datasets 해주고 나니까 잘 됐습니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CJ0j1/btsPwZ4tzL6/3rfoR4LkkMSyBdw7RGJL60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCJ0j1%2FbtsPwZ4tzL6%2F3rfoR4LkkMSyBdw7RGJL60%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;1755&quot; height=&quot;479&quot; data-origin-width=&quot;1755&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여기에서 에러가 났었는데 !pip install -U datasets 해주고 나니까 잘 됐습니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clA1Pj/btsPv7hO8sH/hzIC1ezdqplCjAuxogpVt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clA1Pj/btsPv7hO8sH/hzIC1ezdqplCjAuxogpVt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clA1Pj/btsPv7hO8sH/hzIC1ezdqplCjAuxogpVt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclA1Pj%2FbtsPv7hO8sH%2FhzIC1ezdqplCjAuxogpVt1%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;697&quot; height=&quot;344&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;2) 백본 모델 선택하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7Uaiy/btsPxlzkZI2/k9jQeCCFNVbppDkkfz8DCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7Uaiy/btsPxlzkZI2/k9jQeCCFNVbppDkkfz8DCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7Uaiy/btsPxlzkZI2/k9jQeCCFNVbppDkkfz8DCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7Uaiy%2FbtsPxlzkZI2%2Fk9jQeCCFNVbppDkkfz8DCk%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;1413&quot; height=&quot;235&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nr51x/btsPvSZR2hI/nmKZ9AC3fuKV4Rp2NkrmG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nr51x/btsPvSZR2hI/nmKZ9AC3fuKV4Rp2NkrmG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nr51x/btsPvSZR2hI/nmKZ9AC3fuKV4Rp2NkrmG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnr51x%2FbtsPvSZR2hI%2FnmKZ9AC3fuKV4Rp2NkrmG0%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;676&quot; height=&quot;760&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3) 입력 데이터 토큰화하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKuaSY/btsPw092GUg/IoKQrKYxeOCoK1tskAgDGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKuaSY/btsPw092GUg/IoKQrKYxeOCoK1tskAgDGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKuaSY/btsPw092GUg/IoKQrKYxeOCoK1tskAgDGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKuaSY%2FbtsPw092GUg%2FIoKQrKYxeOCoK1tskAgDGK%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;835&quot; height=&quot;448&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xcZw1/btsPwZpX4DJ/mPD9rsBBz2y02WIIBDKKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xcZw1/btsPwZpX4DJ/mPD9rsBBz2y02WIIBDKKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xcZw1/btsPwZpX4DJ/mPD9rsBBz2y02WIIBDKKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxcZw1%2FbtsPwZpX4DJ%2FmPD9rsBBz2y02WIIBDKKK0%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;801&quot; height=&quot;243&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mvvkl/btsPv9zWpy3/xXryzGtYqjecXB0vzUeqa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mvvkl/btsPv9zWpy3/xXryzGtYqjecXB0vzUeqa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mvvkl/btsPv9zWpy3/xXryzGtYqjecXB0vzUeqa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMvvkl%2FbtsPv9zWpy3%2FxXryzGtYqjecXB0vzUeqa0%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;824&quot; height=&quot;399&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;4) BERT 모델 미세 튜닝하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWAZZ8/btsPwbR4Nas/gamuCA2dlh4kJLpkjuZbJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWAZZ8/btsPwbR4Nas/gamuCA2dlh4kJLpkjuZbJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWAZZ8/btsPwbR4Nas/gamuCA2dlh4kJLpkjuZbJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWAZZ8%2FbtsPwbR4Nas%2FgamuCA2dlh4kJLpkjuZbJK%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;809&quot; height=&quot;797&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r211t/btsPwZ4tHA3/8mkj5Lz3kmk7hSOak8KkSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r211t/btsPwZ4tHA3/8mkj5Lz3kmk7hSOak8KkSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r211t/btsPwZ4tHA3/8mkj5Lz3kmk7hSOak8KkSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr211t%2FbtsPwZ4tHA3%2F8mkj5Lz3kmk7hSOak8KkSk%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;537&quot; height=&quot;251&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;4. 미세 튜닝된 모델로 감성 분석하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzV9Sn/btsPvi5vJ5r/obkDnj6qfOEJEhcEjO3wwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzV9Sn/btsPvi5vJ5r/obkDnj6qfOEJEhcEjO3wwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzV9Sn/btsPvi5vJ5r/obkDnj6qfOEJEhcEjO3wwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzV9Sn%2FbtsPvi5vJ5r%2FobkDnj6qfOEJEhcEjO3wwK%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;755&quot; height=&quot;375&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Chap04-3 BERT 후속 모델로 영화 리뷰 텍스트의 감성 분류하기&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;1. BERT의 성능 개선 모델 - RoBERTa&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;1) RoBERTa&lt;br&gt;- BERT의 사전 훈련 방식을 재구성해 더 많은 데이터를 활용하고, 훈련 설정을 최적화함으로써 성능을 크게 개선&lt;br&gt;- 사전 훈련 방식에서 다음 문장 예측(NSP) 작업을 제거하고, 마스크드 언어 모델링만 사용하여 모델을 훈련&lt;br&gt;- BERT의 워드피스 토크나이저 대신, 바이트 수준의 바이트 페어 인코딩(BPE) 토크나이저를 사용&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNdLgB/btsPxetvfgB/afkTQHqZ5ObNubtnAuNoQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNdLgB/btsPxetvfgB/afkTQHqZ5ObNubtnAuNoQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNdLgB/btsPxetvfgB/afkTQHqZ5ObNubtnAuNoQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNdLgB%2FbtsPxetvfgB%2FafkTQHqZ5ObNubtnAuNoQK%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;1470&quot; height=&quot;278&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;2) KerasNLP로 RoBERTa 모델 만들기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqoD8b/btsPwwpbmHZ/Th4KHY4QLMHajMSuIRYTBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqoD8b/btsPwwpbmHZ/Th4KHY4QLMHajMSuIRYTBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqoD8b/btsPwwpbmHZ/Th4KHY4QLMHajMSuIRYTBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqoD8b%2FbtsPwwpbmHZ%2FTh4KHY4QLMHajMSuIRYTBk%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;625&quot; height=&quot;509&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1645&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zefLd/btsPv83cOH3/fVMuKRLNjV7oTmESfP5Xa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zefLd/btsPv83cOH3/fVMuKRLNjV7oTmESfP5Xa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zefLd/btsPv83cOH3/fVMuKRLNjV7oTmESfP5Xa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzefLd%2FbtsPv83cOH3%2FfVMuKRLNjV7oTmESfP5Xa1%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;1645&quot; height=&quot;732&quot; data-origin-width=&quot;1645&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHaG7z/btsPxlmWOzH/dEn3e1SujgGPzFJbV8TOAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHaG7z/btsPxlmWOzH/dEn3e1SujgGPzFJbV8TOAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHaG7z/btsPxlmWOzH/dEn3e1SujgGPzFJbV8TOAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHaG7z%2FbtsPxlmWOzH%2FdEn3e1SujgGPzFJbV8TOAK%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;530&quot; height=&quot;145&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3) RoBERTa 모델 미세 튜닝하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciLOmG/btsPx8AjsKi/Yy0AN6yflT3rmN3Nn2nM9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciLOmG/btsPx8AjsKi/Yy0AN6yflT3rmN3Nn2nM9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciLOmG/btsPx8AjsKi/Yy0AN6yflT3rmN3Nn2nM9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciLOmG%2FbtsPx8AjsKi%2FYy0AN6yflT3rmN3Nn2nM9k%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;807&quot; height=&quot;193&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhK7UD/btsPwB45I3D/Nr9zqENOG2WGO8mkSbDgpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhK7UD/btsPwB45I3D/Nr9zqENOG2WGO8mkSbDgpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhK7UD/btsPwB45I3D/Nr9zqENOG2WGO8mkSbDgpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhK7UD%2FbtsPwB45I3D%2FNr9zqENOG2WGO8mkSbDgpk%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;804&quot; height=&quot;267&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9igUM/btsPxZqwFe6/dGmmpKfX4baNP9XMkkIIxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9igUM/btsPxZqwFe6/dGmmpKfX4baNP9XMkkIIxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9igUM/btsPxZqwFe6/dGmmpKfX4baNP9XMkkIIxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9igUM%2FbtsPxZqwFe6%2FdGmmpKfX4baNP9XMkkIIxK%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;823&quot; height=&quot;541&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;2. BERT의 경량화 모델 - DistilBERT&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;1) DistilBERT&lt;br&gt;- BERT의 경량화 모델&lt;br&gt;- 지식정제 (knowledge distillation) : 더 큰 모델인 티처 모델이 학습한 지식을 더 작은 모델인 스튜던트 모델에 전달&lt;br&gt;- 마스크드 언어 모델링 작업에서 스튜던트의 출력이 티처의 출력에 가까워지도록 스튜던트를 훈련하는 것이 지식 정제의 핵심&lt;br&gt;- 정제 손실 : 두 모델의 출력 차이로 인한 손실&lt;br&gt;&amp;nbsp;&lt;br&gt;2) 티처 모델 이해하기 - MLM을 위한 BERT&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fkn93/btsPwW803ZR/lEIIr6UQJiCgbx5ZSNWA91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fkn93/btsPwW803ZR/lEIIr6UQJiCgbx5ZSNWA91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fkn93/btsPwW803ZR/lEIIr6UQJiCgbx5ZSNWA91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFkn93%2FbtsPwW803ZR%2FlEIIr6UQJiCgbx5ZSNWA91%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;823&quot; height=&quot;639&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGrvFH/btsPwFGxgSl/Qz8DZNhY4FdkkFrbU4iMm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGrvFH/btsPwFGxgSl/Qz8DZNhY4FdkkFrbU4iMm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGrvFH/btsPwFGxgSl/Qz8DZNhY4FdkkFrbU4iMm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGrvFH%2FbtsPwFGxgSl%2FQz8DZNhY4FdkkFrbU4iMm1%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;834&quot; height=&quot;636&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3) 정제 손실 이해하기&lt;br&gt;- 티처와 스튜던트 모델의 출력 값을 소프트맥스 함수에 통과시켜 확률분포로 변환한 뒤에 비교 ➡️ 쿨백-라이블러 발산(KLD) 손실&lt;/p&gt;&lt;blockquote data-ke-style=&quot;style2&quot;&gt;teacher_pred = softmax(teacher_output)&lt;br&gt;student_pred = softmax(student_output)&lt;br&gt;KLD_loss = teacher_pred * log(teacher_pred / student_pred)&amp;nbsp;&lt;/blockquote&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsnjtf/btsPxCPPdYl/qo9c5C0mbQP92lHCikCQf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsnjtf/btsPxCPPdYl/qo9c5C0mbQP92lHCikCQf0/img.png&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;592&quot; style=&quot;width: 33.5991%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsnjtf/btsPxCPPdYl/qo9c5C0mbQP92lHCikCQf0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsnjtf%2FbtsPxCPPdYl%2Fqo9c5C0mbQP92lHCikCQf0%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;643&quot; height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhPj7j/btsPymrEv3B/T8klK2OiWKXmkQxFOl4ZSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhPj7j/btsPymrEv3B/T8klK2OiWKXmkQxFOl4ZSK/img.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;584&quot; style=&quot;width: 30.5634%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhPj7j/btsPymrEv3B/T8klK2OiWKXmkQxFOl4ZSK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhPj7j%2FbtsPymrEv3B%2FT8klK2OiWKXmkQxFOl4ZSK%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;577&quot; height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nA7yx/btsPyfM2gBE/uusVYKHdjsPk20MePkbF0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nA7yx/btsPyfM2gBE/uusVYKHdjsPk20MePkbF0k/img.png&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;540&quot; style=&quot;width: 33.512%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nA7yx/btsPyfM2gBE/uusVYKHdjsPk20MePkbF0k/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnA7yx%2FbtsPyfM2gBE%2FuusVYKHdjsPk20MePkbF0k%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;585&quot; height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;4) 스튜던트 모델 DistilBERT 사용하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgK1y/btsPylM3vZe/VAUfUylTxqKqVxJebPeMMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgK1y/btsPylM3vZe/VAUfUylTxqKqVxJebPeMMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgK1y/btsPylM3vZe/VAUfUylTxqKqVxJebPeMMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgK1y%2FbtsPylM3vZe%2FVAUfUylTxqKqVxJebPeMMK%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;908&quot; height=&quot;546&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTA2rw/btsPwwixS87/tsqIDrjsr6n4Ek3ck166L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTA2rw/btsPwwixS87/tsqIDrjsr6n4Ek3ck166L0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTA2rw/btsPwwixS87/tsqIDrjsr6n4Ek3ck166L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTA2rw%2FbtsPwwixS87%2FtsqIDrjsr6n4Ek3ck166L0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;722&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxaQBb/btsPxTKvpcd/tXBaXK6tKukipaRWmlWak1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxaQBb/btsPxTKvpcd/tXBaXK6tKukipaRWmlWak1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxaQBb/btsPxTKvpcd/tXBaXK6tKukipaRWmlWak1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxaQBb%2FbtsPxTKvpcd%2FtXBaXK6tKukipaRWmlWak1%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;770&quot; height=&quot;271&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;5) DistilBERT로 IMDB 영화 데이터 리뷰 텍스트의 감성 분류하기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z7MSM/btsPxKGRCUs/yx6pyKlxaQnNhz5KCQIkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z7MSM/btsPxKGRCUs/yx6pyKlxaQnNhz5KCQIkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z7MSM/btsPxKGRCUs/yx6pyKlxaQnNhz5KCQIkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz7MSM%2FbtsPxKGRCUs%2Fyx6pyKlxaQnNhz5KCQIkKK%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;821&quot; height=&quot;644&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XaDAb/btsPxdW3KWQ/TRVgjaMM6QhDxGM8XWCVX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XaDAb/btsPxdW3KWQ/TRVgjaMM6QhDxGM8XWCVX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XaDAb/btsPxdW3KWQ/TRVgjaMM6QhDxGM8XWCVX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXaDAb%2FbtsPxdW3KWQ%2FTRVgjaMM6QhDxGM8XWCVX0%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;826&quot; height=&quot;630&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tik7a/btsPx9MVoeE/pwm3Zmcqp1yUYi1E7irmUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tik7a/btsPx9MVoeE/pwm3Zmcqp1yUYi1E7irmUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tik7a/btsPx9MVoeE/pwm3Zmcqp1yUYi1E7irmUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftik7a%2FbtsPx9MVoeE%2Fpwm3Zmcqp1yUYi1E7irmUK%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;555&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;3. KerasNLP로 DistilBERT 모델 만들기&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFRwNJ/btsPw0jotnH/RIUd9auCvv5bXEVO6KXoc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFRwNJ/btsPw0jotnH/RIUd9auCvv5bXEVO6KXoc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFRwNJ/btsPw0jotnH/RIUd9auCvv5bXEVO6KXoc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFRwNJ%2FbtsPw0jotnH%2FRIUd9auCvv5bXEVO6KXoc0%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;880&quot; height=&quot;746&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1031&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS7cMn/btsPxIPTXIh/PV1aJX1vW2slfZEkWSCosk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS7cMn/btsPxIPTXIh/PV1aJX1vW2slfZEkWSCosk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS7cMn/btsPxIPTXIh/PV1aJX1vW2slfZEkWSCosk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS7cMn%2FbtsPxIPTXIh%2FPV1aJX1vW2slfZEkWSCosk%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;1031&quot; height=&quot;760&quot; data-origin-width=&quot;1031&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&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;후반부라 그런지 지금까지 혼공학습단 스터디하면서 가장 많은 공부 시간을 들인 주차였습니다.. 이렇게 6주 활동이 끝났는데 수고 많으셨습니다!&lt;/p&gt;</description>
      <category>독학/[책] 딥러닝 실습</category>
      <category>혼공</category>
      <category>혼공학습단</category>
      <category>혼만딥</category>
      <author>최연재</author>
      <guid isPermaLink="true">https://0yeonjae2.tistory.com/403</guid>
      <comments>https://0yeonjae2.tistory.com/403#entry403comment</comments>
      <pubDate>Wed, 13 Aug 2025 15:03:20 +0900</pubDate>
    </item>
  </channel>
</rss>