{"id":671224,"date":"2026-01-07T13:06:49","date_gmt":"2026-01-07T12:06:49","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=671224"},"modified":"2026-01-13T10:47:27","modified_gmt":"2026-01-13T09:47:27","slug":"evaluating-kotlin-in-real-projects","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2026\/01\/evaluating-kotlin-in-real-projects\/","title":{"rendered":"\uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c Kotlin \ud3c9\uac00\ud558\uae30"},"content":{"rendered":"<p><em>\uc120\uc784 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4\uc774\uc790 JetBrains \uacf5\uc778 Kotlin \ud2b8\ub808\uc774\ub108\ub85c \ud65c\ub3d9 \uc911\uc778 <a href=\"https:\/\/www.linkedin.com\/in\/urs-peter-70a2882\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/bit.ly\/urs-peter-linked-in\">Urs Peter<\/a>\uac00 \uae30\uace0\ud55c \uae00\uc785\ub2c8\ub2e4. Urs\ub294 \ub354 \uccb4\uacc4\uc801\uc778 \ubc29\ubc95\uc73c\ub85c Kotlin \uc5ed\ub7c9\uc744 \ub192\uc774\uace0 \uc2f6\uc740 \ub3c5\uc790\ub97c \ub300\uc0c1\uc73c\ub85c Xebia Academy\uc5d0\uc11c <a href=\"https:\/\/academy.xebia.com\/upskilling\/kotlin-academy\/\" target=\"_blank\" rel=\"noreferrer noopener\">Kotlin \uc5ed\ub7c9 \uac15\ud654 \ud504\ub85c\uadf8\ub7a8<\/a>\ub3c4 \uc6b4\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/em><\/p>\n<p><em>\uc774 \uae00\uc740 <\/em><strong><em>Java \uae30\ubc18 \ud658\uacbd\uc5d0\uc11c Kotlin\uc744 \uc131\uacf5\uc801\uc73c\ub85c \ub3c4\uc785\ud558\uae30 \uc704\ud55c \uc644\ubcbd \uac00\uc774\ub4dc<\/em><\/strong><em>\ub77c\ub294 \uc81c\ubaa9\uc758 \uc2dc\ub9ac\uc988 \uc911 \ub450 \ubc88\uc9f8 \uae00\uc785\ub2c8\ub2e4. \uc774 \uc2dc\ub9ac\uc988\ub294 \ud55c \uac1c\ubc1c\uc790\uc758 \ud638\uae30\uc2ec\uc5d0\uc11c \uc2dc\uc791\ud558\uc5ec \ud68c\uc0ac \uc804\uccb4\uc758 \ubcc0\ud654\ub85c \uc774\uc5b4\uc9c0\ub294 \uacfc\uc815\uc744 \ud1b5\ud574 \uc2e4\uc81c \ud300 \ub0b4\uc5d0\uc11c Kotlin \ub3c4\uc785\uc774 \uc5b4\ub5bb\uac8c \uc810\uc9c4\uc801\uc73c\ub85c \ud655\ub300\ub418\ub294\uc9c0 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/em><\/p>\n<p><strong>\uc774 \uc2dc\ub9ac\uc988\uc758 \uc804\uccb4 \uae00:<\/strong><\/p>\n<ol>\n<li><a href=\"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2025\/12\/getting-started-with-kotlin-for-java-developers\/\" target=\"_blank\" rel=\"noreferrer noopener\">Java \uac1c\ubc1c\uc790\ub97c \uc704\ud55c Kotlin \uc2dc\uc791\ud558\uae30<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2026\/01\/evaluating-kotlin-in-real-projects\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/10\/evaluating-kotlin-in-real-projects\/\">\uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c Kotlin \ud3c9\uac00\ud558\uae30<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2026\/01\/growing-kotlin-adoption-in-your-company\/\" target=\"_blank\" rel=\"noopener\">\ud68c\uc0ac\uc5d0 Kotlin \ub3c4\uc785 \ud655\uc7a5\ud558\uae30<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2026\/01\/helping-decisionmakers-say-yes-to-kotlin\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/11\/helping-decision-makers-say-yes-to-kotlin\/\">Kotlin \ub3c4\uc785\uc5d0 \ub300\ud55c \uc758\uc0ac\uacb0\uc815\uad8c\uc790\uc758 \ub3d9\uc758 \uc774\ub04c\uc5b4\ub0b4\uae30<\/a><\/li>\n<li><a href=\"http:\/\/blog.jetbrains.com\/ko\/kotlin\/2026\/01\/scaling-kotlin-adoption-across-your-organization\/\">\uc870\uc9c1 \uc804\ubc18\uc73c\ub85c Kotlin \ub3c4\uc785 \ud655\uc7a5\ud558\uae30<\/a><\/li>\n<\/ol>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<h2 class=\"wp-block-heading\"><strong>\ud3c9\uac00 \ub2e8\uacc4: Kotlin \ud655\uc7a5 \uc751\uc6a9<\/strong><\/h2>\n<p>\ud14c\uc2a4\ud2b8 \ub2e8\uacc4\uc5d0\uc11c Kotlin\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc775\ud78c \ud6c4\uc5d0\ub294 \ub354 \uc2e4\uc9c8\uc801\uc778 \ud3c9\uac00\ub97c \uc2dc\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc5d0\ub294 \ud06c\uac8c \ub450 \uac00\uc9c0 \uc811\uadfc \ubc29\uc2dd\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li><a href=\"#1.-build-a-new-microservice\/application-in-kotlin\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/#1.-build-a-new-microservice\/application-in-kotlin\">Kotlin\uc73c\ub85c \uc0c8\ub85c\uc6b4 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4\/\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uad6c\ucd95<\/a><\/li>\n<li><a href=\"#2.-extend\/convert-an-existing-java-application\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/#2.-extend\/convert-an-existing-java-application\">\uae30\uc874 Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud655\uc7a5\/\ubcc0\ud658<\/a><\/li>\n<\/ol>\n<h3 id=\"1.-build-a-new-microservice\/application-in-kotlin\" class=\"wp-block-heading\"><strong>1. Kotlin\uc73c\ub85c \uc0c8\ub85c\uc6b4 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4\/\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uad6c\ucd95<\/strong><\/h3>\n<p>\uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774\ub098 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4\ub97c \ucc98\uc74c\ubd80\ud130 \uac1c\ubc1c\ud558\uba74 \uae30\uc874 \ucf54\ub4dc\uc758 \uc81c\uc57d \uc5c6\uc774 Kotlin\uc758 \ubaa8\ub4e0 \uae30\ub2a5\uc744 \ucda9\ubd84\ud788 \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc811\uadfc \ubc29\uc2dd\uc740 \uc885\uc885 \uac00\uc7a5 \uc88b\uc740 \ud559\uc2b5 \uacbd\ud5d8\uc744 \uc81c\uacf5\ud558\uba70 Kotlin\uc758 \uc7a5\uc810\uc744 \uac00\uc7a5 \ubd84\uba85\ud558\uac8c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<div class=\"wp-block-columns is-layout-flex wp-container-3 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis: 66.66%;\">\n<p><strong>\uc804\ubb38\uac00 \ud301<\/strong>: \uc774 \ub2e8\uacc4\uc5d0\uc11c\ub294 \uc804\ubb38\uac00\uc758 \ub3c4\uc6c0\uc744 \uad6c\ud558\uc138\uc694. \ubb3c\ub860 \uac1c\ubc1c\uc790\ub85c\uc11c \uc790\uc2e0\uc758 \ub2a5\ub825\uc5d0 \ub2f9\uc5f0\ud788 \uc790\uc2e0\uc774 \uc788\uaca0\uc9c0\ub9cc, \ucd08\uae30 \uc2e4\uc218(\uc608: Java \uc2a4\ud0c0\uc77c\uc758 Kotlin \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uac70\ub098 \uae30\ubcf8 Kotlin \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc74c)\ub97c \ud53c\ud558\uba74 \uc218\uac1c\uc6d4\uc758 \uae30\uc220 \ubd80\ucc44\ub97c \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div>\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis: 33.33%;\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-646384\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/10\/unnamed-5.png\" alt=\"\" width=\"600\" height=\"400\" \/><\/figure>\n<\/div>\n<\/div>\n<p>Java \ubc30\uacbd\uc744 \uac00\uc9c4 \uac1c\ubc1c\uc790\ub77c\uba74 Kotlin\uc744 \uc0ac\uc6a9\ud560 \ub54c \ud53c\ud574\uc57c \ud560 \uba87 \uac00\uc9c0 \uc77c\ubc18\uc801\uc778 \ud568\uc815\uc744 \uc18c\uac1c\ud569\ub2c8\ub2e4.<\/p>\n<p><em>\ud568\uc815: Java\uc5d0\uc11c \uc0ac\uc6a9\ud55c \uac83\uacfc \ub2e4\ub978 \ud504\ub808\uc784\uc6cc\ud06c \uc120\ud0dd<\/em><\/p>\n<p>\ud301: <strong>\uae30\uc874 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uace0\uc218\ud558\uc138\uc694<\/strong>.<\/p>\n<p>Java\uc5d0\uc11c Spring Boot\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\uba74 Kotlin\uc5d0\uc11c\ub3c4 \uacc4\uc18d \uc0ac\uc6a9\ud558\uc138\uc694. Spring Boot\ub294 Kotlin\uc744 \ucd5c\uace0 \uc218\uc900\uc73c\ub85c \uc9c0\uc6d0\ud558\ubbc0\ub85c \ub2e4\ub978 \ud504\ub808\uc784\uc6cc\ud06c\ub85c \uc804\ud658\ud558\uc5ec \uc5bb\uc744 \uc218 \uc788\ub294 \ucd94\uac00\uc801 \uc774\uc810\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \uac8c\ub2e4\uac00 \uc0c8\ub85c\uc6b4 \uc5b8\uc5b4\ub97c \ubc30\uc6cc\uc57c \ud560 \ubfd0\ub9cc \uc544\ub2c8\ub77c, \uc0c8\ub85c\uc6b4 \ud504\ub808\uc784\uc6cc\ud06c\ub3c4 \ucd94\uac00\ub85c \uc775\ud600\uc57c \ud558\ubbc0\ub85c \ubcf5\uc7a1\uc131\ub9cc \uac00\uc911\uc2dc\ud0ac \ubfd0 \uc544\ubb34\ub7f0 \uc774\uc810\ub3c4 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\uc911\uc694 \ucc38\uace0 \uc0ac\ud56d<\/strong>: Spring\uc740 Kotlin\uc758 &#8216;\uc124\uacc4\uc5d0 \ub530\ub978 \uc0c1\uc18d&#8217; \uc6d0\uce59\uacfc \ucda9\ub3cc\ud569\ub2c8\ub2e4. \uc774 \uc6d0\uce59\uc5d0 \ub530\ub77c \ud074\ub798\uc2a4\ub97c \ud655\uc7a5\ud558\ub824\uba74 \ud074\ub798\uc2a4\ub97c \uba85\uc2dc\uc801\uc73c\ub85c open\uc73c\ub85c \ud45c\uc2dc\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ubaa8\ub4e0 Spring \uad00\ub828 \ud074\ub798\uc2a4(<code>@Configuration<\/code> \ub4f1)\uc5d0 open \ud0a4\uc6cc\ub4dc\ub97c \ucd94\uac00\ud558\uc9c0 \uc54a\uc73c\ub824\uba74 \ube4c\ub4dc \ud50c\ub7ec\uadf8\uc778(<a href=\"https:\/\/kotlinlang.org\/docs\/all-open-plugin.html#spring-support\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/kotlinlang.org\/docs\/all-open-plugin.html#spring-support<\/a>)\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc798 \uc54c\ub824\uc9c4 \uc628\ub77c\uc778 \ub3c4\uad6c\uc778 <a href=\"https:\/\/start.spring.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Spring Initializr<\/a>\uc744 \uc0ac\uc6a9\ud558\uc5ec Spring \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud558\uba74 \uc774 \ube4c\ub4dc \ud50c\ub7ec\uadf8\uc778\uc774 \ubbf8\ub9ac \uad6c\uc131\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><em>\ud568\uc815: Kotlin \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub300\uc2e0 \uacf5\ud1b5 Java API\ub97c \uc0ac\uc6a9\ud558\uc5ec Java \uc2a4\ud0c0\uc77c\ub85c Kotlin \ucf54\ub4dc \uc791\uc131<\/em><\/p>\n<p>\uc774\ub7ec\ud55c \ud568\uc815\uc740 \ub108\ubb34 \ub9ce\uc73c\ubbc0\ub85c \uba87 \uac00\uc9c0 \uac00\uc7a5 \ud754\ud55c \ud568\uc815\uc5d0 \ub300\ud574 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 1: Kotlin \uceec\ub809\uc158 \ub300\uc2e0 Java \uc2a4\ud2b8\ub9bc \uc0ac\uc6a9<\/em><\/h4>\n<p>\ud301: <strong>\ud56d\uc0c1 Kotlin \uceec\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uc138\uc694.<\/strong><\/p>\n<p>Kotlin \uceec\ub809\uc158\uc740 Java \uceec\ub809\uc158\uacfc \uc644\ubcbd\ud558\uac8c \uc0c1\ud638 \uc6b4\uc6a9 \uac00\ub2a5\ud558\uba70 \uac04\uacb0\ud558\uace0 \uae30\ub2a5\uc774 \ud48d\ubd80\ud55c \uace0\ucc28 \ud568\uc218\ub97c \uc81c\uacf5\ud558\ubbc0\ub85c Java \uc2a4\ud2b8\ub9bc\uc774 \ud544\uc694 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \uc81c\ud488 \uce74\ud14c\uace0\ub9ac\ubcc4\ub85c \uadf8\ub8f9\ud654\ub41c \ub9e4\ucd9c\uc774 \uac00\uc7a5 \ub192\uc740(\uac00\uaca9 * \ud310\ub9e4\ub7c9) \uc0c1\uc704 3\uac1c \uc81c\ud488\uc744 \uc120\ud0dd\ud558\ub3c4\ub85d \uc124\uacc4\ub41c \uc608\uc785\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">record Product(String name, String category, double price, int sold){}\n\nList products = List.of(\n           new Product(\"Lollipop\", \"sweets\", 1.2, 321),\n           new Product(\"Broccoli\", \"vegetable\", 1.8, 5);\n\nMap&lt;String, List&gt; top3RevenueByCategory =\n       products.stream()\n          .collect(Collectors.groupingBy(\n                Product::category,\n                Collectors.collectingAndThen(\n                    Collectors.toList(),\n                    list -&gt; list.stream()\n                              .sorted(Comparator.comparingDouble(\n                                  (Product p) -&gt; p.price() * p.sold())\n                                   .reversed())\n                                   .limit(3)\n                                   .toList()\n                       \t\t)\n          )\n);<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">val top3RevenueByCategory: Map&lt;String, List&gt; =\n   products.groupBy { it.category }\n       .mapValues { (_, list) -&gt;\n           list.sortedByDescending { it.price * it.sold }.take(3)\n       }<\/pre>\n<p>Kotlin\uc740 Java\uc640 \uc0c1\ud638 \uc6b4\uc6a9\uc774 \uac00\ub2a5\ud558\uae30 \ub54c\ubb38\uc5d0 \uae30\ubcf8 Kotlin\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c Java \ud074\ub798\uc2a4\uc640 \ub808\ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc Kotlin(\ub370\uc774\ud130) \ud074\ub798\uc2a4\ub97c \ub300\uc2e0 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 2: Java\uc758 Optional\uc744 \uacc4\uc18d\ud574\uc11c \uc0ac\uc6a9<\/em><\/h4>\n<p>\ud301: <strong>Null \uac00\ub2a5 \ud0c0\uc785\uc744 \ud65c\uc6a9\ud558\uc138\uc694<\/strong>.<\/p>\n<p>Java \uac1c\ubc1c\uc790\uac00 Kotlin\uc73c\ub85c \uc804\ud658\ud558\ub294 \ud575\uc2ec\uc801\uc778 \uc774\uc720 \uc911 \ud558\ub098\ub294 Kotlin\uc758 \uae30\ubcf8\uc801\uc778 null \uac12 \uac00\ub2a5\uc131 \uc9c0\uc6d0\uc73c\ub85c, NullPointerException\uc744 \uc644\uc804\ud788 \ubc29\uc9c0\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c null \uac00\ub2a5 \ud0c0\uc785\ub9cc \uc0ac\uc6a9\ud558\uace0 Optional\uc740 \ud53c\ud558\uc138\uc694. \uc778\ud130\ud398\uc774\uc2a4\uc5d0 Optional\uc774 \uc5ec\uc804\ud788 \ud3ec\ud568\ub418\uc5b4 \uc788\ub098\uc694? \ub2e4\uc74c \ucf54\ub4dc\uc5d0\uc11c \ubcfc \uc218 \uc788\ub4ef\uc774 \uc774\ub97c null \uac00\ub2a5 \ud0c0\uc785\uc73c\ub85c \ubcc0\ud658\ud558\uba74 \uc27d\uac8c \uc81c\uac70\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/Let\u2019s assume this repository is hard to change, because it\u2019s a library you depend on\nclass OrderRepository {\n      \/\/it returns Optional, but we want nullable types\n      fun getOrderBy(id: Long): Optional = \u2026\n}\n\n\/\/Simply add an extension method and apply the orElse(null) trick\nfun OrderRepository.getOrderByOrNull(id: Long): Order? = \n                                    getOrderBy(id).orElse(null)\n\n\/\/Now enjoy the safety and ease of use of nullable types:\n\n\/\/Past:\n val g = repository.getOrderBy(12).flatMap { product -&gt;\n     product.goody.map { it.name }\n}.orElse(\"No goody found\")\n\n\/\/Future:\n val g = repository.getOrderByOrNull(12)?.goody?.name ?: \"No goody found\"<\/pre>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 3: \uc815\uc801 \ub798\ud37c\ub97c \uacc4\uc18d\ud574\uc11c \uc0ac\uc6a9<\/em><\/h4>\n<p>\ud301: <strong>\ud655\uc7a5 \uba54\uc11c\ub4dc\ub97c \ud65c\uc6a9\ud558\uc138\uc694<\/strong>.<\/p>\n<p>\ud655\uc7a5 \uba54\uc11c\ub4dc\ub294 \ub9ce\uc740 \uc774\uc810\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ub798\ud37c\uc640 \ube44\uad50\ud588\uc744 \ub54c \ud655\uc7a5 \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \ucf54\ub4dc\ub97c \ub354 \ub9e4\ub044\ub7fd\uace0 \uc77d\uae30 \uc27d\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud655\uc7a5 \uba54\uc11c\ub4dc\ub294 \ucf54\ub4dc \uc644\uc131\uc73c\ub85c \ucc3e\uc744 \uc218 \uc788\uc9c0\ub9cc \ub798\ud37c\uc758 \uacbd\uc6b0\ub294 \uadf8\ub807\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud655\uc7a5 \uba54\uc11c\ub4dc\uc5d0\ub294 \uac00\uc838\uc624\uae30\uac00 \ud544\uc694\ud558\ubbc0\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud2b9\uc815 \ubd80\ubd84\uc5d0\uc11c \ud655\uc7a5 \uae30\ub2a5\uc744 \uc120\ud0dd\uc801\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/Very common approach in Java to add additional helper methods\npublic class DateUtils {\n      public static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER = \n           DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\");\n\n      public String formatted(LocalDateTime dateTime, \n\t\t              DateTimeFormatter formatter) {\n         return dateTime.format(formatter);\n      }\n\n      public String formatted(LocalDateTime dateTime) {\n         return formatted(dateTime, DEFAULT_DATE_TIME_FORMATTER);\n      }\n}\n\n\/\/Usage\n formatted(LocalDateTime.now());\n<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">val DEFAULT_DATE_TIME_FORMATTER: DateTimeFormatter = \nDateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")\n\n\/\/Use an extension method, including a default argument, which omits the need for an overloaded method.\u00a0\nfun LocalDateTime.asString(\n\u00a0\u00a0\u00a0formatter: DateTimeFormatter = DEFAULT_DATE_TIME_FORMATTER): String =\u00a0\n      this.format(formatter)\n\n\/\/Usage\nLocalDateTime.now().formatted()<\/pre>\n<p>Kotlin\uc740 \ucd5c\uc0c1\uc704 \uba54\uc11c\ub4dc\uc640 \ubcc0\uc218\ub97c \uc81c\uacf5\ud55c\ub2e4\ub294 \uc810\uc744 \uc78a\uc9c0 \ub9c8\uc138\uc694. \uc989, Java\uc5d0\uc11c\ucc98\ub7fc \uac1d\uccb4\uc5d0 \ubc14\uc778\ub529\ud558\uc9c0 \uc54a\uace0\ub3c4 <em><code>DEFAULT_DATE_TIME_FORMATTER<\/code><\/em>\uc640 \uac19\uc740 \uc694\uc18c\ub97c \ucd5c\uc0c1\uc704 \uc694\uc18c\ub85c \uc9c1\uc811 \uc120\uc5b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 4: (\ub2e4\ub8e8\uae30 \ud798\ub4e0) Java API \uc0ac\uc6a9<\/em><\/h4>\n<p>\ud301: <strong>\ub354 \uac04\ub2e8\ud558\uace0 \uc6d0\ud65c\ud55c \ub300\uc548\uc73c\ub85c Kotlin\uc744 \uc0ac\uc6a9\ud558\uc138\uc694.\u00a0<\/strong><\/p>\n<p>Kotlin \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \uae30\ubcf8 \uad6c\ud604\uc774 \uc5ec\uc804\ud788 Java\ub77c\ub3c4 \ud655\uc7a5 \uba54\uc11c\ub4dc\ub97c \ud1b5\ud574 Java \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub354 \uc0ac\uc6a9\uc790 \uce5c\ud654\uc801\uc73c\ub85c \ub9cc\ub4ed\ub2c8\ub2e4. \uac70\uc758 \ubaa8\ub4e0 \uc8fc\uc694 \ud0c0\uc0ac \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640 \ud504\ub808\uc784\uc6cc\ud06c(\uc608: Spring)\uac00 \ub3d9\uc77c\ud55c \uc811\uadfc \ubc29\uc2dd\uc744 \ucc44\ud0dd\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \uc608:<\/strong><\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">String text;\ntry (\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var reader = new BufferedReader(\n                  new InputStreamReader(new FileInputStream(\"out.txt\"), \n            StandardCharsets.UTF_8))) {\n\u00a0\u00a0\u00a0text = reader\n            .lines()\n            .collect(Collectors.joining(System.lineSeparator()));\n}\nSystem.out.println(\"Downloaded text: \" +\u00a0 text + \"n\");<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/Kotlin has enhanced the Java standard library with many powerful extension methods, like on java.io.*, which makes input stream processing a snap due to its fluent nature, fully supported by code completion\n\nval text = FileInputStream(\"path\").use {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0     it.bufferedReader().readText()\n           }\nprintln(\"Downloaded text: $textn\");<\/pre>\n<p><strong>Spring \uc608\uc2dc:<\/strong><br \/>\n<strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">final var books =\u00a0 RestClient.create()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.get()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.uri(\"http:\/\/...\/api\/books\")\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.retrieve()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.body( new ParameterizedTypeReference&lt;List&gt;(){}); \/\/ \u21e6 inconvenient ParameterizedTypeReference<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.springframework.web.client.body\nval books = RestClient.create()\n\u00a0\u00a0\u00a0.get()\n\u00a0\u00a0\u00a0.uri(\"http:\/\/...\/api\/books\")\n\u00a0\u00a0\u00a0.retrieve()\n\u00a0\u00a0\u00a0.body&lt;List&gt;() \/\/\u21e6 Kotlin offers an extension that only requires the type without the need for a ParameterizedTypeReference<\/pre>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 5: public \ud074\ub798\uc2a4\ub9c8\ub2e4 \ubcc4\ub3c4\uc758 \ud30c\uc77c \uc0ac\uc6a9<\/em><\/h4>\n<p>\ud301: <strong> \uad00\ub828 public \ud074\ub798\uc2a4\ub97c \ud558\ub098\uc758 \ud30c\uc77c\uc5d0 \ubcd1\ud569\ud558\uc138\uc694.\u00a0<\/strong><\/p>\n<p>\uc774\ub807\uac8c \ud558\uba74 \uc218\uc2ed \uac1c\uc758 \ud30c\uc77c\uc744 \ud6d1\uc5b4\ubcf4\uc9c0 \uc54a\uace0\ub3c4 \ud2b9\uc815 (\ud558\uc704)\ub3c4\uba54\uc778\uc758 \uad6c\uc870\ub97c \uba85\ud655\ud558\uac8c \uc774\ud574\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-647331\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/10\/unnamed-15.png\" alt=\"\" width=\"1114\" height=\"934\" \/><\/figure>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/For domain classes consider data classes - see why below\ndata class User(val email: String,\n            \/\/Use nullable types for safety and expressiveness\n\u00a0 \u00a0        val avatarUrl: URL? = null,\u00a0\n           var isEmailVerified: Boolean)\n\ndata class Account(val user:User,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val address: Address,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val mfaEnabled:Boolean,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val createdAt: Instant)\n\ndata class Address(val street: String,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val city: String,\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 val postalCode: String)<\/pre>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 6: \uac00\ubcc0 \ud504\ub85c\uadf8\ub798\ubc0d \ud328\ub7ec\ub2e4\uc784 \uc0ac\uc6a9<\/em><\/h4>\n<p>\ud301: <strong>\ubd88\ubcc0\uc131\uc744 \ucc44\ud0dd\ud558\uc138\uc694. Kotlin\uc758 \uae30\ubcf8 \uc6d0\uce59\uc785\ub2c8\ub2e4.<\/strong><\/p>\n<p>Java \ud3ec\ud568\ud55c \ub9ce\uc740 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \ubd88\ubcc0\uc131\uc774 \uc810\ucc28 \uac00\ubcc0\uc131\uc744 \ub300\uccb4\ud558\ub294 \ucd94\uc138\ub294 \ub9e4\uc6b0 \ubd84\uba85\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc720\ub294 \uac04\ub2e8\ud569\ub2c8\ub2e4. \ubd88\ubcc0\uc131\uc740 \uc608\uc0c1\uce58 \ubabb\ud55c \ubd80\uc218 \ud6a8\uacfc\ub97c \ubc29\uc9c0\ud558\uc5ec \ucf54\ub4dc\ub97c \ub354 \uc548\uc804\ud558\uace0 \uc608\uce21 \uac00\ub2a5\ud558\uba70 \uc774\ud574\ud558\uae30 \uc27d\uac8c \ub9cc\ub4e4\uc5b4\uc8fc\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \ub610\ud55c, \ubd88\ubcc0 \ub370\uc774\ud130\ub294 \uacbd\ud569 \uc870\uac74\uc758 \uc704\ud5d8 \uc5c6\uc774 \uc5ec\ub7ec \uc2a4\ub808\ub4dc \uac04\uc5d0 \uc790\uc720\ub86d\uac8c \uacf5\uc720\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ub3d9\uc2dc\uc131\uc774 \uac04\uc18c\ud654\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \uc774\uc720\ub85c Kotlin\uc744 \ud3ec\ud568\ud55c \ub300\ubd80\ubd84\uc758 \ud604\ub300 \uc5b8\uc5b4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ubd88\ubcc0\uc131\uc744 \uac15\uc870\ud558\uac70\ub098 \uac15\ub825\ud558\uac8c \uc639\ud638\ud569\ub2c8\ub2e4. Kotlin\uc5d0\uc11c\ub294 \ubd88\ubcc0\uc131\uc774 \uae30\ubcf8\uc774\uc9c0\ub9cc, \uc815\ub9d0 \ud544\uc694\ud55c \uacbd\uc6b0 \uac00\ubcc0\uc131\uc744 \uc120\ud0dd\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 Kotlin\uc758 <strong>\ubd88\ubcc0\uc131 \ub3c4\uad6c<\/strong>\uc5d0 \ub300\ud55c \uac04\ub2e8\ud55c \uac00\uc774\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n<p>1. <code>var<\/code> \ub300\uc2e0 <code>val<\/code> \uc0ac\uc6a9<\/p>\n<p>\uac00\ub2a5\ud558\uba74 <code>var<\/code> \ub300\uc2e0 <code>val<\/code>\uc744 \uc0ac\uc6a9\ud558\uc138\uc694. <code>val<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uacf3\uc5d0\uc11c <code>var<\/code>\ub97c \uc0ac\uc6a9\ud558\uba74 IntelliJ IDEA\uac00 \uc774\ub97c \uc54c\ub824\uc90d\ub2c8\ub2e4.<\/p>\n<p>2. <code>copy(...)<\/code>\uc640 \ud568\uaed8 (\ubcc0\uacbd \ubd88\uac00\ub2a5\ud55c) data \ud074\ub798\uc2a4 \uc0ac\uc6a9<\/p>\n<p>\ub3c4\uba54\uc778 \uad00\ub828 \ud074\ub798\uc2a4\uc758 \uacbd\uc6b0 <code>val<\/code>\uacfc \ud568\uaed8 <code>data<\/code> \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694. Kotlin\uc758 <code>data<\/code> \ud074\ub798\uc2a4\ub294 \uc885\uc885 Java\uc758 <code>records<\/code> \ud074\ub798\uc2a4\uc640 \ube44\uad50\ub429\ub2c8\ub2e4. \uc11c\ub85c \uc911\ucca9\ub418\ub294 \ubd80\ubd84\uc774 \uc788\uae30\ub294 \ud558\uc9c0\ub9cc <code>data<\/code> \ud074\ub798\uc2a4\ub294 <code>copy(...)<\/code>\ub77c\ub294 \ud575\uc2ec \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774 \uba54\uc11c\ub4dc\uac00 \uc5c6\uc73c\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0\uc11c \uc885\uc885 \ud544\uc694\ud55c <code>records<\/code>\uc758 \ubcc0\ud658 \uc791\uc5c5\uc774 \ub9e4\uc6b0 \ubcf5\uc7a1\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/only immutable state\npublic record Person(String name, int age) {\n\u00a0\u00a0\u00a0\/\/Lack of default parameters requires overloaded constructor\n\u00a0\u00a0\u00a0public Person(String name) {\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this(name, 0);\n\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\/\/+ due to lack of String interpolation\n\u00a0 public String sayHi() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return \"Hello, my name is \" + name + \" and I am \" + age + \" years old.\";\n\u00a0\u00a0\u00a0}\n}\n\n\/\/Usage\nfinal var jack = new Person(\"Jack\", 42);\njack: Person[name=Jack, age=5]\n\n\/\/The issue is here: transforming a record requires manually copying the identical state to the new instance \u2639\ufe0f\nfinal var fred = new Person(\"Fred\", jack.name);<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/also supports mutable state (var)\ndata class Person(val name: String,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0val age: Int = 0) {\n\u00a0 \/\/string interpolation\n\u00a0 fun sayHi() = \"Hi, my name is $name and I am $age years old.\"\n}\nval jack = Person(\"Jack\", 42)\njack: Person(name=Jack, age=42)\n\n\/\/Kotlin offers the copy method, which, due to the \u2018named argument\u2019 feature, allows you to only adjust the state you want to change \ud83d\ude03\nval fred = jack.copy(name = \"Fred\")\nfred: Person(name=Fred, age=42)<\/pre>\n<p>\ub610\ud55c, \uac00\ub2a5\ud55c \ud55c \ub3c4\uba54\uc778 \uad00\ub828 \ud074\ub798\uc2a4\uc5d0 data \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubd88\ubcc0\uc131 \ub355\ubd84\uc5d0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud575\uc2ec \ub85c\uc9c1\uc744 \ucc98\ub9ac\ud560 \ub54c \uc548\uc804\ud558\uace0 \uac04\ub2e8\ud558\uba70 \uc6d0\ud65c\ud55c \uacbd\ud5d8\uc774 \ubcf4\uc7a5\ub429\ub2c8\ub2e4.<\/p>\n<p>\ud301: <strong>\uac00\ubcc0 \uceec\ub809\uc158\ubcf4\ub2e4\ub294 \ubd88\ubcc0 \uceec\ub809\uc158\uc744 \uc120\ud0dd\ud558\uc138\uc694.<\/strong><\/p>\n<p>\ubd88\ubcc0 \uceec\ub809\uc158\uc740 \uc548\uc804\ud558\uac8c \uc804\ub2ec\ub420 \uc218 \uc788\uace0 \uc774\ud574\ud558\uae30 \uc27d\uae30 \ub54c\ubb38\uc5d0 \uc2a4\ub808\ub4dc \uc548\uc804\uc131 \uce21\uba74\uc5d0\uc11c \uc0c1\ub2f9\ud55c \uc774\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. Java \uceec\ub809\uc158\uc740 \uc77c\ubd80 \ubd88\ubcc0\uc131\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 \ub7f0\ud0c0\uc784 \uc608\uc678\uac00 \uc27d\uac8c \ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \uc704\ud5d8\uc774 \ub530\ub985\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">List.of(1,2,3).add(4); \u274cunsafe \ud83d\ude2c! .add(...) compiles, but throws UnsupportedOperationException<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/The default collections in Kotlin are immutable (read-only)\nlistOf(1,2,3).add(4); \u00a0\/\/\u2705safe: does not compile\n\nval l0 = listOf(1,2,3)\u00a0\nval l1 = l0 + 4 \/\/\u2705safe: it will return a new list containing the added element\nl1 shouldBe listOf(1,2,3,4) \/\/\u2705<\/pre>\n<p><code>Collections.<em>unmodifiableList(...)<\/em><\/code><em>\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4. <\/em>\uc774\ub294 \uc548\uc804\ud558\uc9c0 \uc54a\uc744 \ubfd0\ub9cc \uc544\ub2c8\ub77c \ucd94\uac00 \ud560\ub2f9\ub3c4 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PersonRepo {\n\u00a0\u00a0\u00a0private final List cache = new ArrayList();\n\u00a0\u00a0\u00a0\/\/ Java \u2013 must clone or wrap every call\n\u00a0\u00a0\u00a0public List getItems() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Collections.unmodifiableList(cache); \u00a0 \/\/\u26a0\ufe0fextra alloc\n\u00a0\u00a0\u00a0}\n}\n\n\/\/Usage\npersonRepo.getItems().add(joe) \u274cunsafe \ud83d\ude2c! .add(...) can be called but throws UnsupportedOperationException<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PersonRepo {\n\n\/\/The need to type \u2018mutable\u2019 for mutable collections is intentional: Kotlin wants you to use immutable ones by default. But sometimes you need them:\n\n\u00a0\u00a0\u00a0private val cache: MutableList = mutableListOf()\n\n\u00a0\u00a0\u00a0fun items(): List = cache \/\/\u2705safe: though the underlying collection is mutable, by returning it as its superclass List, it only exposes the read-only interface\n\n}\n\n\/\/Usage\npersonRepo.items().add(joe) \/\/\u2705safe:\ud83d\ude2c! Does not compile<\/pre>\n<p>\ub3d9\uc2dc\uc131 \uce21\uba74\uc5d0\uc11c \uceec\ub809\uc158\uc744 \ud3ec\ud568\ud55c \ubd88\ubcc0 \ub370\uc774\ud130 \uad6c\uc870\ub97c \uc6b0\uc120\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4. Java\uc5d0\uc11c\ub294 <code>CopyOnWriteArrayList<\/code>\uc640 \uac19\uc774 \ub2e4\ub974\uac70\ub098 \uc81c\ud55c\ub41c API\ub97c \uc81c\uacf5\ud558\ub294 \uc77c\ubd80 \ud2b9\uc218 \uceec\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \ucd94\uac00\uc801\uc73c\ub85c \uc791\uc5c5\ud574\uc57c \ud569\ub2c8\ub2e4. \ubc18\uba74, Kotlin\uc5d0\uc11c\ub294 \uc77d\uae30 \uc804\uc6a9 <code>List<\/code>\uac00 \uac70\uc758 \ubaa8\ub4e0 \uc0ac\uc6a9 \uc0ac\ub840\uc758 \uc694\uad6c \uc0ac\ud56d\uc744 \ucda9\uc871\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubcc0\uacbd \uac00\ub2a5\ud558\uace0 \uc2a4\ub808\ub4dc\ub85c\ubd80\ud130 \uc548\uc804\ud55c \uceec\ub809\uc158\uc774 \ud544\uc694\ud55c \uacbd\uc6b0, Kotlin\uc740 \ub3d9\uc77c\ud558\uba74\uc11c \uac15\ub825\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uacf5\uc720\ud558\ub294 \uc601\uad6c \uceec\ub809\uc158(<code>persistentListOf(...)<\/code>, <code>persistentMapOf(...)<\/code>)\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ConcurrentHashMap persons = new ConcurrentHashMap();\npersons.put(\"Alice\", 23);\npersons.put(\"Bob\", \u00a0 21);\n\n\/\/not fluent and data copying going on\nMap incPersons = new HashMap(persons.size());\npersons.forEach((k, v) -&gt; incPersons.put(k, v + 1));\n\n\/\/wordy and data copying going on\npersons\n\u00a0\u00a0\u00a0.entrySet()\n\u00a0\u00a0\u00a0.stream()\n\u00a0\u00a0\u00a0.forEach(entry -&gt;\u00a0\n      entry.setValue(entry.getValue() + 1));<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">persistentMapOf(\"Alice\" to 23, \"Bob\" to 21)\n\u00a0\u00a0\u00a0      .mapValues { (key, value) -&gt; value + 1 } \/\/\u2705same rich API like any other Kotlin Map type and not data copying going on<\/pre>\n<h4 class=\"wp-block-heading\"><em>\ud568\uc815 7: \ube4c\ub354\ub97c \uacc4\uc18d\ud574\uc11c \uc0ac\uc6a9(\uc2ec\uc9c0\uc5b4 Lombok\uc744 \uc0ac\uc6a9\ud558\ub824\uace0 \ud568)\u00a0<\/em><\/h4>\n<p>\ud301: <strong>\uba85\uba85\ub41c \uc778\uc218\ub97c \uc0ac\uc6a9\ud558\uc138\uc694.<\/strong><\/p>\n<p>\ube4c\ub354\ub294 Java\uc5d0\uc11c \ub9e4\uc6b0 \uc77c\ubc18\uc801\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ube4c\ub354\ub294 \uc0ac\uc6a9\ud558\uae30 \ud3b8\ub9ac\ud558\uc9c0\ub9cc \ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \uc548\uc804\ud558\uc9c0 \uc54a\uc73c\uba70, \ubcf5\uc7a1\uc131\uc744 \uc99d\uac00\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. Kotlin\uc5d0\uc11c \ube4c\ub354\ub294 \uc804\ud600 \uc4f8\ubaa8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \uac04\ub2e8\ud55c \uc5b8\uc5b4 \uae30\ub2a5\uc778 \uba85\uba85\ub41c \uc778\uc218\uac00 \uadf8 \uc5ed\ud560\uc744 \ub300\uc2e0\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public record Person(String name, int age) {\n\n\u00a0\u00a0\u00a0\/\/ Builder for Person\n\u00a0\u00a0\u00a0public static class Builder {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private String name;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0private int age;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Builder() {}\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Builder name(String name) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.name = name;\n\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return this;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Builder age(int age) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.age = age;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return this;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Person build() {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return new Person(name, age);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0}\n}\n\n\/\/Usage\nnew JPerson.Builder().name(\"Jack\").age(36).build(); \/\/compiles and succeeds at runtime\n\nnew JPerson.Builder().age(36).build(); \/\/\u274cunsafe \ud83d\ude2c: compiles but fails at runtime.<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data class Person(val name: String, val age: Int = 0)\n\n\/\/Usage - no builder, only named arguments.\nPerson(name = \"Jack\") \/\/\u2705safe: if it compiles, it always succeeds at runtime\nPerson(name = \"Jack\", age = 36) \/\/\u2705<\/pre>\n<h3 id=\"2.-extend\/convert-an-existing-java-application\" class=\"wp-block-heading\"><strong>2. \uae30\uc874 Java \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud655\uc7a5\/\ubcc0\ud658<\/strong><\/h3>\n<p>Kotlin\uc744 \ucc98\uc74c\ubd80\ud130 \uc2dc\ub3c4\ud574 \ubcfc \ub9ac\uc18c\uc2a4\uac00 \uc5c6\ub2e4\uba74 <a href=\"https:\/\/www.jetbrains.com\/help\/idea\/get-started-with-kotlin.html#add-kotlin-dependency\" target=\"_blank\" rel=\"noreferrer noopener\">\uae30\uc874 Java \ucf54\ub4dc\ubca0\uc774\uc2a4\uc5d0 \uc0c8\ub85c\uc6b4 Kotlin \uae30\ub2a5\uc774\ub098 \uc644\uc804\ud55c Kotlin \ubaa8\ub4c8\uc744 \ucd94\uac00<\/a>\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Kotlin\uc740 Java\uc640 \uc6d0\ud65c\ud558\uac8c \uc0c1\ud638 \uc6b4\uc6a9\ub418\ubbc0\ub85c Java \uac04 \ud638\ucd9c\uc790\uc640 \uac19\uc774 Kotlin \ucf54\ub4dc\ub97c \uc4f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc811\uadfc \ubc29\uc2dd\uc73c\ub85c \ub2e4\uc74c\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ub300\ub300\uc801\uc73c\ub85c \uc7ac\uc791\uc131\ud560 \ud544\uc694 \uc5c6\uc774 \uc810\uc9c4\uc801\uc73c\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/li>\n<li>\ud2b9\uc815 \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c \uc2e4\uc81c\ub85c Kotlin \ud14c\uc2a4\ud2b8<\/li>\n<li>\ud504\ub85c\ub355\uc158 \uc218\uc900\uc758 Kotlin \ucf54\ub4dc\ub85c \ud300 \uc2e0\ub8b0 \uad6c\ucd95<\/li>\n<\/ul>\n<p><em>\uc544\ubb34 \ubaa9\uc801 \uc5c6\uc774<\/em> \uc2dc\uc791\ud558\ub294 \ub300\uc2e0 \ub2e4\uc74c\uacfc \uac19\uc740 \ub2e4\uc591\ud55c \uc811\uadfc \ubc29\uc2dd\uc744 \uace0\ub824\ud574 \ubcf4\uc138\uc694.<\/p>\n<p><strong>\ubc16\uc5d0\uc11c \uc548\uc73c\ub85c:<\/strong><\/p>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 &#8216;\uac04\ub2e8\ud55c&#8217; \ubd80\ubd84(\uc608: \ucee8\ud2b8\ub864\ub7ec, \uc77c\uad04 \uc791\uc5c5 \ub4f1)\ubd80\ud130 \uc2dc\uc791\ud558\uc5ec \uc810\ucc28 \ud575\uc2ec \uc601\uc5ed\uc73c\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. \uc774 \uc811\uadfc \ubc29\uc2dd\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc7a5\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\ucef4\ud30c\uc77c\ud0c0\uc784 \uaca9\ub9ac<\/strong>. Leaf \ud074\ub798\uc2a4\uc5d0 <em>\uc758\uc874\ud558\ub294<\/em> \ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\ub294 \uac70\uc758 \uc5c6\uc73c\ubbc0\ub85c \uc2dc\uc2a4\ud15c\uc758 \ub098\uba38\uc9c0 \ubd80\ubd84\uc740 \ubcc0\uacbd \uc5c6\uc774 \ube4c\ub4dc\ud558\uba74\uc11c \uc774\ub97c Kotlin\uc73c\ub85c \ubcc0\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\uc5f0\uc1c4\uc801 \ud3b8\uc9d1\uc774 \uc904\uc5b4\ub4ed\ub2c8\ub2e4<\/strong>. \uc6d0\ud65c\ud55c \uc0c1\ud638 \uc6b4\uc6a9\uc131 \ub355\ubd84\uc5d0 \ubcc0\ud658\ub41c UI\/\ucee8\ud2b8\ub864\ub7ec\ub294 \uae30\uc874 Java \ub3c4\uba54\uc778 \ucf54\ub4dc\ub97c \ud638\ucd9c\ud560 \ub54c \uac70\uc758 \ubcc0\uacbd\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\ud480 \ub9ac\ud018\uc2a4\ud2b8\uac00 \uc801\uc744\uc218\ub85d \uac80\ud1a0\uac00 \ub354 \uc26c\uc6cc\uc9d1\ub2c8\ub2e4<\/strong>. \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc740 \ud30c\uc77c\uc774\ub098 \uae30\ub2a5\ubcc4\ub85c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><strong>\uc548\uc5d0\uc11c \ubc16\uc73c\ub85c:<\/strong><\/p>\n<p>\uc911\uc2ec\uc5d0\uc11c \ubc14\uae65\uc73c\ub85c \uc774\ub3d9\ud558\ub294 \uc811\uadfc \ubc29\uc2dd\uc740 \uc704\ud5d8\ud55c \uacbd\uc6b0\uac00 \ub9ce\uc2b5\ub2c8\ub2e4. \uc55e\uc11c \uc5b8\uae09\ud55c &#8216;\ubc16\uc5d0\uc11c \uc548\uc73c\ub85c&#8217; \uc811\uadfc \ubc29\uc2dd\uc758 \uc7a5\uc810\uc774 \uc57d\ud654\ub418\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub2e4\uc74c\uacfc \uac19\uc740 \uc0c1\ud669\uc5d0\uc11c\ub294 \uc774 \ubc29\ubc95\uc774 \uc5ec\uc804\ud788 \uc2e4\ud589 \uac00\ub2a5\ud55c \uc635\uc158\uc785\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\ud575\uc2ec \ubd80\ubd84\uc774 \ub9e4\uc6b0 \uc791\uac70\ub098 \uc790\uccb4\uc801\uc73c\ub85c \ubaa8\ub450 \ud3ec\ud568<\/strong>. \ub3c4\uba54\uc778 \uacc4\uce35\uc5d0 POJO\uc640 \uc11c\ube44\uc2a4\uac00 \uba87 \uac1c\ub9cc \uc788\ub294 \uacbd\uc6b0, \uc870\uae30\uc5d0 \ubcc0\ud658\ud558\ub294 \ub370 \ube44\uc6a9\uc774 \ub35c \ub4e4\uace0 \uad00\uc6a9\uc801 \uad6c\ubb38(data \ud074\ub798\uc2a4, value \ud074\ub798\uc2a4, sealed \uacc4\uce35 \uad6c\uc870)\uc744 \uc989\uc2dc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\uad6c\uc870\ub97c \uc0c8\ub86d\uac8c \uc124\uacc4<\/strong>. \ub9c8\uc774\uadf8\ub808\uc774\uc158 \uc911\uc5d0 \ubd88\ubcc0\uc2dd\uc744 \ub9ac\ud329\ud130\ub9c1\ud558\uac70\ub098 DDD \ud328\ud134(\uac12 \uac1d\uccb4, \uc9d1\uacc4)\uc744 \ub3c4\uc785\ud560 \uacc4\ud68d\uc774\ub77c\uba74 \uba3c\uc800 Kotlin\uc5d0\uc11c \ub3c4\uba54\uc778\uc744 \uc7ac\uc124\uacc4\ud558\ub294 \uac83\uc774 \ub354 \uae54\ub054\ud560 \ub54c\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\uc5c4\uaca9\ud55c null \uc548\uc804 \uad00\ub9ac.<\/strong> Kotlin\uc744 \uc911\uc2ec\uc5d0 \ub193\uc73c\uba74 \ub3c4\uba54\uc778\uc744 &#8216;null \uc548\uc804 \uc694\uc0c8&#8217;\ub85c \ubcc0\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\uae65 Java \ucf54\ub4dc\ub294 \uc5ec\uc804\ud788 null\uc744 \uc804\ub2ec\ud560 \uc218 \uc788\uc9c0\ub9cc \uacbd\uacc4\uac00 \ub354 \uba85\ud655\ud574\uc9c0\uace0 \uad00\ub9ac\ud558\uae30 \uc26c\uc6cc\uc9d1\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><strong>\ubaa8\ub4c8\ubcc4<\/strong><\/p>\n<ul>\n<li>\uc544\ud0a4\ud14d\ucc98\uac00 \uacc4\uce35\uc774 \uc544\ub2cc \uae30\ub2a5\ubcc4\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uace0 \ubaa8\ub4c8 \ud06c\uae30\uac00 \uad00\ub9ac \uac00\ub2a5\ud55c \uc218\uc900\uc774\ub77c\uba74 \ubaa8\ub4c8\uc744 \ud558\ub098\uc529 \ubcc0\ud658\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><strong>Java\ub97c Kotlin\uc73c\ub85c \ubcc0\ud658\ud558\uae30 \uc704\ud55c \uc5b8\uc5b4 \uae30\ub2a5<\/strong><\/p>\n<p>Kotlin\uc740 Kotlin \ucf54\ub4dc\uac00 \ub124\uc774\ud2f0\ube0c Java\ucc98\ub7fc \ub3d9\uc791\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ub2e4\uc591\ud55c \uae30\ub2a5(\uc77c\ucc28\uc801\uc73c\ub85c \uc5b4\ub178\ud14c\uc774\uc158)\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub294 \ud2b9\ud788 Kotlin\uacfc Java\uac00 \ub3d9\uc77c\ud55c \ucf54\ub4dc\ubca0\uc774\uc2a4\uc5d0 \uacf5\uc874\ud558\ub294 \ud558\uc774\ube0c\ub9ac\ub4dc \ud658\uacbd\uc5d0\uc11c \ub9e4\uc6b0 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4.<br \/>\n<strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Person @JvmOverloads constructor(val name: String,\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var age: Int = 0) {\n\u00a0 companion object {\n\n\u00a0 @JvmStatic\n\u00a0 @Throws(InvalidNameException::class)\n\u00a0 fun newBorn(name: String): Person = if (name.isEmpty())\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw InvalidNameException(\"name not set\")\n\u00a0\u00a0\u00a0\u00a0\u00a0else Person(name, 0)\n\n\u00a0\u00a0\u00a0@JvmField\n\u00a0\u00a0\u00a0val LOG = LoggerFactory.getLogger(KPerson.javaClass)\n\u00a0\u00a0}\n}<\/pre>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/thanks to @JvmOverloads an additional constructor is created, propagating Kotlin\u2019s default arguments to Java\nvar john =\u00a0 new Person(\"John\");\n\n\/\/Kotlin automatically generates getters (val) and setters (var) for Java\njohn.setAge(23);\nvar name = ken.getName();\n\n\/\/@JvmStatic and @JvmField all accessing (companion) object fields and methods as statics in Java\n\n\/\/Without @JvmStatic it would be: Person.Companion.newBorn(...)\nvar ken =\u00a0 Person.newBorn(\"Ken\");\u00a0\n\n\/\/Without @JvmField it would be: Person.Companion.LOG\nPerson.LOG.info(\"Hello World, Ken ;-)\");\n\n\/\/@Throws(...) will put the checked Exception in the method signature \ntry {\n\u00a0 Person ken =\u00a0 Person.newBorn(\"Ken\");\n} catch (InvalidNameException e) {\n\u00a0 \/\/\u2026\n}<\/pre>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@file:JvmName(\"Persons\")\npackage org.abc\n\n@JvmName(\"prettyPrint\")\n\nfun Person.pretty() =\n\u00a0 \u00a0 \u00a0 Person.LOG.info(\"$name is $age old\")<\/pre>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/@JvmName for files and methods makes accessing static fields look like Java: without it would be: PersonKt.pretty(...)\nPersons.prettyPrint(ken)<\/pre>\n<p><strong>IntelliJ IDEA\uc758 Java\uc5d0\uc11c Kotlin\uc73c\ub85c\uc758 \ubcc0\ud658\uae30<\/strong><\/p>\n<p>IntelliJ IDEA\ub294 Java\uc5d0\uc11c Kotlin\uc73c\ub85c\uc758 \ubcc0\ud658\uae30\ub97c \uc81c\uacf5\ud558\ubbc0\ub85c \uc774\ub860\uc801\uc73c\ub85c\ub294 \uc774 \ub3c4\uad6c\ub85c \ubcc0\ud658\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc0dd\uc131\ub41c \ucf54\ub4dc\ub294 \uc644\ubcbd\ud568\uacfc\ub294 \uac70\ub9ac\uac00 \uba40\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ubc1c\uc810\uc73c\ub85c\ub9cc \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ubc14\ud0d5\uc73c\ub85c \ucf54\ub4dc\ub97c \ub354\uc6b1 Kotlin\uc2a4\ub7fd\uac8c \ub2e4\ub4ec\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc774 \uc8fc\uc81c\ub294 \uc774 \ube14\ub85c\uadf8 \uc2dc\ub9ac\uc988\uc758 \ub9c8\uc9c0\ub9c9 \uac8c\uc2dc\ubb3c\uc778 <em>\ub300\uaddc\ubaa8 Kotlin \ub3c4\uc785\uc758 \uc131\uacf5 \uc694\uc778<\/em>\uc5d0\uc11c\ub294 \ub354 \uc790\uc138\ud788 \ub2e4\ub8f0 \uc608\uc815\uc785\ub2c8\ub2e4.<\/p>\n<p>Java\ub85c \uc2dc\uc791\ud558\uba74 Java\uc2a4\ub7ec\uc6b4 Kotlin \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uac00\ub2a5\uc131\uc774 \ub192\uace0 \uc774\ub294 \uc774\uc810\uc774 \ub418\ub294 \uce21\uba74\ub3c4 \uc788\uc9c0\ub9cc Kotlin\uc758 \uc7a0\uc7ac\ub825\uc744 \uc644\uc804\ud788 \uc774\ub04c\uc5b4\ub0b4\uc9c0 \ubabb\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ubbc0\ub85c \uc800\ub294 \uc0c8\ub85c\uc6b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc791\uc131\ud558\ub294 \uc811\uadfc \ubc29\uc2dd\uc744 \uc120\ud638\ud569\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\uc2dc\ub9ac\uc988\uc758 \ub2e4\uc74c \uac8c\uc2dc\ubb3c<\/h3>\n<p><em>Java \uae30\ubc18 \ud658\uacbd\uc5d0\uc11c Kotlin\uc744 \uc131\uacf5\uc801\uc73c\ub85c \ub3c4\uc785\ud558\uae30 \uc704\ud55c \uc644\ubcbd \uac00\uc774\ub4dc<\/em> \uc2dc\ub9ac\uc988\uc758 \ube14\ub85c\uadf8 \uae00\uc5d0\uc11c\ub294 Kotlin \uc2e4\ud5d8\uc744 \uc810\uc9c4\uc801\uc73c\ub85c \ud504\ub85c\ub355\uc158\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ucf54\ub4dc\ub85c \uac1c\ubc1c\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec \ub4dc\ub838\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uae00\uc5d0\uc11c\ub294 Kotlin \ub3c4\uc785\uc758 \uc778\uac04\uc801 \uc694\uc778, \uc989 \ub3d9\ub8cc \uc124\ub4dd\uc5d0 \ub300\ud574 \uc911\uc810\uc801\uc73c\ub85c \ub2e4\ub8e8\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \ucf54\ub4dc \uc911\uc2ec\uc758 \ub17c\uc758\ub97c \uba85\ud655\ud788 \ud558\uace0, \uc0c8\ub85c\uc6b4 \uac1c\ubc1c\uc790\ub97c \uc9c0\ub3c4\ud558\uba70, \ud300 \ub0b4\uc5d0 \uc791\uc9c0\ub9cc \uc9c0\uc18d \uac00\ub2a5\ud55c Kotlin \ucee4\ubba4\ub2c8\ud2f0\ub97c \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc18c\uac1c\ud569\ub2c8\ub2e4.<\/p>\n<div class=\"about-author \">\n<div class=\"about-author__box\">\n<div class=\"row\">\n<div class=\"about-author__box-img\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/10\/a3f7-400o400o1-QYUavRYyARnAVJLCpM1m8M.webp\" alt=\"\" \/><\/div>\n<div class=\"about-author__box-text\">\n<h4>Urs Peter<\/h4>\n<p>Urs\ub294 20\ub144 \uc774\uc0c1\uc5d0 \uac78\uccd0 Kotlin\uacfc Scala\ub97c \uc8fc\ub85c \uc0ac\uc6a9\ud558\uc5ec \ubcf5\uc6d0\ub825 \uc788\uace0 \ud655\uc7a5 \uac00\ub2a5\ud558\uba70 \uc784\ubb34 \uc218\ud589\uc5d0 \ud544\uc218\uc801\uc778 \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud55c \ud48d\ubd80\ud55c \uacbd\ud5d8\uc744 \uac00\uc9c4 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4\uc774\uc790 \uc194\ub8e8\uc158 \uc544\ud0a4\ud14d\ud2b8, \ucf58\ud37c\ub7f0\uc2a4 \uc5f0\uc0ac, \ud2b8\ub808\uc774\ub108\uc785\ub2c8\ub2e4.<\/p>\n<p>\ucee8\uc124\ud134\ud2b8\ub85c \ud65c\ub3d9\ud558\ub294 \uc678\uc5d0\ub3c4 \uc5f4\uc815\uc801\uc778 \ud2b8\ub808\uc774\ub108\ub85c\uc11c Kotlin \ubc0f Scala \uc5b8\uc5b4 \uacfc\uc815\ubd80\ud130 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \ubc0f \uc774\ubca4\ud2b8 \uae30\ubc18 \uc544\ud0a4\ud14d\ucc98\uc5d0 \ub300\ud55c \uc544\ud0a4\ud14d\ucc98 \uad50\uc721\uae4c\uc9c0 \uad11\ubc94\uc704\ud55c \uc8fc\uc81c\ub97c \ub2e4\ub8e8\ub294 \ub2e4\uc591\ud55c \uad50\uc721 \uacfc\uc815\uc744 \uc800\uc220\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ucc9c\uc131\uc801\uc73c\ub85c \uc0ac\uad50\uc801\uc778 \uc0ac\ub78c\uc73c\ub85c, \ubaa8\uc784\uacfc \ucf58\ud37c\ub7f0\uc2a4\uc5d0\uc11c \uc9c0\uc2dd\uc744 \uacf5\uc720\ud558\uace0 \ub3d9\ub8cc\ub4e4\uacfc \uc601\uac10\uc744 \ub098\ub204\ub294 \uac83\uc744 \uc88b\uc544\ud569\ub2c8\ub2e4. Urs\ub294 JetBrains \uc778\uc99d Kotlin \ud2b8\ub808\uc774\ub108\uc785\ub2c8\ub2e4.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1191,"featured_media":672370,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/671224"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/1191"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=671224"}],"version-history":[{"count":5,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/671224\/revisions"}],"predecessor-version":[{"id":674074,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/671224\/revisions\/674074"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/672370"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=671224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=671224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=671224"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=671224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}