C/C++에는 함수포인터라는 개념이 있어 함수를 다른 함수로 전달하고 싶을 때에는 함수 포인터를 사용하면 된다. 그런데 자바는 C/C++보다 더 객체지향적인 언어이기 때문에 메소드(C/C++로 따지면 함수)는 무조건 클래스의 내부에 있어야 한다. 따라서 메소드를 전달하고 싶을 때도 (행위를 전달하고 싶을 때도) 메소드만 전달할 수는 없고 클래스를 만들어 그 안에 메소드를 정의하고 그 클래스의 객체를 생성해서 넘겨줘야 한다. 람다식은 객체를 생성하는 방법 중 하나이다. 람다식을 사용하면 객체가 생성된다. 자바에는 인터페이스라는 개념이 있다. 인터페이스는 추상클래스의 극단적인 형태라고 보면 된다. 인터페이스는 구현되어 있는 메소드가 없고 모두 추상메소드로만 이루어져 있다. (JDK 8부터 default 메소..
1. 람다 기본
인터페이스의 메소드(행위) 전달 방법 중 하나로 익명 클래스를 내부적으로 만들어 메소드를 간결하게 전달할 수 있다.
람다식을 사용하면 인터페이스를 구현한 객체를 만드는 것과 동일하다.
() -> {}
(): 전달하고자 하는 함수의 인수 자리
{}: 전달하고자 하는 함수의 구현체
2. 람다 유형
💡
1. Consumer
2. Supplier
3. Predicate (true or false) 논리
4. Function
5. Callable
package ex07.ch02;
/* 람다 유형
1. Consumer
2. Supplier
3. Predicate (true or false) 논리
4. Function
5. Callable
*/// 소비하는 친구 (가져다 쓰기만 한다 => return X / 인수로 받는)interfaceCon01 {
voidaccept(int n);
}
// 공급하는 친구interfaceSup01 {
intget(); // 호출하는 입장에서 얻는
}
// 예견하는 친구interfacePre01 {
booleantest(int n);
}
// 함수interfaceFun01 {
intapply(int n1, int n2);
}
// 기본interfaceCal01 {
voidcall();
}
// 절대 만들지 말 것! 써먹기만 하면 된다.publicclassBeh02 {
publicstaticvoidmain(String[] args) {
// 1. ConsumerCon01c1= (n) -> { // c1은 함수를 가지고 있는 것
System.out.println("소비함: " + n);
};
c1.accept(10);
// 2. Supplier// s1이 1이라는 값을 들고 있는 것이 아니라 함수를 가지고 있는 것Sup01s1= () -> 1; // {} 안쓰면 자동 return 코드가 됨intr1= s1.get();
System.out.println("공급받음: " + r1);
// 3. PredicatePre01p1= (n) -> n % 2 == 0; // return이 한 줄일 때만Pre01p2= (n) -> n % 3 == 0;
System.out.println("예측함: " + p1.test(5));
System.out.println("예측함: " + p2.test(6));
// 4. FunctionFun01add= (n1, n2) -> n1 + n2;
Fun01sub= (n1, n2) -> n1 - n2;
Fun01mul= (n1, n2) -> n1 * n2;
Fun01div= (n1, n2) -> n1 / n2;
System.out.println("함수: " + add.apply(1, 2));
System.out.println("함수: " + mul.apply(4, 5));
// 5. CallableCal01cal1= () -> {
System.out.println("기본 함수");
};
cal1.call();
}
}