{"id":672534,"date":"2026-01-08T15:22:14","date_gmt":"2026-01-08T14:22:14","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=672534"},"modified":"2026-01-13T10:45:49","modified_gmt":"2026-01-13T09:45:49","slug":"growing-kotlin-adoption-in-your-company","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2026\/01\/growing-kotlin-adoption-in-your-company\/","title":{"rendered":"\ud68c\uc0ac \ub0b4 Kotlin \ub3c4\uc785 \ud655\ub300\ud558\uae30"},"content":{"rendered":"<p>\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 <em><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 <em>Xebia Academy<\/em>\uc5d0\uc11c <\/em><a href=\"https:\/\/academy.xebia.com\/upskilling\/kotlin-academy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Kotlin \uc5ed\ub7c9 \uac15\ud654 \ud504\ub85c\uadf8\ub7a8<\/em><\/a>\ub3c4 \uc6b4\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/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\ub85c \uac8c\uc7ac\ub418\ub294 \uc138 \ubc88\uc9f8 \uae00\uc785\ub2c8\ub2e4. \uc774 \uc2dc\ub9ac\uc988\ub294 \ud55c \uac1c\ubc1c\uc790\uc758 \ud638\uae30\uc2ec\uc5d0\uc11c \uc2dc\uc791\ud574 \uc804\uc0ac\uc801\uc778 \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 \uc18c\uac1c\ud569\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\">\uc18c\ubb38\uc744 \ud37c\ub728\ub824\ub77c: \ub3d9\ub8cc \uac1c\ubc1c\uc790\ub4e4\uc758 \ub9c8\uc74c\uacfc \uc0dd\uac01\uc744 \uc0ac\ub85c\uc7a1\uae30<\/h2>\n<p>\uc9c0\uae08\ucbe4\uc774\uba74 Kotlin\uc758 \uc7a5\uc810\uc744 \ucda9\ubd84\ud788 \uc778\uc9c0\ud558\uace0 \uc788\ub294 \ud575\uc2ec \ud300\uc774 \uad6c\uc131\ub418\uc5b4 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4. \uc774\uc81c\ubd80\ud130\uac00 \uc911\uc694\ud55c \ub2e8\uacc4\uc785\ub2c8\ub2e4. \ub3c4\uc785\uc744 \uc5b4\ub5bb\uac8c \ud655\uc7a5\ud560 \uc218 \uc788\uc744\uae4c\uc694?<\/p>\n<p>\uc774 \ub2e8\uacc4\uc758 \ud575\uc2ec\uc740 \ub3c4\uc785\uc5d0 \ud68c\uc758\uc801\uc778 Java \uac1c\ubc1c\uc790\ub4e4\uacfc \uacf5\uac10\ub300\ub97c \ud615\uc131\ud558\ub294 \ub370 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\uc220\uc801 \uc694\uc778\uacfc \ubb38\ud654\uc801 \uc694\uc778\uc774 \uc911\uc694\ud55c \ucc28\uc774\ub97c \ub9cc\ub4e4\uc5b4\ub0c5\ub2c8\ub2e4.<\/p>\n<p>\uae30\uc220\uc801 \uc694\uc778: \ucf54\ub4dc<\/p>\n<ul>\n<li>\ucf54\ub4dc \uc790\uccb4\uc758 \uac15\uc810\uc73c\ub85c \uc124\ub4dd<\/li>\n<\/ul>\n<p>\ubb38\ud654\uc801 \uc694\uc778: \uac1c\ubc1c\uc790 \uc9c0\uc6d0 \ubc0f \uc5f0\uacb0<\/p>\n<ul>\n<li>\uc27d\uace0 \uc6d0\ud65c\ud55c \uc628\ubcf4\ub529 \uc9c0\uc6d0<\/li>\n<li>\uc790\uae30\uc8fc\ub3c4 \ud559\uc2b5 \uc790\ub8cc \uc81c\uacf5<\/li>\n<li>\uc0ac\ub0b4 Kotlin \ucee4\ubba4\ub2c8\ud2f0 \uad6c\ucd95<\/li>\n<li>\uc5ec\uc720\ub97c \uac00\uc9c8 \uac83<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>\ucf54\ub4dc \uc790\uccb4\uc758 \uac15\uc810\uc73c\ub85c \uc124\ub4dd<\/strong><\/h3>\n<p>Kotlin\uc73c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 (\uc7ac)\uc791\uc131\ud558\uba70 \uc313\uc740 \uacbd\ud5d8\uc744 \ubc14\ud0d5\uc73c\ub85c, \uadf8 \uc774\uc810\uc5d0 \ub300\ud574 \ub204\uad6c\ub098 \uc774\ud574\ud560 \uc218 \uc788\ub294 \uba85\ud655\ud55c \ubc29\uc2dd\uc73c\ub85c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\uc124\uba85\ud558\uae30\ubcf4\ub2e4 \ubcf4\uc5ec\uc904 \uac83<\/strong>: Java\uc640 Kotlin \uc2a4\ub2c8\ud3ab\uc744 \ube44\uad50\ud574 Kotlin\uc758 \uac04\uacb0\ud568\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/li>\n<li><strong>\uc804\uccb4\uc801\uc778 \ud328\ub7ec\ub2e4\uc784\uc5d0 \ucd08\uc810\uc744 \ub450\uace0 \ud655\uc7a5\ud560 \uac83<\/strong>: Kotlin\uc740 \ub2e8\uc21c\ud788 Java\uc640 <em>\ub2e4\ub978<\/em> \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4. \uc548\uc804\uc131, \uac00\ub3c5\uc131 \ubc0f \uc720\uc9c0 \uad00\ub9ac \ud3b8\uc758\uc131\uc744 \uadf9\ub300\ud654\ud558\uae30 \uc704\ud55c \uac04\uacb0\ud568, \uae30\ubcf8 \uc694\uc18c\ub85c\uc11c\uc758 \ud568\uc218, \ud655\uc7a5\uc131\uc744 \uae30\ubc18\uc73c\ub85c \uc124\uacc4\ub418\uc5c8\uc73c\uba70, \uc774\ub97c \ud1b5\ud574 Java\uc758 \uadfc\ubcf8\uc801\uc778 \ud55c\uacc4\ub97c \ud574\uacb0\ud558\uba74\uc11c\ub3c4 Java \uc5d0\ucf54\uc2dc\uc2a4\ud15c\uacfc\uc758 \uc644\uc804\ud55c \uc0c1\ud638 \uc6b4\uc6a9\uc131\uc744 \uc720\uc9c0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\ub2e4\uc74c\uc740 \uba87 \uac00\uc9c0 \uad6c\uccb4\uc801\uc778 \uc608\uc2dc\uc785\ub2c8\ub2e4.<\/p>\n<p><strong>1. null \uc548\uc804\uc131: \uc218\uc2ed\uc5b5 \ub2ec\ub7ec \uaddc\ubaa8\uc758 \uc2e4\uc218 \ubc29\uc9c0!\u00a0<\/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=\"\">\/\/This is why we have the billion-dollar mistake (not only in Java\u2026)\nBooking booking = null; \/\/\ud83e\udd28 This is allowed but causes:\nbooking.destination; \/\/Runtime error \ud83d\ude31\n\nOptional booking = null; \/\/Optionals aren\u2019t safe from null either: \ud83e\udd28\nbooking.map(Destination::destination); \/\/Runtime error \ud83d\ude31<\/pre>\n<p>Java\ub294 Optional\uacfc \uc5b4\ub178\ud14c\uc774\uc158(<code>@NotNull<\/code> \ub4f1)\ucc98\ub7fc \uc2dc\uac04\uc774 \uc9c0\ub098\uba70 \uc77c\ubd80 null \uc548\uc804\uc131 \uae30\ub2a5\uc744 \ub3c4\uc785\ud574 \uc654\uc9c0\ub9cc \uadfc\ubcf8\uc801\uc778 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uc9c0\ub294 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub610\ud55c, <a href=\"https:\/\/openjdk.org\/projects\/valhalla\/\" target=\"_blank\" rel=\"noreferrer noopener\">Valhalla<\/a> \ud504\ub85c\uc81d\ud2b8(null \uc81c\ud55c \ubc0f null \uac00\ub2a5 \ud0c0\uc785)\ub294 Java\uc5d0 null \uc548\uc804\uc131\uc744 \ub3c4\uc785\ud558\uae30\ubcf4\ub2e4\ub294 \ub354 \ub9ce\uc740 \uc120\ud0dd\uc9c0\ub97c \uc81c\uacf5\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc9c4\ud589\ub418\uace0 \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=\"\">\/\/Important to realize that null is very restricted in Kotlin:\nval booking:Booking? = null \/\/\u2026null can only be assigned to Nullable types \u2705\u00a0\nval booking:Booking = null \/\/null assigned to a Non-nullable types yields a Compilation error \ud83d\ude03\u00a0\n\nbooking.destination \/\/unsafely accessing a nullable type directly causes a Compilation error \ud83d\ude03\nbooking?.destination \/\/only safe access is possible\u00a0 \u2705<\/pre>\n<p>Kotlin\uc758 null \uc548\uc804\uc131\uc774 \ub6f0\uc5b4\ub09c \uc774\uc720\ub294 \uc548\uc804\ud560 \ubfd0 \uc544\ub2c8\ub77c \uc0ac\uc6a9\uc131 \ub610\ud55c \ub9e4\uc6b0 \uc6b0\uc218\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. &#8216;\ub450 \ub9c8\ub9ac \ud1a0\ub07c\ub97c \ubaa8\ub450 \uc7a1\ub294&#8217; \ub300\ud45c\uc801 \uc608\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc740 \ub3c4\uba54\uc778\uc774 \uc788\ub2e4\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\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=\"\">data class Booking(val destination:Destination? = null)\ndata class Destination(val hotel:Hotel? = null)\ndata class Hotel(val name:String, val stars:Int? = null)<\/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=\"\">public record Booking(Optional destination) {\n\n\u00a0\u00a0\u00a0public Booking() { this(Optional.empty()); }\n\n\u00a0\u00a0\u00a0public Booking(Destination destination) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this(Optional.ofNullable(destination));\n\u00a0\u00a0\u00a0}\n}\n\npublic record Destination(Optional hotel) {\n\n\u00a0\u00a0\u00a0public Destination() { this(Optional.empty()); }\n\n\u00a0\u00a0\u00a0public Destination(Hotel hotel) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this(Optional.ofNullable(hotel));\n\u00a0\u00a0\u00a0}\n}\n\npublic record Hotel(String name, Optional stars) {\n\n\u00a0\u00a0\u00a0public Hotel(String name) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this(name, Optional.empty());\n\n\u00a0\u00a0\u00a0}\n\n\u00a0\u00a0\u00a0public Hotel(String name, Integer stars) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this(name, Optional.ofNullable(stars));\n\u00a0\u00a0\u00a0}\n}<\/pre>\n<p><strong>\uac1d\uccb4 \uc0dd\uc131<\/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=\"\">\/\/Because Optional is a wrapper, the number of nested objects grows, which doesn\u2019t help readability\nfinal Optional booking = Optional.of(new Booking(\n      Optional.of(new Destination(Optional.of(\n            new Hotel(\"Sunset Paradise\", 5))))));<\/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=\"\">\/\/Since nullability is part of the type system, no wrapper is needed: The required type or null can be used.\u00a0\nval booking:Booking? = Booking(Destination(Hotel(\"Sunset Paradise\", 5)))<\/pre>\n<p><strong>\uc911\ucca9 \uac1d\uccb4 \ud0d0\uc0c9<\/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=\"\">\/\/traversing a graph of Optionals requires extensive unwrapping\nfinal var stars = \"*\".repeat(booking\n\u00a0\u00a0                        .flatMap(Booking::getDestination)\n                          .flatMap(Destination::getHotel)\n                          .map(Hotel::getStars).orElse(0)); \/\/-&gt; \"*****\"<\/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=\"\">\/\/Easily traverse a graph of nullable types with: \u2018?\u2019, use\u00a0 ?: for the \u2018else\u2019 case.\nval stars = \"*\".repeat(booking?.destination?.hotel?.stars ?: 0) \/\/-&gt; \"*****\"<\/pre>\n<p><strong>\uc911\ucca9 \uac1d\uccb4 \ub798\ud551 \ud574\uc81c<\/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=\"\">\/\/extensive unwrapping is also needed for printing a leaf\u00a0\nbooking.getDestination()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.flatMap(Destination::getHotel)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map(Hotel::getName)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map(String::toUpperCase)\n\u00a0\u00a0\u00a0      .ifPresent(System.out::println);<\/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=\"\">\/\/In Kotlin we have two elegant options:\n\/\/1. we can again traverse the graph with \u2018?\u2019\nbooking?.destination?.hotel.?name?.uppercase()?.also(::println)\n\n\/\/2. We can make use of Kotlin\u2019s smart-cast feature\nif(booking?.destination?.hotel != null) {\n\u00a0\u00a0\u00a0\/\/The compiler has checked that all the elements in the object graph are not null, so we can access the elements as if they were non-nullable types\n\u00a0\u00a0\u00a0println(booking.destination.hotel.uppercase())\n}<\/pre>\n<p>Java\uac00 null \uc548\uc804\uc131\uc744 \uc81c\ub300\ub85c \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc810\uc740 \uac1c\ubc1c\uc790\ub4e4\uc5d0\uac8c \ud070 \ubd80\ub2f4\uc73c\ub85c \uc791\uc6a9\ud569\ub2c8\ub2e4. \uadf8 \uacb0\uacfc \ubc29\uc5b4\uc801\uc778 \ucf54\ub4dc\uc640 \ub2e4\uc591\ud55c null \uac12 \uac00\ub2a5 \uad6c\ubb38(\ud639\uc740 \uc544\uc608 \uc5c6\ub294 \uacbd\uc6b0)\uc744 \uc791\uc131\ud558\uac8c \ub418\uc5b4 \ucf54\ub4dc\uac00 \uc810\uc810 \uc7a5\ud669\ud574\uc9d1\ub2c8\ub2e4. \ub610\ud55c NullPointerException\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ucda9\ub3cc \uc6d0\uc778\uc5d0\uc11c \uc57d 3\ubd84\uc758 1\uc744 \ucc28\uc9c0\ud569\ub2c8\ub2e4(<a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/11\/productive-server-side-development-with-kotlin-stories\/\" target=\"_blank\" rel=\"noreferrer noopener\">JetBrains \ube14\ub85c\uadf8<\/a>). Kotlin\uc758 \ucef4\ud30c\uc77c\ud0c0\uc784 null \uac80\uc0ac\ub294 \uc774\ub7ec\ud55c \ub7f0\ud0c0\uc784 \uc624\ub958\ub97c \uc644\uc804\ud788 \ubc29\uc9c0\ud569\ub2c8\ub2e4. \ud604\uc7ac\uae4c\uc9c0\ub3c4 <strong>null \uc548\uc804\uc131\uc740 Kotlin \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc744 \uc774\ub044\ub294 \uac00\uc7a5 \uc911\uc694\ud55c \uc694\uc778<\/strong>\uc774\uae30\ub3c4 \ud569\ub2c8\ub2e4.<\/p>\n<p><strong>2. \uceec\ub809\uc158\uc740 \uc801\uc774 \uc544\ub2cc \uc544\uad70<\/strong><\/p>\n<p>Spring\uc758 \ucc3d\uc2dc\uc790\uc778 Rod Johnson\uc740 \ucd5c\uadfc \uc778\ud130\ubdf0(<a href=\"https:\/\/youtu.be\/Rx3XZoqbi78?t=1018\" target=\"_blank\" rel=\"noreferrer noopener\">Creator of Spring: No desire to write Java<\/a>)\uc5d0\uc11c Kotlin\uc744 \uc0ac\uc6a9\ud574 \ubcf4\uae30\ub85c \ud55c \uc774\uc720\uac00 null \uac00\ub2a5 \ud0c0\uc785 \ub54c\ubb38\uc774 \uc544\ub2c8\ub77c \uc9c0\ub098\uce58\uac8c \ubcf5\uc7a1\ud55c Java Streams API \ub54c\ubb38\uc774\uc5c8\ub2e4\uace0 \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \uc608\uc2dc\ub294 Java Streams API\uac00 \uc65c \uadf8\ub807\uac8c \ubcf5\uc7a1\ud55c\uc9c0, \uadf8\ub9ac\uace0 Kotlin\uc774 \uc5b4\ub5bb\uac8c \uadf8 \ubaa8\ub4e0 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294\uc9c0\ub97c \uc798 \ubcf4\uc5ec\uc8fc\uace0 \uc788\uc2b5\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 Product(String name, int... ratings){}\nList products = List.of(\n\u00a0\u00a0new Product(\"gadget\", 9, 8, 7),\u00a0\n\u00a0\u00a0new Product(\"goody\", 10, 9)\n);\n\nMap maxRatingsPerProduct =\n\n\u00a0\u00a0\u00a0\/\/\ud83e\udd28 1. Stream introduces indirection\n\u00a0\u00a0\u00a0products.stream()\n\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 1. Always to and from Stream conversion\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.collect(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 2. Lacks extension methods, so wrappers are required\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Collectors.groupingBy(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Product::name,\n\u00a0 \u00a0         \/\/\ud83e\udd28 2. Again\u2026\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Collectors.mapping( groupedProducts -&gt;\n\u00a0               \/\/\ud83e\udd28 3. (too) low-level types, arrays, and primitives cause extra complexity\n\u00a0               \/\/\ud83e\udd28 4. No API on Array, always wrap in stream\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Arrays.stream(groupedProducts.ratings())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .max()\n                      \/\/\ud83e\udd28 5. Extra verbosity due to Optional\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0         .orElse(0.0),\n\u00a0              \/\/\ud83e\udd28 6. No named arguments: what does this do?\n\u00a0               Collectors.reducing(0, Integer::max)\n              )\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ));<\/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=\"\">\/\/\ud83d\ude03 rich and uniform Collection API - even on Java collections - due to extension methods\nval maxRatingsPerProduct = products.\n      .groupBy { it.name }\n      .mapValues { (_, groupedProducts) -&gt; \/\/\ud83d\ude03 destructuring for semantic precision\n            \/\/\ud83d\ude03 built-in nullability support, and the same API for\u00a0\n            \/\/arrays like other Collections\n            groupedProducts.flatMap { it.ratings }\n                  .maxOrNull() ?: 0\u00a0\n            }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/pre>\n<p>Kotlin\uc758 \uc77c\uad00\ub41c \uceec\ub809\uc158 \ud504\ub808\uc784\uc6cc\ud06c \ub355\ubd84\uc5d0 \uc11c\ub85c \ub2e4\ub978 \uceec\ub809\uc158 \ud0c0\uc785 \uac04 \ubcc0\ud658\ub3c4 \ub9e4\uc6b0 \uac04\ub2e8\ud569\ub2c8\ub2e4.<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=\"\">int[] numbers = {1, 3, 3, 5, 2};\n\nSet unique = Arrays.stream(numbers).boxed().collect(Collectors.toSet());\n\nMap evenOrOdd = unique.stream()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.collect(Collectors.toMap(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0n -&gt; n,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0n -&gt; n % 2 == 0));<\/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 numbers = arrayOf(1, 3, 3, 5, 2)\n\nval unique: Set = numbers.toSet() \/\/\ud83d\ude03 simply call to to do the conversion\n\nval evenOrOdd: Map = unique.associateWith { it % 2 == 0 }<\/pre>\n<p><strong>\uacb0\uacfc\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \ud6a8\uacfc\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/strong><\/p>\n<ul>\n<li><strong>\ud48d\ubd80\ud558\uace0 \uc9c1\uad00\uc801\uc778 \uceec\ub809\uc158 API:<\/strong> \ud30c\uc774\ud504\ub77c\uc778\uc774 \uc911\ucca9\ub41c \uceec\ub809\ud130 \ud638\ucd9c \ub0b4\ubd80\uc5d0\uc11c\uac00 \uc544\ub2cc \uc601\uc5b4\ucc98\ub7fc \uc67c\ucabd\uc5d0\uc11c \uc624\ub978\ucabd\uc73c\ub85c \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc77d\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\uc0c1\uc6a9\uad6c\uc640 \ubcf5\uc7a1\uc131 \uac10\uc18c:<\/strong> Collectors.groupingBy, Stream, Optional, Arrays.stream\uc774 \ud544\uc694 \uc5c6\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\ud558\ub098\uc758 \uba58\ud0c8 \ubaa8\ub378:<\/strong> <code>List<\/code>, <code>Set<\/code>, <code>Array<\/code> \ub610\ub294 \uc6d0\uc2dc \ubc30\uc5f4\ub85c \uc2dc\uc791\ud558\ub354\ub77c\ub3c4 <em>\ub3d9\uc77c\ud55c<\/em> \uceec\ub809\uc158 \uc5f0\uc0b0\uc790\uc5d0 \ub3c4\ub2ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\ubd80\uac00 \uc791\uc5c5\uc774 \ud544\uc694 \uc5c6\ub294 \uc131\ub2a5:<\/strong> \ucef4\ud30c\uc77c\ub7ec\uac00 \uaf2d \ud544\uc694\ud55c \uacbd\uc6b0\uc5d0\ub9cc \ubc15\uc2f1\uacfc \uc5b8\ubc15\uc2f1\uc744 \ucc98\ub9ac\ud558\ubbc0\ub85c, \uac1c\ubc1c\uc790\ub294 \ud3c9\uc18c\ucc98\ub7fc \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uba74 \ub429\ub2c8\ub2e4.<\/li>\n<li><strong>null \uc548\uc804\uc131 \ud1b5\ud569:<\/strong> \uceec\ub809\uc158 API\ub294 <code>orNull(...)<\/code>\ub85c \ub05d\ub098\ub294 \ub2e4\uc591\ud55c \ud5ec\ud37c\ub97c \ud1b5\ud574 null \uac12 \uac00\ub2a5\uc131\uc744 \uc644\uc804\ud558\uac8c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\uad00\uc6a9\uc801 \ub798\ud37c\ub97c \ud1b5\ud55c \ub9e4\ub044\ub7ec\uc6b4 Java \uc0c1\ud638\uc6b4\uc6a9\uc131:<\/strong> \ud655\uc7a5 \ud568\uc218\ub97c \ud1b5\ud574 Java \uceec\ub809\uc158\uc744 \uae30\ubc18\uc73c\ub85c \ud55c \uae30\ub2a5\uc774 \ud48d\ubd80\ud55c \uceec\ub809\uc158\uc744 \uadf8\ub300\ub85c \ud65c\uc6a9\ud560 \uc218 \uc788\uc5b4 \ub450 \uc138\uacc4\uc758 \uc7a5\uc810\uc744 \ubaa8\ub450 \ub204\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uac04\ub2e8\ud788 \ub9d0\ud574, Kotlin\uc740 \ud544\ud130\ub9c1, \ub9e4\ud551, \uadf8\ub8f9\ud654 \uac19\uc740 \uc77c\uc0c1\uc801\uc778 \uceec\ub809\uc158 \uc791\uc5c5\uc744 <em>\uad6c\uc131 \uac00\ub2a5\ud55c<\/em> \ud544\uc218 \ud568\uc218\ub85c \uaca9\uc0c1\ud558\uc5ec \uc0ac\uc6a9\uc790\uac00 <em>\uc5b4\ub5bb\uac8c \ucc98\ub9ac\ud560\uc9c0<\/em>\uac00 \uc544\ub2c8\ub77c <em>\ubb34\uc5c7\uc744 \uc6d0\ud558\ub294\uc9c0<\/em>\ub97c \uc790\uc5f0\uc2a4\ub7fd\uac8c \ud45c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>3. Checked Exception \uc81c\uac70\uc640 Kotlin \ucf54\ub4dc \uc548\uc804\uc131 \ud655\ubcf4 \uc804\ub7b5<\/strong><\/p>\n<p>Java\ub294 \uc5ec\uc804\ud788 Checked Exception\uc744 \uc9c0\uc6d0\ud558\ub294 \uba87 \uc548 \ub418\ub294 \uc5b8\uc5b4 \uc911 \ud558\ub098\uc785\ub2c8\ub2e4. \uc774\ub294 \ucc98\uc74c\uc5d0\ub294 \uc548\uc804\uc131 \uae30\ub2a5\uc744 \uc704\ud574 \ub3c4\uc785\ub418\uc5c8\uc9c0\ub9cc \uadf8 \ubaa9\uc801\uc744 \ub2ec\uc131\ud558\uc9c0\ub294 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \uc7a5\ud669\ud568, \uc544\ubb34 \ud6a8\uacfc\uac00 \uc5c6\uac70\ub098 <code>RuntimeException<\/code>\uc73c\ub85c \ub2e4\uc2dc \ub358\uc9c0\ub294 \ubb34\uc758\ubbf8\ud55c catch \ube14\ub85d, \ub78c\ub2e4 \ud45c\ud604\uc2dd\uacfc\uc758 \ud1b5\ud569 \ubb38\uc81c \ub4f1\uc740 \ucf54\ub4dc \uc548\uc804\uc131 \ud655\ubcf4\ubcf4\ub2e4 \uc624\ud788\ub824 \uac1c\ubc1c \ud750\ub984\uc744 \uc800\ud574\ud558\ub294 \uc6d0\uc778\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<p>Kotlin\uc740 C#, Python, Scala, Rust, Go \ub4f1 \ub300\ubd80\ubd84\uc758 \ub2e4\ub978 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c, \ubcf5\uad6c \ubd88\uac00\ub2a5\ud55c \uc0c1\ud669\uc5d0\uc11c\ub9cc \uc608\uc678\ub97c \uc0ac\uc6a9\ud558\ub294 \uac80\uc99d\ub41c \ud328\ub7ec\ub2e4\uc784\uc744 \ub530\ub985\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 Checked Exception\uc774 \ucf54\ub4dc \uc548\uc804\uc131\uc744 \ub192\uc774\uc9c0 \ubabb\ud558\uace0 \uc624\ud788\ub824 \ubb38\uc81c\ub97c \uc77c\uc73c\ud0a4\ub294 \uc0c1\ud669\uc744 \ubcf4\uc5ec\uc8fc\ub294 \uc608\uc2dc\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 String downloadAndGetLargestFile(List urls) {\n\u00a0\u00a0\u00a0List contents = urls.stream().map(urlStr -&gt; {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Optional optional;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0optional = Optional.of(new URI(urlStr).toURL());\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 Within lambdas checked exceptions are not supported and must always be caught...\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} catch (URISyntaxException | MalformedURLException e) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0optional = Optional.empty();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return optional;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}).filter(Optional::isPresent) \u00a0 \u00a0 \u00a0 \/\/Quite a mouthful to get rid of the Optional...\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map(Optional::get)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map(url -&gt; {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try (InputStream is = url.openStream()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return new String(is.readAllBytes(), StandardCharsets.UTF_8);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} catch (IOException e) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28\u2026 or re-thrown, which is annoying, I don\u2019t really care about IOE\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw new IllegalArgumentException(e);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}).toList();\n\u00a0\u00a0\u00a0\/\/\ud83e\udd28 An empty List results in a NoSuchElementException, so why is it not checked? The chance that the List is empty is as high as the other two cases above...\n\u00a0\u00a0\u00a0return Collections.max(contents);\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=\"\">\/\/\ud83d\ude03 safe return type\nfun downloadAndGetLargestFile(urls: List): String? =\n\u00a0\u00a0\u00a0urls.mapNotNull { \u00a0\u00a0\u00a0\/\/\ud83d\ude03 convenient utility methods to rid of null\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83d\ude03 try catch is possible, yet runCatching is an elegant way to convert an exception to null\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0runCatching { URI(it).toURL() }.getOrNull()\n\u00a0\u00a0\u00a0}.maxOfOrNull{ \u00a0\/\/\ud83d\ude03 safe way to retrieve the max value\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0it.openStream().use{ it.reader().readText() } \u00a0\/\/\ud83d\ude03 convenient extension methods to make java.io streams fluent\n\u00a0\u00a0\u00a0}<\/pre>\n<p><strong>4. \uae30\ubcf8 \uc694\uc18c\ub85c\uc11c\uc758 \ud568\uc218<\/strong><\/p>\n<p>Kotlin\uc740 \ud568\uc218\ub97c \uae30\ubcf8 \uc694\uc18c\ub85c \ucde8\uae09\ud569\ub2c8\ub2e4. Java \uac1c\ubc1c\uc790 \uc785\uc7a5\uc5d0\uc11c\ub294 \uc774\uac83\uc758 \uc758\ubbf8\uc640 \uc911\uc694\uc131\uc5d0 \ub300\ud574 \uc758\ubb38\uc774 \uc0dd\uae38 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud575\uc2ec \ucc28\uc774\ub294 Java\uc758 \uc81c\ud55c\ub41c \uc811\uadfc \ubc29\uc2dd\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. Java\uc758 \ud568\uc218 \uae30\ub2a5\uc740 \uc8fc\ub85c \ub78c\ub2e4\ub97c \ud1b5\ud55c \ud638\ucd9c \ubd80\ubd84\uc5d0 \uc9d1\uc911\ub418\uc5b4 \uc788\uc73c\uba70, \uc120\uc5b8\ubd80\ub294 \uc5ec\uc804\ud788 \uc7a5\ud669\ud558\uace0 \uc9c1\uad00\uc801\uc774\uc9c0 \uc54a\uc740 \ud568\uc218 \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \ubb36\uc5ec \uc788\uc2b5\ub2c8\ub2e4. Kotlin\uc5d0\uc11c\ub294 \ud568\uc218\ub97c \uc815\uc758\ud558\uace0 \uc804\ub2ec\ud558\uace0 \ubc18\ud658\ud558\uace0 \uc870\ud569\ud558\ub294 \uc791\uc5c5\uc744 \uc0c1\uc6a9\uad6c \uc5c6\uc774 \uc218\ud589\ud560 \uc218 \uc788\uc5b4, \ud568\uc218\ud615 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud6e8\uc52c \ub354 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ud48d\ubd80\ud55c \ud45c\ud604\uc73c\ub85c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\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 void doWithImage(\n      URL url,\u00a0\n      \/\/\ud83e\udd28 Function interfaces introduce an indirection: because we don\u2019t see the signature of a Function we don\u2019t know what a\u00a0 BiConsumer does, unless we look it up\n      BiConsumer f) throws IOException {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0f.accept(url.getFile(), ImageIO.read(url));\n}\n\n\/\/\ud83e\udd28 Same here\npublic void debug(Supplier f) {\n\u00a0\u00a0\u00a0if(isDebugEnabled()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logger.debug(\"Debug: \" + f.get());\n\u00a0\u00a0\u00a0}\n}\n\n\/\/\ud83e\udd28 calling no-argument lambdas is verbose\ndebug(() -&gt; \"expensive concat\".repeat(1000));<\/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=\"\">fun doWithImage(\n\u00a0\u00a0\u00a0url: URL,\n\u00a0 \/\/\ud83d\ude03 Kotlin has a syntax for declaring functions: from the signature, we see what goes in and what goes out\u00a0\n\u00a0\u00a0\u00a0f:(String, BufferedImage) -&gt; Unit) =\u00a0\n      f(url.file, ImageIO.read(url))\n\n\u00a0\u00a0\/\/\ud83d\ude03 same here: nothing goes in, a String goes out\nfun debug(msg: () -&gt; String) {\n\u00a0\u00a0\u00a0if(isDebugEnabled) {\n            logger.debug(msg())\n\u00a0\u00a0\u00a0}\n}\n\n\/\/\ud83d\ude03 convenient syntax to pass a lambda: {}\ndebug{\"expensive concat\".repeat(1000)}<\/pre>\n<p>Kotlin\uc740 \ud568\uc218 \uc120\uc5b8\uc744 \uc704\ud55c \uba85\ud655\ud558\uace0 \uac04\uacb0\ud55c \uad6c\ubb38\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc2dc\uadf8\ub2c8\ucc98\ub9cc \ubcf4\uace0\ub3c4 \ubb34\uc5c7\uc774 \ub4e4\uc5b4\uac00\uace0 \ubb34\uc5c7\uc774 \ucd9c\ub825\ub418\ub294\uc9c0 \uc989\uc2dc \ud30c\uc545\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \uc678\ubd80\uc758 \ud568\uc218 \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc774\ub3d9\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Java\ub294 \ud568\uc218\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \uae30\ub2a5\uc744 <code>java.util.function.*<\/code>\uc5d0 \uc18d\ud55c \ub300\uaddc\ubaa8 \uc778\ud130\ud398\uc774\uc2a4 \uc9d1\ud569\uc744 \ud1b5\ud574 \uadf8\ub300\ub85c \ub178\ucd9c\ud558\ub294\ub370, \uc774 \uc778\ud130\ud398\uc774\uc2a4\ub4e4\uc740 \uc7a5\ud669\ud558\uace0 \ubcf5\uc7a1\ud55c \uc2dc\uadf8\ub2c8\ucc98\ub97c \uac00\uc838 \ud568\uc218\ud615 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc0ac\uc6a9\ud558\ub294 \ub370 \ubd88\ud544\uc694\ud55c \ubd80\ub2f4\uc744 \uc90d\ub2c8\ub2e4. \ubc18\uba74 Kotlin\uc740 \ud568\uc218\ub97c \uae30\ubcf8 \uc694\uc18c\ub85c \ucde8\uae09\ud558\ubbc0\ub85c \uc774\ub7ec\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub294 \uac1c\ubc1c\uc790\uc5d0\uac8c \uc228\uaca8\uc9c4 \uc0c1\ud0dc\ub85c Java \ubc29\uc2dd\uacfc \uc6d0\ud65c\ud788 \uc0c1\ud638 \uc6b4\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-655829\" style=\"aspect-ratio: 1.1355932203389831; width: 510px; height: auto;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/unnamed-16.png\" alt=\"\" width=\"804\" height=\"708\" \/><\/figure>\n<p>\uadf8 \uacb0\uacfc, Kotlin\uc5d0\uc11c \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\ub294 \uacfc\uc815\uc740 \ud6e8\uc52c \ub354 \uc9c1\uad00\uc801\uc774\uace0 \ub2e8\uc21c\ud574\uc838 \uc774 \uac15\ub825\ud55c \ud504\ub85c\uadf8\ub798\ubc0d \uac1c\ub150\uc744 \ucf54\ub4dc\uc5d0 \uc801\uc6a9\ud558\uae30\uac00 \ud6e8\uc52c \uc26c\uc6cc\uc9d1\ub2c8\ub2e4.<\/p>\n<p><strong>5. \ucf54\ub8e8\ud2f4\uc73c\ub85c \uad6c\ud604\ud558\ub294 \ubd80\ub2f4 \uc5c6\ub294 \ub3d9\uc2dc\uc131 \ucc98\ub9ac<\/strong><\/p>\n<p>\ub192\uc740 \ucc98\ub9ac\ub7c9, \ub2e8\uc77c \uc694\uccad \ub0b4 \ubcd1\ub82c \ucc98\ub9ac \ub610\ub294 \uc2a4\ud2b8\ub9ac\ubc0d\uc774 \ud544\uc694\ud558\ub2e4\uba74 Java\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc720\uc77c\ud55c \uc120\ud0dd\uc9c0\ub294 Spring WebFlux, Vert.X, Quarkus \ub4f1\uc758 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c \uc81c\uacf5\ub418\ub294 Reactor\ub098 RxJava \uac19\uc740 \ubc18\uc751\ud615 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \ubb38\uc81c\ub294 \uc9c0\ub098\uce58\uac8c \ubcf5\uc7a1\ud574 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc0ac\uc2e4\uc0c1 \ud568\uc218\ud615 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uac15\uc694\ud55c\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c \ud559\uc2b5 \uace1\uc120\uc774 \ub9e4\uc6b0 \uac00\ud30c\ub974\uba70, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ubd80\ud558\ub97c \ubc1b\uc744 \ub54c \uce58\uba85\uc801\uc778 \uacb0\uacfc\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\ub294 \uc624\ub958\uac00 \uc27d\uac8c \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d\uc774 \uc8fc\ub958\uac00 \ub418\uc9c0 \ubabb\ud55c \uc8fc\ub41c \uc6d0\uc778\ub3c4 \uc774 \ub54c\ubb38\uc77c \uac83\uc785\ub2c8\ub2e4.<\/p>\n<div class=\"alert \">\n<p><strong>\ucc38\uace0:<\/strong> \uac00\uc0c1 \uc2a4\ub808\ub4dc\ub294 \ubc18\uc751\ud615 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub300\uccb4\ud558\ub294 \uae30\uc220\uc774 \uc544\ub2c8\uba70, \uc77c\ubd80 \uacb9\uce58\ub294 \ubd80\ubd84\uc774 \uc788\uae34 \ud558\uc9c0\ub9cc \uc644\uc804\ud55c \ub300\uc548\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uac00\uc0c1 \uc2a4\ub808\ub4dc\ub294 \ub17c\ube14\ub85c\ud0b9 I\/O\ub97c \uc81c\uacf5\ud558\uc9c0\ub9cc, \ubcd1\ub82c \ucc98\ub9ac\ub098 \ubc18\uc751\ud615 \uc2a4\ud2b8\ub9bc\uacfc \uac19\uc740 \uae30\ub2a5\uc740 \uc81c\uacf5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc8fc\uc694 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c \uc774\ub97c \uc9c0\uc6d0\ud558\uba74 \uad6c\uc870\ud654\ub41c \ub3d9\uc2dc\uc131\uacfc \ubc94\uc704 \uc9c0\uc815\ub41c \uac12 \uc5ed\uc2dc \ubcd1\ub82c \ucc98\ub9ac\uac00 \uac00\ub2a5\ud574\uc9c8 \uac83\uc785\ub2c8\ub2e4. \ubc18\uc751\ud615 \uc2a4\ud2b8\ub9bc\uc758 \uacbd\uc6b0, \ud56d\uc0c1 \ubc18\uc751\ud615 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<p>Spring Boot\ub97c \uc0ac\uc6a9\ud558\ub294 Java \uac1c\ubc1c\uc790\uac00 \ub2e8\uc77c \uc694\uccad \ub0b4\uc5d0\uc11c \ubcd1\ub82c \ud638\ucd9c\uc744 \uc218\ud589\ud55c\ub2e4\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ucf54\ub4dc\uac00 \ub098\uc635\ub2c8\ub2e4.<\/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=\"\">@PostMapping(\"\/users\")\n@ResponseBody\n@Transactional\npublic Mono storeUser(@RequestBody User user) {\n\u00a0\u00a0\u00a0Mono avatarMono = avatarService.randomAvatar();\n\u00a0\u00a0\u00a0Mono validEmailMono = emailService.verifyEmail(user.getEmail());\n\u00a0\u00a0\u00a0\/\/\ud83e\udd28 what does \u2018zip\u2019 do?\n\u00a0\u00a0\u00a0return Mono.zip(avatarMono, validEmailMono).flatMap(tuple -&gt;\u00a0\n\u00a0      if(!tuple.getT2()) \/\/what is getT2()? It\u2019s the validEmail Boolean\u2026\n\u00a0\u00a0\u00a0     \/\/\ud83e\udd28 why can I not just throw an exception?\n\u00a0\u00a0\u00a0      Mono.error(new InvalidEmailException(\"Invalid Email\"));\n\u00a0      else personDao.save(UserBuilder.from(user)\n                                          .withAvatarUrl(tuple.getT1()));\n\u00a0\u00a0\u00a0\u00a0\u00a0);\u00a0\u00a0\n\u00a0\u00a0}<\/pre>\n<p>\ub7f0\ud0c0\uc784 \uad00\uc810\uc5d0\uc11c\ub294 \uc774 \ucf54\ub4dc\uac00 \uc644\ubcbd\ud558\uac8c \ub3d9\uc791\ud558\ub354\ub77c\ub3c4, \uc5b4\uca54 \uc218 \uc5c6\uc774 \ucd94\uac00\ub41c \ubcf5\uc7a1\uc131\uc774 \ub9e4\uc6b0 \ud07d\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc804\uccb4 \ud638\ucd9c \uccb4\uc778\uc5d0\uc11c <code>Mono\/Flux<\/code>\uac00 \uc9c0\ubc30\uc801\uc774\uc5b4\uc11c \ubaa8\ub4e0 \ub3c4\uba54\uc778 \uac1d\uccb4\ub97c \uac10\uc2f8\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\uacf3\uacf3\uc5d0 <code>zip<\/code>, <code>flatMap<\/code> \ub4f1 \ubcf5\uc7a1\ud55c \uc5f0\uc0b0\uc790\uac00 \ub9e4\uc6b0 \ub9ce\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uc608\uc678 \ub358\uc9c0\uae30\uc640 \uac19\uc740 \ud45c\uc900 \ud504\ub85c\uadf8\ub798\ubc0d \uad6c\ubb38\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ucf54\ub4dc\uc758 \ube44\uc988\ub2c8\uc2a4 \uc758\ub3c4\uac00 \ud06c\uac8c \ud6fc\uc190\ub429\ub2c8\ub2e4. \ucf54\ub4dc\ub294 <code>Monos<\/code>\uc640 <code>flatMap<\/code>\uc5d0 \ucd08\uc810\uc744 \ub9de\ucd94\uace0 \uc788\uc5b4 \ube44\uc988\ub2c8\uc2a4 \uad00\uc810\uc5d0\uc11c \uc2e4\uc81c\ub85c \uc5b4\ub5a4 \uc77c\uc774 \uc77c\uc5b4\ub098\ub294\uc9c0 \ubaa8\ud638\ud574\uc9d1\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc88b\uc740 \uc18c\uc2dd\uc740 Kotlin \ucf54\ub8e8\ud2f4\uc774 \uc774\ub7ec\ud55c \ubb38\uc81c\ub97c \ud574\uacb0\ud574 \uc904 \uac15\ub825\ud55c \ub300\uc548\uc774\ub77c\ub294 \uc810\uc785\ub2c8\ub2e4. \ucf54\ub8e8\ud2f4\uc740 \uc5b8\uc5b4 \uc218\uc900\uc758 \ubc18\uc751\ud615 \uad6c\ud604\uc73c\ub85c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub450 \uc138\uacc4\uc758 \uc7a5\uc810\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uacb0\ud569\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc774\uc804\ucc98\ub7fc \uc21c\ucc28\uc801\uc73c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ucf54\ub4dc\ub294 \ub7f0\ud0c0\uc784\uc5d0 \ube44\ub3d9\uae30\uc801\uc73c\ub85c\/\ubcd1\ub82c\ub85c \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc704\uc758 Java \ucf54\ub4dc\ub97c \ucf54\ub8e8\ud2f4 \uae30\ubc18\uc73c\ub85c \ubcc0\ud658\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\uac00 \ub429\ub2c8\ub2e4.<\/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=\"\">@GetMapping(\"\/users\")\n@ResponseBody\n@Transactional\nsuspend fun storeUser(@RequestBody user:User):User = coroutineScope {\n\u00a0\u00a0\u00a0val avatarUrl = async { avatarService.randomAvatar() }\n\u00a0  val validEmail = async { emailService.verifyEmail() }\n\u00a0\u00a0\u00a0if(!validEmail.await()) throw InvalidEmailException(\"Invalid email\")\n\u00a0\u00a0\u00a0personRepo.save(user.copy(avatar = avatarUrl.await()))\n}<\/pre>\n<p>Kotlin\uc758 suspend \ud0a4\uc6cc\ub4dc\ub294 \uad6c\uc870\ud654\ub41c \ub17c\ube14\ub85c\ud0b9\uc774 \uba85\ud655\ud558\uace0 \uac04\uacb0\ud55c \ubc29\uc2dd\uc73c\ub85c \uc2e4\ud589\ub418\ub3c4\ub85d \ud569\ub2c8\ub2e4. <code>async()<\/code> \ubc0f <code>await()<\/code>\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud558\uba74, \uae4a\uac8c \uc911\ucca9\ub41c \ucf5c\ubc31\uc774\ub098 <code>Mono<\/code> \ub610\ub294 <code>CompletableFuture<\/code>\uc640 \uac19\uc740 \ubcf5\uc7a1\ud55c \uad6c\ubb38 \uc5c6\uc774\ub3c4 \ubcd1\ub82c \ucc98\ub9ac\ub97c \uc27d\uac8c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8 \uacb0\uacfc \ubcf5\uc7a1\uc131\uc740 \uc904\uc5b4\ub4e4\uace0 \uac1c\ubc1c\uc790\uc758 \ub9cc\uc871\ub3c4\uc640 \uc720\uc9c0 \uad00\ub9ac \ud3b8\uc758\uc131\uc740 \ub192\uc544\uc9c0\uba70 \uc131\ub2a5\uc740 \ub3d9\uc77c\ud558\uac8c \uc720\uc9c0\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-655845\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/unnamed-17.png\" alt=\"\" width=\"1566\" height=\"456\" \/><\/figure>\n<p><strong>\ucc38\uace0:<\/strong> \ubaa8\ub4e0 \uc8fc\uc694 Java \uae30\ubc18 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uac00 \ucf54\ub8e8\ud2f4\uc744 \uc9c0\uc6d0\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. Spring\uacfc Micronaut\ub294 \ud0c1\uc6d4\ud55c \uc9c0\uc6d0\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. Quarkus\ub294 \ud604\uc7ac \uc81c\ud55c\uc801\uc778 \ucf54\ub8e8\ud2f4 \uc9c0\uc6d0\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>6. \ud558\uc9c0\ub9cc \uacc4\uc18d \ubc1c\uc804\ud558\ub294 Java!<\/strong><\/p>\n<p>Java\ub294 \ub808\ucf54\ub4dc, \ud328\ud134 \uc77c\uce58 \uac19\uc740 \uae30\ub2a5\uc744 \ud1b5\ud574 \uacc4\uc18d \ubc1c\uc804\ud558\uace0 \uc788\uc73c\uba70 Amber, Valhalla, Loom\uacfc \uac19\uc740 \ud5a5\ud6c4 \ud504\ub85c\uc81d\ud2b8\ub3c4 \uc9c4\ud589\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uafb8\uc900\ud55c \ubc1c\uc804\uc740 JVM\uc744 \uac15\ud654\ud558\uace0 \uc804\uccb4 \uc0dd\ud0dc\uacc4\uc5d0\ub3c4 \uc774\uc810\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \uc774\ub7ec\ud55c &#8216;\uc0c8\ub85c\uc6b4&#8217; Java \uae30\ub2a5 \uc911 \ub300\ubd80\ubd84\uc740 Kotlin \uac1c\ubc1c\uc790 \uc785\uc7a5\uc5d0\uc11c\ub294 \uc774\ubbf8 \uc624\ub79c \uae30\uac04 \ud65c\uc6a9\ud574 \uc628 \uae30\ub2a5\uc774\ub77c\ub294 \uc810\uc5d0 \uc720\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. Null \uc548\uc804\uc131, value \ud074\ub798\uc2a4, \ucd5c\uc0c1\uc704 \ud568\uc218, \uae30\ubcf8 \uc778\uc218, \uac04\uacb0\ud55c \uceec\ub809\uc158, \uadf8\ub9ac\uace0 \uae30\ubcf8 \uc694\uc18c\ub85c\uc11c\uc758 \ud568\uc218\ub294 \ubaa8\ub450 Kotlin\uc758 \uc124\uacc4\uc5d0 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ub179\uc544 \uc788\uc73c\uba70 \ub354 \ud1b5\ud569\uc801\uc774\uace0 \uac1c\ubc1c\uc790 \uce5c\ud654\uc801\uc778 \ubc29\uc2dd\uc73c\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4. \uc774 \ub54c\ubb38\uc5d0 Kotlin \ucf54\ub4dc\ub294 \ub354 \uae54\ub054\ud558\uace0 \uc548\uc804\ud558\uba70 \ud6e8\uc52c \uc0dd\uc0b0\uc801\uc73c\ub85c \ub290\uaef4\uc9d1\ub2c8\ub2e4.<\/p>\n<p>\uac8c\ub2e4\uac00 Kotlin\uc740 Java\uc758 \ud601\uc2e0\uc5d0\uc11c\ub3c4 \uc774\uc810\uc744 \ub204\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac00\uc0c1 \uc2a4\ub808\ub4dc\ub098 Loom\uacfc \uac19\uc740 JVM \uc218\uc900\uc758 \uc804\ubc18\uc801\uc778 \ubc1c\uc804, \uadf8\ub9ac\uace0 Valhalla\uc758 \uc131\ub2a5 \ud5a5\uc0c1\uc740 Kotlin\uc5d0\ub3c4 \uadf8\ub300\ub85c \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc694\uc57d\ud558\uba74, Java\ub3c4 \ubc1c\uc804\ud558\uace0 \uc788\uc9c0\ub9cc Kotlin\uc740 \ucc98\uc74c\ubd80\ud130 \uac1c\ubc1c\uc790\uc5d0\uac8c \ud544\uc694\ud55c \ucd5c\uc2e0 \ub3c4\uad6c\ub97c \uc81c\uacf5\ud558\ub3c4\ub85d \uc124\uacc4\ub418\uc5b4 \uc548\uc804\ud558\uace0 \ud604\ub300\uc801\uc774\uba70 \ubbf8\ub798 \uc9c0\ud5a5\uc801\uc778 \uc120\ud0dd\uc9c0\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-655858\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/kotlin-castle-1.png\" alt=\"\" width=\"1698\" height=\"1780\" \/><\/figure>\n<p><strong>7. Kotlin\uc774 \uc9c0\ub2cc \uc9c4\ud654\uc801 \uc774\uc810<\/strong><\/p>\n<p>\uc624\ub798\ub41c \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\ub294 \ud604\ub300\uc801 \ub300\uc548\uc5d0 \ube44\ud574 \ud53c\ud560 \uc218 \uc5c6\ub294 \uae30\uc874\uc758 \ubd80\ub2f4\uc744 \uc548\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubc29\ub300\ud55c \uae30\uc874 \ucf54\ub4dc\ubca0\uc774\uc2a4\ub97c \uc9c0\uc6d0\ud558\uba74\uc11c \uc5b8\uc5b4\ub97c \ubc1c\uc804\uc2dc\ud0a4\ub294 \uc77c\uc740 \uc5b8\uc5b4 \uc124\uacc4\uc790\ub4e4\uc758 \uace0\uc720\ud55c \uacfc\uc81c\uc785\ub2c8\ub2e4. Kotlin\uc740 \ub2e4\uc74c\uc758 \ub450 \uac00\uc9c0 \uc774\uc810\uc744 \uac16\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\uac70\uc778\uc758 \uc5b4\uae68 \uc704\uc5d0 \uc11c\uae30<\/strong>: \ubc14\ud034\ub97c \ub2e4\uc2dc \ubc1c\uba85\ud558\ub294 \ub300\uc2e0, Kotlin \ucd08\uae30 \uc124\uacc4 \ud300\uc740 \uc8fc\uc694 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uac80\uc99d\ub41c \ud328\ub7ec\ub2e4\uc784\uc744 \ubaa8\uc544 \ud558\ub098\uc758 \uc751\uc9d1\ub825 \uc788\ub294 \uccb4\uacc4\ub85c \ud1b5\ud569\ud588\uc2b5\ub2c8\ub2e4. \uc774 \uc811\uadfc \ubc29\uc2dd\uc740 \uc218\ub9ce\uc740 \ud504\ub85c\uadf8\ub798\ubc0d \ucee4\ubba4\ub2c8\ud2f0\uc758 \uc9c4\ud654\uc801 \ud559\uc2b5\uc744 \uadf9\ub300\ud654\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>Java\uc758 \ud55c\uacc4\uc5d0\uc11c \ubc30\uc6b0\uae30<\/strong>: Kotlin \uc124\uacc4\uc790\ub4e4\uc740 Java\uc758 \ubb38\uc81c\uc810\uc744 \uad00\ucc30\ud558\uace0, \uc774\ub97c \ud1a0\ub300\ub85c \ucc98\uc74c\ubd80\ud130 \uacac\uace0\ud55c \ud574\uacb0\ucc45\uc744 \uac1c\ubc1c\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Kotlin\uc758 \ubc1c\uc804\uc744 \ub354 \uae4a\uc774 \uc774\ud574\ud558\uace0 \uc2f6\ub2e4\uba74, \ucd08\uae30 \uc124\uacc4 \ud300\uc758 Andrey Breslav\uac00 KotlinDevDay Amsterdam\uc5d0\uc11c \ubc1c\ud45c\ud55c <a href=\"https:\/\/www.youtube.com\/watch?v=7z_K-hTTeqI&amp;ab_channel=Xebia\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Shoulders of Giants: Languages Kotlin Learned From(\uac70\uc778\uc758 \uc5b4\uae68: Kotlin\uc758 \ud1a0\ub300\uac00 \ub41c \uc5b8\uc5b4\ub4e4)<\/em><\/a>\uc744 \ud655\uc778\ud574 \ubcf4\uc138\uc694.<\/p>\n<p><strong>\ubb38\ud654\uc801 \uc694\uc18c: Kotlin \ub3c4\uc785 \uc5ec\uc815\uc5d0\uc11c \uac1c\ubc1c\uc790\ub97c \uc9c0\uc6d0\ud558\uace0 \uc5f0\uacb0<\/strong><\/p>\n<h3 class=\"wp-block-heading\"><strong>1. \uc27d\uace0 \uc6d0\ud65c\ud55c \uc628\ubcf4\ub529 \uc9c0\uc6d0<\/strong><\/h3>\n<p>Java\uc640 Kotlin \ucf54\ub4dc \uc2a4\ub2c8\ud3ab\uc744 \ube44\uad50\ud574\uc11c \ubcf4\uc5ec\uc8fc\ub294 \ubaa9\uc801\uc740 Kotlin\uc774 \uc5bc\ub9c8\ub098 \ub9e4\ub825\uc801\uc778 \uc5b8\uc5b4\uc778\uc9c0 \uc54c\ub9ac\uae30 \uc704\ud55c \uac83\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ucf54\ub4dc\ub9cc\uc73c\ub85c\ub294 Java \uac1c\ubc1c\uc790\ub4e4\uc758 \ub9c8\uc74c\uc744 \uc5bb\uae30\uc5d0 \ucda9\ubd84\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub3c4\uc785\uc744 \uac00\uc18d\ud654\ud558\uace0 \uc6d0\ud65c\ud558\uac8c \uc2dc\uc791\ud560 \uc218 \uc788\ub3c4\ub85d \ub2e4\uc74c\uc744 \uc81c\uacf5\ud574 \ubcf4\uc138\uc694.<\/p>\n<ul>\n<li><strong>\uc0d8\ud50c \ud504\ub85c\uc81d\ud2b8<\/strong>: Java\uc640 Kotlin \ucf54\ub4dc\ub97c \ub098\ub780\ud788 \ubcf4\uc5ec\uc8fc\ub294 \ubc14\ub85c \uc2e4\ud589 \uac00\ub2a5\ud55c \ud504\ub85c\uc81d\ud2b8\ub85c, \ud300\uc774 \ub9c8\uc774\uadf8\ub808\uc774\uc158 \uacfc\uc815\uc5d0\uc11c \uc2e4\uc9c8\uc801\uc778 \ucc38\uace0 \uc790\ub8cc\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\ub0b4\uc7a5\ub41c \ud488\uc9c8 \uac80\uc0ac<\/strong>: SonarQube, ktlint, detekt \uac19\uc740 \ub3c4\uad6c\uac00 \uc0ac\uc804 \uad6c\uc131\ub418\uc5b4 \uc788\uc5b4 \uccab\ub0a0\ubd80\ud130 \uae54\ub054\ud558\uace0 \uc77c\uad00\ub418\uba70 \uc720\uc9c0 \uad00\ub9ac \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc77c\uad00\ub41c \ub9b0\ud2b8 \uaddc\uce59, \ud14c\uc2a4\ud2b8 \ud504\ub808\uc784\uc6cc\ud06c, \ub77c\uc774\ube0c\ub7ec\ub9ac, CI \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc801\uc6a9\ud574 \ud300 \uac04 \ub9c8\ucc30\uc744 \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>\ucf54\uce6d \ubc0f \uc9c0\uc6d0<\/strong>: \uacbd\ud5d8 \ub9ce\uc740 Kotlin \uc5d4\uc9c0\ub2c8\uc5b4\uac00 \uc0c8 \ud300\uc744 \ucf54\uce6d\ud558\uace0, \uc9c8\ubb38\uc5d0 \ub2f5\ubcc0\ud558\uba70, \ucd08\uae30 \uac1c\ubc1c \ub2e8\uacc4\uc5d0\uc11c \uc2e4\uc804 \uc870\uc5b8\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.\n<ul>\n<li>\uc774 \ubd80\ubd84\uc774 \ubb34\uc5c7\ubcf4\ub2e4 \uc911\uc694\ud569\ub2c8\ub2e4. \uc774\ubbf8 \uac19\uc740 \uc5ec\uc815\uc744 \uacbd\ud5d8\ud55c \ud0c0 \ud300\uc758 \uc219\ub828\ub41c \uac1c\ubc1c\uc790\uac00 \ub2e8 \uba87 \uc2dc\uac04\ub9cc \ub3c4\uc640\uc918\ub3c4, \ubd88\ud544\uc694\ud55c \uc2dc\ud589\ucc29\uc624\uc640 \uae30\uc220 \ubd80\ucc44\ub97c \ud06c\uac8c \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\uc57d\uac04\uc758 \uc9c0\uc6d0\uacfc \ucf54\uce6d\ub9cc\uc73c\ub85c\ub3c4 Kotlin\uc5d0 \ub300\ud55c \uc9c0\uc18d\uc801\uc778 \uc5f4\uc815\uc744 \ud0a4\uc6b0\ub294 \uac00\uc7a5 \uac15\ub825\ud55c \ubc29\ubc95\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\"><strong>2. (\uc790\uae30 \uc8fc\ub3c4) \ud559\uc2b5 \uc790\ub8cc \uc81c\uacf5<\/strong><\/h3>\n<p>\ud2b9\ud788 Java\uc5d0\uc11c \ub118\uc5b4\uc624\ub294 \uacbd\uc6b0, Kotlin \uae30\ubcf8 \uc9c0\uc2dd\uc744 \uc2a4\uc2a4\ub85c \ud559\uc2b5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc77c\ubd80 \uc790\ub8cc\ub97c \ubbf8\ub9ac \uc81c\uacf5\ud558\uba74 Kotlin\uc744 \uc0dd\uc0b0\uc801\uc73c\ub85c \ud65c\uc6a9\ud558\ub294 \uc5ec\uc815\uc744 \ub354 \uc218\uc6d4\ud558\uac8c \ub9cc\ub4e4\uace0 \uc9c4\uc785 \uc7a5\ubcbd\uc744 \ub0ae\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/getting-started.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>JetBrains &#8216;Tour of Kotlin'(\uc2dc\uc791 \uac00\uc774\ub4dc)<\/strong><br \/>\n<\/a>Kotlin \uacf5\uc2dd \uc0ac\uc774\ud2b8\uc5d0\uc11c \uc81c\uacf5\ub418\ub294 \uac04\ub2e8\ud55c \ube0c\ub77c\uc6b0\uc800 \uae30\ubc18 \ud29c\ud1a0\ub9ac\uc5bc\uc785\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/koans.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Kotlin Koans<br \/>\n<\/strong><\/a>JetBrains\uac00 \uad00\ub9ac\ud558\ub294 \uc791\uc740 \ub2e8\uc704\uc758 \ucf54\ub529 \uacfc\uc81c \ubaa8\uc74c\uc785\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/www.udacity.com\/course\/kotlin-bootcamp-for-programmers--ud9011\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Udacity &#8216;Kotlin Bootcamp for Programmers&#8217;<\/strong><br \/>\n<\/a>Google\uacfc\uc758 \ud30c\ud2b8\ub108\uc2ed\uc73c\ub85c \uc81c\uc791\ub41c \uc804\uccb4 \uc601\uc0c1 \uae30\ubc18 \uad50\uc721 \uacfc\uc815\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<div class=\"alert \">\n<p><strong>\ucc38\uace0:<\/strong> \uc790\uae30\uc8fc\ub3c4 \ud559\uc2b5\uc740 \uae30\ucd08\ub97c \uc775\ud788\ub294 \ub370 \uc720\uc6a9\ud558\uc9c0\ub9cc \ub2e8\uc810\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8\uc810 \uc911 \ud558\ub098\ub294 \ud559\uc2b5\uc774 \uc120\ud0dd \uc0ac\ud56d\uc774\ub77c\ub294 \uc810\uc785\ub2c8\ub2e4. \uc885\uc77c \uc5c5\ubb34\uc5d0 \uc2dc\ub2ec\ub9ac\ub2e4 \ubcf4\uba74 \uc790\uae30 \uc8fc\ub3c4 \ud559\uc2b5\uc744 \uac74\ub108\ub6f0\uace0 \uc2f6\uc740 \ub9c8\uc74c\uc774 \ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac8c\ub2e4\uac00 \uc62c\ubc14\ub974\uac8c \uc801\uc6a9\ub41c \uad00\uc6a9\uc801 Kotlin\uc758 \ubbf8\ubb18\ud55c \ub258\uc559\uc2a4\ub97c \uc544\ub294 \uc2e4\ubb34\uc790\uc758 \uadc0\uc911\ud55c \ud53c\ub4dc\ubc31\uc744 \ub193\uce58\uac8c \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc790\uae30 \uc8fc\ub3c4 \ud559\uc2b5 \ud6c4\uc5d0 Java \uac19\uc740 Kotlin\uc744 \uc4f0\uac8c \ub420 \uac00\ub2a5\uc131\uc774 \ud07d\ub2c8\ub2e4. \uc774\ub807\uac8c \uc791\uc131\ud558\uba74 \uc77c\ubd80 \uc7a5\uc810\uc740 \uc788\uc744\uc9c0 \ubab0\ub77c\ub3c4 \uc5b8\uc5b4\uc758 \uc7a0\uc7ac\ub825\uc744 \ucda9\ubd84\ud788 \ub04c\uc5b4\ub0b4\uc9c0 \ubabb\ud569\ub2c8\ub2e4.<\/p>\n<\/div>\n<p>\uc88b\uc740 \ucf54\uce6d\uc744 \ubc1b\uc9c0 \ubabb\ud55c\ub2e4\uba74, \uc804\ud1b5\uc801\uc778 \uad50\uc721 \uacfc\uc815\uc774 \ub9e4\uc6b0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7f0 \uacfc\uc815\uc5d0 \ucc38\uc5ec\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \uac19\uc740 \uc218\uc900\uc758 \ub3d9\ub8cc\ub4e4\uacfc \uad50\ub958\ud558\uace0, \uacbd\ud5d8 \ub9ce\uc740 \uc804\ubb38\uac00\uc5d0\uac8c \uc9c8\ubb38\uc5d0 \ub300\ud55c \ub2f5\uc744 \ub4e4\uc73c\uba70, \ucd08\uae30 \uc804\ud658 \uacfc\uc815\uc5d0\uc11c \ube44\uad00\uc6a9\uc801\uc778 Kotlin\uc744 \ub35c \uc0ac\uc6a9\ud558\uba74\uc11c \ud6e8\uc52c \ube60\ub974\uac8c \uc2e4\ub825\uc744 \ud5a5\uc0c1\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\"><strong>3. \uc0ac\ub0b4 Kotlin \ucee4\ubba4\ub2c8\ud2f0 \uad6c\ucd95<\/strong><\/h3>\n<p>\ud68c\uc0ac \uc804\ubc18\uc5d0\uc11c Kotlin \uc804\ubb38\uc131\uc744 \ub192\uc774\ub294 \uac00\uc7a5 \ube60\ub978 \ubc29\ubc95 \uc911 \ud558\ub098\ub294 \uc0ac\ub0b4 \ucee4\ubba4\ub2c8\ud2f0\ub97c \ub9cc\ub4e4\uc5b4 \uc774\ub97c \uc721\uc131\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\uc0ac\ub0b4 Kotlin \ucee4\ubba4\ub2c8\ud2f0 \uc2dc\uc791<\/strong>\n<ul>\n<li>\uba3c\uc800 Kotlin \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uae30\uc5ec\ud560 \uc758\uc9c0\uac00 \uc788\ub294 3~6\uba85 \uaddc\ubaa8\uc758 \ud575\uc2ec \uac1c\ubc1c\uc790 \ud300\uc744 \ucc3e\uc73c\uc138\uc694. \ub610\ud55c, \uc774\ub4e4\uc774 \uc5c5\ubb34\uc5d0 \ub300\ud574 \uad00\ub9ac\uc790\ub85c\ubd80\ud130 \uc2dc\uac04\uacfc \ud06c\ub808\ub527\uc744 \ubc1b\uc744 \uc218 \uc788\ub3c4\ub85d \ubcf4\uc7a5\ud558\uc138\uc694.<\/li>\n<li>\ud300\uc774 \uad6c\uc131\ub418\uba74 \uc720\uba85\ud55c Kotlin \ucee4\ubba4\ub2c8\ud2f0 \uc5f0\uc0ac\ub97c \ucd08\uccad\ud574 \ud68c\uc0ac \uc804\uccb4 \uaddc\ubaa8\ub85c \ud0a5\uc624\ud504\ub97c \uc9c4\ud589\ud558\uc138\uc694. \uc774\ub807\uac8c \ud558\uba74 Kotlin \uae30\uc220 \ub3c4\uc785\uc758 \ub3d9\uae30 \ubd80\uc5ec\ub97c \uac15\ud654\ud558\uace0 \ucd94\uc9c4\ub825\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uc815\uae30\uc801\uc778 \ubaa8\uc784(\uc6d4\ubcc4 \ub610\ub294 \uaca9\uc8fc)\uc744 \uc7a1\uc544 \ucd94\uc9c4\ub825\uc774 \uc9c0\uc18d\ub418\ub3c4\ub85d \ud558\uc138\uc694.<\/li>\n<li>\uc9c8\ubb38, \ucf54\ub4dc \uc2a4\ub2c8\ud3ab, \uc774\ubca4\ud2b8 \ub178\ud2b8\uac00 \uacf5\uc720\ub418\ub294 \uacf5\uc720 \ucc44\ud305 \ucc44\ub110\/\uc704\ud0a4\ub97c \ub9cc\ub4dc\uc138\uc694.<\/li>\n<\/ul>\n<\/li>\n<li><strong>(\uc678\ubd80) \uc5f0\uc0ac \ucd08\uccad<\/strong>\n<ul>\n<li>\uc2e4\uc81c \ud504\ub85c\ub355\uc158\uc5d0\uc11c Kotlin\uc744 \uc801\uc6a9\ud574 \ubcf8 \uc5d4\uc9c0\ub2c8\uc5b4\ub97c \ucd08\ub300\ud574 \uc194\uc9c1\ud55c \uacbd\ud5d8\ub2f4\uc744 \uacf5\uc720\ud574 \ubcf4\uc138\uc694.<\/li>\n<li>\uc2ec\ud654 \uae30\uc220 \ubc1c\ud45c(\ucf54\ub8e8\ud2f4, KMP, \ud568\uc218\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \ub4f1)\uc640 \uace0\ucc28\uc6d0 \uc0ac\ub840 \uc5f0\uad6c(\ub9c8\uc774\uadf8\ub808\uc774\uc158 \uc804\ub7b5, \ub3c4\uad6c \ud65c\uc6a9 \ud301 \ub4f1)\ub97c \ubc88\uac08\uc544 \uc9c4\ud589\ud574 \ubcf4\uc138\uc694.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\ub2e4\ub978 \uc0ac\ub0b4 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc5bb\uc740 \uad50\ud6c8 \uacf5\uc720<\/strong>\n<ul>\n<li>\ud504\ub85c\uc81d\ud2b8 \ub9ac\ub4dc\uc5d0\uac8c Kotlin \ub3c4\uc785 \uacfc\uc815\uc5d0\uc11c \ud6a8\uacfc\uac00 \uc788\uc5c8\ub358 \uac83\uacfc \uc5c6\uc5c8\ub358 \uac83, \uce21\uc815 \uac00\ub2a5\ud55c \uc131\uacfc \ub4f1\uc744 \ubc1c\ud45c\ud558\ub3c4\ub85d \uc694\uccad\ud574 \ubcf4\uc138\uc694.<\/li>\n<li>\uc774\ub7ec\ud55c \uc778\uc0ac\uc774\ud2b8\ub294 \uc0c8 \ud300\uc774 \ucc38\uace0\ud560 \uc218 \uc788\ub294 &#8216;Kotlin \ud50c\ub808\uc774\ubd81&#8217; \ud615\ud0dc\ub85c \uc815\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\uc790\uc0ac \uac1c\ubc1c\uc790\ub97c \uc704\ud55c \ubb34\ub300 \ub9c8\ub828<\/strong>\n<ul>\n<li>5~10\ubd84 \uc548\uc5d0 \uba4b\uc9c4 \ud301, \ub77c\uc774\ube0c\ub7ec\ub9ac \ub610\ub294 \uadf9\ubcf5\ud588\ub358 \uc2e4\ud328\ub97c \uc2dc\uc5f0\ud560 \uc218 \uc788\ub294 \ub77c\uc774\ud2b8\ub2dd \ud1a0\ud06c \uc138\uc158\uc744 \uc6b4\uc601\ud558\uc138\uc694.<\/li>\n<li>\uae30\uc5ec\uc790\ub4e4\uc744 \uacf5\uac1c\uc801\uc73c\ub85c \uce6d\ucc2c\ud558\uc138\uc694. \uc804\uc0ac\uc801 \ud68c\uc758\ub098 \uc0ac\ub0b4 \ub274\uc2a4\ub808\ud130\ub97c \ud1b5\ud574 \uce6d\ucc2c\ud558\uba74 \ucc38\uc5ec\ub3c4\uc640 \uc9c0\uc2dd \uacf5\uc720\ub97c \uc99d\uc9c4\uc2dc\ud0b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\ube60\ub978 \ud53c\ub4dc\ubc31 \ub8e8\ud504 \uc720\uc9c0<\/strong>\n<ul>\n<li>\uac01 \uc138\uc158\uc774 \ub05d\ub09c \ud6c4, \uba85\ud655\uc131\uacfc \uc720\uc6a9\uc131\uc5d0 \ub300\ud55c \ube60\ub978 \uc124\ubb38\uc744 \uc218\uc9d1\ud558\uace0, \uc774\uc5d0 \ub530\ub77c \ud5a5\ud6c4 \uc758\uc81c\ub97c \uc870\uc815\ud558\uc138\uc694.<\/li>\n<li>\uc870\uc9c1 \uc5c5\ubb34\ub97c \uc21c\ud658\uc2dc\ucf1c \ucee4\ubba4\ub2c8\ud2f0\uac00 \ub2e8 \ud55c \uba85\uc758 \ud575\uc2ec \uc778\ubb3c\uc5d0 \uc758\uc874\ud558\uc9c0 \uc54a\uace0 \uc7a5\uae30\uc801\uc73c\ub85c \ubcf5\uc6d0\ub825\uc744 \uc720\uc9c0\ud558\ub3c4\ub85d \ud558\uc138\uc694.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>\ucc38\uace0<\/strong>: \uc704 \uc81c\uc548 \uc911 \uc0c1\ub2f9\uc218\ub294 \ub2e8\uc21c\ud574 \ubcf4\uc77c \uc218 \uc788\uc9c0\ub9cc \ucee4\ubba4\ub2c8\ud2f0\ub97c \ud65c\uae30\ucc28\uace0 \uc0dd\ub3d9\uac10 \uc788\uac8c \uc720\uc9c0\ud558\ub294 \ub370 \ud544\uc694\ud55c \ub178\ub825\uc744 \uacfc\uc18c\ud3c9\uac00\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\"><strong>4. \uc5ec\uc720\ub97c \uac00\uc9c8 \uac83<\/strong><\/h3>\n<p>\ubb38\ud654\uc801 \ubcc0\ud654\ub294 \uc2dc\uac04\uc774 \uac78\ub9bd\ub2c8\ub2e4. \uac1c\uc778\uc801\uc73c\ub85c \ud6a8\uacfc\ub97c \ubcf8 \ub3c4\uad6c\uc5d0 \ub300\ud55c \uacfc\ub3c4\ud55c \uc5f4\uc815\uc740 \uc790\uce6b \ubb34\ub9ac\ud55c \ucd94\uc9c4\uc73c\ub85c \uc774\uc5b4\uc838 \uc624\ud788\ub824 \uc5ed\ud6a8\uacfc\ub97c \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud6a8\uacfc\uc801\uc778 \uc811\uadfc \ubc29\uc2dd\uc740 <em>\uc124\uba85\ud558\uae30\ubcf4\ub2e4 \ubcf4\uc5ec\uc8fc\ub294 \uac83<\/em>\uc744 \uc6b0\uc120 \uc9c0\uce68\uc73c\ub85c \uc0bc\uc544, \uc704\uc5d0\uc11c \ub17c\uc758\ub41c \ubaa8\ub4e0 \ud65c\ub3d9\uc744 \ud1b5\ud574 \ub3c4\uc785 \uacfc\uc815\uc744 \ucd09\uc9c4\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\uc2dc\ub9ac\uc988\uc758 \ub2e4\uc74c \uac8c\uc2dc\ubb3c<\/h3>\n<p>\uac1c\ubc1c\uc790\ub97c \uc124\ub4dd\ud558\ub294 \ub370\uc11c \uc758\uc0ac\uacb0\uc815\uc790\ub97c \uc124\ub4dd\ud558\ub294 \uac83\uc73c\ub85c \ucd08\uc810\uc744 \uc804\ud658\ud569\ub2c8\ub2e4. \ub2e4\uc74c \uae00\uc5d0\uc11c\ub294 \uc2e4\uc81c \ub370\uc774\ud130\uc640 \uce21\uc815 \uac00\ub2a5\ud55c \uacb0\uacfc\ub97c \uae30\ubc18\uc73c\ub85c Kotlin \ub3c4\uc785\uc744 \uc704\ud55c \uac15\ub825\ud55c \ube44\uc988\ub2c8\uc2a4 \uc0ac\ub840\ub97c \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \ub2e4\ub8f9\ub2c8\ub2e4. \uac1c\ubc1c\uc790\uc758 \uc131\uacf5\uc744 \uacbd\uc601\uc9c4\uc744 \uc124\ub4dd\ud558\ub294 \ub17c\ub9ac\ub85c \uc804\ud658\ud558\ub294 \ubc29\ubc95, \uc0dd\uc0b0\uc131 \ud5a5\uc0c1\uc744 \ube44\uc6a9 \uc808\uac10\uc73c\ub85c \uc5f0\uacb0\ud558\ub294 \ubc29\ubc95, \uadf8\ub9ac\uace0 Kotlin\uc774 \ub2e8\uc21c\ud55c \uae30\uc220 \uc5c5\uadf8\ub808\uc774\ub4dc\ub97c \ub118\uc5b4 \ud300\uacfc \ud68c\uc0ac \ubaa8\ub450\uc5d0\uac8c \uc804\ub7b5\uc801\uc778 \ubc29\ud5a5\uc784\uc744 \uc99d\uba85\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b0\uac8c \ub429\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>\uc0ac\ub78c\ub4e4\uacfc\uc758 \uad50\ub958\ub97c \uc990\uae30\ub294 \uc131\ud5a5\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":672537,"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\/672534"}],"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=672534"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/672534\/revisions"}],"predecessor-version":[{"id":674072,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/672534\/revisions\/674072"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/672537"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=672534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=672534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=672534"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=672534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}