1) 람다 표현식(lambda expression)
메소드를 하나의 식으로 표현한 것으로 익명 함수(anouymous fuctions)를 지칭하는 용어이다. 일반적으로 사용하는 함수를 단순하게 표현하는 방법이다.
2)람다의 특징
람다식은 익명 함수의 특징으로 이름을 가질 필요가 없다.
두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다식으로 단순화 가능하다. 람다식으로 선언된 함수는 1급 객체이기 때문에 Stream API의 매개변수로 전달이 가능해진다.
3) 람다의 장점과 단점
장점 | 단점 |
1. 코드의 간결함 및 가독성 증가. 람다를 통해 불필요한 코드를 삭제할 수 있으며 이로 인해 단순하게 코드를 표현할 수 있음. 2. 지연연산 수행 람다는 지연연산을 수행 함으로써 불필요한 연산을 최소화 할 수 있음. 3. 병렬처리 가능 멀티 쓰레드를 활용해 병렬처리가 가능. 4. 생산성 향상 함수를 만드는 과정 없이 한 번에 처리가 가능함 |
1. 람다식의 호출이 까다로움 2. 람다 스트림 사용 시 단순 for문, while문의 사용 시 성능이 떨어짐 3. 불필요한 사용으로 가독성의 저하 (비슷한 함수가 중복생성 되 코드가 지저분해질 수 있음.) 4. 람다를 사용하면서 만든 무명함수는 재사용이 불가능함. 5. 재귀로 만들경우 부적합. |
1) 기존 방식의 함수 선언 및 람다식으로 변환
<기존 방식>
public String food(){
return "hungry";
}
<람다 방식>
(매개변수,)->(실행문)
()->"hungry"
4) 람다식을 작성할 때 주의할 점
1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.
2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.
(이때 세미콜론(;)은 붙이지 않음)
4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다.
(이때 세미콜론(;)은 붙이지 않음)
1. 함수형 인터페이스
함수형 인터페이스는 람다식을 하나의 변수에 대입할 때 참조하는 참조 변수의 타입을 말한다. 자바에서는 일반 함수와 순수 함수를 다르게 취급한다. 때문에 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션(@)으로 인터페이스에 선언해 단 하나의 추상 메서드만을 갖도록 제한하는 역할을 하는데, Java의 람다식이 함수형 인터페이스를 반환하기에 사용한다.
여기서 1급 객체란 무엇일까?
1급 객체는 변수나 데이터 구조 안에 담을 수 있으며, 파라미터로 전달할 수 있다. 또한 반환값으로 사용할 수 있으며 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
@FuctionalInterface 어노테이션을 사용한다.
해당 어노테이션을 인터페이스의 선언 앞에 붙이면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다.
이렇게 명시된 함수형 인터페이스에 두 개 이상의 메서드가 선언되면 오류가 발생한다.
1) 함수형 인터페이스의 선언
@FunctionalInterface
public interface Log {
int min(int x, int y);
}
public class Main {
public static void main(String[]args){
Log kim = (x,y)->x<y? x:y;
System.out.println(kim.min(4,5));
}
}
함수형 인터페이스와 람다식 그리고 스트림API에 대해 더 알아볼 필요가 있다
'Language > Java' 카테고리의 다른 글
예외 처리(Exception) (0) | 2022.05.15 |
---|---|
인터페이스와 추상클래스 그리고 Enum (0) | 2022.05.14 |
추상 클래스(abstract class)와 인터페이스(interface) (0) | 2022.01.23 |
내부 클래스(inner class) (0) | 2022.01.22 |
상속(Inheritance) (0) | 2022.01.21 |