Java_5_람다식(Lambda Expressions)
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