익명객체
를 생성하기 위한 표현식..
옛날부터 들었지만 손이 안갔는데 이참에 써봤다.
public interface Kuruma {
public void iku();
}
public class Benz implements Kuruma{
@Override
public void iku() {
System.out.println("ike!!");
}
}
public class Main {
public static void main(String[] args) {
Kuruma bz = new Benz();
bz.iku();
}
}
java에서 interface를 이용해 다형성을 제공하기 위해서는 interface를 만들고, 그것을 구현한 class를 작성한 뒤, 사용시에는 interface 타입의 참조변수에 interface를 구현한 class의 객체를 생성하여 사용했다.
흐름을 보면
public class Main {
public static void main(String[] args) {
Kuruma bz = new Kuruma() {
public void iku() {
System.out.println("ike!!");
}
};
bz.iku();
}
}
혹은 다음과 같이 실행하는 쪽에서 익명 객체를 만들어 사용했다. 하지만 Kuruma를 구현한 객체가 자주 사용되어야 하면, 위 코드를 계속해서 반복해서 사용하게 되며 지저분한 코드가 될 것
public class Main {
public static void Main(String[] args) {
Kuruma bz = () -> System.out.println("ike!!");
bz.iku();
}
}
람다식은 매개변수 + 실행문 구성 -> 접근자, 반환형 모두 생략
()->{}; 형태로 구성되며, 첫 괄호 ()에 해당 interface 함수의 매개변수를 입력하면 된다.
그 다음 ->를 입력하고, {} 안에 실행 할 코드를 작성
우선 람다식에 사용 될 Interface 생성
public interface Calculator {
public int call(int num1, int num2);
}
public static void main(String[] args) {
Calculator cal = (int num1, int num2) -> {return num1 + num2; };
System.out.println(cal.cal(1,2));
}
기본 사용법에서 매개변수가 1개 이거나, 2개 이상의 매개변수의 타입이 모두 같을 때에는 타입 생략이 가능
public static void main(String[] args) {
Calculator cal = (num1, num2) -> {return num1 + num2; };
System.out.println(cal.cal(1,2));
}
public static void main(String[] args) {
Calculator cal = () -> {System.out.println("매개변수가 없는 경우")};
cal.cal();
}
public static void main(String[] args) {
Calculator cal = (num1, num2) -> num1 + num2;
System.out.println(cal.cal(1,2));
}
실행할 문장이 1개 일 때는 {} 생략 가능하며
이 때 반환이 필요한 메소드는 return 생략이 필수
public static void main(String[] args) {
Calculator cal = num1, num2 -> System.out.println(num1);
cal.cal(1);
}
매개변수가 1개이고, 실행 할 문장도 1개면 (), {} 생략 가능
람다식을 사용하기 위한 Interface에는 조건이 있다.
구현해야 할 Interface의 추상 메소드가 단 '1개' 이어야 한다는 조건!
2개 이상인 경우 어떤 메소드를 람다식으로 표현했는지 알 수 없으니 당연하다
하지만 모든 Interface를 검사하며 개발하기엔 너무 어렵다.
그래서 나온 방법이
바로 @FunctionalInterface 어노테이션을 사용하는 것!
@FunctionalInterface
public interface Calculator {
public int cal(int num1, int num2);
public void cal2();
}
위와 같이 람다식으로 표현하기 위해 사용 될 Interface 위에 @FunctionalInterface
만 붙여주면 컴파일 시 알아서 에러를 잡아준다.