개인용 복습공간

[Java] 람다식과 함수형 인터페이스 - 1 본문

Java

[Java] 람다식과 함수형 인터페이스 - 1

taehwanis 2021. 5. 8. 04:39

첫 포스팅이라 부족함이 있을 수 있음

람다식

자바에서는 함수형 인터페이스의 구현 객체로 취급한다. 메서드를 포함하는 익명 구현 객체를 전달할 수 있는 코드를 의미한다

 

람다식의 특징 은 여러 가지가 있다

  • 메서드와 달리 이름이 없다
  • 메서드와 달리 특정 클래스에 종속되지 않지만, 매개변수, 반환 타입, 본체를 가지며, 심지어 예외도 처리할 수 있다
  • 메서드의 인수로 전달될 수도 있고 변수에 대입될 수 있다
  • 익명 구현 객체와 달리 메서드의 핵심 부분만 포함한다

 

람다식의 문법 은 간단하다

예를 들어, (x, y) -> { return x + y }; 이런 식으로 작성하면 된다

 


 

함수형 인터페이스

함수형 인터페이스란 추상 메서드가 1개만 있는 인터페이스를 의미한다

매개 값 ------> 함수형 인터페이스 ------> 반환 값       이런 느낌이다.

 

java.util.function 패키지가 제공하는 함수형 인터페이스 종류

이외에도 BiPredicate와 같은 다양한 변종들이 있다. java.util.function 패키지가 제공하는 함수형 인터페이스는 추상 메서드 외 다양한
디폴트 메서드나 정적 메서드도 제공한다.

 


 

람다식 활용 문제

간단하게 Car리스트와 람다식, 함수형 인터페이스를 이용한 예제를 해보려 한다 (자세한 내용은 주석으로 설명해 두었다)

 

Car.java

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.Arrays;
import java.util.List;
 
//필요한 함수형 인터페이스 (1)
@FunctionalInterface//함수형 인터페이스의 조건을 갖추었는지에 대한 검사를 컴파일러에게 요청 -> 아니면 오류출력
interface CarConsumer{
    void apply(Car car); // 입출력 출력이 있음
}
//필요한 함수형 인터페이스 (2)
@FunctionalInterface
interface CarPredicate{
    boolean test(Car car); //전달 인자를 근거로 참 또는 거짓을 반환하는 메소드
}
 
public class Car {
    //매개변수
    private String model;
    private boolean gasoline;
    private int age;
    private int mileage;
    
    //생성자
    public Car(String model, boolean gasoline, int age, int mileage) {
        this.model = model;
        this.gasoline = gasoline;
        this.age = age;
        this.mileage = mileage;
    }
    
    //메소드
    public String getModel() {return model;}
    public boolean isGasoline() {return gasoline;}
    public int getAge() {return age;}
    public int getMileage() {return mileage;}
    public String toString() {
        return String.format("Car(%s,%s,%d,%d)", model, gasoline, age, mileage);
    }
    
    //Car리스트
    public static final List<Car> cars = Arrays.asList(
            new Car("소나타"true18210000),
            new Car("코란도"false15200000),
            new Car("그랜저"true12150000),
            new Car("싼타페"false10220000),
            new Car("아반테"true1070000),
            new Car("에쿠스"true6100000),
            new Car("그랜저"true580000),
            new Car("소나타"true235000),
            new Car("쏘렌토"false110000),
            new Car("아반테"true17000));
    
}
 
cs

 

CarDemo.java

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.ArrayList;
import java.util.List;
 
public class CarDemo {
    public static void main(String[] args) {
        //디젤 자동차만 모두 찾기
        List<Car> dieselCars = findCars(Car.cars, c -> !c.isGasoline());
        System.out.println("디이젤 자동차 = " + dieselCars);
        
        //10년보다 오래된 자동차만 모두 찾기
        List<Car> oldCars = findCars(Car.cars, c -> c.getAge()>10);
        System.out.println("오래된 자동차 = " + oldCars);
        
        //10년보다 오래된 디젤 자동차만 모두 찾기
        List<Car> oldDieselCars = findCars(Car.cars, c -> c.getAge()>10 && !c.isGasoline());
        System.out.println("오래된 디이젤 자동차 = " + oldDieselCars);
        
        //디젤 자동차를 출력하되 모델과 연식만 나타나도록 출력
        System.out.print("디이젤 자동차 = ");
        printCars(dieselCars, c -> System.out.printf("%s(%d) ", c.getModel(), c.getAge()));
        
        //10년보다 오래된 자동차를 출력하되 모델, 연식, 주행거리만 출력
        System.out.print("\n오래된 자동차 = ");
        printCars(oldCars, c -> System.out.printf("%s(%d, %d) ", c.getModel(), c.getAge(), c.getMileage()));
    }
 
    
    //람다식으로 디젤 or 오래된 자동차 or 오래되고 디젤 인 자동차를 구별해서 출력한다.
    private static List<Car> findCars(List<Car> all, CarPredicate cp) {
        List<Car> result = new ArrayList<>();
        for (Car car : all) {
            if(cp.test(car))
                result.add(car);
        }
        return result;
    }
    //이미 구분된 자동차를 사용해서 함수형 인터페이스를 이용해 원하는 정보만 출력한다.
    public static void printCars(List<Car> all, CarConsumer cc) {
        for (Car car : all) {
            cc.apply(car);
        }
    }
 
}
cs

간단하게 말하면 Car리스트를 함수형 인터페이스와 람다식을 이용하여 필요한 정보만 출력하는 예시다

Comments