{"componentChunkName":"component---src-templates-blog-post-js","path":"/java/2016-06-14-java-generics-vs-c-generics/","result":{"data":{"site":{"siteMetadata":{"title":"Seungdols Company","author":"[Seungdols]","siteUrl":"https://seungdols.dev","comment":{"disqusShortName":"","utterances":"seungdols/seungdols.dev"},"sponsor":{"buyMeACoffeeId":"seungdols"}}},"markdownRemark":{"id":"cceee2b7-68aa-56c5-a5ba-1520f8bb548f","excerpt":"Java Erasure Generic vs C# Reification Generic Complie Time이 지나 Java의 경우 ByteCode로 변환 될 경우 Generic에 관한 Type Info가 날라간다. 즉, 위의 Type 정보는 를 확인해보면 아래와 같이 타입 정보가 사라진다는 것을 알 수 있다. 제네릭이 컴파일 타임의 Type Check에 대한 기능을 기본적으로 가지게 되는데 에 불과하다. 위 코드의 실제 결과 즉, 이 것은 버그이다. List…","html":"<h3 id=\"java-erasure-generic-vs-c-reification-generic\" style=\"position:relative;\"><a href=\"#java-erasure-generic-vs-c-reification-generic\" aria-label=\"java erasure generic vs c reification generic 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><a href=\"http://seungdols.tistory.com/421\">Java Erasure Generic</a> vs C# Reification Generic</h3>\n<p>Complie Time이 지나 Java의 경우 ByteCode로 변환 될 경우 Generic에 관한 Type Info가 날라간다. 즉,</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">List</span> <span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Orange</span><span class=\"token punctuation\">></span></span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Orange</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">List</span> <span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Apple</span><span class=\"token punctuation\">></span></span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Apple</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>위의 Type 정보는 <code class=\"language-text\">Byte Code</code>를 확인해보면 아래와 같이 <strong>타입 정보</strong>가 사라진다는 것을 알 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">List</span> <span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">List</span> <span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>제네릭이 <strong>컴파일 타임의 Type Check에 대한 기능</strong>을 기본적으로 가지게 되는데 <code class=\"language-text\">Java의 경우 컴파일 트릭</code>에 불과하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">GenericsErasure</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> main <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\n        <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Apple</span><span class=\"token punctuation\">></span></span> appleList <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Orange</span><span class=\"token punctuation\">></span></span> orangeList <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\">Apple</span> apple <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Apple</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        add <span class=\"token punctuation\">(</span>apple<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        add <span class=\"token punctuation\">(</span>orangeList<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">E</span><span class=\"token punctuation\">></span></span><span class=\"token keyword\">void</span> add <span class=\"token punctuation\">(</span><span class=\"token class-name\">E</span> fruit<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>fruit <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">Apple</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span>println <span class=\"token punctuation\">(</span><span class=\"token string\">\"Apple\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>fruit <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span>println <span class=\"token punctuation\">(</span><span class=\"token string\">\"Apple List\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Apple</span>\n<span class=\"token punctuation\">{</span>\n\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Orange</span>\n<span class=\"token punctuation\">{</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위 코드의 실제 결과</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Apple\nApple List</code></pre></div>\n<p>즉, 이 것은 버그이다. List<Apple>이여야지만 동작해야하는데 orangeList를 전달해도 appleList로 동작하게 되는 것이다.</p>\n<p>List&#x3C;?> 즉 List 타입의 와일드카드를 도입하므로 <code class=\"language-text\">Type Checking</code>에 Bug가 생긴다.</p>\n<p><code class=\"language-text\">List&lt;Apple> 입력시 컴파일 에러가 발생된다.</code></p>\n<p>C#의 경우 컴파일 되고나면, <code class=\"language-text\">IL (Intermediate Language)</code>로 번역이 되는데, 이 번역된 코드는 <code class=\"language-text\">CLR ( Common Language Runtime )</code> 위에서 동작하게 된다.</p>\n<p>그런데 이 IL 코드에는 <code class=\"language-text\">Generic Type Info</code>가 존재한다. 결과적으로 제네릭에 관한 구체적인 정보를 컴파일 이후 코드에도 존재하게 된다.</p>\n<p>그리하여 Java Generic의 한계와 단점은 다음과 같다.</p>\n<ul>\n<li>타입 조사 (Introspection)</li>\n<li>오버로드 (Overload)</li>\n<li>객체 생성 (Instantiation)</li>\n<li>리플렉션 (Reflection)</li>\n<li>성능 (Performance)</li>\n</ul>\n<h3 id=\"예외\" style=\"position:relative;\"><a href=\"#%EC%98%88%EC%99%B8\" 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<p>실행시간 예외 ( Runtime Exception )</p>\n<ul>\n<li>NullPointerException</li>\n<li>IndexOutOfBoundsException</li>\n</ul>\n<p>검사된 예외 ( Checked Exception )</p>\n<ul>\n<li>Complie Time에 검사를 하므로 코딩하는 시점에서 강제로 예외처리.</li>\n<li>Call Site에서 반드시 Try-Catch 구문을 사용해야 함.</li>\n</ul>\n<p>이 두 예외에 관해서는 언어 설계자의 철학이 달라서라고 할 수 있다.</p>\n<p>앤더스 하일스 버그</p>\n<blockquote>\n<p>C#에서 검사된 예외는 확장성과 호환성에 문제를 가지므로 제외 시켰으며, Try-catch • Try-finally 구문 둘 중에서 1:9의 비율로 Try-finally 구문을 많이 사용해야 한다.</p>\n</blockquote>\n<p>제임스 고슬링</p>\n<blockquote>\n<p>예외는 발생한 곳에서 가장 가까운 지점에서 해당 예외를 처리 해야한다. 모든 예외처리가 실행 시간에 예외라면 프로그램 종료 말고, 어떻게 예외를 처리를 하겠는가?라고 했다고 한다.</p>\n</blockquote>\n<p>제임스 고슬링의 경우 <code class=\"language-text\">간결성의 원칙</code>과 로보틱스의 주된 관심사로 인한 철학을 가진 사람이기에 Java 설계시에도 그런 영향을 정말 많이 준 것으로 보인다.</p>\n<h4 id=\"타입-시스템--type-system-\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C--type-system-\" aria-label=\"타입 시스템  type system  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>타입 시스템 ( Type System )</h4>\n<p><code class=\"language-text\">Java</code></p>\n<ul>\n<li>참조타입 (Reference Type)</li>\n<li>원시타입 (Primitive Type)</li>\n</ul>\n<p><code class=\"language-text\">C#</code></p>\n<ul>\n<li>참조타입 (Reference Type)</li>\n<li>값 타입 (Value type)</li>\n</ul>\n<h4 id=\"java8의-특징\" style=\"position:relative;\"><a href=\"#java8%EC%9D%98-%ED%8A%B9%EC%A7%95\" aria-label=\"java8의 특징 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>Java8의 특징</h4>\n<ul>\n<li>람다 표현 ( Lambda Expression ) - 내부적으로는 실제 구현 객체로 변함.</li>\n<li>함수 인터페이스 (Functional Interface) = SAM(Single Abstract Method)</li>\n<li>\n<p>메서드 참조 (Method Reference)</p>\n<ul>\n<li>함수포인터와 비슷함</li>\n</ul>\n</li>\n<li>스트림 (Stream) API</li>\n<li>\n<p>디폴트 메서드 ( Default Method ) - C#의 Extension Method 개념을 유사하게 지원함.C#의 Extension Method 개념을 유사하게 지원함.</p>\n<ul>\n<li>기존 Interface rule을 변경하여 Interface 내에 Body를 포함하는 Method 추가 가능.</li>\n</ul>\n</li>\n</ul>\n<h4 id=\"c의-특징\" style=\"position:relative;\"><a href=\"#c%EC%9D%98-%ED%8A%B9%EC%A7%95\" aria-label=\"c의 특징 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>C#의 특징</h4>\n<ul>\n<li>\n<p>람다 (Lambda)</p>\n<ul>\n<li>delegate로 변함</li>\n</ul>\n</li>\n<li>\n<p>대리자 (delegate)</p>\n<ul>\n<li>Function Pointer와 비슷함</li>\n</ul>\n</li>\n<li>링큐 (LinQ)</li>\n<li>확장 메서드 (Extension Method)</li>\n</ul>\n<h3 id=\"linq\" style=\"position:relative;\"><a href=\"#linq\" aria-label=\"linq 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>LinQ</h3>\n<p>에릭 마이어 - 크래커출신 MS사에서 앤더스 하일스 버그와 같이 C#을 작업함.</p>\n<ul>\n<li>\n<p>링큐를 가능하게 만든 C#에서 기본적으로 지원하는 문법 기능</p>\n<ul>\n<li>질의 표현 (Query Expression)</li>\n<li>암묵적 타입 변수 (Implicitly typed Variables)</li>\n<li>객체와 컬렉션 초기자 (Object and Collection Initializers)</li>\n<li>익명 타입 (Anonymous Types)</li>\n<li>확장 메소드 (Extension Methods)</li>\n<li>람다 표현식 (Lambda Expression)</li>\n<li>자동 구현 속성 (Auto-Implemented Properties)</li>\n</ul>\n</li>\n</ul>\n<p>출처 : <a href=\"https://mva.microsoft.com/ko/training-courses/-c--11209?l=hXTcSPHBB_6704984382\">MVA 임작가님 - C# 세미나</a></p>","frontmatter":{"title":"java generics vs c# generics","date":"June 14, 2016"}}},"pageContext":{"slug":"/java/2016-06-14-java-generics-vs-c-generics/","previous":{"fields":{"slug":"/terminal/2016-06-11-terminator-short-key/"},"frontmatter":{"title":"Terminator Short Key"}},"next":{"fields":{"slug":"/python/2016-06-14-python-list/"},"frontmatter":{"title":"python-list"}}}}}