타켓타입과 함수적 인터페이스


자바는 메소드를 단독으로 선언할 수 없고 클래스의 구성 멤버로 선언된다.

그렇기에 람다식은 단순히 메소드를 생성하는 것이 아니라 이 메소드를 가지고 있는 객체를 생성하는 것!!


람다식이 생성하는 객체는 인터페이스의 익명 구현 객체

인터페이스를 구현하는 것이기 때문에 람다식은 인터페이스의 종류에 따라 작성방법이 달라진다.

람다식이 대입될 인터페이스가 람다식의 타겟 타입


함수적 인터페이스


람다식은 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는

람다식의 타겟 타입이 될 수 없다.


하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟 타입이 될 수 있고,

이러한 인터페이스를 함수적 인터페이스라고 부름


@FunctionalInterface

함수적 인터페이스를 작성할 때 두개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체크해주는 기능으로

인터페이스 선언시 @FunctionalInterface 어노테이션을 붙이면 됨


1
2
3
4
5
@FuntionalInterface
public interface MyFunInterface {
    public void method();
    public void method2(); //컴파일 오류
}
cs



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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@FunctionalInterface
public interface MyFuntionalInterface {
    public void method();
}
//함수적 인터페이스
//이 인터페이스의 추상메서드는 매개변수와 리턴값이 없기 때문에
//이 인터페이스를 타겟 타입으로 갖는 람다식은 매겨변수와 리턴값이 없어야 함 
 
 
public class MyFuntionalInterfaceExample {
    public static void main(String[] args) {
        MyFuntionalInterface fi;
        
        fi = () -> {
            String str = "method call_1";
            System.out.println(str);
        };
        fi.method();
        
        fi = () -> System.out.println("method call_2");
        fi.method();    
    }
}
cs




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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@FunctionalInterface
public interface MyFuntionalInterface2 {
    public int method(int x, int y);
}
 
//타겟타입이 될 인터페이스
//추상메서드의 리턴값은 int, 매개변수는 두개
//이 인터페이스를 타겟 타입으로 갖는 람다식은
//리턴값 int를 가져야하며 매개변수가 두개여야 한다.
 
public class MyFuntionalInterfaceExample2 {
    public static void main(String[] args) {
        MyFuntionalInterface2 fi;
        
        fi = (x, y) -> {
            int result = x + y;
            return x + y;
        };
        System.out.println(fi.method(23));
        
        fi = (x, y) -> x + y; 
        System.out.println(fi.method(23));
    }
}
 
cs





표준 API 함수적 인터페이스 종류


*자바 8부터 자주 사용되는 함수적 인터페이스를 java.util.funtion에서 제공하고 있음

+ Recent posts