{"id":2605,"date":"2024-10-08T21:23:28","date_gmt":"2024-10-08T12:23:28","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=2605"},"modified":"2024-10-08T21:23:28","modified_gmt":"2024-10-08T12:23:28","slug":"kotlin-%ec%97%90-%ec%9d%b5%ec%88%99%ed%95%b4%ec%a7%80%ea%b8%b0-%eb%82%af%ec%84%a0-%eb%ac%b8%eb%b2%95%eb%93%a4-%ec%a0%95%eb%a6%ac-4","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2024\/10\/08\/2605\/","title":{"rendered":"Kotlin \uc5d0 \uc775\uc219\ud574\uc9c0\uae30 : \ub0af\uc120 \ubb38\ubc95\ub4e4 \uc815\ub9ac #4"},"content":{"rendered":"\n<p>codepro \ub54c\ubb38\uc5d0 \ud3ec\uc2a4\ud305\uc744 \ub098\ub220\uc11c \uacc4\uc18d \uc9e4\ub77c\uba39\uc5b4\uc57c \ud558\ub294\uac8c \uc9dc\uc99d\ub098\ub124.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">delegation : <br><a href=\"https:\/\/kotlinlang.org\/docs\/delegation.html\">https:\/\/kotlinlang.org\/docs\/delegation.html<\/a><br><a href=\"https:\/\/kotlinlang.org\/docs\/delegated-properties.html\">https:\/\/kotlinlang.org\/docs\/delegated-properties.html<\/a><\/h3>\n\n\n\n<p>\uc704\uc784(delegation) \ub514\uc790\uc778 \ud328\ud134( <a href=\"https:\/\/en.wikipedia.org\/wiki\/Delegation_pattern\">https:\/\/en.wikipedia.org\/wiki\/Delegation_pattern<\/a> )\uc740 \ud55c \ud074\ub798\uc2a4\uc758 \uba64\ubc84 \uad6c\ud604\uc744 \uc9c1\uc811 \ud558\uc9c0 \uc54a\uace0, \ub2e4\ub978 \ud074\ub798\uc2a4\uc758 \uba64\ubc84\uad6c\ud604\uc744 \uc774\uc6a9\ud558\ub294 \uac83\uc774\ub2e4. \ub2e4\uc2dc\ub9d0\ud558\uba74, \ub2e4\ub978 \ud074\ub798\uc2a4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac83\uc774\ub2e4. \ucf54\ud2c0\ub9b0\uc740 \uc774\ub97c \uc5b8\uc5b4 \uc218\uc900\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \uc9c0\uc6d0\ud55c\ub2e4. \ubc14\ub85c &#8216;by&#8217;\ud0a4\uc6cc\ub4dc\uac00 \uadf8\uac83\uc774\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"interface ClosedShape {\n    fun area(): Int\n}\n\nclass Rectangle(val width: Int, val height: Int) : ClosedShape {\n    override fun area() = width * height\n}\n\n\/\/ The ClosedShape implementation of Window delegates to that of the Rectangle that is bounds\nclass Window(private val bounds: Rectangle) : ClosedShape by bounds\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ClosedShape<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">area<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Rectangle<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> width: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> height: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #F69D50\">ClosedShape<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">area<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> width <\/span><span style=\"color: #F47067\">*<\/span><span style=\"color: #ADBAC7\"> height<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ The ClosedShape implementation of Window delegates to that of the Rectangle that is bounds<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Window<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> bounds: <\/span><span style=\"color: #F69D50\">Rectangle<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #F69D50\">ClosedShape<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">by<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">bounds<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704 \ucf54\ub4dc\uc5d0\uc11c Window \ud074\ub798\uc2a4\ub294 ClosedShape \uc778\ud130\ud398\uc774\uc2a4\uc758 \uad6c\ud604\uc744 bounds\uc5d0\uac8c \uc704\uc784\ud558\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<p>\ud074\ub798\uc2a4 \ub2e8\uc704\uac00 \uc544\ub2c8\ub77c property\uc5d0\uc11c\ub3c4 \uac00\ub2a5\ud55c\ub370, \ub9e4\uc6b0 \ud754\ud788 \ubcfc \uc218 \uc788\ub2e4. \uc774 \ub54c, get()\/set() \uc774 \uc704\uc784\ub418\ub294 \ub300\uc0c1\uc758 getValue(), setValue()\ub97c \ub300\uc2e0 \ubd80\ub974\uac8c \ub418\ubbc0\ub85c \uc774\ub4e4\uc774 \uad6c\ud604\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class Delegate {\n    operator fun getValue(thisRef: Any?, property: KProperty&lt;*&gt;): String {\n        return &quot;$thisRef, thank you for delegating '${property.name}' to me!&quot;\n    }\n\n    operator fun setValue(thisRef: Any?, property: KProperty&lt;*&gt;, value: String) {\n        println(&quot;$value has been assigned to '${property.name}' in $thisRef.&quot;)\n    }\n}\n\nclass Example {\n    var p: String by Delegate() \/\/ val\/var &lt;property name&gt;: &lt;Type&gt; by &lt;expression&gt;\n}\n\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Delegate<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">operator<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getValue<\/span><span style=\"color: #ADBAC7\">(thisRef: <\/span><span style=\"color: #F69D50\">Any<\/span><span style=\"color: #ADBAC7\">?, property: <\/span><span style=\"color: #F69D50\">KProperty<\/span><span style=\"color: #ADBAC7\">&lt;*&gt;): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #6CB6FF\">$thisRef<\/span><span style=\"color: #96D0FF\">, thank you for delegating &#39;${property.name}&#39; to me!&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">operator<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">setValue<\/span><span style=\"color: #ADBAC7\">(thisRef: <\/span><span style=\"color: #F69D50\">Any<\/span><span style=\"color: #ADBAC7\">?, property: <\/span><span style=\"color: #F69D50\">KProperty<\/span><span style=\"color: #ADBAC7\">&lt;*&gt;, <\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;<\/span><span style=\"color: #6CB6FF\">$value<\/span><span style=\"color: #96D0FF\"> has been assigned to &#39;${property.name}&#39; in <\/span><span style=\"color: #6CB6FF\">$thisRef<\/span><span style=\"color: #96D0FF\">.&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Example<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> p: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">by<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Delegate<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #768390\">\/\/ val\/var &lt;property name&gt;: &lt;Type&gt; by &lt;expression&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"57\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png\" alt=\"seperator\" class=\"wp-image-381\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-300x22.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-768x57.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Lazy initialization<\/h3>\n\n\n\n<p> \uc55e\uc5d0\uc11c delegated property \ub97c\ub2e4\ub918\ub294\ub370, \ucf54\ud2c0\ub9b0 \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c \uc9c0\uc6d0\ud574\uc8fc\ub294 \uac83\ub4e4\uc774 \uc788\ub2e4. \uadf8 \uc911 \ud558\ub098\uac00 Lazy\uc774\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"val lazyValue: String by lazy {\n    println(&quot;computed!&quot;)\n    &quot;Hello&quot;\n}\n\nfun main() {\n    println(lazyValue)\n    println(lazyValue)\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> lazyValue: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">by<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">lazy<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;computed!&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #96D0FF\">&quot;Hello&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(lazyValue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(lazyValue)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\ub294 \uc9c0\uc5f0\ub41c \ucd08\uae30\ud654\uc5d0 \uc0ac\uc6a9\ub418\ub294\ub370, lambda \ud568\uc218\ub97c \uc778\uc790\ub85c \ubc1b\uae30 \ub54c\ubb38\uc5d0, \uc5ec\uae30\uc11c \ucd08\uae30\ud654 \ucf54\ub4dc\ub97c \uc804\ub2ec\ud574\uc8fc\uba74 \ub41c\ub2e4. \ucc98\uc74c property\uac00 \ubd88\ub9ac\uba74 get()\uc774 \uc2e4\ud589\ub418\uc5b4 \ub118\uaca8\uc900 \ub78c\ub2e4 \ud568\uc218\uac00 \uc2e4\ud589\ub418\uace0 \uadf8 \uacb0\uacfc\ub97c \uae30\uc5b5\ud574\ub454\ub2e4. \uadf8 \ub2e4\uc74c\ubd80\ud130\ub294 \uae30\uc5b5\ub41c \uacb0\uacfc\uac12\ub9cc \ub3cc\ub824\uc8fc\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"57\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png\" alt=\"seperator\" class=\"wp-image-381\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-300x22.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-768x57.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">scope functions <\/h3>\n\n\n\n<p>\uc2a4\ucf54\ud504 \ud568\uc218\ub4e4\uc740 let, run, with, apply, also \uc758 \ub2e4\uc12f\uac00\uc9c0\uac00 \uc788\ub2e4. \uc0ac\uc6a9\uc5d0 \ud63c\ub3d9\uc774 \uc62c \uc218 \uc788\ub294\ub370, \uc815\ub9ac\ub0b4\uc6a9\uc774 \uc880 \ub9ce\uc73c\ubbc0\ub85c, \uae30\uc874 \ud3ec\uc2a4\ud305\uc73c\ub85c \ub300\uccb4\ud55c\ub2e4. <\/p>\n\n\n\n<p><a href=\"http:\/\/batmask.dothome.co.kr\/index.php\/2021\/12\/10\/286\/\">http:\/\/batmask.dothome.co.kr\/index.php\/2021\/12\/10\/286\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"57\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png\" alt=\"seperator\" class=\"wp-image-381\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-300x22.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-768x57.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">coroutine : <a href=\"https:\/\/kotlinlang.org\/docs\/coroutines-overview.html\">https:\/\/kotlinlang.org\/docs\/coroutines-overview.html<\/a><\/h3>\n\n\n\n<p>\ucf54\ud2c0\ub9b0\uc758 \ud575\uc2ec \ub0b4\uc6a9\uc911 \ud558\ub098\uc774\uc9c0\ub9cc, \uc774\uac83\ub3c4 \ub0b4\uc6a9\uc774 \ub9ce\ub2e4. \uae30\uc874\uc5d0 \uc791\uc131\ud588\ub358 \ubcc4\ub3c4 \ud3ec\uc2a4\ud305 \ucc38\uace0. <\/p>\n\n\n\n<p><a href=\"http:\/\/batmask.dothome.co.kr\/index.php\/2023\/07\/29\/672\/\">Kotlin: Coroutines <\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"57\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png\" alt=\"seperator\" class=\"wp-image-381\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-300x22.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-768x57.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Flow : <a href=\"https:\/\/kotlinlang.org\/docs\/flow.html\">https:\/\/kotlinlang.org\/docs\/flow.html<\/a><\/h3>\n\n\n\n<p>\ucf54\ub8e8\ud2f4\uacfc \ud568\uaed8 \ubd10\uc57c\ud560 \uc5ed\uc2dc \ud575\uc2ec\ub0b4\uc6a9. \uc774\uac83\ub3c4 \ub0b4\uc6a9\uc774 \ub9ce\uc73c\ub2c8 \uae30\uc874 \uc791\uc131\ud588\ub358 \ud3ec\uc2a4\ud305 \ucc38\uace0.<\/p>\n\n\n\n<p><a href=\"http:\/\/batmask.dothome.co.kr\/index.php\/2023\/08\/01\/1045\/\">Kotlin : Flow Part. 1 <\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/batmask.dothome.co.kr\/index.php\/2023\/08\/03\/1986\/\">Kotlin : Flow Part.2 (Shared Flow, State Flow) <\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"57\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png\" alt=\"seperator\" class=\"wp-image-381\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-300x22.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-768x57.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">annotation : <a href=\"https:\/\/kotlinlang.org\/docs\/annotations.html\">https:\/\/kotlinlang.org\/docs\/annotations.html<\/a><\/h3>\n\n\n\n<p>annotation\uc740 \ucf54\ub4dc\uc5d0 \uba54\ud0c0 \ub370\uc774\ud130\ub97c \ubd99\uc774\ub294\uac78 \uc758\ubbf8\ud55c\ub2e4. \ucc98\uc74c\uc5d4 \uac04\ub2e8\ud55c \uc5d0\ub7ec\ub098 \uacbd\uace0\ud45c\uc2dc \uc548\ud558\uac8c \ub9cc\ub4dc\ub294 \uc815\ub3c4\uc758 \uc218\uc900\uc73c\ub85c \uc54c\uc558\uc5c8\ub294\ub370, \uc5b4\ub290\uc21c\uac04 \ud2b9\ud788 \ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 compose\ub97c \uc4f0\ub824\uba74 \uaf2d \ud544\uc694\ud558\ub4ef\uc774 \ucf54\ub529\uc758 \ud55c \ubd80\ubd84\uc774 \ub418\ubc84\ub838\ub2e4. \uc608\uc804 \uc5b8\uc5b4\ub4e4\uc758 \ud504\ub9ac\ud504\ub85c\uc138\uc11c \uc791\uc5c5\ub4e4\uc774 \ubb38\uc81c\uac00 \ub9ce\uc544 \uc0ac\ub77c\uc84c\uc9c0\ub9cc, \uacb0\uad6d \uc774\uac83\ub4e4\uc774 annotation\uc73c\ub85c \uc7ac\ud0c4\uc0dd\ud55c \ub290\ub08c\ub3c4 \ub4e0\ub2e4. \uc2e4\uc81c\ub85c annotation\uc740 \uba54\uc778 \ucf54\ub4dc\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\uac8c \ucef4\ud30c\uc77c\ub7ec\uc5d0 \uc758\ud574 \uc804\ucc98\ub9ac \ub41c\ub2e4. <\/p>\n\n\n\n<p>annotation\uc744 \ub9cc\ub4e4\ub824\uba74 \ud074\ub798\uc2a4 \uc55e\uc5d0 &#8216;annotation&#8217;\uc744 \ubd99\uc5ec\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"annotation class Special\n\/\/ usage \n@Special class MyClass { }\n@Special fun myFunction() { }\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">annotation<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Special<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ usage <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">@Special<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">MyClass<\/span><span style=\"color: #ADBAC7\"> { }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">@Special<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">myFunction<\/span><span style=\"color: #ADBAC7\">() { }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ud30c\ub77c\ubbf8\ud130\ub97c \ubc1b\ub294 \uacbd\uc6b0, \ub2e4\uc74c\uacfc \uac19\ub2e4. \uadf8\ub0e5 \uc77c\ubc18 \ud074\ub798\uc2a4\uc640 \ud06c\uac8c \ub2e4\ub974\uc9c0 \uc54a\uac8c \ub290\uaef4\uc9c4\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"annotation class Review(val reviewer: String, val date: String)\n@Review(reviewer = &quot;John Doe&quot;, date = &quot;2022-01-01&quot;)\nclass Document { }\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">annotation<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Review<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> reviewer: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> date: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">@Review<\/span><span style=\"color: #ADBAC7\">(reviewer <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;John Doe&quot;<\/span><span style=\"color: #ADBAC7\">, date <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;2022-01-01&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Document<\/span><span style=\"color: #ADBAC7\"> { }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uae30\ubcf8\uc801\uc73c\ub85c \ube4c\ud2b8\uc778 annotation\ub4e4\uc774 \uc874\uc7ac\ud55c\ub2e4. @deprecated, @JvmOverloads, @JvmStatic, @Suppress, @Retention, @Target, @Repeatable \ub4f1. custom annotation\uc5d0 \ub300\ud574\uc120 \uc0ac\uc2e4, \ubcc4\uac1c\uc758 \ud3ec\uc2a4\ud305\uc73c\ub85c \uc815\ub9ac\ud558\ub294\uac8c \ub9de\ub294 \ub0b4\uc6a9\uac19\uace0, \uc544\ub798 \ucc38\uc870\uae00\ub85c \ub0b4\uc6a9\uc744 \ub300\uccb4\ud55c\ub2e4. <\/p>\n\n\n\n<p>\ucc38\uc870\uae00 : <br><a href=\"https:\/\/medium.com\/@m.abuzaid.ali\/how-to-create-custom-annotations-in-kotlin-f7ed238b52eb\">How to create custom annotations in Kotlin<\/a><br><a href=\"https:\/\/medium.com\/@ramadan123sayed\/understanding-kotlin-annotations-a-comprehensive-guide-9a60c329d76b\">Understanding Kotlin Annotations: A Comprehensive Guide<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"57\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png\" alt=\"seperator\" class=\"wp-image-381\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator.png 771w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-300x22.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/seperator-768x57.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Generics, in, out : <a href=\"https:\/\/kotlinlang.org\/docs\/generics.html\">https:\/\/kotlinlang.org\/docs\/generics.html<\/a><\/h3>\n\n\n\n<p>Generics\uac00 \uc0ac\uc6a9\ub41c\uac74 \uc624\uc624\uc624\uc624\ub798\uc804 C++\uc758 STL(Standard Template Library)\ub4f1 Template \uc0ac\uc6a9\uae30\uc5b5\uc774 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774\uac8c \ubb54\uc9c0 \uc790\uc138\ud55c \uc124\uba85\uc740 \uc0dd\ub7b5. generic\uc740 function, class, interface\uc5d0 \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4. \ud568\uc218\uc5d0\uc11c\uc758 \uc120\uc5b8 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"fun &lt;T&gt; singletonList(item: T): List&lt;T&gt; {\n}\n\nfun &lt;T&gt; T.basicToString(): String { \/\/ extension function\n}\nval l = singletonList&lt;Int&gt;(1)\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> &lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; <\/span><span style=\"color: #DCBDFB\">singletonList<\/span><span style=\"color: #ADBAC7\">(item: <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">List<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> &lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">basicToString<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> { <\/span><span style=\"color: #768390\">\/\/ extension function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> l <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">singletonList<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt;(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ud568\uc218 \uc774\ub984\uc804\uc5d0 &lt;T>\ub85c \uc368\uc8fc\uba70, \uaf2d T\uac00 \uc544\ub2c8\uc5b4\ub3c4 \ub41c\ub2e4. \uc5ec\ub7ec\uac1c\uc778 \uacbd\uc6b0, &lt;T, F> \uc640 \uac19\uc774 \uc368\uc904 \uc218 \uc788\ub2e4. \uc5ec\uae30\uc11c T, F\ub97c \ud0c0\uc785 \ud30c\ub77c\ubbf8\ud130\ub77c\uace0 \ud55c\ub2e4. \uadf8\ub9ac\uace0 \uc0ac\uc6a9\uc2dc\uc5d0 \uc774\ub984\ub4a4\uc5d0 &lt;>\uad04\ud638\uc640 \ud568\uaed8 \uc6d0\ud558\ub294 \ud0c0\uc785\uc744 \ub123\uc5b4\uc8fc\uba74 \ub41c\ub2e4. \uc774 \ud0c0\uc785\uc774 \uc120\uc5b8\uc5d0 \uc0ac\uc6a9\ub41c \ud0c0\uc785 \ud30c\ub77c\ubbf8\ud130 \uc790\ub9ac\ub97c \ub300\uce58\ud55c\ub2e4. <\/p>\n\n\n\n<p>\ud074\ub798\uc2a4\uc758 \uacbd\uc6b0\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"class Box&lt;T&gt;(t: T) {\n    var value = t\n}\nval box: Box&lt;Int&gt; = Box&lt;Int&gt;(1)\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Box<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;(t: <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> box: <\/span><span style=\"color: #F69D50\">Box<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt; <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Box<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt;(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc790\ubc14\uc640 \uac19\uc774, \ud074\ub798\uc2a4 \uc774\ub984\ub4a4\uc5d0 &lt;T> \uc640 \uac19\uc774 \ucd94\uac00\ud574\uc900\ub2e4. \uc774 \ud6c4, \ud0c0\uc785\uc774 \ub4e4\uc5b4\uac08 \uc790\ub9ac\uc5d0 \uc774 T\ub97c \uc0ac\uc6a9\ud558\uac8c\ub41c\ub2e4. \uc0ac\uc6a9\uc2dc\uc5d0\ub294 \ud568\uc218 \ub54c\uc640 \ub3d9\uc77c\ud558\uac8c, \ud074\ub798\uc2a4 \uc774\ub984\ub4a4\uc5d0 &lt;\ud0c0\uc785>\uacfc \uac19\uc774 \uc0ac\uc6a9\ud55c\ub2e4. \uc778\ud130\ud398\uc774\uc2a4\ub3c4 \ud074\ub798\uc2a4\uc640 \ub3d9\uc77c\ud558\uac8c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p>\uc774\uc81c in, out  \ud0a4\uc6cc\ub4dc\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc790. <\/p>\n\n\n\n<p>\uc790\ubc14\ub791 \ucc28\uc774\uc810\uc744 \uc54c\uc544\uc57c \ud574\uc11c \uc77c\ub2e8 \uc790\ubc14\uc758 generic\uc5d0 \ub300\ud574 \uc880 \uc54c\uc544\uc57c \ud55c\ub2e4. \uc790\ubc14\uc5d0\uc11c generic type\uc740 \ubd88\ubcc0(invariant)\uc774\ub2e4. \ubb34\uc2a8 \ub9d0\uc774\ub0d0\uba74, <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Java\nList&lt;String&gt; strs = new ArrayList&lt;String&gt;();\n\n\/\/ Java reports a type mismatch here at compile-time.\nList&lt;Object&gt; objs = strs;\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #768390\">\/\/ Java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">List<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">String<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">strs<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> ArrayList&lt;<\/span><span style=\"color: #F47067\">String<\/span><span style=\"color: #ADBAC7\">&gt;();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ Java reports a type mismatch here at compile-time.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">List<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">Object<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">objs<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> strs;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc704\uc640 \uac19\uc774 List&lt;String>\uacfc List&lt;Object>\ub294 \ud638\ud658\uc774 \ub418\uc9c0 \uc54a\ub294\ub2e4. \uc8fc\uc5b4\uc9c4 generic type\ub9cc \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4. \uc774\uac74 \ub7f0\ud0c0\uc784\uc2dc \uc548\uc804\uc744 \uc704\ud55c \uac83\uc774\ub77c\uace0 \ud55c\ub2e4. \ud558\uc9c0\ub9cc, \uc774\ub7f0\uacbd\uc6b0\uac00 \ud544\uc694\ud558\uc9c0 \uc54a\ub098? \ub2e4\uc74c \uc2a4\ud0dd\uc758 \uc608\ub97c \ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/java\npublic void pushAll(Iterable&lt;E&gt; src) {\n    for (E e : src)\n        push(e);\n\n...\nStack&lt;Number&gt; numberStack = new Stack&lt;Number&gt;();\nIterable&lt;Integer&gt; integers = ...;\n\/\/ Error!\nnumberStack.pushAll (integers);\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #768390\">\/\/java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">pushAll<\/span><span style=\"color: #ADBAC7\">(Iterable<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">E<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> src) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (E<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">e<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> src)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">push<\/span><span style=\"color: #ADBAC7\">(e);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Stack<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">Number<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">numberStack<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> Stack&lt;<\/span><span style=\"color: #F47067\">Number<\/span><span style=\"color: #ADBAC7\">&gt;();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Iterable<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">Integer<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">integers<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> ...;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ Error!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">numberStack.<\/span><span style=\"color: #DCBDFB\">pushAll<\/span><span style=\"color: #ADBAC7\"> (integers);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p> \uc704\uc640 \uac19\uc774 \uc0ac\uc6a9\ud558\uba74, invariant\ud55c \uc131\uc9c8 \ub54c\ubb38\uc5d0 Stack&lt;Number>\uc5d0 Integer\ub97c \ub123\uc744 \uc218 \uc5c6\uc5b4\uc11c \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \uc774 \ub54c \uc790\ubc14\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294\uac8c wildcard type \uc778\uc790\ub85c &lt; ?  extends E > \uc640 \uac19\uc774 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Java\npublic void pushAll(Iterable&lt;? extends E&gt; src) {\n    for (E e : src)\n        push(e);\n\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #768390\">\/\/ Java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">pushAll<\/span><span style=\"color: #ADBAC7\">(Iterable<\/span><span style=\"color: #F47067\">&lt;?<\/span><span style=\"color: #ADBAC7\"> extends E<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> src) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">for<\/span><span style=\"color: #ADBAC7\"> (E<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">e<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">:<\/span><span style=\"color: #ADBAC7\"> src)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">push<\/span><span style=\"color: #ADBAC7\">(e);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774 \uac83\uc758 \uc758\ubbf8\ub294 E \ud0c0\uc785\uacfc E\uc758 \uc11c\ube0c\ud0c0\uc785\uc744 \ub2e4 \ubc1b\uc744 \uc218 \uc788\ub2e4\ub294 \uc598\uae30\ub85c \uc704\uc758 \ubb38\uc81c\uac00 \ud574\uacb0\ub41c\ub2e4. \uc774\ub807\uac8c wildcard\uc640 extends-bound\ub97c \uc8fc\uac8c\ub418\uba74 \uc774 \ud0c0\uc785\uc740 covariant\uac00 \ub41c\ub2e4. \uadf8\ub7fc \ub2e4\uc74c\uc73c\ub85c popAll()\uc744 \uc0dd\uac01\ud574\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/java\npublic void popAll(Collection&lt;E&gt; dest) {\n    while(!isEmpty())\n        dest.add(pop());\n}\n...\nStack&lt;Number&gt; numberStack = new Stack&lt;Number&gt;();\nCollection&lt;Object&gt; objects = ...;\nnumberStack.popAll(objects);  \/\/ Error!!\n- - - \npublic void popAll(Collection&lt;? super E&gt; dest) {\n\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #768390\">\/\/java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">popAll<\/span><span style=\"color: #ADBAC7\">(Collection<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">E<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> dest) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">while<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">!<\/span><span style=\"color: #DCBDFB\">isEmpty<\/span><span style=\"color: #ADBAC7\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        dest.<\/span><span style=\"color: #DCBDFB\">add<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">pop<\/span><span style=\"color: #ADBAC7\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Stack<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">Number<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">numberStack<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> Stack&lt;<\/span><span style=\"color: #F47067\">Number<\/span><span style=\"color: #ADBAC7\">&gt;();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">Collection<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">Object<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">objects<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> ...;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">numberStack.<\/span><span style=\"color: #DCBDFB\">popAll<\/span><span style=\"color: #ADBAC7\">(objects);  <\/span><span style=\"color: #768390\">\/\/ Error!!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">-<\/span><span style=\"color: #ADBAC7\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">popAll<\/span><span style=\"color: #ADBAC7\">(Collection<\/span><span style=\"color: #F47067\">&lt;?<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\"> E<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> dest) {<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774 \uacbd\uc6b0, Number\ub97c Collection&lt;Object>\uc5d0 \ub123\uc744 \uc218 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ub610\ub2e4\uc2dc \uc5d0\ub7ec\uc5d0 \uc9c1\uba74\ud55c\ub2e4. \uc774 \ub54c\ub294 pushAll\uacfc \ubc18\ub300\uc758 \uacbd\uc6b0\ub85c, &lt;? super E> wildcard type\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p>\uc774 \uacbd\uc6b0\uc5d0\ub294 contravariance\ub77c\uace0 \ud55c\ub2e4. \uc5ec\uae30\uc11c \uc804\uc790\uc758 \uacbd\uc6b0, \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud574\uc11c \uc2a4\ud0dd\uc5d0 \ub123\uae30 \ub54c\ubb38\uc5d0 \uc0dd\uc0b0\uc790(producer)\ub77c \uce6d\ud558\uace0, \ud6c4\uc790\uc758 \uacbd\uc6b0 \uaebc\ub0b4\uc640 \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \uc18c\ube44\uc790(consumer)\ub77c \uce6d\ud55c\ub2e4. \uadf8\ub798\uc11c \uc774\ub7f0\uacbd\uc6b0 PECS(Producer-Extends, Consumer-Super)\ub85c \uae30\uc5b5\ud558\uace0 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub7fc \uc774\uc81c PECS\uc5d0 \ud574\ub2f9\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/\/ Java\ninterface Source&lt;T&gt; {\n    T nextT();\n}\n\n\/\/ Java\nvoid demo(Source&lt;String&gt; strs) {\n    Source&lt;Object&gt; objects = strs; \/\/ !!! Not allowed in Java\n    \/\/ ...\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #768390\">\/\/ Java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Source<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F47067\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    T <\/span><span style=\"color: #DCBDFB\">nextT<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #768390\">\/\/ Java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">demo<\/span><span style=\"color: #ADBAC7\">(Source<\/span><span style=\"color: #F47067\">&lt;<\/span><span style=\"color: #ADBAC7\">String<\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> strs) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    Source<\/span><span style=\"color: #F69D50\">&lt;<\/span><span style=\"color: #F47067\">Object<\/span><span style=\"color: #F69D50\">&gt; <\/span><span style=\"color: #ADBAC7\">objects<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> strs; <\/span><span style=\"color: #768390\">\/\/ !!! Not allowed in Java<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774 \uacbd\uc6b0, consumer method\ub3c4 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc644\uc804\ud788 \uc548\uc804\ud558\uace0 \ub9c9\uc744 \uc774\uc720\uac00 \uc5c6\ub2e4. \ud558\uc9c0\ub9cc, \uc774\ub97c \ud53c\ud558\uae30\uc704\ud574 Source&lt;? extends Obejct>\ub97c \uc368\uc918\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p>\ucf54\ud2c0\ub9b0\uc5d0\uc11c\ub294 \uc774\ub97c \ucef4\ud30c\uc77c\ub7ec\uc5d0\uac8c \uc54c\ub824\uc904 \ubc29\ubc95\uc774 \uc788\ub2e4. declaration-site variance \ub77c\ub294 \uac83\uc774\ub2e4.  \ud0c0\uc785 T\uac00 \uc624\uc9c1 \ub9ac\ud134\ub9cc\ub418\uace0(produced), consumed \ub418\ub294 \uc77c\uc774 \uc5c6\ub2e4\ub294 \uc758\ubbf8\ub85c &#8216;out&#8217;\uc744 \uc368\uc900\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"interface Source&lt;out T&gt; {\n    fun nextT(): T\n}\n\nfun demo(strs: Source&lt;String&gt;) {\n    val objects: Source&lt;Any&gt; = strs \/\/ This is OK, since T is an out-parameter\n}\n\ninterface Comparable&lt;in T&gt; {\n    operator fun compareTo(other: T): Int\n}\n\nfun demo(x: Comparable&lt;Number&gt;) {\n    x.compareTo(1.0) \/\/ 1.0 has type Double, which is a subtype of Number\n    \/\/ Thus, you can assign x to a variable of type Comparable&lt;Double&gt;\n    val y: Comparable&lt;Double&gt; = x \/\/ OK!\n}\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Source<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">out<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">nextT<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">T<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">demo<\/span><span style=\"color: #ADBAC7\">(strs: <\/span><span style=\"color: #F69D50\">Source<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">&gt;) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> objects: <\/span><span style=\"color: #F69D50\">Source<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Any<\/span><span style=\"color: #ADBAC7\">&gt; <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> strs <\/span><span style=\"color: #768390\">\/\/ This is OK, since T is an out-parameter<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Comparable<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">in<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">operator<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">compareTo<\/span><span style=\"color: #ADBAC7\">(other: <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">demo<\/span><span style=\"color: #ADBAC7\">(x: <\/span><span style=\"color: #F69D50\">Comparable<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Number<\/span><span style=\"color: #ADBAC7\">&gt;) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    x.<\/span><span style=\"color: #DCBDFB\">compareTo<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1.0<\/span><span style=\"color: #ADBAC7\">) <\/span><span style=\"color: #768390\">\/\/ 1.0 has type Double, which is a subtype of Number<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ Thus, you can assign x to a variable of type Comparable&lt;Double&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> y: <\/span><span style=\"color: #F69D50\">Comparable<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Double<\/span><span style=\"color: #ADBAC7\">&gt; <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> x <\/span><span style=\"color: #768390\">\/\/ OK!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc640 \ubc18\ub300\ub85c \uc624\uc9c1 \uc18c\ube44(consumed)\ub9cc \ub418\uace0 \uc0dd\uc0b0(produced)\uc740 \uc548\ub418\ub294 \uacbd\uc6b0\uc5d0, &#8216;in&#8217; \ud0a4\uc6cc\ub4dc\ub97c \uc0ac\uc6a9\ud55c\ub2e4. Comparable\uc740 \ud6cc\ub96d\ud55c \uc608\uc774\ub2e4.<\/p>\n\n\n\n<p>\uc774 \uc678\uc5d0\ub3c4 type projection, star projection\ub4f1\uc774 \uc788\ub294\ub370 \ubb38\uc11c\ub97c \ucc38\uace0\ud558\uc2dc\uae38.  \uacf5\uc2dd \ubb38\uc11c ( <a href=\"https:\/\/kotlinlang.org\/docs\/generics.html\">https:\/\/kotlinlang.org\/docs\/generics.html<\/a> ) \ub098, \uae30\ud0c0 \ub2e4\ub978 \ubb38\uc11c( \uc608: <a href=\"https:\/\/kt.academy\/article\/kfde-generics\">https:\/\/kt.academy\/article\/kfde-generics<\/a> ) \ub4f1<\/p>\n","protected":false},"excerpt":{"rendered":"<p>codepro \ub54c\ubb38\uc5d0 \ud3ec\uc2a4\ud305\uc744 \ub098\ub220\uc11c \uacc4\uc18d \uc9e4\ub77c\uba39\uc5b4\uc57c \ud558\ub294\uac8c \uc9dc\uc99d\ub098\ub124. delegation : https:\/\/kotlinlang.org\/docs\/delegation.htmlhttps:\/\/kotlinlang.org\/docs\/delegated-properties.html \uc704\uc784(delegation) \ub514\uc790\uc778 \ud328\ud134( https:\/\/en.wikipedia.org\/wiki\/Delegation_pattern )\uc740 \ud55c \ud074\ub798\uc2a4\uc758 \uba64\ubc84 \uad6c\ud604\uc744 \uc9c1\uc811 \ud558\uc9c0 \uc54a\uace0, \ub2e4\ub978 \ud074\ub798\uc2a4\uc758 \uba64\ubc84\uad6c\ud604\uc744 \uc774\uc6a9\ud558\ub294 \uac83\uc774\ub2e4. \ub2e4\uc2dc\ub9d0\ud558\uba74, \ub2e4\ub978 \ud074\ub798\uc2a4\uc5d0\uac8c \uc704\uc784\ud558\ub294 \uac83\uc774\ub2e4. \ucf54\ud2c0\ub9b0\uc740 \uc774\ub97c \uc5b8\uc5b4 \uc218\uc900\uc5d0\uc11c \uc9c1\uc811\uc801\uc73c\ub85c \uc9c0\uc6d0\ud55c\ub2e4. \ubc14\ub85c &#8216;by&#8217;\ud0a4\uc6cc\ub4dc\uac00 \uadf8\uac83\uc774\ub2e4. \uc704 \ucf54\ub4dc\uc5d0\uc11c Window \ud074\ub798\uc2a4\ub294 ClosedShape \uc778\ud130\ud398\uc774\uc2a4\uc758 \uad6c\ud604\uc744 bounds\uc5d0\uac8c \uc704\uc784\ud558\uace0 \uc788\ub2e4. \ud074\ub798\uc2a4 \ub2e8\uc704\uac00 \uc544\ub2c8\ub77c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[38,41],"class_list":["post-2605","post","type-post","status-publish","format-standard","hentry","category-kotlin","tag-kotlin","tag-kotlin-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=2605"}],"version-history":[{"count":80,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2605\/revisions"}],"predecessor-version":[{"id":2694,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/2605\/revisions\/2694"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=2605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=2605"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=2605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}