chapter14. 람다식. 


14.1 람다식이란?


* 함수적 프로그래밍

1. y=f(x) 형태의 함수로 구성된 프로그래밍 기법

- 데이터를 매개값으로 전달하고 결과를 받는 코드들로 구성

- 객체 지향 프로그래밍 보다는 효율적인 경우

// 대용량 데이터의 처리시에 유리

: 데이터 포장 객체를 생성후 처리하는 것 보다, 데이터를 바로 처리하는 것이 속도에 유리하다

: 멀티 코어 CPU에서 데이터를 병렬 처리하고 취합할 때 객체보다는 함수가 유리


// 이벤트 지향 프로그래밍(이벤트가 발생하면 핸들러 함수 실행)에 적합

: 반복적인 이벤트 처리는 핸들러 객체보다는 핸들러 함수가 적합


2. 현대적 프로그래밍 기법

- 객체 지향 프로그래밍 + 함수적 프로그래밍


* 자바 8부터 함수적 프로그래밍 지원

- 람다식(Lamda Expressions)을 언어 차원에서 제공

// 람다 계산법에서 사용된 식을 프로그래밍 언어에 접목

// 익명 함수(anonymous function)을 생성하기 위한 식


- 자바에서 람다식을 수용한 이유

// 코드가 매우 간결해 진다

// 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해서 쉽게 집계할 수 있다.


- 자바는 람다식을 함수적 인터페이스의 익명 구현 객체로 취급

// 어떤 인터페이스를 구현할지는 대입되는 인터페이스에 달려있다.



14.2 람다식 기본 문법

* 함수적 스타일의 람다식을 작성하는 방법





14.3 타겟 타입과 함수적 인터페이스

* 타겟 타입(target type)

- 람다식이 대입되는 인터페이스를 말한다

- 익명 구현 객체를 만들 때 사용할 인터페이스이다.


14.3.1 함수적 인터페이스(functional interface)

- 모든 인터페이스는 람다식의 타겟 타입이 될 수 없다.

// 람다식은 하나의 메소드를 정의하기 때문에

// 하나의 추상 메소드만 선언된 인터페이스만 타겟 타입이 될 수 있음


- 함수적 인터페이스

// 하나의 추상 메소드만 선언된 인터페이스를 말한다


- @FunctionalInterface 어노테이션 (실수를 줄이기 위해서 쓴다. 선택 사항)

// 하나의 추상 메소드만을 가지는지 컴파일러가 체크하도록 함

// 두 개 이상의 추상 메소드가 선언되어 있으면 컴파일 오류가 발생


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


1
2
3
4
5
6
package sec03.exam01_no_arguments_no_return;
 
@FunctionalInterface // 확실히 하기 위해
public interface MyFunctionalInterface {
    public void 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
26
27
28
package sec03.exam01_no_arguments_no_return;
 
public class MyFunctionalInterfaceExample { 
    public static void main(String[] args) {
        MyFunctionalInterface fi;
        // 4개 다 똑같다
        // 1번째
        fi= () -> { 
            String str = "method call1";
            System.out.println(str);
        };
        fi.method();
        // 2번째
        fi = () -> { System.out.println("method call2"); };
        fi.method();
        // 3번째 // 실행문이 하나라면 중괄호 {}는 생략가능
        fi = () -> System.out.println("method call3");
        fi.method();
        // 람다식을 사용하지 않고, 익명 객체를 만든다면
        // 4번째
        fi = new MyFunctionalInterface() {
            public void method() {
                System.out.println("method call4");
            };
        };
        fi.method();
    }
}
cs



14.3.3 매개 변수가 있는 람다식


1
2
3
4
5
6
package sec03.exam02_arguments;
 
@FunctionalInterface // 확실히 하기 위해
public interface MyFunctionalInterface {
    public void method(int x);
}
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
26
27
28
package sec03.exam02_arguments;
 
public class MyMethodReferencesExample { 
    public static void main(String[] args) {
        MyFunctionalInterface fi;
        // 4개 다 똑같다 
        // 1번째
        fi= (x) -> { 
            int result = x * 5;
            System.out.println(result);
        };
        fi.method(2);
        // 2번째
        fi = (x) -> { System.out.println(x*5); };
        fi.method(2); 
        // 3번째 // 실행문이 하나라면 중괄호 {}는 생략가능
        fi = x -> System.out.println(x*5);
        fi.method(2);//매개변수가 하나라면 괄호 ()는 생략가능
        // 람다식을 사용하지 않고, 익명 객체를 만든다면
        // 4번째
        fi = new MyFunctionalInterface() {
            public void method(int x) {
                System.out.println(x*5);    
            };
        };
        fi.method(2);
    }
}

cs



14.3.4 리턴값이 있는 람다식



1
2
3
4
5
6
package sec03.exam03_return;
 
@FunctionalInterface
public interface MyFunctionalInterface {
    public int method(int x, int y);
}
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
26
27
package sec03.exam03_return;
 
public class MyFunctionalInterfaceExample { 
    public static void main(String[] args) {
        MyFunctionalInterface fi;
        // 4개 다 똑같다
        // 1번째
        fi = (x, y) -> {
            int result = x + y;
            return result;
        };
        System.out.println(fi.method(25));
        // 2번째
        fi = (x, y) -> { return x + y; };
        System.out.println(fi.method(25));
        // 3번째
        // {}에 return만 있을경우 return, {} 둘 다 생략가능
        fi = (x, y) -> x + y;
        System.out.println(fi.method(25));
        // 4번째
        fi = (x, y) -> sum(x, y);
        System.out.println(fi.method(25));
    }
    public static int sum(int x, int y) {
        return (x + y);
    }
}
cs



Posted by 너래쟁이
: