{"componentChunkName":"component---src-templates-blog-post-js","path":"/language/201027-타입/","result":{"data":{"site":{"siteMetadata":{"title":"Junbyeol Blog","author":"Junsung Yoon","siteUrl":"https://junbyeol.github.io","comment":{"disqusShortName":"","utterances":"junbyeol/junbyeol.github.io"},"sponsor":{"buyMeACoffeeId":"junbyeol"}}},"markdownRemark":{"id":"33b363e3-4ae9-5f61-9569-fff89eaea593","excerpt":"이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다. 타입 체계 타입 에러 에러에는 런타임에러와 컴파일에러 두 종류가 있다.  위에서부터 1, 2,…","html":"<blockquote>\n<p>이 글은 윤준성의 개발꼬맹이 시절, 혼자 노션에 공부하며 정리해둔 것 중 괜찮은 것을 추려올린 글입니다.\n기술블로그 글 기고 목적으로 작성되지 않아, 가독성이 좋지 않거나 알 수 없는 워딩이 있을 수 있습니다.</p>\n</blockquote>\n<p><a href=\"https://hjaem.info/articles/kr_19_5\">타입 체계</a></p>\n<h2 id=\"타입-에러\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EC%97%90%EB%9F%AC\" aria-label=\"타입 에러 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 에러</h2>\n<ul>\n<li>에러에는 런타임에러와 컴파일에러 두 종류가 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 478px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 101%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAABkElEQVQ4y5VU2Q6CQAzk/z9NEx8MaEIMKKjgCXIoeFAzTWrqCgQ3abrs0Z1Oh1pN05C21+vFfujQZ3HXkgDwMIzL5UK+79PxeKTb7UZpmlJRFLy+XC4pSRJarVa8X9c1RVFEeZ7zXUujkoCHw4Fmsxk5jkPb7ZYvI9jpdCLXdSmOY/bT6ZTnOIdHOKAO9ng8eBGoyrL8pHK/33kP567XKz2fz5+UJcYnYJZlFIYhb+LV0WhEk8mEdrsdz4F6v98zFXhQODOtNWVcgAENOAJ/ghBogVDzLoa1r5S1Nytt7um5Nksf0JXuG22PdwYU2YgsRDaQBjjEmubvJ6B+TaqHAti2zbbZbMjzPC4YHkHBegPqYsgiUEkRNIfy3cXfF0IoXWSzXq8ZDTwGkLcVrzdlyKGqKp4DnRazKY1ehGZDMKXRprVBKZuXujpLX7BO2UAmqCwaAwoEDz7l//4LocgGHWQ+n7NsxuMxe2lRgzjUKem/pe27N+W2brNYLCgIgp/f7K+iQCLoLBjn8/mLr6HBYG//DR01MdYtPAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"위에서부터 1, 2, 3 번 오류\"\n        title=\"위에서부터 1, 2, 3 번 오류\"\n        src=\"/static/c829639602dff13d4a34511ee8c9fb68/50978/201027-1.png\"\n        srcset=\"/static/c829639602dff13d4a34511ee8c9fb68/5a46d/201027-1.png 300w,\n/static/c829639602dff13d4a34511ee8c9fb68/50978/201027-1.png 478w\"\n        sizes=\"(max-width: 478px) 100vw, 478px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>위에서부터 1, 2, 3 번 오류</p>\n<ul>\n<li>\n<p>이런 에러는 런타임에러라고 볼 수 있다.</p>\n<ul>\n<li>보통 프로그래머의 의도가 아닌, 실수이다.</li>\n</ul>\n</li>\n<li>타입 에러는 런타임 에러의 한 종류이다.</li>\n<li>타입 에러를 정의하려면 타입부터 정의해야 한다.</li>\n<li>타입은 값을 분류한 것이다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">1, 42, 0 , -1 : 정수\nλx.x, λx.x 1 : 함수</code></pre></div>\n<ul>\n<li>\n<p>타입 에러는 프로그램 실행 중 기대되는 타입과 실제 들어온 타입이 달라서 생긴 에러이다.</p>\n<ul>\n<li>위 실패한 에러들을 살펴보자.</li>\n<li>\n<p>1번 오류</p>\n<ul>\n<li><code class=\"language-text\">+</code> 의 피연산자의 타입은 모두 정수여야 하는데 함수가 들어왔으므로 타입 에러다.</li>\n</ul>\n</li>\n<li>\n<p>2번 오류</p>\n<ul>\n<li>λx.x 1 이 녀석은 첫 피연산자 자리에 함수가 들어가야 하는데 정수가 들어왔으므로 타입 에러다.</li>\n</ul>\n</li>\n<li>\n<p>3번 오류</p>\n<ul>\n<li>자유 변수 y가 오류의 원인이다</li>\n<li>이는 자유 식별자 오류(free identifier error)이며 타입 오류는 아니다.</li>\n<li>런타임 에러이지만 타입오류는 아닌 오류로는 segmentation fault, ArrayIndexOutOfBoundsException 등이 있다.</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<h2 id=\"타입-체계\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EC%B2%B4%EA%B3%84\" aria-label=\"타입 체계 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 체계</h2>\n<ul>\n<li>우리가 만든 프로그램이 타입 오류를 일으키는지 확인하는 체계</li>\n<li>프로그램을 실행하지 않아도 된다는 점에서 <code class=\"language-text\">정적 의미</code> 라고도 부름</li>\n<li>이 체계를 프로그램으로 구현한 것이 <code class=\"language-text\">타입 검사기</code> 이다</li>\n</ul>\n<h3 id=\"타입-검사기\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EA%B2%80%EC%82%AC%EA%B8%B0\" aria-label=\"타입 검사기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 검사기</h3>\n<ul>\n<li>어떤 프로그램이 타입오류가 일어난다면 NOT OK, 괜찮다면 OK를 반환</li>\n<li>\n<p>아래의 성질을 만족해야 한다.</p>\n<ol>\n<li>유한한 시간 내로 종료 될것</li>\n<li>OK, NOT OK 둘 중 하나를 결과로 낼 것</li>\n<li>오류가 없어야 할것</li>\n</ol>\n</li>\n<li>\n<p>아래의 성질을 선택적으로 더 가질 수 있다</p>\n<ul>\n<li>타입 완전성(completeness)</li>\n<li>타입 안전성(soundness)</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"타입-완전성\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EC%99%84%EC%A0%84%EC%84%B1\" aria-label=\"타입 완전성 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 완전성</h3>\n<ul>\n<li>타입 오류를 일으키지 않는 모든 프로그램에 OK를 반환한다.</li>\n<li>NOT OK가 반환된 프로그램은 무조건 타입 오류를 일으킨다.</li>\n</ul>\n<h3 id=\"타입-안전성\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EC%95%88%EC%A0%84%EC%84%B1\" aria-label=\"타입 안전성 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 안전성</h3>\n<ul>\n<li>타입 오류를 일으키는 모든 프로그램에 NOT OK를 반환한다.</li>\n<li>OK가 반환된 프로그램은 무조건 타입 안전하다!</li>\n</ul>\n<blockquote>\n<p>튜링 완전한 언어라면, 완전하면서 안전할 수 없다.</p>\n</blockquote>\n<h2 id=\"타입-검사\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EA%B2%80%EC%82%AC\" aria-label=\"타입 검사 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 검사</h2>\n<ul>\n<li>일반적으로 컴파일러나 인터프리터의 앞부분이다.</li>\n<li>실행 전에 타입 검사를 수행하는 것을 <code class=\"language-text\">정적 타입 검사</code>라고 한다.</li>\n<li>정적 타입 검사를 수행하는 언어를 <code class=\"language-text\">정적 타입 언어</code>라고 한다.</li>\n<li>실행 중에 타입 검사가 일어나는 <code class=\"language-text\">동적 타입 언어</code>도 있다.</li>\n<li>\n<p>타입 검사의 목적과 상충하는 것으로 보이나 의미가 있다.</p>\n<ul>\n<li>타입 오류가 프로그램의 비정상 종료가 아닌, 비정상 작동을 유발할 경우</li>\n<li>ex) int 대신 float이 들어와 종료는 되지 않지만, 이상한 작동을 한다</li>\n<li>Python</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"정적-타입-언어\" style=\"position:relative;\"><a href=\"#%EC%A0%95%EC%A0%81-%ED%83%80%EC%9E%85-%EC%96%B8%EC%96%B4\" aria-label=\"정적 타입 언어 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>정적 타입 언어</h3>\n<ul>\n<li>C, C++, Java, Scala</li>\n<li>\n<p>장점</p>\n<ul>\n<li>실행 전에 오류를 찾을 수 있다.</li>\n<li>미리 찾은 타입 정보로 최적화를 수행 할 수 있어, 성능 면의 이점까지 챙길 수 있다.</li>\n<li>타입 표시 자체가 주석의 역할을 하기도 한다.</li>\n</ul>\n</li>\n<li>\n<p>단점</p>\n<ul>\n<li>\n<p>안전성을 대가로 잃어버린 완전성</p>\n<ul>\n<li>타입 오류를 일으키지 않음에도 프로그램이 NOT OK를 반환할 수 있다</li>\n<li>이를 보완하는 기능이 명시적 타입 변환(explicit type casting)</li>\n</ul>\n</li>\n<li>\n<p>불필요한 타입 표시가 많이 필요함</p>\n<ul>\n<li>타입 추론(type inference)을 통해 보완</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"동적-타입-언어\" style=\"position:relative;\"><a href=\"#%EB%8F%99%EC%A0%81-%ED%83%80%EC%9E%85-%EC%96%B8%EC%96%B4\" aria-label=\"동적 타입 언어 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>동적 타입 언어</h3>\n<ul>\n<li>오류의 사전확인이 불가능 → 성능상의 단점</li>\n<li>\n<p>대신, 타입 검사기의 불완전함으로 인한 불편이 없다</p>\n<ul>\n<li>대충 만들면 대충 만든대로 돌아가니까 일단 편하다</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"점진적-타입gradual-type\" style=\"position:relative;\"><a href=\"#%EC%A0%90%EC%A7%84%EC%A0%81-%ED%83%80%EC%9E%85gradual-type\" aria-label=\"점진적 타입gradual type permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>점진적 타입(gradual type)</h3>\n<ul>\n<li>두 언어의 장점을 모두 취해보자!</li>\n<li>동적 타입 언어인 JavaScript에 타입표시를 추가하여 안전하게 사용할 수 있게 해준 TypeScript</li>\n</ul>","frontmatter":{"title":"타입","date":"October 27, 2020"}}},"pageContext":{"slug":"/language/201027-타입/","previous":{"fields":{"slug":"/web/201026-Babel/"},"frontmatter":{"title":"Babel"}},"next":{"fields":{"slug":"/language/201123-함수형-프로그래밍/"},"frontmatter":{"title":"함수형 프로그래밍"}}}}}