{"id":552,"date":"2021-06-03T05:07:50","date_gmt":"2021-06-03T05:07:50","guid":{"rendered":"http:\/\/scrutineer.co.kr\/wordpress\/?p=552"},"modified":"2021-06-03T05:07:51","modified_gmt":"2021-06-03T05:07:51","slug":"%eb%aa%a8%eb%8d%98-%ec%9e%90%eb%b0%94-%ec%9d%b8-%ec%95%a1%ec%85%98-16%ec%9e%a5","status":"publish","type":"post","link":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/2021\/06\/03\/%eb%aa%a8%eb%8d%98-%ec%9e%90%eb%b0%94-%ec%9d%b8-%ec%95%a1%ec%85%98-16%ec%9e%a5\/","title":{"rendered":"\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158 16\uc7a5"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">CompletableFuture\ub85c \ube44\ub3d9\uae30 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158 \ub9cc\ub4e4\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01\uc885 \uc628\ub77c\uc778\ubab0\uc758 \ucd5c\uc800\uac00\ub97c \uad6c\ud558\ub294 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ud604\ud558\ub294 \uac83\uc744 \ud1b5\ud574, CompletableFuture\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc2e4\uc2b5\ud574 \ubcf8\ub2e4(\uc2e4\uc2b5\uc774\ub77c\uae30\ubcf4\ub2e4\ub294 \uac1c\ub150\ud655\uc778 \uc815\ub3c4\uc5d0 \uac00\uae5d\uc9c0 \uc54a\uc744\uae4c..)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:28px\">\uadf8 \uc804\uc5d0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CompletableFuture\uac00 \uc790\ubc14 8\uc744 \ud1b5\ud574 \ucd9c\uc2dc\ub418\uae30 \uc804, \uc790\ubc145\ubd80\ud130 \uc9c0\uc6d0\ud588\ub358 Future\uc758 \ub2e8\uc21c\ud55c \ud65c\uc6a9\ubc95\uc744 \ud55c\ubc88 \uc0b4\ud3b4\ubcf4\uace0 \uac00\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc790\ubc148\uc5d0\uc11c \uad6c\ud604\ud55c Future\uc758 \uc0d8\ud50c \ucf54\ub4dc<\/p>\n\n\n\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=\"\">ExecutorService executor = Executors.newCachedTHreadPool();\nFuture&lt;Double> future = executor.submit(new Callcable&lt;Double>() {\n  public Double call() {\n    return doSomeLongCompute(); \/\/ \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub9ac\ub294 \uc791\uc5c5. \ub2e4\ub978 \uc2a4\ub808\ub4dc\ub97c \ud1b5\ud574\uc11c \ube44\ub3d9\uae30\uc801\uc73c\ub85c \uc2e4\ud589.\n  }\n});\n\ndoSomethingElse(); \/\/ \uc9ec \ub0a0\ub54c \ub2e4\ub978 \uc791\uc5c5\uc744 \u3131\u3131\n\ntry{\n  Double result = future.get(1, TimeUnit.SECONDS); \/\/ \ube14\ub85d. \ub2e8 \ucd5c\ub300 1\ucd08\ub9cc \uae30\ub2e4\ub9bc.\n} catch (Exception e) {\n  \/\/\uc0dd\ub7b5\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubb50&#8230;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">doSomeLongCompute(); \uac00 \uc6d0\ub798 \ud558\uace0\uc790 \ud558\ub294 \ud589\uc704\uc774\uace0, \uc598\ub97c main\uc2a4\ub808\ub4dc\uac00 \uc544\ub2cc \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \ud1b5\ud574 \uc2e4\ud589\uc2dc\ud0a4\uace0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">domSomethingElse(); \ub97c \ud1b5\ud574 \uadf8\ub3d9\uc548 main\uc2a4\ub808\ub4dc\ub294 \ub2e4\ub978 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub294 \ub85c\uc9c1\uc774\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:28px\">\uadf8\ub7f0\ub370 \ubb38\uc81c\uac00\u001c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">future.get() \uc744 \ud1b5\ud574 main\uc2a4\ub808\ub4dc\uac00 &#8216;\ube14\ub85d&#8217;\uc0c1\ud0dc\uc5d0 \ube60\uc9c4\ub2e4\ub294 \uac83\uc774\ub2e4. \ub9cc\uc57d doSomeLongCompute()\uac00 \uc5b5\uac81\uc758 \uc2dc\uac04\uc774 \uac78\ub9ac\ub294 \uc791\uc5c5\uc774\ub77c\uba74&#8230; \uc5b5\uac81\uc758 \uc2dc\uac04\ub3d9\uc548 \uae30\ub2e4\ub824\uc57c \ud558\ub294 \ubb38\uc81c\uac00 \uc788\ub2e4. \ubb3c\ub860 \uadf8\ub798\uc11c \ucf54\ub4dc\uc0c1\uc73c\ub85c\ub294 \ucd5c\ub300 \ube14\ub85d \uc2dc\uac04\uc778 &#8216;1\ucd08&#8217;\ub97c \uba85\uc2dc\ud574 \uc8fc\uc5b4\uc11c \uc774 \ubb38\uc81c\ub97c \ud68c\ud53c\ud588\uc9c0\ub9cc \ub9d0\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Future\ub294 \uc81c\ud55c\uc0ac\ud56d\uc774 \uba87\uac00\uc9c0 \uc874\uc7ac\ud55c\ub2e4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud64d\uae38\ub3d9\uc774 \uc624\ub798 \uac78\ub9ac\ub294 \uc791\uc5c5 \uc5ec\ub7ec\uac1c\ub97c Future\ub85c \uad6c\ud604\ud558\ub294 \uc0c1\ud669\uc5d0 \ube60\uc84c\ub2e4\uace0 \ud55c\ub2e4. A,B,C,D \ub124\uac00\uc9c0 \uc791\uc5c5\uc744 Future\ub97c \ud1b5\ud574 \uad6c\ud604\ud55c\ub2e4\uace0 \ud558\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8216;\uc624\ub798 \uac78\ub9ac\ub294 A\uc791\uc5c5\uc774 \ub05d\ub098\uba74, \uadf8 \uacb0\uacfc\ub97c B\uc5d0 \uc804\ub2ec\ud558\uc2dc\uc624. \uadf8\ub9ac\uace0 B\uc758 \uacb0\uacfc\uac00 \ub098\uc624\uba74 C,D\uc758 \uacb0\uacfc\uc640 B\ub97c \uc870\ud569\ud558\uc2dc\uc624&#8217;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc640 \uac19\uc740 \uc694\uad6c\uc870\uac74\/\uc758\uc874\uc131\uc774 \uc788\ub294 \uc0c1\ud669\uc774\ub77c\uba74 Future\ub97c \ud1b5\ud574\uc11c \uad6c\ud604\ud558\uae30\uac00 \ucc38 \uc5b4\ub835\ub2e4\uace0 \ud55c\ub2e4(\ubb50 \ud574\ubcf4\uc9c4 \uc54a\uc544\uc11c \ubaa8\ub974\uaca0\ub2e4.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Future\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc740 &#8216;\uc120\uc5b8\ud615&#8217; \uae30\ub2a5\uc774 \uc788\ub2e4\uba74 \uc720\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\ub450\uac1c\uc758 \ube44\ub3d9\uae30 \uacc4\uc0b0\uacb0\uacfc\ub97c \ud558\ub098\ub85c \ud569\uce5c\ub2e4.<ul><li>\ub450\uac1c\uc758 \uacb0\uacfc\ub97c \uc11c\ub85c \ub3c5\ub9bd\uc801\uc77c\uc218\ub3c4 \uc788\uace0, \uc758\uc874\uc131\uc774 \uc788\uc744\uc218\ub3c4 \uc788\ub2e4<\/li><\/ul><\/li><li>Future\uc9d1\ud569\uc774 \uc2e4\ud589\ud558\ub294 \ubaa8~\ub4e0 \uc791\uc5c5\uc758 \uc644\ub8cc\ub97c \uae30\ub2e4\ub9b0\ub2e4.<ul><li>A,B,C,D \uac00 \ub2e4 \ub05d\ub0a0\ub54c\uae4c\uc9c0 main\uc2a4\ub808\ub4dc\uac00 \uae30\ub2e4\ub9bc.<\/li><\/ul><\/li><li>Future\uc9d1\ud569\uc911 \uc81c\uc77c \uba3c\uc800 \uc644\ub8cc\ub418\ub294 \uc791\uc5c5 \ud558\ub098\ub9cc \uae30\ub2e4\ub9b0\ub2e4.<ul><li>\uac19\uc740 \uacb0\uacfc\ubb3c\uc744 \uc5ec\ub7ec \ubc29\ubc95\uc73c\ub85c \ucc3e\uc744\ub54c(shortest path)<\/li><\/ul><\/li><li>\ud504\ub85c\uadf8\ub7a8\uc801\uc73c\ub85c Future\ub97c \uc644\ub8cc\uc2dc\ud0a8\ub2e4<ul><li>\ube44\ub3d9\uae30 \ub3d9\uc791\uc5d0 \uc218\ub3d9\uc73c\ub85c \uacb0\uacfc \uc81c\uacf5<\/li><\/ul><\/li><li>Future\uc644\ub8cc \ub3d9\uc791\uc5d0 \ubc18\uc751<ul><li>main\uc2a4\ub808\ub4dc\uac00 \ube14\ub85d \uc0c1\ud0dc\ub85c \uae30\ub2e4\ub9ac\ub294\uac8c \uc544\ub2c8\ub77c, Future\uac00 \ub2a5\ub3d9\uc801\uc73c\ub85c main\uc2a4\ub808\ub4dc\uc5d0\uac8c &#8216;\ub098 \ub05d\ub0a8&#8217; \uc774\ub77c\ub294 \uc54c\ub78c\uc744 \uc8fc\ub294 \uad6c\uc870<\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\uc774 \ubaa8\ub4e0 \uae30\ub2a5\uc744<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc790\ubc148\uc5d0\uc11c \ud280\uc5b4\ub098\uc628 CompletableFuture\uac00 \ub9cc\uc871\ud588\ub2e4\uace0 \ud55c\ub2e4!<\/p>\n\n\n\n<hr class=\"wp-block-separator is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uadf8\ub7ec\ub2c8\uae4c&#8230; \uc774\uc81c \uc9c4\uc9dc\ub85c \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uc790<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4dc\ub294 \uc2e4\uc2b5\uc744 \ud558\ub294 \ub3d9\uc548 \uc6b0\ub9ac\ub294 \uc774\uc640 \uac19\uc740 \uae30\uc220\ub4e4\uc744 \uc2b5\ub4dd\ud560 \uc218 \uc788\ub2e4!!!<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\ube44\ub3d9\uae30 API\ub97c \uc81c\uacf5\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4\ub2e4.(\uc628\ub77c\uc778\uc0c1\uc810\uc744 \uc6b4\uc601\ud558\uace0 \uc788\ub294 \ub3c5\uc790!!!!!!!!!!!!!!!!!!! \uc5d0\uac8c \ud2b9\ud788 \uc720\uc6a9\ud55c \uae30\uc220)<ul><li>??? : \ubb63\ud558\ub7ec \ube44\ub3d9\uae30\ub85c \ud574? \uc11c\ubc84 \ub298\ub9ac\uace0 \uc624\ub77c\ud074 \ube44\uc2fc\uac70 \uc4f0\uba74 \ub418\ub294\uac70 \uc544\ub2c8\uc57c?<\/li><\/ul><\/li><li>\ub3d9\uae30 API\ub97c \uc0ac\uc6a9\ud574\uc57c \ud560 \ub54c \ucf54\ub4dc\ub97c Non-Blocking\uc73c\ub85c \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b4\ub2e4.<ul><li>\ub450\uac1c\uc758 \ube44\ub3d9\uae30 \ub3d9\uc791\uc744 \ud30c\uc774\ud504\ub77c\uc778\uc73c\ub85c \uc5f0\uacb0\ud558\ub358\uac00, \ub450\uac1c\uc758 \uacb0\uacfc\ub97c \ud558\ub098\uc758 \ube44\ub3d9\uae30 \uacc4\uc0b0\uc73c\ub85c \ud569\uce58\ub294&#8230;<\/li><\/ul><\/li><li>\ube44\ub3d9\uae30 \ub3d9\uc791\uc758 \uc644\ub8cc\uc5d0 \ub300\uc751\ud558\ub294 \ubc95\uc744 \ubc30\uc6b4\ub2e4.<ul><li>\ucd5c\uc800\uac00\ub97c \ucc3e\uc744 \ub54c, \uac01 \ub9c8\ucf13\ub9c8\ub2e4 \uac00\uaca9 \uc751\ub2f5\uc774 \uc624\uba74 \uc989\uc2dc \ucd5c\uc800\uac00 \uacc4\uc0b0\uc744 \uc2e4\uc2dc\uac04\uc73c\ub85c \ud558\ub294 \ubc29\ubc95<\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:28px\">\uac00\uaca9\uc744 \uac00\uc838\uc624\ub294 \ubaa9\uc5c5 \uba54\uc18c\ub4dc \ub9cc\ub4e4\uae30<\/h2>\n\n\n\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 class Shop {\n  public double getPrice(String product) {\n    return calculatePrice(product);\n  }\n\n  private double calculatePrice(String product) {\n    delay(); \/\/1sec sleep.... for mockup\n    return random.nextDouble() * product.charAt(0) + product.charAt(1);\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa9\uc5c5\uc744 \uc704\ud574 \uac15\uc81c\ub85c \uc9c0\uc5f0\uc744 \ub9cc\ub4ec..<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc800 getPrice() \uba54\uc18c\ub4dc\ub294 \ub3d9\uae30\ud654 \uba54\uc18c\ub4dc\uc774\ub2e4. \uc774\uc81c \uadf8 \ub3d9\uae30 \uba54\uc18c\ub4dc\ub97c \ube44\ub3d9\uae30 \uba54\uc18c\ub4dc\ub85c \ubcc0\uacbd\ud574 \ubcf4\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\uc810 \ucf54\ub4dc<\/p>\n\n\n\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 class Shop {\n  public Future&lt;Double> getPriceAsync(String product) { \/\/change return type.\n    CompletableFuture&lt;Double> futurePrice = new CompletableFuture&lt;>();\n    new Thread (() -> {          \/\/\uc0c8\ub86d\uac8c \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud574\uc11c calculatePrice() \uc218\ud589 -\ube44\ub3d9\uae30-\n      double price = calculatePrice(product);\n      futurePrice.complete(price); \/\/ \uacc4\uc0b0\uc774 \uc644\ub8cc\ub418\uba74 futurePrice\uc5d0 \uac12 \ud560\ub2f9\n    }).start();\n    return futurePrice; \/\/ new Thread\ub97c \ud1b5\ud55c \uacc4\uc0b0\uc774 \ub05d\ub098\uc9c0 \uc54a\uace0\ub3c4 \uadf8\ub0e5 Future\uac00 \ub9ac\ud134\ub428\n  }\n\n  private double calculatePrice(String product) {\n    delay(); \/\/1sec sleep.... for mockup\n    return random.nextDouble() * product.charAt(0) + product.charAt(1);\n  }\n}\n\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uae54-\ub054<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7fc \uc774\uc81c \uc774 CompletableFuture\ub97c \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\ub97c \uc791\uc131\ud574 \ubcf4\uc790.<br>\ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"824\" height=\"213\" src=\"https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image.png\" alt=\"\" class=\"wp-image-556\" srcset=\"https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image.png 824w, https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image-300x78.png 300w, https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image-768x199.png 768w\" sizes=\"auto, (max-width: 824px) 100vw, 824px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"820\" height=\"285\" src=\"https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image-1.png\" alt=\"\" class=\"wp-image-557\" srcset=\"https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image-1.png 820w, https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image-1-300x104.png 300w, https:\/\/scrutineer.co.kr\/wordpress\/wp-content\/uploads\/2021\/06\/image-1-768x267.png 768w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>\uc0c1\uc810 \ucf54\ub4dc\ub294 \ube44\ub3d9\uae30 API\ub97c \uc81c\uacf5\ud558\ubbc0\ub85c, getPriceAsync() \uc2e4\ud589 \uc989\uc2dc Future\uc774 \ub9ac\ud134\ub41c\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \ub9ac\ud134\ub41c Future\ub97c \uc774\uc6a9\ud574\uc11c, \ub098\uc911\uc5d0 \uacb0\uacfc\ub97c \ubc1b\uc544\ubcfc \uc218 \uc788\ub2e4.<ul><li>\ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc0c1\uc810\uc73c\ub85c\ubd80\ud130 Future\ud0c0\uc785\uc758 \uac00\uaca9\uac12\uc744 \ubc1b\uc744 \ub54c\uae4c\uc9c0, \uadf8 \uc0ac\uc774 \ub2e4\ub978 \uc77c\uc744 \ud560 \uc218 \uc788\ub2e4(\ub2e4\ub978 \uc0c1\uc810\uc758 \uac00\uaca9\uac12\uc744 \uac00\uc838\uc628\ub2e4\ub358\uc9c0&#8230;\ubb50&#8230;)<\/li><\/ul><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\uadf8\ub807\uac8c \ubaa8\ub4e0 \ucf54\ub4dc\uac00 \uacc4\ud68d\ub300\ub85c \uc798 \uc218\ud589\ub41c\ub2e4\uba74 \uc88b\uc9c0\ub9cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud604\uc2e4\uc740 \uadf8\ub807\uc9c0 \uc54a\uc740 \ubc95. \ubaa8\ub4e0 \ucf54\ub4dc\uac00 \uacc4\ud68d\ub300\ub85c,\uc0dd\uac01\ub300\ub85c \uc798 \uc218\ud589\ub420 \ub9ac\uac00 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud604\uc7ac \uc608\uc81c \uc0c1\ud669\uc5d0\uc11c\uc758 \uac00\uc7a5 \ud070 \ubb38\uc81c\ub294, &#8216;\uac00\uaca9\uc744 \uacc4\uc0b0\ud558\ub294 \ub85c\uc9c1\uc774 \uc218\ud589\ub418\ub2e4\uac00 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd&#8217; \ud558\ub294 \uacbd\uc6b0\uc774\ub2e4. main\uc2a4\ub808\ub4dc\uac00 \uc544\ub2cc \ubcc4\ub3c4\uc758 \uc2a4\ub808\ub4dc\ub97c \uc0dd\uc131\ud574\uc11c \ub85c\uc9c1\uc744 \uc218\ud589\uc2dc\ud0a4\ub294 \uacfc\uc815\uc5d0\uc11c \uc5d0\ub7ec\uac00 \ub09c \uac83\uc774\ub2c8, \uc5d0\ub7ec\uc758 \uc8fc\uccb4\ub294 &#8216;\ubcc4\ub3c4\uc758 \uc2a4\ub808\ub4dc&#8217; \uc774\uace0, \uc774\ub97c \uba85\uc2dc\uc801\uc73c\ub85c main\uc2a4\ub808\ub4dc\uc5d0\uac8c \uc54c\ub824\uc8fc\uae30 \uc804\uae4c\uc9c0 main\uc2a4\ub808\ub4dc\ub294&#8230;&#8230; \uc624\ub9e4\ubd88\ub9dd &#8216;\uac00\uaca9\uc744 \uacc4\uc0b0\ud558\ub294 \ub85c\uc9c1\uc774 \uc218\ud589 \uc644\ub8cc&#8217; \ub418\uae30\ub9cc\uc744 \uae30\ub2e4\ub9b4 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c \uc608\uc678\ucc98\ub9ac\uac00 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\uc810 \ucf54\ub4dc\uc5d0\ub2e4\uac00, \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc600\uc744 \uc2dc main\uc2a4\ub808\ub4dc\uc5d0 \uc774\ub97c noti\uc2dc\ucf1c\uc8fc\ub294 \ubd80\ubd84\uc744 \ucd94\uac00\ud574 \ubcf4\uc790.<\/p>\n\n\n\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 class Shop {\n  public Future&lt;Double> getPriceAsync(String product) {\n    CompletableFuture&lt;Double> futurePrice = new CompletableFuture&lt;>();\n    new Thread (() -> {\n      try {\n        double price = calculatePrice(product);\n        futurePrice.complete(price);\n      } catch (Exception e) {\n        futurePrice.completeExceptionally(e);  \/\/ \uc5d0\ub7ec\ubc1c\uc0dd \uc2dc \uc5d0\ub7ec\ub85c Future\uc885\ub8cc.\n      }\n    }).start();\n    return futurePrice;\n  }\n\n  private double calculatePrice(String product) {\n    delay(); \/\/1sec sleep.... for mockup\n    return random.nextDouble() * product.charAt(0) + product.charAt(1);\n  }\n}\n\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:28px\">\uac00\ub3c5\uc131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0b4\uc774 \ubd99\uc5b4\ub098\uac00\uba74\uc11c getPriceAsync\uac00 \uc810\uc810 \ub354\ub7ec\uc6cc\uc9c0\uae30 \uc2dc\uc791\ud55c\ub2e4&#8230;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c CompletableFuture\ub294 \uc774\ub7f0 \ub354\ub7fd\uace0 \ubcf5\uc7a1\ud55c \uc18c\uc2a4\ub97c \ud55c \uc904\ub85c \uc81c\uacf5\ud574 \uc8fc\ub294 \uba54\uc18c\ub4dc\uac00 \uc788\ub2e4.<\/p>\n\n\n\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 Future&lt;Double> getPriceAsync(String product) {\n  return CompletableFuture.supplyAsync(() -> calculatePrice(product));\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud3b8-\uc548<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:28px\">\ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\ub97c \uc880 \ub354 \uace0\ub3c4\ud654\ud574 \ubcf4\uc790<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0ac\uc2e4, \ubc30\uc6b0\uace0\uc790 \uc0c1\uc810 \ucf54\ub4dc\ub97c \uc190\ub304 \uac83\uc774\uc9c0, \uc6b0\ub9ac\uac00 \uc2e4\uc81c\ub85c \uc77c \ud560\ub54c, callee\uc758 API\ub85c\uc9c1\uc740 \uc6b0\ub9ac\uac00 \ud568\ubd80\ub85c \uac74\ub4dc\ub9ac\uc9c0 \ubabb\ud55c\ub2e4.(\uadf8\ub7f4 \uad8c\ud55c\ub3c4 \uc5c6\uace0,\uadf8\ub798\uc11c\ub3c4 \uc548\ub418\uace0)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c\ubd80\ud130\ub294 \uc0c1\uc810 \ucf54\ub4dc\ub97c \uac74\ub4dc\uc9c0\ub9ac \ubabb\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uace0 &amp;&amp; \uac00\uaca9\uc744 \uac00\uc838\uc624\ub294 \ub85c\uc9c1\uc774 &#8216;\ub3d9\uae30&#8217; \ubc29\uc2dd\uc758 \ube14\ub85d \uba54\uc18c\ub4dc\ub77c\uace0 \uac00\uc815\ud55c \ucc44\ub85c&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">caller\uc778 \ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\ub97c \uc880 \uace0\ub3c4\ud654 \ud574 \ubcf4\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uc0c1\uc810\uc5d0 \uc21c\ucc28\uc801\uc73c\ub85c \uc815\ubcf4\ub97c \uc694\uccad\ud558\ub294 findPrices\ub77c\ub294 \uba54\uc18c\ub4dc\ub97c \ub9cc\ub4e0\ub2e4\uace0 \ud558\uc790.<\/p>\n\n\n\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&lt;Shop> shops = Arrays.asList(new Shop(\"\ucfe0\ud321\"),\n                                 new Shop(\"\ub124\uc774\ubc84\"),\n                                 new Shop(\"11st\"),\n                                 new Shop(\"G\ub9c8\ucf13\"));\n\n\n\npublic List&lt;String> findPrices(String product) {\n  return shops.stream()\n              .map(shop -> String.format(\"%s price is %.2f\", \n                                         shop.getName(), \n                                         shop.getPrice(product)))\n              .collect(toList());\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">findPrices \uc218\ud589\uc2dc\uac04\uc744 \uc0dd\uac01\ud574\ubcf4\uc790&#8230; 4\ucd08\ub294 \uc871\ud788 \ub118\ub294\ub2e4. \uc774 \ucf54\ub4dc\ub300\ub85c\ub77c\uba74 \uc6b0\ub9ac \ud560\uba38\ub2c8\ub3c4 \uc774\uac83\ubcf4\ub2e8 \ube60\ub978 \uacb0\uacfc\uac12\uc744 \ub0bc \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2f9\uc5f0\ud788 \uc774\ub7f0 4\ucd08\ub098 \uac78\ub9ac\ub294 \ub85c\uc9c1\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud560 \uc218\ub294 \uc5c6\uace0, \uc774\uac78 \ubcd1\ub82c \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uc694\uccad\ud574 \ubcf4\uc790.<\/p>\n\n\n\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&lt;Shop> shops = Arrays.asList(new Shop(\"\ucfe0\ud321\"),\n                                 new Shop(\"\ub124\uc774\ubc84\"),\n                                 new Shop(\"11st\"),\n                                 new Shop(\"G\ub9c8\ucf13\"));\n\n\n\npublic List&lt;String> findPrices(String product) {\n  return shops.parallelStream() \/\/\ubc14\uafbc\uac74 \uc774\uac83\ubc16\uc5d0 \uc5c6\uc74c!!!!!\n              .map(shop -> String.format(\"%s price is %.2f\", \n                                         shop.getName(), \n                                         shop.getPrice(product)))\n              .collect(toList());\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud3b8-\uc548<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc774\ub294 \ub3d9\uae30 \ud638\ucd9c\uc774\ub2e4. \ub2e8\uc21c\ud788 stream\ub9cc\uc744 parallel\ud558\uac8c \ub3cc\ub838\ub2e4\uace0 \ud574\uc11c 1\ucd08\ub3d9\uc548 \ube14\ub85c\ud0b9\uc774 \uac78\ub9ac\ub294 \uc2dc\uac04 \ud2c8\uc0c8\uae4c\uc9c0 \ucabc\uac1c\uc11c \uc0ac\uc6a9\ud560 \uc218\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c \uc5ec\uae30\uc11c CompletableFuture\ub97c \ucd94\uac00\ud574\uc11c \ube44\ub3d9\uae30 \ud638\ucd9c\uad6c\uc870\ub85c \ucf54\ub4dc\ub97c \ubcc0\uacbd\ud574 \ubcf8\ub2e4.<\/p>\n\n\n\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 List&lt;String> findPrices(String product) {\n  List&lt;CompletableFuture&lt;String>> priceFutures = shops.stream()\n                                                      .map(shop -> \n                                                             CompletableFuture.supplyAsync(() -> \n                                                               shop.getName() + \" price is \" + shop.getPrice(product)))\n                                                      .collect(toList());\n\n  return priceFutures.stream()\n                     .map(CompletableFuture::join)\n                     .collect(toList());\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud3b8&#8212;&#8212;\uc548<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:28px\">join\uc744 \ubcc4\ub3c4\uc758 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \ube80 \uc774\uc720<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ube7c\uc9c0 \uc54a\uace0 \uccab\ubc88\uc9f8 \uc2a4\ud2b8\ub9bc\uc5d0\ub2e4 join\uc744 \uac19\uc774 \ub123\uc5b4\ubc84\ub9ac\uba74, \uccab\ubc88\uc9f8 \uc0c1\uc810(\ucfe0\ud321)\uc758 \uacb0\uacfc\uac12\uc744 \ubc1b\uc544\uc62c\ub54c\uae4c\uc9c0 \uc2a4\ud2b8\ub9bc\uc774 \ub2e4\uc74c \uc694\uc18c\ub97c \uc2e4\ud589\uc2dc\ud0a4\uc9c0 \uc54a\uace0 \uae30\ub2e4\ub9ac\uae30 \ub54c\ubb38&#8230;. \uc5b4\ucc0c\ubcf4\uba74 \ub2f9\uc5f0\ud558\ub2e4. \uad6c\ud604\ud560\ub54c \uc8fc\uc758\ud558\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>CompletableFuture\ub85c \ube44\ub3d9\uae30 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158 \ub9cc\ub4e4\uae30 \uac01\uc885 \uc628\ub77c\uc778\ubab0\uc758 \ucd5c\uc800\uac00\ub97c \uad6c\ud558\ub294 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ud604\ud558\ub294 \uac83\uc744 \ud1b5\ud574, CompletableFuture\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc2e4\uc2b5\ud574 \ubcf8\ub2e4(\uc2e4\uc2b5\uc774\ub77c\uae30\ubcf4\ub2e4\ub294 \uac1c\ub150\ud655\uc778 \uc815\ub3c4\uc5d0 \uac00\uae5d\uc9c0 \uc54a\uc744\uae4c..) \uadf8 \uc804\uc5d0 CompletableFuture\uac00 \uc790\ubc14 8\uc744 \ud1b5\ud574 \ucd9c\uc2dc\ub418\uae30 \uc804, \uc790\ubc145\ubd80\ud130 \uc9c0\uc6d0\ud588\ub358 Future\uc758 \ub2e8\uc21c\ud55c \ud65c\uc6a9\ubc95\uc744 \ud55c\ubc88 \uc0b4\ud3b4\ubcf4\uace0 \uac00\uc790. \uc790\ubc148\uc5d0\uc11c \uad6c\ud604\ud55c Future\uc758 \uc0d8\ud50c \ucf54\ub4dc \ubb50&#8230;. doSomeLongCompute(); \uac00 \uc6d0\ub798 \ud558\uace0\uc790 \ud558\ub294 \ud589\uc704\uc774\uace0, \uc598\ub97c main\uc2a4\ub808\ub4dc\uac00 \uc544\ub2cc \uc0c8\ub85c\uc6b4 \uc2a4\ub808\ub4dc\ub97c \ud1b5\ud574 &#8230; <a title=\"\ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158 16\uc7a5\" class=\"read-more\" href=\"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/2021\/06\/03\/%eb%aa%a8%eb%8d%98-%ec%9e%90%eb%b0%94-%ec%9d%b8-%ec%95%a1%ec%85%98-16%ec%9e%a5\/\" aria-label=\"Read more about \ubaa8\ub358 \uc790\ubc14 \uc778 \uc561\uc158 16\uc7a5\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-552","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=552"}],"version-history":[{"count":5,"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/552\/revisions"}],"predecessor-version":[{"id":559,"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/552\/revisions\/559"}],"wp:attachment":[{"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=552"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scrutineer.co.kr\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}