함수형 인터페이스

BuZZLightyear·2023년 3월 8일
0

정리

목록 보기
35/47

함수형 인터페이스

자바에서 함수는 반드시 클래스 안에서 정의되어야 하기 때문에 메서드가 독립적으로 있을 수 없고 반드시 클래스 객체를 먼저 생성한 후 생성한 객체로 메서드를 호출해야한다.

람다식은 객체이다. 정확히는 이름이 없기 때문에 익명 객체라고 부른다.

// sum 메서드 람다식
(num1, num2) -> num1 + num2

// 람다식을 객체로 표현 
new Object() {
	int sum(int num1, int num2) {
		return num1 + num1;
	}
}

익명 객체는 익명 클래스를 통해 만들 수 있다.

익명 클래스 : 객체의 선언과 생성을 동시에 하여 오직 하나의 객체를 생성하고, 단 한번만 사용되는 일회용 클래스

함수형 인터페이스에는 단 하나의 추상 메서드만 선언 될수있다.

public class LamdaExample1 {
    public static void main(String[] args) {
        /* Object obj = new Object() {
            int sum(int num1, int num2) {
                return num1 + num1;
            }
        };
        */ 
        ExampleFunction exampleFunction = (num1, num2) -> num1 + num2;
        System.out.println(exampleFunction.sum(10,15));
}

@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는지 확인하도록 합니다. 
interface ExampleFunction {
		int sum(int num1, int num2);
}
25

매개변수와 리턴값이 없는 람다식

@FunctionalInterface
public interface MyFunctionalInterface {
    void accept();
}

위 인터페이스를 타겟 타입으로 갖는 람다식

MyFunctionalInterface example = () -> { ... };

example.accept(); // { } 를 실행 시킴

람다식에서 매개변수가 없는 이유는 accept()가 매개변수를 가지지 않기 때문이다.

@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() 호출

매개변수가 있는 람다식

매개 변수가 있고 리턴값이 없는 추상 메서드를 가진 함수형 인터페이스

@FunctionalInterface
public interface MyFunctionalInterface {
    void accept(int x);
}
public class MyFunctionalInterfaceExample {

    public static void main(String[] args) throws Exception {

        MyFunctionalInterface example;
        example = (x) -> {
            int result = x * 5;
            System.out.println(result);
        };
        example.accept(2);

        example = (x) -> System.out.println(x * 5);
        example.accept(2);
    }
}
10
10

리턴값이 있는 람다식

@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

람다식이 대입된 인터페이스 참조변수는 위와 같이 accept()를 호출할 수 있다.

profile
버즈라이트이어

0개의 댓글