원래 메서드는 클래스 안에서 정의되어야 한다. 메서드는 독립적일 수 없기 때문이다. 다른 클래스의 메서드를 호출해야할 경우 클래스 객체를 먼저 생성한 뒤 그 객체를 통해 메서드를 호출해야 한다.
우리는 메서드와 동일시 여겼지만 따지고 보면 람다식은 객체다. 이름없는 익명객체이다.
람다식은 익명클래스를 통해 생성할 수 있다.
익명 클래스란? 객체의 선언과 생성을 동시에 하여 오직 하나의 객체를 생성하고 단 한번만 사용되는 일회용 클래스이다.
익명클래스 : 1(하나의객체만 생성해서) / 1(한번만 사용하는) / 1(일회용 클래스이다.)
만약 람다식이 객체라고 한다면 우리는 아래와 같이 객체에 접근할 참조변수가 필요하다.
public class LamdaExample1 {
public static void main(String[] args) {
💡 람다식 Object obj = (num1, num2) -> num1 + num2; 로 축약 가능
Object obj = new Object() { // obj참조변수 생성
int sum(int num1, int num2) {
return num1 + num1;
}
};
obj.sum(1, 2);
}
}
그러나 이처럼 익명객체를 생성하여 참조변수 obj에 담아준다 하더라도 Object클래스에는 sum 메서드가 없기 때문에 sum()를 사용할 수 없다. 이같은 문제를 해결하기 위해 함수형 인터페이스를 사용한다. 즉, 부모타입의 클래스안에 람다식에서 사용할 메서드가 없기때문에 메서드를 사용할 수 없다.그렇기때문에 람다식에서 메서드를 사용하기 위해선 함수형 인터페이스안에 추상메서드를 선언한 뒤 람다식을 1:1로 매칭해주어야 한다.
public class LamdaExample1 {
public static void main(String[] args) {
ExampleFunction exampleFunction = (num1, num2)->num1+num2;
System.out.println(exampleFunction.sum(10,15));
}
}
@FunctionalInterface 👉🏻 컴파일러에게 인터페이스가 바르게 정의되었는지 확인하도록 요청함
interface ExampleFunction { //ExampleFunction인터페이스 생성
int sum(int num1, int num2); //추상메서드 선언
}
// 출력값
25
MyFunctionalInterface라는 인터페이스를 생성 후 매개변수와 리턴값이 없는 추상메서드를 선언해주었다.
@FunctionalInterface
interface MyFunctionalInterface {
void accept();
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) throws Exception {
MyFunctionalInterface example =()-> System.out.println("accept() 호출");
example.accept();
}
}
// 출력값
accept() 호출
// 함수형 인터페이스생성
interface MyFunctionalInterface{
void accept(int x); //매개변수 x가 있는 추상메서드
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) throws Exception {
💡 매개변수가 있는 람다식
MyFunctionalInterface example2;
// MyFunctionalInterface타입의 example2필드선언
💡 람다식의 실행문이 2개 이상인 경우 {}중괄호로 묶는다.
example2 = (x) -> {
int result = x * 5;
System.out.println(result);
};
example2.accept(2);
💡 출력문에서 바로 계산하는 경우, 실행문이 1개일 때 {} 없음
example2 = (x) -> System.out.println(x*5);
example2.accept(2);
@FunctionalInterface
public interface MyFunctionalInterface {
int accept(int x, int y);
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) throws Exception {
MyFunctionalInterface example;
example = (x, y) -> {
int result = x + y;
return result;
};
int result1 = example.accept(2, 5);
System.out.println(result1);
example = (x, y) -> { return x + y; };
int result2 = example.accept(2, 5);
System.out.println(result2);
example = (x, y) -> x + y;
//return문만 있을 경우, 중괄호 {}와 return문 생략가능
int result3 = example.accept(2, 5);
System.out.println(result3);
example = (x, y) -> sum(x, y);
//return문만 있을 경우, 중괄호 {}와 return문 생략가능
int result4 = example.accept(2, 5);
System.out.println(result4);
}
public static int sum(int x, int y){
return x + y;
}
}
//출력값
7
7
7
7