๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ/JAVA

๋žŒ๋‹ค ํ‘œํ˜„์‹(Lambda Expression)

๋žŒ๋‹ค ํ‘œํ˜„์‹(Lambda Expressionโ€Ž)


Java 8์— ๋žŒ๋‹ค ํ‘œํ˜„์‹์ด ๋„์ž…๋˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ๋น„์Šทํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด ์กŒ๋‹ค๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์ด๋ฆ„์ด ์—†๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค์šฐ๋ฆฌ๊ฐ€ ๋žŒ๋‹ค์— ๊ด€์‹ฌ์„ ๋‘ฌ์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  - OOP ์–ธ์–ด์ธ Java์—์„œ ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

  - ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์ด์šฉํ•จ์œผ๋กœ์จ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋กœ ๊ทธ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  - Collection filtering, Iteration , Extraction ๋“ฑ์—์„œ ๋†€๋ผ์šด ์ฝ”๋“œ ์ƒ์‚ฐ์„ฑ์„ ๋ณด์ธ๋‹ค.

 

๋žŒ๋‹ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  1. ์ต๋ช… : ๋ณดํ†ต์˜ ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ ์ด๋ฆ„์ด ์—†์œผ๋ฏ€๋กœ ์ต๋ช…์ด๋ผ ํ‘œํ˜„ํ•˜๋ฉฐ, ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•จ์œผ๋กœ ์ธํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฑฑ์ •๊ฑฐ๋ฆฌ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
  2. ํ•จ์ˆ˜ : ๋žŒ๋‹ค๋Š” ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ํŠน์ • ํด๋ž˜์Šค์— ์ข…์†๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ, ๋ฐ”๋””, ๋ฐ˜ํ™˜ ํ˜•์‹, ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ๋‹ค.
  3. ์ „๋‹ฌ : ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ๋ฉ”์„œ๋“œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  4. ๊ฐ„๊ฒฐ์„ฑ : ์ต๋ช… ํด๋ž˜์Šค์—์„œ์™€ ๊ฐ™์€ ์ž์งˆ๊ตฌ๋ ˆํ•œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๋žŒ๋‹ค๋Š” ๋ฌด๋ช…์˜ ๋ฉ”์„œ๋“œ(Anonymous Method)๋ฅผ ๋งํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ”์—์„œ์˜ ๋žŒ๋‹ค๋Š” ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค(Functional Interface)๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ์— ๋žŒ๋‹ค๋ฅผ ํ†ตํ•ด ๋ชธ์ฒด๋ฅผ ๋‹ค ๊ธฐ์ˆ ํ•˜์ง€ ์•Š๊ณ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊นŒ๋‹ญ์œผ๋กœ Interface๋ฅผ ์ด์šฉํ•˜์—ฌ ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ฆ์œผ๋กœ์จ Interface์˜ ํ•จ์ˆ˜๊ฐ€ ๋‹จ 1๊ฐœ๋งŒ ์žˆ์–ด์•ผ ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ๋‹ค์‚ฌ์‹ค ์ž๋ฐ”์—์„œ Interface๋ฅผ ์ด์šฉํ•˜์—ฌ ๋žŒ๋‹ค๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ํ•จ์€ ๋‚ด๋ถ€์ ์œผ๋กœ Proxy ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ ์•ˆ์— ๋žŒ๋‹ค ํ‘œํ˜„์„ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ ๋žŒ๋‹ค ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๋ฌธ๋ฒ•์„ ํ™•์ธํ•ด ๋ณด์ž.

 

(argument ,,,) -> (body)

 : 0๊ฐœ ์ด์ƒ์˜ ์ธ์ž๋ฅผ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜ body๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ์ด๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌ๋ฌธ์ด๋‹ค.

 

๋žŒ๋‹ค๋Š” ํฌ๊ฒŒ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ

  • ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ : xxx๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ()  : (int a1, int a2)
  • ํ™”์‚ดํ‘œ : ํ™”์‚ดํ‘œ ( -> )๋Š” ๋žŒ๋‹ค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ์™€ ๋ฐ”๋””๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค
  • ๋žŒ๋‹ค์˜ ๋ฐ”๋”” : ๋žŒ๋‹ค์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ํ‘œํ˜„์‹์ด๋‹ค.

 

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋จผ์ € ์ธ์ž๊ฐ€ ์—†๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‘”๋‹ค.

MyInter.java

public interface MyInter {

       void abc();

}

 

์ด๋ฒˆ์—๋Š” ์ธ์ž๊ฐ€ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‘”๋‹ค.

MyInterArg.java

public interface MyInterArg {

       void def(int aint b);

}

 

๋‹ค์Œ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

Main.java

public class Main {

           public static void main(String[] args) {

                     //1. ์ธ์ž๊ฐ€ ์—†๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ ์ฒ˜๋ฆฌ

                     MyInter inter = new MyInter() {

                                @Override


                                public void abc() {


                                          System.out.println("์ผ๋ฐ˜์ ์ธ ์ต๋ช… ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ");

                                }

                     };

                    

                     inter.abc();   //๋ฌด๋ช… ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

                    

                     //๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„

                     MyInter inter2 = ()->System.out.println("๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„");

                     inter2.abc();  //๋žŒ๋‹ค๋กœ ํ‘œํ˜„๋œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

                    

                     System.out.println();

                     //2. ์ธ์ž๊ฐ€ ์žˆ๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ ์ฒ˜๋ฆฌ

                     MyInterArg interArg = new MyInterArg() {

                                @Override


                                public void def(int a, int b) {

                                          System.out.println("๋‘ ์ˆ˜์˜ ํ•ฉ์€ " + (a + b));


                                }

                     };

                    

                     interArg.def(3, 4);   //์ธ์ž๊ฐ€ ์žˆ๋Š” ๋ฌด๋ช… ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

                    

                     //๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„

                     MyInterArg interArg2 = (a, b)->System.out.println("๋žŒ๋‹ค์‹์œผ๋กœ ํ‘œํ˜„:" + (a + b));

                     interArg2.def(3, 4);  //์ธ์ž๊ฐ€ ์žˆ๋Š” ๋žŒ๋‹ค๋กœ ํ‘œํ˜„๋œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

           }

}

 


์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹


import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class ButtonProcess extends JFrame{

    public ButtonProcess(){

        super("lambda test");

        setBounds(100, 100, 300, 300);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

       

        setLayout(null);

        Button btn = new Button("button1");

        btn.setBounds(10, 50, 100, 50);

        add(btn);

       

        btn.addActionListener(new ActionListener() {  //์ „ํ†ต์  ๋ฐฉ๋ฒ•

            @Override

            public void actionPerformed(ActionEvent e) {

               setTitle("์ฒซ๋ฒˆ์งธ ๋ฒ„ํŠผ");

            }

        });

 

        Button btn2 = new Button("button2");

        btn2.setBounds(10, 150, 100, 50);

        add(btn2);

 

        btn2.addActionListener(e -> setTitle("2๋ฒˆ์งธ ๋ฒ„ํŠผ"));  //๋žŒ๋‹ค ๋ฐฉ๋ฒ•

     }

   

    public static void main(String[] args) {

        new ButtonProcess();

    }   

}


*** ๋‹ค์–‘ํ•œ ๋žŒ๋‹ค ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ***

  • ๋ถˆ๋ฆฐ ํ‘œํ˜„์‹    :  (List<String> list) ->list.isEmpty()
  • ๊ฐ์ฒด ์ƒ์„ฑ      :  () -> new Apple(10)
  • ๊ฐ์ฒด์—์„œ ์†Œ๋น„  :  (Apple a) -> { System.out.println(a.getWeight()); }
  • ๊ฐ์ฒด์—์„œ ์„ ํƒ/์ถ”์ถœ  :  (String s) ->s.length()
  • ๋‘ ๊ฐ’์„ ์กฐํ•ฉ   :  (int a, int b) -> a * b
  • ๋‘ ๊ฐ์ฒด ๋น„๊ต   :  (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())

 

๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๋žŒ๋‹ค์˜ ์ถ•์•ฝํ˜•์ด๋‹ค.

๋žŒ๋‹ค์™€ ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค ๋‹จ์ถ• ํ‘œํ˜„ ์˜ˆ์ œ

  • (Apple a) ->a.getWeight()     = >     Apple::getWeight()
  • () ->Thread.currentThread().dumpStack()     =>    Thread.currentThread()::dumpStack
  • (str, i) ->str.substring(i)    =>    String::substring
  • (String s) ->System.out.println(s)    =>    System.out::println





์ถœ์ฒ˜: ์ปด์„ธ์ƒ๊ณผ ์œ ํ†ต http://cafe.daum.net/flowlife/HqLo/72 

๋ฐ˜์‘ํ˜•