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


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

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


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

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

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


함수적 인터페이스


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

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


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

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


@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에서 제공하고 있음

람다식



람다식이란? 



람다식 등장 배경


람다식은 함수적 프로그래밍을 위해 자바8부터 지원하기 시작


함수적 프로그래밍이 부각되는 이유는 병렬처리와 이벤트 지향 프로그래밍에 적합하기 때문이다.



람다식이란?


람다식은 익명함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.

람다식을 사용하면 코드가 간결해지고, 컬랙션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계 가능



람다식의 형태


매개변수를 가진 코드 블록 --> 런타임 시에는 익명 구현 객체를 생성


1
2
3
4
5
6
7
8
9
Runnable runnable = () -> { ... };
//람다식
 
 
Runnable runnable = new Runnalble() {
    public void run() { ... }
};
// 익명 구현 객체
// 람다식이 런타임시에는 익명 구현 객체로 생성
cs

 



람다식 기본 문법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
(int a) -> { System.out.println(a); }
//기본 람다식
 
(a) -> { System.out.println(a); }
//매개변수 타입은 런타임시 대입되는 값에 따라 자동으로 인식이 가능
//그렇기에 람다식에서는 매개변수 타입을 일반적으로 언급안함
 
-> System.out.println(a);
//하나의 매개변수만 있다면 괄호 생략가능
//마찬가디로 하나의 실행문만 있다면 중괄호 생략가능
 
(x, y) -> { return x + y; };
(x, y) -> x + y
//중괄호에 리턴문만 있다면 return을 사용하지 않는게 정석 
cs



+ Recent posts