#오류에 대해 지적해 주시면 수정하겠습니다.
람다 표현식 (Lambda Expression)이란?
람다식은, 쉽게 말해 메서드를 하나의 식으로 표현한 것을 의미한다. 메서드를 람다식으로 표현하면, 메서드의 이름과 반환값이 없어지므로 람다식을 익명 함수라고도 한다. 즉, 익명 함수의 일종이다.
람다 표현식은 왜 나왔을까?
위에 있는 Runnable interface처럼 메서드를 하나만 가진 인터페이스를 함수형 인터페이스라고 한다.
이전에는 Thread class를 생성하기 위해 Runnable interface안에있는 run 메서드가 필요한데, 자바는 메서드만 매개변수로 전달할 방법이 없으므로, 해당 메서드를 가지고 있는 Runnable 객체를 생성해서 전달해야한다. 즉, 자바는 매번 객체를 생성해서 매개변수로 전달 해야한다.
메서드만 전달 할 수 있다면 좀더 편하게 프로그래밍 할 수 있지 않을까? 해서 등장한게 람다다.
JVM은 Thread의 생성자를 보고, 이게 무엇인지 대상을 추론한다고 한다!
Thread 생성자 API를 보면, Runnable 인터페이스를 받아들이는 것을 알고있는 JVM이 람다식을 Runnable을 구현하는 객체로 자동으로 만들어서 매개변수를 넣어준다.
함수형 인터페이스
// @FunctionalInterface
함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션으로, 인터페이스에 선언하여 단 하나의 추상 메서드만 갖도록 제한하는 역할을 한다.
# 1급 객체 : 변수나 데이터에 할당할 수 있으며, 객체의 인자로 넘길수 있어야하고, 객체의 리턴값으로 리턴할 수 있는 객체
Java에서 제공하는 함수형 인터페이스
- Supplier<T>
- Consumer<T>
- Function<T>
- Predicate<T>
람다식이 없었을 땐?
1. 인터페이스를 구현한 클래스의 객체 생성
기존 자바에서 다형성을 제공하기 위해 인터페이스를 만들고, 그것을 구현한 클래스를 작성한 뒤,
사용시에는 인터페이스 타입의 참조변수에 인터페이스를 구현한 클래스 객체를 생성해서 사용했다.
2. 익명 객체
위와 같이 따로 클래스를 만들지 않고, 바로 코드 내에서 익명 객체를 만들어서 사용하기도 했다. 하지만 익명 객체는 재활용이 불가능하므로 Good를 구현한 객체가 자주 사용되어야 한다면, 아래와 같은 코드를 반복해서 사용하게 되고, 그러면 코드가 지저분해진다.
람다식으로 바꿔보자!
람다 표현식 정리!
1.컴파일러는 람다식을 해석해, 자동으로 익명구현객체로 만든다.
2.이 때, 익명구현객체의 기반이 되는 인터페이스의 타입을 타겟 타입이라고 한다.
3.타겟 타입이 될 인터페이스는 2개 이상의 추상 메서드를 가지면 안된다.
그 이유는, 2개 이상의 추상 메서드를 가질 경우, 컴파일러가 해당 람다식이 타겟 타입의 어떤 메서드를 구현한 것인지 알 수 없기 때문이다.
람다식 표현법
1.매개변수 타입을 추론할 수 있는 경우, 타입을 생략할 수 있다.
2.매개변수가 하나인 경우에는 괄호()를 생략할 수 있다. (타입이 없을 때만 가능)
3.함수의 몸체가 하나의 명령문만으로 이루어진 경우, 중괄호{}를 생략할 수 있다.
(이 때, 세미콜론은 붙이지 않는다.)
4.함수의 몸체가 하나의 return 문으로만 이루어진 경우, 중괄호를 생략할 수 없다.
5.return문 대신 표현식을 사용할 수 있으며, 이 때 반환값은 표현식의 결과값이 된다.
(이 때, 세미콜론은 붙이지 않는다.)
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA스터디]JDK,JRE,JVM (0) | 2021.08.15 |
---|---|
[JAVA스터디]다형성(Polymorphism) (0) | 2021.08.15 |
[JAVA스터디]자바 입출력(2)-직렬화/역직렬화 (0) | 2021.08.11 |
[JAVA스터디]자바 입출력(1)-System,Stream,표준입출력,객체입출력 (0) | 2021.08.10 |