가자공부하러!

Java_5_람다식(Lambda Expressions) 본문

공부/Java

Java_5_람다식(Lambda Expressions)

오피스엑소더스 2019. 5. 17. 19:08

1. 람다식?


1. 정의

  > 식별자 없이 실행 가능한 함수 표현식

  > 다른 말로 익명 메소드라고 함 

  > 객체 지향 언어 보다는 함수 지향 언어에 가깝다.

 

2. 왜 쓰나요?

  > 인터페이스가 가지고 있는 메소드를 간편하게 즉흥적으로 구현해서 사용하기 위함

ㄴ 조건 : 람다식으로 구현할 인터페이스는 단 한개의 추상메소드만 가지고 있어야 한다.

  > 자바는 인터페이스의 메소드를 활용하려면 객체를 생성해야만 했다.

      ㄴ메소드만 전달할 수 있는 방법이 없었다는 말.

  > 람다식을 사용하면 객체 생성 없이 메소드를 사용할 수 있다! 와! 

 

3. 사용 방법은?

  > 기본 구조 : 

- (타입 매개변수, ... ) -> { 실행문; ... } ;

- 매개인자의 자료형 생략 가능

- 매개인자가 한개인 경우 매개인자의 괄호 생략 가능

- 실행문이 한개인 경우 중괄호 생략 가능

- 실행문이 한개이면서, 실행문이 return인 경우 중괄호와 return 생략 가능


 예 1)

  > 인터페이스 중에서 메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 한다.

     - 쓰레드를 만들 때 사용하는 Runnable 인터페이스의 경우 run()메소드를 하나만 가지고 있다.

  > Runnable을 이용하여 쓰레드를 만드는 방법

1
2
3
4
5
6
7
8
9
10
public class LambdaExam1 {
 
        public static void main(String[] args) {
            new Thread(new Runnable(){public void run(){
                for(int i = 0; i < 10; i++){
                    System.out.println("hello");
                }
            }}).start();
        }   
}
cs

- 쓰레드가 실행되면 쓰레드 생성자 안에 넣은 run() 메소드가 실행된다.

- 자바는 메소드만 매개변수로 전달할 방법이 없다. 인스턴스만 전달 할 수 있다.

- 그렇기 때문에 run()메소드를 가지고 있는 Runnable 객체를 만들어서 전달한다.


메소드만 전달할 수 있다면 좀 더 편리하게 프로그래밀 할 수 있을텐데!

람다식으로 해치우자! 해치우자!


  > 람다식을 이용해서 수정한 코드

1
2
3
4
5
6
7
8
9
public class LambdaExam1 {  
    public static void main(String[] args) {
        new Thread(()->{
            for(int i = 0; i < 10; i++){
                 System.out.println("hello");
            }
        }).start();
    }   
}
cs

- ()->{ .... } 부분이 람다식. 다른 말로 익명 메소드.

- JVM은 쓰레드 생성자를 보고 ()->{}이 무엇인지 대상을 추론한다.

- 쓰레드 생성자 api를 보면 Runnable 인터페이스를 받아들이는 것을 알 수 있다.

- JVM은 Thread 생성자가 Runnable 인터페이스를 구현한 것이 와야 하는 것을 알게 되고,

 람다식을 Runnable을 구현하는 객체로 자동으로 만들어서 매개변수로 넣어준다.




  > 제네릭, 컬렉션도 제대로 모르면서 람다는 무슨...

  > 자바 중급부터 다시 공부합니다!



참고 문서 : 

  > 프로그래머스, 자바 중급 - 람다식 (https://programmers.co.kr/learn/courses/9/lessons/280)

  > https://palpit.tistory.com/671





















'공부 > Java' 카테고리의 다른 글

Java_7_컬렉션 프레임워크, java.util, Generic, Time  (0) 2019.05.21
Java_6_Object클래스, java.lang 패키지  (0) 2019.05.21
Java_4_Stream(스트림)  (0) 2019.05.17
신나는 별찍기 공부  (0) 2019.05.16
Java_3_제네릭(Generic)  (0) 2019.05.14
Comments