반응형
[람다식] 타겟 타입과 함수적 인터페이스
람다식의 형태는 매개변수를 가진 코드블록이어서 메소드를 선언하는 것처럼 보이지만 실제로는 이 메소드를 가지고 있는 객체를 생성해 낸다. (자바는 메소드를 단독으로 선언할 수 없기 때문)
인터페이스 변수 = 람다식;
람다식은 인터페이스의 익명 구현 객체를 생성한다고 보면 된다. (클래스를 생성하고 객체화 함)
인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type)이라고 한다.
함수적 인터페이스(@FunctionallInterface)
람다식이 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해 객체를 생성할 수 없다.
하나의 추상 메소드가 선언된 인터페이스만 람다식의 타겟 타입이 될 수 있다. 이러한 인터페이스를 함수적 인터페이스(functional interface)라고 한다. 인터페이스 선언시 @FunctionallInterface 어노테이션을 붙이면 컴파일러가 두 개 이상 추상메소드가 선언되었을 시, 컴파일 오류를 발생시킨다.
@FunctionalInterface
public interface MyFunctionalInterface{
public void method();
public void method2(); // 컴파일 에러
}
매개 변수와 리턴값이 없는 람다식
@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) {
MyFunctionalInterface fi;
fi = () -> {
String str = "hello lamda!";
System.out.println(str);
};
fi.method();
fi = () -> System.out.println("hello again!");
fi.method();
}
}
hello again!
매개 변수가 있는 람다식
@FunctionalInterface
public interface MyFunctionalInterface2 {
public void method(int num);
}
public class Example2 {
public static void main(String[] args) {
MyFunctionalInterface2 fi;
fi = (x) -> {
int result = x * 5;
System.out.println(result);
};
fi.method(5);
fi = x -> System.out.println(x*5);
// 매개 변수가 하나일 경우 괄호를 생략, 실행문 하나일 때 중괄호 생략 가능
fi.method(5);
}
}
25
25
리턴값이 있는 람다식
@FunctionalInterface
public interface MyFunctionalInterface3 {
public int method(int num);
}
public class Example3 {
public static void main(String[] args) {
MyFunctionalInterface3 fi;
fi = (x, y) -> {
int result = x+y;
return result;
};
System.out.println(fi.method(2,3));
fi = (x, y) -> {return x+y;};
System.out.println(fi.method(2,3));
fi = (x, y) -> x+y;
System.out.println(fi.method(2,3));
fi = (x, y) -> sum(x,y);
System.out.println(fi.method(2,3));
}
public static int sum(int x, int y){
return x+y;
}
}
5
5
5
5
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] 익명객체_익명 자식 객체 생성 (0) | 2019.04.15 |
---|---|
[JAVA] 람다식 클래스 멤버와 로컬 변수 사용 (0) | 2019.04.15 |
[JAVA] 람다식이란? (1) | 2019.03.28 |
[JAVA] 동기화된 컬렉션(thread-safe collection), 병렬처리 가능한 컬렉션 (0) | 2019.03.20 |
[JAVA] Comparable과 Comparator (0) | 2019.03.17 |