# ëë¤(Lambda) ### ëë¤ í¨ìë? ëë¤ í¨ìë íë¡ê·¸ëë° ì¸ì´ìì ì¬ì©ëë ê°ë ì¼ë¡ ìµëª í¨ì(Anonymous functions)를 ì§ì¹íë ì©ì´ì ëë¤. íì¬ ì¬ì©ëê³ ìë ëë¤ì ê·¼ê°ì ìíê³¼ ê¸°ì´ ì»´í¨í°ê³¼í ë¶ì¼ììì ëë¤ ëìì´ë¤. ëë¤ ëìë ê°ë¨í ë§íë©´ ìíìì ì¬ì©íë í¨ì를 ë³´ë¤ ë¨ìíê² íííë ë°©ë²ì´ë¤. ### ëë¤ì í¹ì§ - ì´ë¦ì ê°ì§ íìê° ìë `ìµëª í¨ì(Anonymous functions)`ì´ë¤. - ë ê° ì´ìì ì ë ¥ì´ ìë í¨ìë ìµì¢ ì ì¼ë¡ 1ê°ì ì ë ¥ë§ ë°ë ëë¤ ëìë¡ `ë¨ìí`ë ì ìë¤. > ìµëª í¨ì: ë§ ê·¸ëë¡ **ì´ë¦ì´ ìë í¨ì**ì´ë¤. ìµëª í¨ìë¤ì ê³µíµì¼ë¡ `ì¼ê¸ê°ì²´(First class citizen)`ë¼ë í¹ì§ì ê°ì§ê³ ìë¤. ì´ ì¼ê¸ê°ì²´ë ì¼ë°ì ì¼ë¡ **ë¤ë¥¸ ê°ì²´ë¤ì ì ì© ê°ë¥í ì°ì°ì 모ë ì§ìíë ê°ì²´**를 ê°ë¥´í¨ë¤. í¨ì를 `ê°`ì¼ë¡ ì¬ì©í ìë ìì¼ë©° `íë¼ë¯¸í°ë¡ ì ë¬` ë° `ë³ìì ëì `í기ì ê°ì ì°ì°ë¤ì´ ê°ë¥íë¤. ### ëë¤ì ì¥ë¨ì #### ì¥ì - ì½ëì ê°ê²°ì± : ëë¤ë¥¼ ì¬ì©íë©´ **ë¶íìí ë°ë³µë¬¸ì ìì ê° ê°ë¥**íë©°, ë³µì¡í ìì ë¨ìíê² ííí ì ìë¤. - ì§ì°ì°ì° ìí : ëë¤ì ì§ì°ì°ì°ì ìíí¨ì¼ë¡ì¨ **ë¶íìí ì°ì°ì ìµìí** í ì ìë¤. - ë³ë ¬ì²ë¦¬ ê°ë¥ : **ë©í°ì°ë ë를 íì©**íì¬ ë³ë ¬ì²ë¦¬ë¥¼ ì¬ì©í ì ìë¤. #### ë¨ì - ëë¤ìì í¸ì¶ì´ ê¹ë¤ë¡ë¤. - ì´ë¡ ì ë¨ìíê² ëª¨ë ìì를 **ì ë¶ ìííë ê²½ì° ëë¤ìì´ ì¡°ê¸ ë릴 ì ìë¤.** - ë¶íìíê² ë무 ì¬ì©íê² ëë©´ **ì¤íë ¤ ê°ë ì±ì ë¨ì´ë¨ë¦´ ì ìë¤.** ### ëë¤ì ííì - ëë¤ì 매ê°ë³ì `íì´í(->)` í¨ì ëª¸ì²´ë¡ ì´ì©íì¬ ì¬ì©í ì ìë¤. - í¨ì ëª¸ì²´ê° **ë¨ì¼ ì¤í문ì´ë©´ ê´í¸{}를 ìëµí ì ìë¤.** - í¨ì ëª¸ì²´ê° **return문**ì¼ë¡ë§ 구ì±ëì´ ìë ê²½ì° **ê´í¸{}를 ìëµí ì ìë¤.** ```java //ì ìì ì¸ ì í () -> {} () -> 1 () -> { return 1; } (int x) -> x+1 (x) -> x+1 x -> x+1 (int x) -> { return x+1; } x -> { return x+1; } (int x, int y) -> x+y (x, y) -> x+y (x, y) -> { return x+y; } (String lam) -> lam.length() lam -> lam.length() (Thread lamT) -> { lamT.start(); } lamT -> { lamT.start(); } //ì못ë ì í ì ì¸ë typeê³¼ ì ì¸ëì§ ìì typeì ê°ì´ ì¬ì© í ì ìë¤. (x, int y) -> x+y (x, final y) -> x+y ``` ### ëë¤ì ìì #### 기존 ìë° ë¬¸ë² ```java new Thread(new Runnable() { @Override public void run() { System.out.println("Hello thread"); } }).start(); ``` #### ëë¤ì ë¬¸ë² ```java new Thread(()->{ System.out.println("Hello thread"); }).start(); ``` ì´ì ê°ì´ ëë¤ìì ì¬ì©íë©´ ì½ëê° í¨ì¬ ê°ê²°í´ì§ê³ ê°ë ì±ë ì¢ìì§ ê²ì íì¸í ì ìë¤. # í¨ìí ì¸í°íì´ì¤ ### @FunctionalInterface - ì¼ë°ì ì¼ë¡ 구íí´ì¼ í **ì¶ì ë©ìëê° íëë§ ì ì**ë ì¸í°íì´ì¤ë¥¼ ê°ë¦¬í¨ë¤. - ìë° ì»´íì¼ë¬ë í¨ìí ì¸í°íì´ì¤ì **ë ê° ì´ìì ë©ìëê° ì ì¸ëë©´ ì¤ë¥ë¥¼ ë°ì**ìí¨ë¤. - `ëë¤`ì²ë¼ ì¬ì©ì´ ê°ë¥íë¤. ``` //구íí´ì¼ í ë©ìëê° íê°ì´ë¯ë¡ Functional Interfaceì´ë¤. @FunctionalInterface public interface Math { public int Calc(int x, int y); } //구íí´ì¼ í ë©ìëê° ëê°ì´ë¯ë¡ Functional Interfaceê° ìëë¤. (ì¤ë¥ ì¬í) @FunctionalInterface public interface Math { public int Calc(int x, int y); public int Calc2(int x, int y); } ``` ### í¨ìí ì¸í°íì´ì¤ ëë¤ ì¬ì© ìì ```java @FunctionalInterface interface Math{ int calc(int x, int y); } public class Main { public static void main(String[] args) { Math plusLambda = (x, y) -> x + y; System.out.println(plusLambda.calc(2, 1)); Math minusLambda = (x, y) -> x - y; System.out.println(minusLambda.calc(2, 1)); } } ```