람다식 (lambda expression)
- 자바에서 함수형 프로그래밍 (functional programming)을 구현하는 방식
- 자바 8부터 지원
- 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행
함수형 프로그래밍
- 순수 함수를 구현하고 호출함으로써 외부 자료에 부수적인 영향을 주지 않고 매개 변수만을 사용하도록 만든 함수
- 함수를 기반으로 구현
- 입력 받은 자료를 기반으로 수행되고 외부에 영향을 미치지 않으므로 병렬처리 등에 가능
- 안정적인 확장성 있는 프로그래밍 방식
- 동일한 매개변수가 들어왔을 때 동일한 반환값을 리턴함 ( 외부자료를 건드리지 않아 병렬처리를 하더라도 사이드 이펙트가 없음 )
람다식 구현하기
- 익명 함수 만들기
- 매개 변수와 매개 변수를 활용한 실행문으로 구현
- (매개변수) -> {실행문;}
- 두 수를 입력받아 더하는 add() 함수
int add(int x, int y) {
return x+y;
}
(int x, int y) -> {return x+y;}
- 함수 이름 반환 형을 없애고 -> 를 사용
- {} 까지 실행문을 의미한다.
람다식 문법
- 매개변수 ( 하나인 경우 ) 자료형과 괄호 생략
str -> {System.out.Println(str);}
- 매개 변수가 두 개인 경우 괄호를 생략할 수 없음
x, y -> {System.out.Println(x+y);} // 잘못된 형식
- 중괄호 안의 구현부가 한 문장인 경우 중괄호 생략
str -> System.out.println(str);
- 중괄호 안의 구현부가 한 문장이라도 return문은 중괄호를 생략할 수 없음
str -> return str.length(); // 잘못된 형식
- 중괄호 안의 구현부가 반환문 하나라면 return과 중괄호 모두 생략
(x, y) -> x + y // 두 값을 더하여 반환
str -> str.length() // 문자열의 길이 반환
람다식 사용 예제
람다식을 선언한 인터페이스 ( 함수형 인터페이스 )에 여러 메소드가 있으면 어떻게 될까?
- 함수형 인터페이스에는 한 메소드만 들어갈 수 있다.
- @FunctionalInterface 어노테이션 선언
- 다른 메소드를 선언할 경우 에러 발생
함수형 인터페이스
- 람다식을 선언하기 위한 인터페이스
- 익명 함수와 매개 변수만 구현되므로 단 하나의 메서드만을 가져야 한다.
- 두 개 이상의 메서드인 경우 어떤 메서드의 호출인지 모호해짐
- @FunctionalInterface 애노테이션
- 함수형 인터페이스라는 의미, 여러 개의 메서드 선언 시 에러
- 실제적으로는 객체에 대한 익명 내부 클래스가 생성되며 함수형 인터페이스의 메소드를 구현하는 것임
익명 객체를 생성하는 람다식
- 자바는 객체 지향 언어로 객체를 생성해야 메소드가 호출 됨
- 람다식으로 메서드를 구현하고 호출하면 내부에서 익명 클래스가 생성됨
- 람다식에서 외부 메서드의 지역변수는 상수로 처리됨 ( 지역 내부 클래스와 동일 원리 )
StringConcat concat1 = new StringConcat() {
@Override
public void makeString(String s1, String s2) {
System.out.Println(s1+","+s2);
}
};
인터페이스 구현 / 람다식 사용 / 익명 내부 클래스 사용 3가지 방법이 있음
함수를 변수처럼 사용하는 람다식
프로그램에서 변수를 사용하는 경우
- 특정 자료형으로 변수 선언 후 값 대입하여 사용 int a = 10;
- 매개 변수로 전달 int add(int x, int y);
- 메서드의 반환 값으로 반환 return num;
인터페이스형 변수에 람다식 대입
interface PrintString {
void showString(String s);
}
s-> System.out.Println(s)
PrintString printString = s -> System.out.Println(s);
printString.showString("hello lambda");