{"componentChunkName":"component---src-template-post-tsx","path":"/java-to-kotlin-starter-guide-코틀린에서-OOP/","result":{"data":{"allMarkdownRemark":{"nodes":[{"fields":{"slug":"/java-to-kotlin-starter-guide-코틀린에서-코드를-제어하는-방법/"},"timeToRead":10,"frontmatter":{"title":"[코틀린 입문] 코틀린에서 코드를 제어하는 방법","series":"코틀린 입문"}},{"fields":{"slug":"/java-to-kotlin-starter-guide-코틀린에서-OOP/"},"timeToRead":18,"frontmatter":{"title":"[코틀린 입문] 코틀린에서 OOP","series":"코틀린 입문"}},{"fields":{"slug":"/java-to-kotlin-starter-guide-코틀린에서-FP/"},"timeToRead":13,"frontmatter":{"title":"[코틀린 입문] 코틀린에서 FP","series":"코틀린 입문"}},{"fields":{"slug":"/java-to-kotlin-starter-guide-추가적으로-알아두어야-할-코틀린-특성/"},"timeToRead":6,"frontmatter":{"title":"[코틀린 입문] 추가적으로 알아두어야 할 코틀린 특성","series":"코틀린 입문"}},{"fields":{"slug":"/java-to-kotlin-starter-guide-강의-소개/"},"timeToRead":1,"frontmatter":{"title":"[코틀린 입문] 강의 소개","series":"코틀린 입문"}},{"fields":{"slug":"/java-to-kotlin-starter-guide-코틀린에서-변수와-타입-연산자를-다루는-방법/"},"timeToRead":11,"frontmatter":{"title":"[코틀린 입문] 코틀린에서 변수와 타입, 연산자를 다루는 방법","series":"코틀린 입문"}}]},"markdownRemark":{"id":"851b7f01-fcba-574d-a2fd-13652137c84d","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1024px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVR42mP4DwZ//4HQ/39/oYg4wIDE/odg/Pv7DwagQv/+/QEDdM1AgSln/05a/f/BurX/t4X925X7/9sbsAaoEX//ItyCbCID2M1/1Xf8j23a+71M9G8jw/8rC4DGXbx4/vr162fPnQUq+PDxw42bN7Zt37Z7726QephZQM3/vvz/X7Dmyv0yr98NBr/v7gIZ//dPQmJCTFzMug3runu7C4sLff19U1JSEpISSspLJkyagLD517//LxqnPslInlJz8spFkNF//vyNj49PTU8NCQ1pa29z93CPjYvNyckxMjSqqqqqq6t78wbkLwaQ83//O161yabzmnz3/9i8v+eOg8Lh+Injd+/eXb5i+cxZM0+eOrls+bKNmzeuWLXi9JnTQPTt2ze45r9Lj38KO/+/9OS/rq3/16z9//0z2O1//xEfVUiR9u8/PJyB0QOJJzgbJbQhqiHpBKyNyDTyHwAqaQrvbcvtsAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"banner\"\n        title=\"\"\n        src=\"/static/619e6175d83cd70c239721219e3cbc91/2bef9/banner.png\"\n        srcset=\"/static/619e6175d83cd70c239721219e3cbc91/6f3f2/banner.png 256w,\n/static/619e6175d83cd70c239721219e3cbc91/01e7c/banner.png 512w,\n/static/619e6175d83cd70c239721219e3cbc91/2bef9/banner.png 1024w,\n/static/619e6175d83cd70c239721219e3cbc91/c1b63/banner.png 1200w\"\n        sizes=\"(max-width: 1024px) 100vw, 1024px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<blockquote>\n<p>해당 포스팅은 인프런의 <a href=\"https://inf.run/yusn4\">자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)</a> 강의를 참조하여 작성한 글입니다.</p>\n</blockquote>\n<h2>코틀린에서 클래스를 다루는 방법</h2>\n<h3>클래스와 프로퍼티</h3>\n<p>아래와 같은 자바 클래스가 있다고 해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPerson</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setAge</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 자바 클래스를 코틀린에서는 어떻게 변경이 가능할까? 바로 아래처럼 변경이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> Person <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">val</span> name <span class=\"token operator\">=</span> name\n    <span class=\"token keyword\">var</span> age <span class=\"token operator\">=</span> age\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>매우 심플해졌다. 자바에서는 필드를 선언해두고 getter + setter + 생성자를 직접 만들어줘야 한다면 코틀린에서는 클래스에 필드만 만들면 getter + setter + 생성자를 한번에 만들어준다. 심지어 위의 코틀린 코드에서 <code>constructor</code> 키워드는 생략이 가능하다. 또한, 클래스의 필드 선언과 생성자를 동시에 선언도 가능하다. 그렇게 되면 위의 코드가 아래처럼 간결해질 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span> \n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그리고 자바와 달리, getter와 setter를 호출할 때, <strong>.필드</strong>를 통해서 getter와 setter를 호출할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">val</span> person <span class=\"token operator\">=</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span>\nperson<span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> <span class=\"token number\">30</span>\n<span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">.</span>age<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>물론 자바로 만든 클래스를 코틀린 코드에서 호출할 때도 <strong>.필드</strong>를 통해서 getter와 setter를 호출 할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">val</span> javaPerson <span class=\"token operator\">=</span> <span class=\"token function\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"Robert\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">println</span><span class=\"token punctuation\">(</span>javaPerson<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span>\njavaPerson<span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> <span class=\"token number\">30</span>\n<span class=\"token function\">println</span><span class=\"token punctuation\">(</span>javaPerson<span class=\"token punctuation\">.</span>age<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>생성자와 init</h3>\n<p>그러면 만약 객체 생성 시점에 나이를 검증하는 로직을 추가하는 요구사항을 받았다고 가정해보자. 그러면 자바 코드로는 아래와 같이 작성 할 수 있을 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPerson</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"나이는 %s일 수 없습니다.\"</span><span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setAge</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그러면 코틀린에서는 생성자에 어떻게 나이 검증 로직을 추가할까? 바로 <code>init</code> 블록이라는 키워드를 제공해준다. 해당 블록은 생성자를 호출할 때 딱 한번 호출하여 초기화 해주는 블록을 의미한다. 그러면 나이 검증 로직을 한번 코틀린 코드에 적용해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>보통 실무에서 해당 블록에는 validation하는 로직이나 값을 적절히 세팅해주는 로직을 넣곤 한다.</p>\n<p>그러면 추가사항으로 사람이라는 객체는 생성하면 기본 1살부터 시작이니 나이값을 넣지 않으면 기본 1살로 세팅해주는 생성자를 추가해야한다고 해보자. 자바 코드라면 아래처럼 작성하면 될 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPerson</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"나이는 %s일 수 없습니다.\"</span><span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setAge</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그러면 코틀린에서는 새로운 생성자를 하나 더 만들 때 어떻게 만들 수 있을까? 이 때 코틀린에서 제공해주는 <code>constructor(파라미터)</code>로 부 생성자를 만들 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"첫 번째 부 생성자\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"두 번째 부 생성자\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>여기서 <strong>부 생성자</strong>라는 용어가 나왔으니, 한번 짚어가겠다. 코틀린에서 클래스 옆에 생성자를 둔 것을 <strong>주 생성자</strong>라고 부른다. 해당 생성자는 있으면 반드시 존재해야 하며 주 생성자에 파라미터가 없다면 생략이 가능하다. 부 생성자는 optional이며, 있을수도 있고 없을수도 있다. 부 생성자의 목적은 결국 최종적으로 주 생성자를 <code>this()</code>를 통해 호출해줘야 하며, 부 생성자에 추가적인 로직이 있을 시, 위와 같이 <code>{}</code>를 이용하여 body를 추가할 수 있다.</p>\n<p>그런데 사실 실무에서는 부 생성자보다는 default parameter를 권장한다. 그 이유는 부 생성자를 만듬으로써 코드 가시성이 복잡해지고 한 눈에 들어오지 않기 때문이다. 바로 아래처럼 사용하는 것이 실무에서 많이 이용하는 방식이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Converting과 같은 로직이 필요한 경우라도 부 생성자를 이용할 수도 있지만, 그 보다는 실무에서는 정적 팩토리 메서드를 만들어서 사용하곤 한다. 그래서 일반적으로 부 생성자는 정말 잘 사용되지 않는다.</p>\n<h3>커스텀 getter, setter</h3>\n<p>기존 로직에 이제 성인인지 아닌지 판별하는 기능을 추가해보자. 만약, 자바 코드라면 아래처럼 작성이 가능할 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPerson</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">.</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"나이는 %s일 수 없습니다.\"</span><span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setAge</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isAdult</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>코틀린 코드에서도 이 로직을 적용해보도록 하겠다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">isAdult</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Boolean <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>하지만 코틀린에서는 더욱 간편한 custom getter/setter 기능을 지원한다. 메서드를 마치 필드명처럼 선언하여 사용하는 방식인데 위의 로직을 한번 custom getter를 적용해서 작성해보면 아래와 같이 간결해짐을 알 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">val</span> isAdult<span class=\"token operator\">:</span> Boolean\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>이렇게 작성한 코틀린 2개의 코드 모두 동일한 기능이며, 차이는 가독성 차이일 뿐이다. 그러면 어떨 때 어떤 경우를 사용할까? 필자가 재직중인 회사의 컨벤션을 빗대서 이야기하자면 만약 해당 기능이 객체 내부 필드로 두어도 괜찮다고 두어지면 custom getter를 만들어서 사용하고 그렇지 않다면 메서드로 사용하는 것이 올바른 선택이라고 생각이 든다.</p>\n<p>또한, custom getter를 사용한다면 자기 자신을 변형할 수 있다. 이게 무슨 말일까? 한번 코드로 살펴보도록 하자. 만약 name을 getter를 할 때 무조건 대문자로 변경했으면 한다는 요구사항이 전달되었다고 해보자. 그럴 때 코틀린 코드에서는 아래와 같이 변경이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> name\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> field<span class=\"token punctuation\">.</span><span class=\"token function\">uppercase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> isAdult<span class=\"token operator\">:</span> Boolean\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 코드를 보면 주 생성자로 받은 name을 불변 프로퍼티 name에 바로 대입을 하였다. 왜냐하면 기존처럼 <code>var</code>이나 <code>val</code>을 선언해두면 코틀린에서 자동으로 getter/setter를 만들어주기 때문이다. 그러면 custom getter를 사용하지 못하기에 해당 키워드를 제외하고 클래스 body에 불변 프로퍼티를 하나 만들고 파라미터 값을 전달시키도록 한 것이다. 그리고 custom getter를 만들 때 <code>field</code>라는 키워드를 사용하였다.</p>\n<p>왜 <code>field</code>라는 키워드를 사용했을까? 한번 <code>field</code> 키워드를 사용하지 않고 코드를 작성해보자. 아마 컴파일 에러가 발생하겠지만 설명을 위해 작성해보겠다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> name\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> name<span class=\"token punctuation\">.</span><span class=\"token function\">uppercase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> isAdult<span class=\"token operator\">:</span> Boolean\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>불변 프로퍼티 name에서 파라미터의 name을 대입 시킨다. 그리고 getter를 호출해서 name을 호출하려고 한다. 하지만 코틀린에서는 name이라는 필드명만 적어줘도 getter가 호출되니 다시 <code>get()</code>이 호출되고 다시 name을 부르는 무한루프 문제가 발생하게 된다. 그래서 코틀린에서는 이를 방지하고자 <code>field</code>라는 키워드를 두어서 해당 문제를 해결한 것이다. <code>field</code>는 자바의 <code>this</code>처럼 해당 필드의 네이밍만 가리킨다. 즉, 자기 자신을 가리키고 getter는 호출을 안 하는 예약어라고 생각해두면 좋을 것 같다. 이 예약어를 전문용어로 <strong>backing field</strong>라고 부른다.</p>\n<p>하지만 이렇게 custom getter에서 backing field를 쓰는 경우도 실무에서는 매우 드물다. 보통은 아래와 같이 <code>this</code> 키워드를 사용해서 해주기 때문이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> name\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">uppercase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">val</span> isAdult<span class=\"token operator\">:</span> Boolean\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그러면 setter를 호출할 때도 무조건 대문자로 변경해서 set을 해줘야 하는 요구사항이 생겼다고 해보자. 이것을 코틀린 코드에서 어떻게 풀어나갈까?</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec09\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>\n    name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> <span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">&lt;=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">throw</span> <span class=\"token function\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나이는 </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token expression\">age</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">일 수 없습니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"초기화 블록\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String <span class=\"token operator\">=</span> name\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">uppercase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">var</span> setName <span class=\"token operator\">=</span> name\n        <span class=\"token keyword\">set</span><span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            field <span class=\"token operator\">=</span> value\n        <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">val</span> isAdult<span class=\"token operator\">:</span> Boolean\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>바로 위와 같이 <code>set(value)</code>를 이용하여 사용이 가능하다. 하지만 이것 또한 실무에서 사용되지 않는다. 그 이유는 실무에서 setter 자체를 지양하기 때문이다. 그래서 custom setter도 잘 사용되지 않는다.</p>\n<h2>코틀린에서 상속을 다루는 방법</h2>\n<h3>추상 클래스</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1024px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 46.875%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABe0lEQVR42pWS30sbQRDH7/8tFPsilIIpKBiQ9qXQPpUGjaJQaLHYpDGtodQfGImNkkBKvIdWidIak97e7eXudj9d9wS9SEEHPjuzw+x3d3bXYdy0Tr1w4XgV3Stb6H1Cn5Tg5AP4v7K1N8y5LahSf1aDgyeIeo7O2gTt1YeIvZzN6T872dq7COqLBvrHM/TRS8ThHF5zDkxsc8PWPQQz3actdbtHuK6byf3PnHEB3w8IZJgSSEOA53mWy9gipcU38fgGjr3YOLIkIyPiDdHRCBVKVByjlMpicpd1JDGB8FDGm8HOraDqnyKrRcIviwzKBc4/vkFuLBFUCkTtrRuvmZ4kan1DmtqL6hLnlQX660X8jRXCr29RXh8n6bmIxRnkSp7e6yk6Lybxl/OI+Rzh5rtbgmFtGbHwlO6rx+zMPqD5/BGD4jSBWZ/8PsbRYkDcWLck+1XU98/Exsf1Eupn+1rw6q6SboPR9nuSRhm1VyIxRLtrRHXzX4O//APe5aD2E1MIawAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"image01\"\n        title=\"\"\n        src=\"/static/977c6576f3fcfff30ed65263b92040b0/2bef9/01.png\"\n        srcset=\"/static/977c6576f3fcfff30ed65263b92040b0/6f3f2/01.png 256w,\n/static/977c6576f3fcfff30ed65263b92040b0/01e7c/01.png 512w,\n/static/977c6576f3fcfff30ed65263b92040b0/2bef9/01.png 1024w,\n/static/977c6576f3fcfff30ed65263b92040b0/71c1d/01.png 1536w,\n/static/977c6576f3fcfff30ed65263b92040b0/a878e/01.png 2048w,\n/static/977c6576f3fcfff30ed65263b92040b0/bf668/01.png 2328w\"\n        sizes=\"(max-width: 1024px) 100vw, 1024px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>위의 관계도가 있다고 해보자. <code>Animal</code> 클래스는 추상 클래스고 해당 추상 클래스를 상속받은 구체 클래스 <code>Cat</code>과 <code>Penguin</code> 클래스가 있다고 해보자. 이것을 자바 클래스로 작성해보고 해당 자바 클래스를 코틀린 클래스로 변경해보면서 상속에 관해 이야기 해보고자 한다.</p>\n<p>먼저, <code>Animal</code> 추상 클래스에 대해 살펴보도록 하자. 자바로 작성된 코드는 아래와 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaAnimal</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> species<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> legCount<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaAnimal</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> species<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> legCount<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>species <span class=\"token operator\">=</span> species<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>legCount <span class=\"token operator\">=</span> legCount<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">void</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getSpecies</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> species<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getLegCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> legCount<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 코드를 코틀린으로 변경해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token function\">Animal</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">val</span> species<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">val</span> legCount<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>여기까지는 지금까지 배운 내용 그대로인 듯 보인다. 그러면 <code>Cat</code> 클래스를 작성해보자. 먼저 자바 코드는 아래와 같을 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaCat</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">JavaAnimal</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaCat</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> species<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"고양이가 사뿐 사뿐 걸어가~\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 코드를 코틀린 코드로 변경해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Cat</span><span class=\"token punctuation\">(</span>\n    species<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">Animal</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"고양이가 사뿐 사뿐 걸어가~\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>코틀린에서는 상속을 사용할 때, <code>extends</code> 키워드를 사용하지 않고 <code>:</code> 키워드를 사용한다. 그리고 상위 클래스의 생성자를 바로 호출만 해주면 상속을 해주는 조건을 만족시킨다. 또한, <code>move</code> 메서드를 오버라이딩할 때, 자바에서는 <code>@Override</code> 어노테이션을 붙여줘야 하나, 코틀린에서는 <code>override</code> 키워드를 <code>fun</code> 키워드 앞에 붙여주면 해당 함수가 오버라이딩 되었다고 인식해준다.</p>\n<p>다음으로 <code>Penguin</code> 클래스를 작성해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPenguin</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">JavaAnimal</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> wingCount<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPenguin</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> species<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"펭귄이 움직입니다~ 꿱꿱\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getLegCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span>legCount <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 코드를 코틀린 코드로 변경하면 아래와 같이 변경이 가능할 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Penguin</span><span class=\"token punctuation\">(</span>\n    species<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">Animal</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> wingCount<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">2</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> swimAbility<span class=\"token operator\">:</span> Int\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token number\">3</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> legCount<span class=\"token operator\">:</span> Int\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span>legCount <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"펭귄이 움직입니다. 꽥꽥!\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>펭귄 클래스는 특별하게 wingCount라는 필드가 있고 <code>getLegCount</code>를 오버라이딩 하였다. 그래서 코틀린 코드를 위와 같이 작성한다면 에러가 발생할 것이다. 왜냐하면 코틀린 <code>Animal</code> 클래스를 상속받을 때 코틀린은 기본적으로 필드를 상속해주지 않기 때문이다. 만약 상속을 받고 싶다면 아래처럼 <code>open</code> 키워드를 붙야줘서 상속을 해줄것이라고 명시해줘야 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token function\">Animal</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">val</span> species<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token keyword\">open</span> <span class=\"token keyword\">val</span> legCount<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>인터페이스</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1024px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 38.28125000000001%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABh0lEQVR42o2Sz0sbQRzF8x+LiKce1FLbQ9GjBykU1NSDF1tEczARKg2aLhYTmtYfaGLcZM266yaNzuyPmU9ndxMQCm2/8B3ezHvf932HKdTbQxrXD5xe+TTaAy6dERpTgyY4ZUK7grwto50K+r5mCE3LFXy98LDOXdP3Gb5yntIpCss7Ld5sWsy/P2Rp+5yNz11UyrSLJCczdA+mudmfQlqz6B9vDRFROvV5WTxhceOIV+tVFtZqfLLc3PBba8TxmUvp+IJGR/DTfswT/jqDhy8MrkvY9S0YHqF8K0vY8STfu5Jqs8dhvZPhVl/khukhhOCud2uQQsUhUkpklBCZqP5Q0HMDYrNFRNpoJUkUZtrA6+N7Xmaktc4NlU4vhlaKOFEkplOs4ggdS+LQmAuT2ixKl6Vc8kynx/Njvzzh8w0TJm5WeSoXcfbW6ZfWeKxsEtZ20Srhb1X442VsGFY/MvqwyOXqHM2VFwTF18i9dyZpNBH+p+FEPgrMN7EhcLLWno0OXP5VvwEdKFdXOQ9lBQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"image02\"\n        title=\"\"\n        src=\"/static/403f1de451d8ef6d43075ba368e2db0f/2bef9/02.png\"\n        srcset=\"/static/403f1de451d8ef6d43075ba368e2db0f/6f3f2/02.png 256w,\n/static/403f1de451d8ef6d43075ba368e2db0f/01e7c/02.png 512w,\n/static/403f1de451d8ef6d43075ba368e2db0f/2bef9/02.png 1024w,\n/static/403f1de451d8ef6d43075ba368e2db0f/71c1d/02.png 1536w,\n/static/403f1de451d8ef6d43075ba368e2db0f/a878e/02.png 2048w,\n/static/403f1de451d8ef6d43075ba368e2db0f/ea9a1/02.png 2970w\"\n        sizes=\"(max-width: 1024px) 100vw, 1024px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>이제 펭귄 클래스에 위의 도식처럼 <code>flyable</code> 인터페이스와 <code>swimable</code> 인터페이스를 추가해서 구현해보도록 하자. 자바에서는 인터페이스는 아래와 같이 정의가 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">JavaFlyable</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">void</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"파닥파닥\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">JavaSwimable</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">void</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"어푸 어푸\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<blockquote>\n<p>⚠️ 주의</p>\n<p>만약 독자가 JDK8 버전 이전을 사용한다면 위의 인터페이스 2개의 코드는 에러가 날 것이다. defulat method는 JDK8부터 나왔기 때문이다.</p>\n</blockquote>\n<p>위의 코드를 코틀린으로 변경하면 아래와 같을 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">interface</span> Flyable <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"파닥 파닥\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">interface</span> Swimable <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"어푸 어푸\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>코틀린에서는 인터페이스에 default 메서드를 선언할 때 <code>default</code> 키워드 없이도 선언이 가능하다. 그럼 이 2개의 인터페이스를 기존에 만들었던 펭귄 클래스에 구현해보도록 하겠다. 먼저 자바 코드부터 살펴보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPenguin</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">JavaAnimal</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">JavaSwimable</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">JavaFlyable</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> wingCount<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPenguin</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> species<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"펭귄이 움직입니다~ 꿱꿱\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getLegCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span>legCount <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">JavaSwimable</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">JavaFlyable</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 코드를 코틀린으로 변경하면 아래와 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Penguin</span><span class=\"token punctuation\">(</span>\n    species<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">Animal</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> Swimable<span class=\"token punctuation\">,</span> Flyable <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> wingCount<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">2</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> legCount<span class=\"token operator\">:</span> Int\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span>legCount <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"펭귄이 움직입니다. 꽥꽥!\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token operator\">&lt;</span>Swimable<span class=\"token operator\">></span><span class=\"token punctuation\">.</span><span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">super</span><span class=\"token operator\">&lt;</span>Flyable<span class=\"token operator\">></span><span class=\"token punctuation\">.</span><span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>자바 코드와의 차이점은 구현도 자바에서는 <code>implements</code> 키워드를 이용했지만, 코틀린은 상속과 마찬가지로 <code>:</code>를 사용한다. 또한, 중복되는 인터페이스의 메서드를 사용할때는 <code>super&#x3C;타입>.함수</code>로 표현을 해야 한다.</p>\n<p>추가적으로, 코틀린에서는 backing field가 없는 프로퍼티를 인터페이스에 만들 수 있다. 이게 무슨 말일까? 코드를 통해서 살펴보자. 만약 <code>Swimable</code>에 능력치를 필드로 둘 수 있다는 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">interface</span> Swimable <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">val</span> swimAbility<span class=\"token operator\">:</span> Int\n\n    <span class=\"token keyword\">fun</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>swimAbility<span class=\"token punctuation\">)</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"어푸 어푸\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그리고 해당 구현체에서 <code>swimAbility</code>를 오버라이딩을 해주면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Penguin</span><span class=\"token punctuation\">(</span>\n    species<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">Animal</span><span class=\"token punctuation\">(</span>species<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> Swimable<span class=\"token punctuation\">,</span> Flyable <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> wingCount<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">2</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> swimAbility<span class=\"token operator\">:</span> Int\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token number\">3</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> legCount<span class=\"token operator\">:</span> Int\n        <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span>legCount <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>wingCount\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"펭귄이 움직입니다. 꽥꽥!\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">super</span><span class=\"token operator\">&lt;</span>Swimable<span class=\"token operator\">></span><span class=\"token punctuation\">.</span><span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">super</span><span class=\"token operator\">&lt;</span>Flyable<span class=\"token operator\">></span><span class=\"token punctuation\">.</span><span class=\"token function\">act</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<blockquote>\n<p>✅ 참고</p>\n<p>물론 인터페이스 자체에서 기본 값을 세팅해주면 반드시 구현할 필요는 없다.</p>\n</blockquote>\n<h3>클래스를 상속받을 때 주의할 점</h3>\n<p>코틀린에서 클래스를 상속 받을 때 주의할 점을 살펴보도록 하자. 아래의 코드들이 있다고 해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">open</span> <span class=\"token keyword\">class</span> <span class=\"token function\">Base</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">open</span> <span class=\"token keyword\">val</span> number<span class=\"token operator\">:</span> Int <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"Base Class\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>number<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Derived</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">override</span> <span class=\"token keyword\">val</span> number<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token function\">Base</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">init</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"Derived Class\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>이렇게 되어 있을 때, 아래처럼 하위 클래스의 <code>Derived</code> 생성자를 호출하면 어떤 결과가 나올까? 독자들이 예상하기에는 \"Base Class\"라고 호출되고 number값으로 300이 찍히고 \"Derived Class\"가 찍힐 것으로 예상이 될 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec10\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">Derived</span><span class=\"token punctuation\">(</span><span class=\"token number\">300</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>하지만 실제 결과는 이렇다.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">Base Class\n<span class=\"token number\">0</span>\nDerived Class</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>왜 0이 나온걸까? 그 이유는 바로 하위 클래스의 생성자를 호출 할 때, 상위 클래스 생성자가 호출되고 거기서 number라는 값을 출력하려고 할 때, 오버라이딩 된 필드이므로 하위 클래스에 접근하려고 한다. 단, 해당 하위 클래스 생성자가 호출되기 전이므로 이 값은 알 수 없는 값이기에 기본 값이 출력이 된 것이다. 따라서 상위클래스를 설계할 때 생성자 또는 초기화 블록에 사용되는 프로퍼티에는 <code>open</code>을 피해야한다.</p>\n<h2>코틀린에서 접근 제어를 다루는 방법</h2>\n<h3>자바와 코틀린의 가시성 제어</h3>\n<p>자바의 접근 제어자와 코틀린의 접근 제어자에는 조금 차이가 존재한다. 한번 살펴보도록 하자. 먼저 자바의 접근 제어자에 대해 살펴보자.</p>\n<table style=\"border-collapse: collapse; width: 100%; background-color: #ffe4e1; color: #000; border: 2px solid #ff7f50;\">\n  <thead>\n    <tr>\n      <th style=\"border: 1px solid #ff7f50; padding: 20px; text-align: left; font-size: 18px; font-weight: normal;\">접근 제어자</th>\n      <th style=\"border: 1px solid #ff7f50; padding: 20px; text-align: left; font-size: 18px; font-weight: normal;\">설명</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 32px; font-weight: bold;\">public</td>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 24px;\">모든 곳에서 접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 32px; font-weight: bold;\">protected</td>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 24px; line-height: 1.4;\">같은 패키지 또는<br>하위 클래스에서만<br>접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 32px; font-weight: bold;\">default</td>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 24px;\">같은 패키지에서만<br>접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 32px; font-weight: bold;\">private</td>\n      <td style=\"border: 1px solid #ff7f50; padding: 20px; font-size: 24px;\">선언된 클래스<br>내에서만 접근 가능</td>\n    </tr>\n  </tbody>\n</table>\n<p>그러면 코틀린 접근 제어자에 대해서도 살펴보도록 하자.</p>\n<table style=\"border-collapse: collapse; width: 100%; background-color: #e6f3ff; color: #000; border: 2px solid #4682b4;\">\n  <thead>\n    <tr>\n      <th style=\"border: 1px solid #4682b4; padding: 20px; text-align: left; font-size: 18px; font-weight: normal; background-color: #dae8f5;\">접근 제어자</th>\n      <th style=\"border: 1px solid #4682b4; padding: 20px; text-align: left; font-size: 18px; font-weight: normal; background-color: #dae8f5;\">설명</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #e6f3ff;\">public</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; background-color: #e6f3ff;\">모든 곳에서 접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #d6e9ff;\">protected</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; line-height: 1.4; background-color: #d6e9ff;\">선언된 클래스 또는<br>하위 클래스에서만<br>접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #e6f3ff;\">internal</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; background-color: #e6f3ff;\">같은 모듈에서만<br>접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #d6e9ff;\">private</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; background-color: #d6e9ff;\">선언된 클래스<br>내에서만 접근 가능</td>\n    </tr>\n  </tbody>\n</table>\n<p>자바와 코틀린의 접근 제어자의 차이를 보면 먼저 <code>protected</code> 접근 제어자 차이가 존재한다. 자바에서는 같은 패키지 또는 하위 클래스에서만 접근 가능한 접근 제어자지만 코틀린에서는 선언된 클래스 혹은 하위 클래스에서만 접근 가능한 제어자이다. 왜냐하면 코틀린에서는 패키지 자체를 <strong>namespace</strong>를 관리하기 위한 용도로만 쓰일 뿐 가시성과는 전혀 관련이 없기 때문이다. 따라서 이런 차이가 발생하는 것이다. 그리고 코틀린에서 <code>default</code> 접근 제어자가 없는 이유도 위와 같이 패키지가 단순한 namespace용도이기 때문이다. 코틀린에서만 있는 <code>internal</code> 접근 제어자는 같은 모듈에서만 접근이 가능한데 여기서 모듈이라고 하면은 Maven Module, Gradle Module같은 모듈의 개념이다.</p>\n<h3>코틀린 파일의 접근 제어</h3>\n<p>또 자바와 코틀린의 차이로는 자바의 기본 접근 제어자는 <code>default</code>이고 코틀린의 기본 접근 제어자는 <code>public</code>이다. 그리고 코틀린에서는 <code>.kt</code>파일에 변수, 클래스, 함수 여러개를 만들 수 있다. 바로 아래처럼 말이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">val</span> a <span class=\"token operator\">=</span> <span class=\"token number\">3</span>\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span> b<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Int <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> a <span class=\"token operator\">+</span> b\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">Cat</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>하지만 <code>protected</code> 접근 제어자로 코틀린 파일의 최상단에 선언할 경우 컴파일 에러가 발생한다. 왜냐하면 <code>protected</code>는 선언된 클래스 혹은 하위 클래스에 접근 가능하지만 최상단에는 클래스에 속하지 않기 때문이다.</p>\n<h3>다양한 구성 요소의 접근 제어</h3>\n<p>코틀린의 클래스 멤버간에 접근 제어자를 붙일 수 있다. 이에 대해 살펴보면 아래와 같다.</p>\n<table style=\"border-collapse: collapse; width: 100%; background-color: #e6f3ff; color: #000; border: 2px solid #4682b4;\">\n  <thead>\n    <tr>\n      <th style=\"border: 1px solid #4682b4; padding: 20px; text-align: left; font-size: 18px; font-weight: normal; background-color: #dae8f5;\">접근 제어자</th>\n      <th style=\"border: 1px solid #4682b4; padding: 20px; text-align: left; font-size: 18px; font-weight: normal; background-color: #dae8f5;\">설명</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #e6f3ff;\">public</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; background-color: #e6f3ff;\">모든 곳에서 접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #d6e9ff;\">protected</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; line-height: 1.4; background-color: #d6e9ff;\">선언된 클래스 또는<br>하위 클래스에서만<br>접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #e6f3ff;\">internal</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; background-color: #e6f3ff;\">같은 모듈에서만<br>접근 가능</td>\n    </tr>\n    <tr>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 32px; font-weight: bold; background-color: #d6e9ff;\">private</td>\n      <td style=\"border: 1px solid #4682b4; padding: 20px; font-size: 24px; background-color: #d6e9ff;\">선언된 클래스<br>내에서만 접근 가능</td>\n    </tr>\n  </tbody>\n</table>\n<p>생성자도 동일하다. 단, 생성자에 접근 제어자를 붙여주려면 아래와 같이 <code>constructor</code>를 붙여줘야 한다. 접근제어자가 <code>public</code>일때만 생략이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> Bus <span class=\"token keyword\">internal</span> <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> price<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p>이렇게 생성자에 접근 제어자를 붙여주는 경우는 유틸성 클래스를 사용할 때 많이 이용할 것 같다. 자바 코드는 아래와 같이 작성이 될 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec11</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">StringUtils</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">StringUtils</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">isDirectoryPath</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> path<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">endsWith</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>코틀린도 위와 유사하게 작성이 가능하지만, 코틀린에서는 그냥 파일 최상단에 유틸성 함수를 정의만 하면 끝이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec11\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">isDirectoryPath</span><span class=\"token punctuation\">(</span>path<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Boolean <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> path<span class=\"token punctuation\">.</span><span class=\"token function\">endsWith</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"/\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그리고 코틀린 코드에서 해당 함수를 사용할 때는 그냥 함수명만 작성해주면 된다. 단, 자바 코드에서 사용 시에는 아래와 같이 static 메서드를 호출하는 식으로 작성해주면 좋을 것 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec11</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Lec11Main</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">StringUtilsKt</span><span class=\"token punctuation\">.</span><span class=\"token function\">isDirectoryPath</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>다음으로 프로퍼티에 대한 접근 제어자에 대해 알아보자. 프로퍼티도 가시성 제어는 동일하다. 단, 프로퍼티의 가시성 제어를 하는 방법으로는 아래와 같이 getter/setter 동시에 가시성 제어를 하던가 <code>private set</code>과 같이 setter에만 private을 지정하는 식으로 작성이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">class</span> <span class=\"token function\">Car</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">internal</span> <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">var</span> owner<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    _price<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> price <span class=\"token operator\">=</span> _price\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">set</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>자바와 코틀린을 함께 사용할 때 주의점</h3>\n<p>필자는 실무에서 자바와 코틀린을 함께 사용해본 경험이 전무하다. 따라서 해당 부분은 실무 경험은 딱히 없고 강의에서 소개해준 내용을 기반으로 정리를 해보았다.</p>\n<ul>\n<li>Internal은 바이트코드 상 <code>public</code>이 된다. 때문에 자바 코드에서는 코틀린 모듈의 <code>internal</code> 코드를 가져올수있다.</li>\n<li>코틀린의 <code>protected</code>와 자바의 <code>protected</code>는 다르다. 자바의 <code>protected</code>는 같은 패지지 내의 클래스는 접근이 가능하다. 따라서, 같은 패키지의 코틀린 <code>protected</code> 멤버에 접근이 가능하다.</li>\n</ul>\n<h2>코틀린에서 object 키워드를 다루는 방법</h2>\n<h3>static 함수와 변수</h3>\n<p>아래의 자바 코드가 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPerson</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> <span class=\"token constant\">MIN_AGE</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">JavaPerson</span> <span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">JavaPerson</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> <span class=\"token constant\">MIN_AGE</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위의 코드를 코틀린으로 변경해야 한다는 요구사항이 있다고 해보자. 그런데 우리가 지금까지 배운 내용을 토대로 작성해보려면 <code>static</code> 메서드와 필드를 어떻게 작성해야할지 의문일 것이다. 왜냐하면 코틀린에서는 <code>static</code> 키워드가 존재하지 않기 때문이다. 코틀린에서는 <code>static</code> 키워드 대신에 <code>companion object</code>라는 것이 존재한다. 그것을 토대로 변경하면 다음과 같을 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12\n\n<span class=\"token keyword\">class</span> Person <span class=\"token keyword\">private</span> <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">var</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">companion</span> <span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> MIN_AGE <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n        <span class=\"token keyword\">fun</span> <span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Person <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> MIN_AGE<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p><code>companion object</code>는 동행 객체라는 의미인데, 코틀린은 자바의 <code>static</code> 키워드 대신에 <code>companion object</code> 키워드를 사용한다라고 생각해보자. 그럼 <code>static</code>과 <code>companion object</code>에 대해 잠깐 살펴보자.</p>\n<ul>\n<li><code>static</code>: 클래스가 인스턴스화 될 때 새로운 값이 복제되는 것이 아니라 정적으로 인스턴스끼리 값을 공유한다.</li>\n<li><code>companion object</code>: 클래스와 동행하는 유일한 오브젝트</li>\n</ul>\n<p>또한, 위의 코드에서 <code>MIN_AGE</code>를 작성하면 IDE에서 경고를 띄워줄 것이다. <code>const</code>라는 키워드를 붙이라고 말이다. 왜냐하면 위의 코드처럼 작성하면 런타임 시에 변수가 할당된다. 즉, 본연의 <code>static</code>처럼 쓰는 변수가 아니라는 것이다. <code>const</code>라는 키워드를 붙여주면 정적으로 사용이 가능하며, 컴파일 시, 변수에 할당된다. <code>const</code>라는 키워드는 진짜 상수에 붙이기 위한 용도로 써야하며, 기본타입과 <code>String</code> 타입에 사용이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12\n\n<span class=\"token keyword\">class</span> Person <span class=\"token keyword\">private</span> <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">var</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">companion</span> <span class=\"token keyword\">object</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">val</span> MIN_AGE <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n        <span class=\"token keyword\">fun</span> <span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Person <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> MIN_AGE<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그리고 해당 정적 메서드를 사용하는 방법은 기존 자바와 동일하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>Person<span class=\"token punctuation\">.</span><span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>하지만, 여기서 자바와 다른 점이 존재한다. <code>companion object</code>는 말 그대로 동반 객체이다. 따라서, 하나의 객체로 간주된다. 때문에 이름을 붙일 수 있고, interface도 구현이 가능하다. 바로 아래처럼 말이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12\n\n<span class=\"token keyword\">class</span> Person <span class=\"token keyword\">private</span> <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">var</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">companion</span> <span class=\"token keyword\">object</span> Factory<span class=\"token operator\">:</span> Log <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">val</span> MIN_AGE <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n        <span class=\"token keyword\">fun</span> <span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Person <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> MIN_AGE<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나는 Person 클래스의 동행 객체입니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그러면 독자들은 이런 생각이 들 것이다. <code>companion object</code>는 굳이 사용하는 예시를 보면, 유틸성 메서드를 만들 때 유용하지 않을까? 물론 유틸성 메서드를 만들 때도 사용이 가능하지만 유틸성 메서드를 만들 때는 그냥 코틀린 파일에 함수를 선언해서 사용하는 것을 추천한다.</p>\n<p>그럼 만약 위의 코틀린 코드를 자바에서 사용하면 어떻게 될까? 자바에서 일반 static 메서드처럼 사용은 불가능하다. <code>companion object</code>에 이름을 안 붙였다면 <code>클래스명.Companion.메서드명</code>으로 작성해야 하며, 이름이 있다면 <code>클래스명.컴패니언 오브젝트 이름.메서드명</code>으로 호출을 해야 한다. 위의 코드로 예시를 들어보면 다음과 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Person<span class=\"token punctuation\">.</span>Factory</span><span class=\"token punctuation\">.</span><span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"양성빈\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>만약, 기존 자바의 static 메서드처럼 사용하고 싶다면 기존 코틀린 코드에 <code>@JvmStatic</code> 어노테이션을 붙여줘야 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12\n\n<span class=\"token keyword\">class</span> Person <span class=\"token keyword\">private</span> <span class=\"token keyword\">constructor</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">var</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">var</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">companion</span> <span class=\"token keyword\">object</span> Factory<span class=\"token operator\">:</span> Log <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">val</span> MIN_AGE <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n\n        <span class=\"token annotation builtin\">@JvmStatic</span>\n        <span class=\"token keyword\">fun</span> <span class=\"token function\">newBaby</span><span class=\"token punctuation\">(</span>name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> Person <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">Person</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> MIN_AGE<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"나는 Person 클래스의 동행 객체입니다.\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>싱글톤</h3>\n<p>아래의 싱글톤 패턴을 적용한 자바 코드가 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaSingleton</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">JavaSingleton</span> <span class=\"token constant\">INSTANCE</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">JavaSingleton</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">JavaSingleton</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">JavaSingleton</span> <span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token constant\">INSTANCE</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>코틀린에서는 어떻게 변경할 수 있을까? 바로 아래와 같이 <code>object</code> 키워드를 쓰면 끝이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\">objcect Singleton</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>정말 매우 심플해졌다.</p>\n<h3>익명 클래스</h3>\n<p>익명 클래스란, 특정 인터페이스나 클래스를 상속받은 구현체를 일회성으로 사용할 때 쓰는 클래스이다. 그래서 자바에서 해당 익명 클래스의 예시를 들어보면 아래와 같이 작성이 가능하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Lec12Main</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">moveSomething</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Movable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token annotation punctuation\">@Override</span>\n            <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"움직인다~~~\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token annotation punctuation\">@Override</span>\n            <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">fly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"난다~~\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">moveSomething</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Movable</span> movable<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        movable<span class=\"token punctuation\">.</span><span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        movable<span class=\"token punctuation\">.</span><span class=\"token function\">fly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>이것을 코틀린에서는 어떻게 변경이 가능할까? 바로 아래와 같이 <code>new 인터페이스명 or 클래스명</code> 대신에 <code>object : 인터페이스명 or 클래스명 {}</code>을 해주면 된다. 그리고 해당 블록 안에서 구현할 메서드들을 재정의해주면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec12\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">moveSomething</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">object</span> <span class=\"token operator\">:</span> Movable <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"움직인다~~~\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">override</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">fly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"난다~~\"</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">moveSomething</span><span class=\"token punctuation\">(</span>movable<span class=\"token operator\">:</span> Movable<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    movable<span class=\"token punctuation\">.</span><span class=\"token function\">move</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    movable<span class=\"token punctuation\">.</span><span class=\"token function\">fly</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2>코틀린에서 중첩 클래스를 다루는 방법</h2>\n<h3>중첩 클래스의 종류</h3>\n<p>중첩 클래스란, 어딘가에 소속되어 있는 클래스를 의미한다. 종류는 여러가지가 존재한다.</p>\n<ul>\n<li>static을 사용하는 중첩 클래스(내부 클래스)</li>\n<li>static을 사용하지 않는 중첩 클래스\n<ul>\n<li>내부 클래스</li>\n<li>지역 클래스</li>\n<li>익명 클래스</li>\n</ul>\n</li>\n</ul>\n<p>각각의 특징을 보면, static을 사용하는 중첩 클래스는 밖의 클래스를 직접 참조할 수 없다. static을 사용하지 않는 중첩 클래스 같은 경우 밖의 클래스를 직접 참조할 수 있다. 이 중에 우리는 static을 사용하는 중첩 클래스와 static을 사용하지 않는 중첩 클래스 중에 내부 클래스에 대해서 코틀린은 어떻게 표현하는지 알아보자. 왜냐하면 지역 클래스같은 경우는 실제 실무에서 사용해본 경험어 거의 없고 자주 사용되지 않는 듯 하다. 또한, 익명 클래스는 이전에 한번 다룬 적이 있기에 이번에는 생략한다.</p>\n<p>아래의 내부 클래스가 있다고 하자.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec13</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaHouse</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> address<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">LivingRoom</span> livingRoom<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaHouse</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> address<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>address <span class=\"token operator\">=</span> address<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>livingRoom <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">LivingRoom</span> <span class=\"token function\">getLivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> livingRoom<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LivingRoom</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">double</span> area<span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token class-name\">LivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span> area<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>area <span class=\"token operator\">=</span> area<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getAddress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token class-name\">JavaHouse</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>내부 클래스를 보면 <code>getAddress</code> 메서드에서 바깥 클래스를 직접 참조하고 있는 것을 보고 있다. 그래서 아래와 같이 코드를 사용할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec13</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Lec13Main</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">JavaHouse</span> house <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">JavaHouse</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"제주도\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>house<span class=\"token punctuation\">.</span><span class=\"token function\">getLivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getAddress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>하지만 아래의 내부 클래스가 static이 붙인 중첩 클래스로 변경되면 바깥 클래스를 참조할 수 없는 상황이 나온다. 아래처럼 작성하면 컴파일 에러가 발생할 것이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec13</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaHouse</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> address<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">LivingRoom</span> livingRoom<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaHouse</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> address<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>address <span class=\"token operator\">=</span> address<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>livingRoom <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">LivingRoom</span> <span class=\"token function\">getLivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> livingRoom<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">LivingRoom</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">double</span> area<span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token class-name\">LivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span> area<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>area <span class=\"token operator\">=</span> area<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getAddress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token class-name\">JavaHouse</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>address<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 컴파일 에러</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그런데 실제 실무에서는 내부 클래스를 static이 붙은 내부 클래스를 두기를 권장한다. Effective Java와 같은 곳에서도 아래와 같은 이유로 static 내부 클래스를 두기를 권장한다.</p>\n<ul>\n<li>내부클래스는 숨겨진 외부클래스 정보를 가지고있어, 참조를 해지하지 못하는 경우 메모리 누수가 생길 수 있고, 이를 디버깅하기 어렵다.</li>\n<li>내부클래스의 직렬화 형태가 명확하게 정의되지 않아 직렬화에 있어 제한이 있다.</li>\n</ul>\n<p>그래서 클래스 안의 클래스를 만들 때는 반드시 static class로 만들어야 한다. 이런 원칙은 코틀린이 잘 준수하고 있다. 자바의 static 중첩 클래스를 코틀린 코드로 변경하면 아래와 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec13\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">House</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> address<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> livingRoom<span class=\"token operator\">:</span> LivingRoom <span class=\"token operator\">=</span> <span class=\"token function\">LivingRoom</span><span class=\"token punctuation\">(</span><span class=\"token number\">10.0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">class</span> <span class=\"token function\">LivingRoom</span><span class=\"token punctuation\">(</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> area<span class=\"token operator\">:</span> Double<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>그냥 클래스 body 블록에 class를 선언해주면 되는 것이다. 그런데 혹여나, static이 붙지 않은 내부 클래스를 사용할 때는 <code>inner</code> 키워드만 추가해주면 된다. 그리고 바깥 클래스를 참조할 때는 <code>this@바깥 클래스 명.필드명</code>을 적어주면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec13\n\n<span class=\"token keyword\">class</span> <span class=\"token function\">InnerHouse</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> address<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> livingRoom<span class=\"token operator\">:</span> LivingRoom<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">inner</span> <span class=\"token keyword\">class</span> <span class=\"token function\">LivingRoom</span><span class=\"token punctuation\">(</span>\n        <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> area<span class=\"token operator\">:</span> Double<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">val</span> address<span class=\"token operator\">:</span> String\n            <span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token label symbol\">@InnerHouse</span><span class=\"token punctuation\">.</span>address\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>코틀린은 기본적으로 바깥 클래스를 참조하지 않는다. 바깥클래스를 참조하고 싶다면 <code>inner</code> 키워드를 추가해줘야 한다.</p>\n<h2>코틀린에서 다양한 클래스를 다루는 방법</h2>\n<h3>Data Class</h3>\n<p>계층 간에 데이터를 주고 받고 싶을 때는 DTO라는 것을 많이 이용하고 자바로는 아래와 같이 보통 작성을 많이 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token import\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Objects</span></span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">JavaPersonDto</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">JavaPersonDto</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> age<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> name<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">getAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> age<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Object</span> object<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>object <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> <span class=\"token function\">getClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> object<span class=\"token punctuation\">.</span><span class=\"token function\">getClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">JavaPersonDto</span> that <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">JavaPersonDto</span><span class=\"token punctuation\">)</span> object<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> age <span class=\"token operator\">==</span> that<span class=\"token punctuation\">.</span>age <span class=\"token operator\">&amp;&amp;</span> <span class=\"token class-name\">Objects</span><span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> that<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> <span class=\"token function\">hashCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">Objects</span><span class=\"token punctuation\">.</span><span class=\"token function\">hash</span><span class=\"token punctuation\">(</span>name<span class=\"token punctuation\">,</span> age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">\"JavaPersonDto{\"</span> <span class=\"token operator\">+</span>\n                <span class=\"token string\">\"name='\"</span> <span class=\"token operator\">+</span> name <span class=\"token operator\">+</span> <span class=\"token char\">'\\''</span> <span class=\"token operator\">+</span>\n                <span class=\"token string\">\", age=\"</span> <span class=\"token operator\">+</span> age <span class=\"token operator\">+</span>\n                <span class=\"token char\">'}'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>보통은 자바에서 DTO 클래스를 정의할 때, <code>getter</code>, <code>setter</code>, <code>equals</code>, <code>hashCode</code>, <code>toString</code>을 많이 재정의를 한다. 그래서 보통 위와 같이 정의를 하거나, lombok을 활용하여 코드의 장황함을 줄이곤 한다. 하자민 lombok을 사용한다고 하더라도 클래스를 생성 이후, 어노테이션을 달아주는 행위, 혹은 lombok에 대한 의존성이 생겨버린다. 그래서 코틀린은 이런 문제점을 해결하고자 <code>data class</code>라는 것을 만들었다. <code>data class</code>로 위의 코드를 변경하면 아래와 같이 심플해진다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14\n\n<span class=\"token keyword\">data</span> <span class=\"token keyword\">class</span> <span class=\"token function\">PersonDto</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> age<span class=\"token operator\">:</span> Int<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>이렇게 <code>data class</code>로 선언해주면, 코틀린이 알아서 <code>getter</code>, <code>setter</code>, <code>equals</code>, <code>hashCode</code>, <code>toString</code>을 자동으로 만들어준다. 또한, named argument를 활용하면 builder패턴까지 활용할 수 있으니, lombok을 사용하지 않아도 되면서 간결해지는 장점을 가진다.</p>\n<blockquote>\n<p>✅ 참고</p>\n<p>JDK16부터 자바에서도 이런 문제를 인식하고 <code>record</code>라는 것을 만들었다. 이것도 일종의 <code>data class</code>라고 생각하면 좋을 것 같다.</p>\n</blockquote>\n<h3>Enum Class</h3>\n<p>자바의 enum 클래스를 살펴보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">enum</span> <span class=\"token class-name\">JavaCountry</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">KOREA</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"KO\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">AMERICA</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"US\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> code<span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">JavaCountry</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> code<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>code <span class=\"token operator\">=</span> code<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> code<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>자바의 enum 클래스는 <code>Enum</code>이라는 것을 상속받고 있는 형태이기에 추가적인 상속을 할 수 없으며 인터페이스만 구현 가능하며, 각각이 싱글톤으로 관리되는 클래스이다. 코틀린도 자바랑 다를 것이 없다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14\n\n<span class=\"token keyword\">enum</span> <span class=\"token keyword\">class</span> <span class=\"token function\">Country</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">val</span> code<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">KOREA</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"KO\"</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">AMERICA</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"US\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>단, 코틀린의 enum class의 장점은 <code>when</code>절을 사용할 때 진가를 발휘한다. 아래의 자바 코드를 보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-java line-numbers\"><code class=\"language-java\"><span class=\"token keyword\">package</span> <span class=\"token namespace\">me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Lec14Main</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">handleCountry</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">JavaCountry</span><span class=\"token punctuation\">.</span><span class=\"token constant\">KOREA</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">handleCountry</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">JavaCountry</span> country<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>country <span class=\"token operator\">==</span> <span class=\"token class-name\">JavaCountry</span><span class=\"token punctuation\">.</span><span class=\"token constant\">KOREA</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"KOREA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>country <span class=\"token operator\">==</span> <span class=\"token class-name\">JavaCountry</span><span class=\"token punctuation\">.</span><span class=\"token constant\">AMERICA</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"AMERICA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>자바에서 enum class를 인자로 받을 때는 위와 같이 작성을 할 수 있다. 하지만 만약 <code>JavaCountry</code>에 enum이 추가가 된다면 컴파일 타임에 미리 확인 할 수 없는 단점이 있다. 런타임에도 사실 모를 수 있다. 또한, 점점 enum이 많아지면 else 로직에 대한 처리도 애매하다. 하지만 코틀린 같은 경우 <code>when</code> 절을 사용하면 컴파일 타임에 확인할 수 있다. 또한, else 로직을 따로 작성 할 필요가 없다. 그래서 enum이 추가가 되더라도 컴파일 타임에서 IDE가 잘 알려주니 정말 강력한 기능인듯 하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">val</span> person1 <span class=\"token operator\">=</span> <span class=\"token function\">PersonDto</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">30</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> person2 <span class=\"token operator\">=</span> <span class=\"token function\">PersonDto</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">30</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person1 <span class=\"token operator\">==</span> person2<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person1<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person2<span class=\"token punctuation\">)</span>\n\n    <span class=\"token function\">handleCountry</span><span class=\"token punctuation\">(</span>Country<span class=\"token punctuation\">.</span>KOREA<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">handleCountry</span><span class=\"token punctuation\">(</span>country<span class=\"token operator\">:</span> Country<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">when</span> <span class=\"token punctuation\">(</span>country<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        Country<span class=\"token punctuation\">.</span>KOREA <span class=\"token operator\">-></span> <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"Korea\"</span></span><span class=\"token punctuation\">)</span>\n        Country<span class=\"token punctuation\">.</span>AMERICA <span class=\"token operator\">-></span> <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"America\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>sealed class, sealed interface</h3>\n<p>해당 sealed class와 sealed interface가 나온 배경은 <code>sealed</code>라는 용어에서 보면 알 수 있다. sealed는 \"봉인 된\"이라는 의미로 상속이 가능한 추상클래스를 만들까 했었는데 특정 클래스에서는 이 클래스를 상속받지 않게끔 하고 싶은 생각에서 탄생하게 되었다.</p>\n<p>sealded class, interface의 장점으로는 컴파일 타임 때 하위 클래스의 타입을 모두 기억한다. 즉, 런타임 때 클래스타입이 추가될 수 없다. 또한, 하위 클래스와 같은 패키지에 존재해야 한다. 여기까지만 보면 enum과 다를께 없지만 차이가 몇가지 존재한다. 첫째로, 상속이 가능한 점이 다르고 둘째로 하위 클래스는 멀티 인스턴스가 가능해진다는 점이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14\n\n<span class=\"token keyword\">sealed</span> <span class=\"token keyword\">class</span> <span class=\"token function\">HyundaiCar</span><span class=\"token punctuation\">(</span>\n    <span class=\"token keyword\">val</span> name<span class=\"token operator\">:</span> String<span class=\"token punctuation\">,</span>\n    <span class=\"token keyword\">val</span> price<span class=\"token operator\">:</span> Long<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">class</span> Avante <span class=\"token operator\">:</span> <span class=\"token function\">HyundaiCar</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"아반떼\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">1_000L</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">class</span> Sonata <span class=\"token operator\">:</span> <span class=\"token function\">HyundaiCar</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"소나타\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">2_000L</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">class</span> Grandeur <span class=\"token operator\">:</span> <span class=\"token function\">HyundaiCar</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"그랜져\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">3_000L</span><span class=\"token punctuation\">)</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>위와 같이 정의를 하면 컴파일타임 때 하위클래스의 타입을 모두 기억한다. 즉, 런타임 때 클래스 타입이 추가될 수 없다라는 것이다. 그리고 sealed class도 <code>when</code>절을 사용해서 enum과 마찬가지로 강력한 효과를 얻을 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"kotlin\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-kotlin line-numbers\"><code class=\"language-kotlin\"><span class=\"token keyword\">package</span> me<span class=\"token punctuation\">.</span>sungbin<span class=\"token punctuation\">.</span>lec14\n\n<span class=\"token keyword\">fun</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">val</span> person1 <span class=\"token operator\">=</span> <span class=\"token function\">PersonDto</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">30</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">val</span> person2 <span class=\"token operator\">=</span> <span class=\"token function\">PersonDto</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"양성빈\"</span></span><span class=\"token punctuation\">,</span> <span class=\"token number\">30</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person1 <span class=\"token operator\">==</span> person2<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person1<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">println</span><span class=\"token punctuation\">(</span>person2<span class=\"token punctuation\">)</span>\n\n    <span class=\"token function\">handleCountry</span><span class=\"token punctuation\">(</span>Country<span class=\"token punctuation\">.</span>KOREA<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">handleCountry</span><span class=\"token punctuation\">(</span>country<span class=\"token operator\">:</span> Country<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">when</span> <span class=\"token punctuation\">(</span>country<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        Country<span class=\"token punctuation\">.</span>KOREA <span class=\"token operator\">-></span> <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"Korea\"</span></span><span class=\"token punctuation\">)</span>\n        Country<span class=\"token punctuation\">.</span>AMERICA <span class=\"token operator\">-></span> <span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string-literal singleline\"><span class=\"token string\">\"America\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">fun</span> <span class=\"token function\">handleCar</span><span class=\"token punctuation\">(</span>car<span class=\"token operator\">:</span> HyundaiCar<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">when</span> <span class=\"token punctuation\">(</span>car<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">is</span> Avante <span class=\"token operator\">-></span> <span class=\"token function\">TODO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">is</span> Grandeur <span class=\"token operator\">-></span> <span class=\"token function\">TODO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">is</span> Sonata <span class=\"token operator\">-></span> <span class=\"token function\">TODO</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<blockquote>\n<p>✅ 참고</p>\n<p>자바도 JDK17부터 sealed class가 추가되었지만 사용 방법이 살짝 다르다.</p>\n</blockquote>","fields":{"slug":"/java-to-kotlin-starter-guide-코틀린에서-OOP/"},"timeToRead":18,"frontmatter":{"title":"[코틀린 입문] 코틀린에서 OOP","tags":["kotlin"],"date":"2026-03-22T18:06:27.000Z","image":{"publicURL":"/static/619e6175d83cd70c239721219e3cbc91/banner.png"},"series":"코틀린 입문"}}},"pageContext":{"id":"851b7f01-fcba-574d-a2fd-13652137c84d","series":"코틀린 입문"}},"staticQueryHashes":["3810308631","4253518612"],"slicesMap":{}}