{"id":5959,"date":"2022-08-12T20:44:46","date_gmt":"2022-08-12T11:44:46","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=5959"},"modified":"2022-08-16T11:29:25","modified_gmt":"2022-08-16T02:29:25","slug":"java-generic","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=5959","title":{"rendered":"\uc790\ubc14 \uc81c\ub124\ub9ad(Java Generic)"},"content":{"rendered":"<h1>\uc790\ubc14 \uc81c\ub124\ub9ad(Java Generic)<\/h1>\n<p><a href=\"https:\/\/st-lab.tistory.com\/153\">\ucc38\uc870<\/a><\/p>\n<p>Generic Type \uc740 \ubc94\uc6a9 \ud0c0\uc785\uc744 \uc9c0\uc6d0\ud55c\ub2e4.<\/p>\n<h2>Generic \uc7a5\ub2e8\uc810<\/h2>\n<h3>\uc7a5\uc810<\/h3>\n<p>\ucf54\ub4dc \uc911\ubcf5\uc774 \uc904\uc5b4\ub4e0\ub2e4.<\/p>\n<pre><code class=\"language-java\">\/\/ Generic \uc774 \uc5c6\uc73c\uba74\npublic class MyIntegerMapper { ... }\npublic class MyFloatMapper { ... }\npublic class MyStringMapper { ... }\n\n\/\/ Generic \uc744 \uc0ac\uc6a9\ud558\uba74\npublic class MyMapper&lt;T&gt; { ... }<\/code><\/pre>\n<h3>\ub2e8\uc810<\/h3>\n<p>Generic \uc740 Java \ubb38\ubc95\uc911 \ub09c\ud574\ud55c \ubb38\ubc95\uc5d0 \uc18d\ud55c\ub2e4.<\/p>\n<p>RestController CRUD \uc5d0 \uc801\uc6a9\ud574 \ubcf4\uc558\ub294\ub370,<br \/>\n\uac00\ub3c5\uc131\uc774 \ub9e4\uc6b0 \uc548\uc88b\uc558\ub2e4.<\/p>\n<p>Mapper \uac19\uc740 \uc544\uc8fc \ub2e8\uc21c\ud55c \uae30\ub2a5\uc5d0 Generic \uc744 \uc801\uc6a9\ud558\ub294\uac8c \uc88b\ub2e4.<\/p>\n<h2>\uae30\ubcf8 \ubb38\ubc95<\/h2>\n<p>class, interface \uc5d0 Generic \uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.<br \/>\nenum \uc740 interface \uad6c\ud604\uc744 \ud1b5\ud574\uc11c\ub9cc \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\"language-java\">public class MyClass&lt;T&gt; { ... }\npublic class MyClass&lt;K, V&gt; { ... }\npublic interface MyInterface&lt;T&gt; { ... }\n\npublic enum MyEnum implements MyInterface&lt;Integer&gt; { ... }<\/code><\/pre>\n<h2>\uae30\ubcf8 \ubb38\ubc95 \uc124\uba85<\/h2>\n<pre><code class=\"language-java\">public class MyMapper&lt;T&gt; {\n\n    private T value;\n\n    public String toString() {\n        return value.toString();\n    }\n\n    public MyMapper(T value) {\n        this.value = value;\n    }\n}\n\nMyMapper&lt;Integer&gt; a = new MyMapper&lt;&gt;(1);\nMyMapper&lt;Float&gt; b = new MyMapper&lt;&gt;(1.0f);\nMyMapper&lt;Double&gt; c = new MyMapper&lt;&gt;(1.0);<\/code><\/pre>\n<p>Generic \ud30c\ub77c\ubbf8\ud130 T \ub294 \uc554\ubb35\uc801\uc778 \uaddc\uce59\uc774\uace0,<br \/>\n\ub300\ubb38\uc790 \uc54c\ud30c\ubcb3 \ud55c\uae00\uc790\ub77c\ub294 \uaddc\uce59\uc740 \uc5c6\ub2e4.<\/p>\n<p>\uc54c\ud30c\ubcb3 \ub450\uae00\uc790 \uc774\uc0c1\uc774\uc5b4\ub3c4 \ub418\uace0,<br \/>\n\uc18c\ubb38\uc790\uc5ec\ub3c4 \uc0c1\uad00\uc5c6\ub2e4.<br \/>\n\ud558\uc9c0\ub9cc \uc554\ubb35\uc801\uc73c\ub85c \ub300\ubb38\uc790\ub85c \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc900\ub2e4.<\/p>\n<p>Generic \ud30c\ub77c\ubbf8\ud130\ub294 Object \ub97c \uc0c1\uc18d\ubc1b\uc740 \uac1d\uccb4\ub9cc \uac00\ub2a5\ud558\ub2e4.<br \/>\n\ub530\ub77c\uc11c int, float \ub4f1\uc740 \ud30c\ub77c\ubbf8\ud130\uac00 \ub420 \uc218 \uc5c6\ub2e4.<\/p>\n<h2>\uba54\uc18c\ub4dc Generic<\/h2>\n<p>\uba54\uc18c\ub4dc\uc5d0 \ub300\ud574\uc11c\ub9cc Generic \uc744 \uc801\uc6a9\ud558\ub294 \uac83\ub3c4 \uac00\ub2a5\ud558\ub2e4.<br \/>\n\uc811\uadfc \uc81c\uc5b4\uc790(public \ub4f1) \ub2e4\uc74c\uc5d0 Generic \ud30c\ub77c\ubbf8\ud130\ub97c \uba85\uc2dc\ud574 \uc900\ub2e4.<\/p>\n<pre><code class=\"language-java\">public class MyClass {\n    public &lt;K&gt; String toString(K k) {\n        return k.toString();\n    }\n\n    public static &lt;T&gt; T origin(T t) {\n        return t;\n    }\n}\n\nMyClass cls = new MyClass();\nSystem.out.println(cls.toString(1));\n\nSystem.out.println(MyClass.origin(2));<\/code><\/pre>\n<p>\uba54\uc18c\ub4dc Generic \uc740 \ub3d9\uc77c\ud55c \ud30c\ub77c\ubbf8\ud130 K \ub97c \uc0ac\uc6a9\ud588\ub2e4\uace0 \ud574\ub3c4,<br \/>\n\ud074\ub798\uc2a4 Generic \uacfc\ub294 \ubcc4\uac1c\uc758 \ud30c\ub77c\ubbf8\ud130\uc774\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc, IntelliJ \uac00 \ubd88\ud3c9\ubd88\ub9cc\uc744 \uc3df\uc544\ub0b8\ub2e4.<\/p>\n<pre><code class=\"language-java\">public class MyClass&lt;K extends BaseDocument&gt; {\n    public static &lt;K&gt; K origin(K k) {\n        return k;\n    }\n}<\/code><\/pre>\n<h2>\ubc94\uc704 \uc81c\ud55c Generic<\/h2>\n<h3>&lt;K extends T&gt;<\/h3>\n<p>\ud2b9\uc815 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294 \ud558\uc704 \ud074\ub798\uc2a4\ub9cc,<br \/>\n\ud30c\ub77c\ubbf8\ud130\ub85c \ubc1b\ub294 Generic \uc744 \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\uacf5\ud1b5\uc801\uc73c\ub85c \ud544\uc694\ud55c \uba54\uc18c\ub4dc(\uc608\ub97c \ub4e4\uba74 \ub370\uc774\ud0c0\uc758 PK \ubc18\ud658\ubc1b\uae30 \ub4f1) \uac00 \ud544\uc694\ud55c \uacbd\uc6b0,<br \/>\n\ud574\ub2f9 \uba54\uc18c\ub4dc\ub97c \ubd80\ubaa8 \ud074\ub798\uc2a4\ub85c \ub9cc\ub4e4\uc5b4 \ub193\uace0,<br \/>\n\ubaa8\ub4e0 \ud074\ub798\uc2a4\ub97c \ubd80\ubaa8 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uac8c \ud574\uc11c,<br \/>\n\ud574\ub2f9 \uba54\uc18c\ub4dc\ub97c \uc774\uc6a9\ud558\uac8c \ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>interface \ub97c \uc0c1\uc18d\ubc1b\ub294 \ud558\uc704 \ud074\ub798\uc2a4\uc5d0 \ub300\ud574\uc11c\ub3c4,<br \/>\nextends \ub97c \uc0ac\uc6a9\ud55c\ub2e4.(implements XXX)<\/p>\n<pre><code class=\"language-java\">public class BaseDocument {\n\n    private final String id;\n\n    public String getId() {\n        return id;\n    }\n\n    public BaseDocument(String id) {\n        this.id = id;\n    }\n}\n\npublic class ItemDocument extends BaseDocument {\n    public ItemDocument(String id) {\n        super(id);\n    }\n}\n\npublic class MyClass&lt;K extends BaseDocument&gt; {\n\n    private final K document;\n\n    public String getId() {\n        return document.getId();\n    }\n\n    public MyClass(K document) {\n        this.document = document;\n    }\n}\n\nMyClass&lt;ItemDocument&gt; cls = new MyClass&lt;&gt;(new ItemDocument(&quot;a&quot;));\nSystem.out.println(cls.getId());<\/code><\/pre>\n<h3>&lt;K super T&gt;<\/h3>\n<p>\ud2b9\uc815 \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294 \uc790\uc2dd \ud074\ub798\uc2a4\uac00 \uc544\ub2c8\ub77c,<br \/>\n\ubd80\ubaa8 \ud074\ub798\uc2a4\ub9cc \ud30c\ub77c\ubbf8\ud130\ub85c \ubc1b\ub294 Generic \uc744 \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \ucf54\ub4dc\ub97c \uc791\uc131\ud574 \ubcf8 \uc801\uc740 \uc5c6\ub2e4.<\/p>\n<h3>&lt;?&gt; (\uc640\uc77c\ub4dc \uce74\ub4dc : Wild Card)<\/h3>\n<p>\uacfc\uc77c \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294 \uc0ac\uacfc \ud074\ub798\uc2a4, \ubc14\ub098\ub098 \ud074\ub798\uc2a4\uac00 \uc788\ub2e4\uace0 \ud560 \ub54c,<\/p>\n<p><code>&lt;T extends E&gt;<\/code> \ub294 \uc0ac\uacfc\uba74 \uc0ac\uacfc, \ubc14\ub098\ub098\uba74 \ubc14\ub098\ub098,<br \/>\n\ud55c\uac00\uc9c0\uc758 \ud074\ub798\uc2a4\ub9cc \ub370\uc774\ud0c0\ub85c \ubc1b\uc744 \uc218 \uc788\ub2e4.<\/p>\n<p>\ubc18\uba74\uc5d0, <code>&lt;? extends E&gt;<\/code> \ub294 \uc0ac\uacfc, \ubc14\ub098\ub098\ub97c \ub3d9\uc2dc\uc5d0 \ub370\uc774\ud0c0\ub85c \ubc1b\uc744 \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\"language-java\">public boolean addAll(Collection&lt;T extends E&gt; c);\n\npublic boolean addAll(Collection&lt;? extends E&gt; c);<\/code><\/pre>\n<p>\ud558\uc9c0\ub9cc \ucf54\ub4dc\ub97c \uc791\uc131\ud574 \ubcf8 \uc801\uc740 \uc5c6\ub2e4.<\/p>\n<h2>\ud074\ub798\uc2a4\uc640 \uc778\ud130\ud398\uc774\uc2a4 \ub3d9\uc2dc \uc0c1\uc18d<\/h2>\n<pre><code class=\"language-java\">public class SomeClass&lt;T extends MyClass &amp; MyInterface&gt; { ... }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\uc790\ubc14 \uc81c\ub124\ub9ad(Java Generic) \ucc38\uc870 Generic Type \uc740 \ubc94\uc6a9 \ud0c0\uc785\uc744 \uc9c0\uc6d0\ud55c\ub2e4. Generic \uc7a5\ub2e8\uc810 \uc7a5\uc810 \ucf54\ub4dc \uc911\ubcf5\uc774 \uc904\uc5b4\ub4e0\ub2e4. \/\/ Generic \uc774 \uc5c6\uc73c\uba74 public class MyIntegerMapper { &#8230; } public class MyFloatMapper { &#8230; } public class MyStringMapper { &#8230; } \/\/ Generic \uc744 \uc0ac\uc6a9\ud558\uba74 public class MyMapper&lt;T&gt; { &#8230; } \ub2e8\uc810 Generic \uc740 Java \ubb38\ubc95\uc911 \ub09c\ud574\ud55c \ubb38\ubc95\uc5d0\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=5959\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,1],"tags":[],"class_list":["post-5959","post","type-post","status-publish","format-standard","hentry","category-java","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5959","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5959"}],"version-history":[{"count":24,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5959\/revisions"}],"predecessor-version":[{"id":5996,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/5959\/revisions\/5996"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}