람다함수
(Anonymous Function)를 지칭하는 용어이다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터 과학 분야에서의 람다 대수이다.
람다 대수는 간단히 말하자면 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법이다.
람다 특징
람다 대수는 이름을 가질 필요가 없다. - 익명함수
두 개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다대수로 단순화 될 수 있다, - 커링(Curring)
익명함수
익명함수란 말 그대로 함수의 이름이 없는 함수이다. 익명함수들은 공통으로 일급객체(First Class citizen)라는 특징을 가지고 있다.
이 일급 객체란 일반적으로 다룰 객체들에 적용 가능한 연산을 모두 지원하는 개체를 가르킨다. 함수를 값으로 사용 할 수도 있으며 파라메터로 전달
및 변수에 대입하기와 같은 연산들이 가능하다.
람다의 장단점
장점
1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다.
2. 자연연산 수행 - 람다는 자연연산을 수행함으로써 불필요한 연산을 최소화 할 수 있다.
3. 병렬 처리 가능 - 멀티스레드를 활용하여 병렬 처리를 사용할 수 있다.
단점
1. 람다식의 호출이 까다롭다.
2. 람다 stream 사용시 단순 for문 혹은 while문 사용 시 성능이 떨어진다.
3. 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어 뜨릴 수 있다.
람다의 표현식
1. 람다는 매개변수 화살표(->) 함수 몸체로 이용하여 사용 할 수 있다.
2. 함수 몸체가 단일 시행문이면 괄호 {}를 생략할 수 있다.
3. 함수 몸체가 return문으로만 구성되어 있는 경우 괄호 {}를 생략 할 수 없다.
람다식 예제
기존 자바 문법
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello world");
}
}).start();
람다식 문법
new Thread(() -> {
System.out.println("hello world");
}).start();
@functionalInterface
Functional Interface는 일반적으로 구현해야 할 추상 메서드가 하나만 정의된 인터페이스를 가르킨다.
함수형 인터페이스임을 보장하기 위함
람다식 : 추상메서드를 구현하기 위해 구체적인 메서드를 구현하는 것이 아니라 익명으로 구체적인 내용 기술하는 기법
() -> { 구체적인 실행문 }
매개변수 없는 람다식
() -> {
실행문;
실행문;
}
() -> 실행문;
정적 메서드 사용법
클래스명.메소드명();
인스턴스 메서드 사용법
객체변수명.메서드명();
람다식이란?
람다식
- 함수형 프로그래밍: 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법
- 데이터 처리부는 제공된 함수의 입력값으로 데이터를 넣고 함수에 정의된 처리 내용을 실행
- 람다식: 데이터 처리부에 제공되는 함수 역할을 하는 매개변수를 가진 중괄호 블록이다.
- 자바는 람다식을 익명 구현 객체로 변환
함수형 인터페이스
- 인터페이스가 단 하나의 추상 메소드를 가지는 것
- 인터페이스가 함수형 인터페이스임을 보장하기 위해서는 @FunctionalInterface 어노테이션을 붙임
- @FunctionalInterface: 컴파일 과정에서 추상 메소드가 하나인지 검사해 정확한 함수형 인터페이스를 작성할 수 있게 도와주는 역할
매개변수가 없는 람다식
매개변수가 없는 람다식
- 함수형 인터페이스의 추상 메소드에 매개변수가 없을 경우 람다식 작성하기
- 실행문이 두 개 이상일 경우에는 중괄호를 생략할 수 없고, 하나일 경우에만 생략할 수 있음
매개변수가 있는 람다식
- 함수형 인터페이스의 추상 메소드에 매개변수가 있을 경우 람다식 작성하기
- 매개변수를 선언할 때 타입은 생략할 수 있고, 구체적인 타입 대신에 var를 사용할 수 있음
- 매개변수가 하나일 경우에는 괄호를 생략 가능. 이때는 타입 또는 var를 붙일 수 없음
리턴값이 있는 람다식
리턴값이 있는 람다식
- 함수형 인터페이스의 추상 메소드에 리턴값이 있을 경우 람다식 작성하기
- return 문 하나만 있을 경우에는 중괄호와 함께 return 키워드를 생략 가능
- 리턴값은 연산식 또는 리턴값 있는 메소드 호출로 대체 가능
메소드 참조
메소드 참조
- 메소드를 참조해 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거
정적 메소드와 인스턴스 메소드 참조
- 정적 메소드를 참조 시 클래스 이름 뒤에 :: 기호를 붙이고 정적 메소드 이름을 기술
- 인스턴스 메소드일 경우에는 객체를 생성한 다음 참조 변수 뒤에 :: 기호를 붙이고 인스턴스 메소드 이름을 기술
매개변수의 메소드 참조
- 람다식에서 제공되는 a 매개변수의 메소드를 호출해서 b 매개변수를 매개값으로 사용
- a의 클래스 이름 뒤에 :: 기호를 붙이고 메소드 이름을 기술
생성자 참조
생성자 참조
- 객체를 생성하는 것. 람다식이 단순히 객체를 생성하고 리턴하도록 구성되면 람다식을 생성자 참조로 대치 가능
- 클래스 이름 뒤에 :: 기호를 붙이고 new 연산자를 기술
- 생성자가 오버로딩되어 여러 개가 있을 경우, 컴파일러는 함수형 인터페이스의 추상 메소드와 동일한 매개변수 타입과 개수를 가지고 있는 생성자를 찾아 실행
- 해당 생성자가 존재하지 않으면 컴파일 오류 발생
'자바' 카테고리의 다른 글
자바 - 데이터 입출력 (0) | 2023.01.30 |
---|---|
자바 - 스트림 요소 처리 (0) | 2023.01.27 |
자바 - 컬렉션 자료구조 (0) | 2023.01.25 |
자바 - 멀티 스레드 (0) | 2023.01.25 |
자바 - 제네릭 (0) | 2023.01.20 |