자바는 메소드만 인자로 전달하려면 반드시 객체를 만들어서 전달해야 했다.
Java8에 람다식이 생기면서, 마치 함수만 전달하는 것처럼 간편하게 문법을 사용할 수 있게 되었다.
람다식 기본 문법
(타입 매개변수, ...) -> { 실행문; ... }
(타입 매개변수, ...)는 오른쪽 중괄호 { } 블록을 실행하기 위해 필요한 값을 제공하는 역할을 한다.
이때, 매개 변수의 이름은 개발자가 자유롭게 지정할 수 있다.
' -> ' 기호는 매개 변수를 이용해서 중괄호 { }를 실행한다는 뜻으로 해석하면 된다.
함수적 인터페이스(@FunctionalInterface) <출처: https://palpit.tistory.com/671[palpit Vlog]>
모든 인터페이스를 람다식의 타겟 타입으로 사용할 수 없다. 람다식이 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다.
하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟 타입이 될 수 있는데, 이러한 인터페이스를 함수적 인터페이스(functional interface)라고 한다.
1
2
3
4
5
6
|
@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
public void otherMethod(); // Compile Error
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
함수적 인터페이스를 작성할 때 두 개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능이 있는데, 인터페이스 선언 시 @FunctionalInterface 어노테이션을 붙이면 된다.
이 어노테이션은 두 개 이상의 추상 메소드가 선언되면 컴파일 오류를 발생시킨다.
@FunctionalInterface 어노테이션은 선택사항이다. 이 어노테이션이 없더라도 하나의 추상 메소드만 있다면 모두 함수적 인터페이스지만 실수로 두 개 이상의 추상 메소드를 선언하는 것을 방지하고 싶다면 붙여주는 것이 좋다.
#예제
- 매개변수와 리턴값이 없는 람다식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
}
public class MyFunctionalInterfaceExam {
public static void main(String[] args) {
MyFunctionalInterface fi;
fi = () -> {System.out.println("method call2"); };
fi = () -> System.out.println("method call2");
}
}
|
- 매개변수가 있고 리턴값이 없는 람다식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@FunctionalInterface
public interface MyFunctionalInterface2 {
public void method(int x);
}
public class MyFunctionalInterfaceExam2 {
public static void main(String[] args) {
MyFunctionalInterface2 fi;
fi = (x) -> {
int result = x * 5;
System.out.println(result);
};
fi = x -> System.out.println(x * 5);
}
}
|
- 매개변수와 리턴값이 있는 람다식
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
@FunctionalInterface
public interface MyFunctionalInterface3 {
public int method(int x, int y);
}
public class MyFunctionalInterfaceExam3 {
public static void main(String[] args) {
MyFunctionalInterface3 fi;
fi = (x, y) -> {
int result = x + y;
return result;
};
fi = (x, y) -> {
return x + y;
};
fi = (x, y) -> x + y;
fi = (x, y) -> sum(x, y);
}
public static int sum(int x, int y) {
return x + y;
}
|
'Java' 카테고리의 다른 글
추상화와 추상 클래스 (0) | 2020.06.02 |
---|---|
람다식이란? #1 개념 및 특징 (0) | 2020.04.03 |