JAVA/JAVA

[Java] 람다식 (Lambda Expression)

Anna-Jin 2021. 11. 26. 15:06
728x90
반응형

[JAVA] 람다식(Lambda Expression) (tistory.com)

 

[JAVA] 람다식(Lambda Expression)

람다식(Lambda Expression) JDK1.8부터 추가됨 람다식의 도입 → 자바 = 객체지향 언어 + 함수형 언어 ※ 객체지향 언어와 함수형 언어란? 각각 객체지향 프로그래밍 패러다임을 지원하는 언어와 함수형

atoz-develop.tistory.com

람다식(Lambda Expression)

JDK 8부터 추가된 람다 함수는 익명함수(Anonymous functions)를 지칭하는 용어이다.

즉, '식별자 없이 실행가능한 함수, 메소드의 이름이 필요없는 함수'라고 말할 수 있다.

 

📌함수형 인터페이스

함수를 단 하나만 가지고 있는 인터페이스

함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션으로, 인터페이스에 선언하여 단 하나의 추상메소드만을 갖도록 제한하는 역할을 한다.

 

[Java] 람다식(Lambda Expression)과 함수형 인터페이스(Functional Interface) (2/5) - MangKyu's Diary (tistory.com)

 

[Java] 람다식(Lambda Expression)과 함수형 인터페이스(Functional Interface) (2/5)

1. 람다식(Lambda Expression) 이란? Stream 연산들은 매개변수로 함수형 인터페이스(Functional Interface)를 받도록 되어있다. 그리고 람다식은 반환값으로 함수형 인터페이스를 반환하고 있다. 그렇기 때문

mangkyu.tistory.com

 

람다식의 장단점

  • 장점
    1. 식에 개발자의 의도가 명확히 드러나 가독성이 높아진다.
    2. 병렬프로그래밍이 용이하다.
    3. 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다.
    4. 코드를 간결하게 만들 수 있다.
  • 단점
    1. 디버깅이 어렵다.
    2. 재귀로 만들 경우에 부적합하다.
    3. 람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있다.
    4. 람다를 사용하면서 마든 무명함수는 재사용이 불가능하다.

 

람다식 기본문법

람다는 객체를 생성할 필요가 없다.

(매개변수) -> { 실행문 }

 

람다식 사용 예제

※프로그래머스 프로그래밍강의 > 자바 중급 > 람다, 내부클래스, 익명클래스

 

람다식 사용 전

내부클래스를 이용해서 CheckCar라는 인터페이스를 만들고, 그걸 구현하는 CheckCarForBigAndNotExpensive클래스를 만들어서 4명 이상이 탈 수 있고, 가격이 2500이하인 차를 검색한다

import java.util.*;
public class CarExam{
    public static void main(String[] args){
        List<Car> cars = new ArrayList<>();
        cars.add( new Car("작은차",2,800,3) );
        cars.add( new Car("봉고차",12,1500,8) );
        cars.add( new Car("중간차",5,2200,0) );
        cars.add( new Car("비싼차",5,3500,1) );
        
        printCar(cars, new CheckCarForBigAndNotExpensive());
    }
    
    public static void printCar(List<Car> cars, CheckCar tester){
        for(Car car : cars){
            if (tester.test(car)) {
                System.out.println(car);
            }
        }
    }
    
    interface CheckCar{
        boolean test(Car car);
    }
    
    //내부클래스를 만들어서 사용합니다.
    static class CheckCarForBigAndNotExpensive implements CheckCar{
        public boolean test(Car car){
            return car.capacity >= 4 && car.price < 2500;
        }
    }
}

 

익명클래스를 사용한 후

import java.util.*;
public class CarExam{
    public static void main(String[] args){
        List<Car> cars = new ArrayList<>();
        cars.add( new Car("작은차",2,800,3) );
        cars.add( new Car("봉고차",12,1500,8) );
        cars.add( new Car("중간차",5,2200,0) );
        cars.add( new Car("비싼차",5,3500,1) );
        
        printCar(cars, 
            //인터페이스 CheckCar를 구현하는 익명클래스를 만듭니다.
            new CheckCar(){
                public boolean test(Car car){
                    return car.capacity >= 4 && car.price < 2500;
                }
            });
    }
    
    public static void printCar(List<Car> cars, CheckCar tester){
        for(Car car : cars){
            if (tester.test(car)) {
                System.out.println(car);
            }
        }
    }
    
    interface CheckCar{
        boolean test(Car car);
    }  
}

 

람다식 사용 후

import java.util.*;
public class CarExam{
    public static void main(String[] args){
        //Car객체를 만들어서 cars에 넣습니다.
        List<Car> cars = new ArrayList<>();
        cars.add( new Car("작은차",2,800,3) );
        cars.add( new Car("봉고차",12,1500,8) );
        cars.add( new Car("중간차",5,2200,0) );
        cars.add( new Car("비싼차",5,3500,1) );
        
        CarExam carExam = new CarExam();
        carExam.printCar(cars, 
            //인터페이스 CheckCar의 test메소드에 대응하는 람다를 만듭니다.
            (Car car) -> { return car.capacity >= 4 && car.price < 2500; }
        );
    }
    
    public void printCar(List<Car> cars, CheckCar tester){
        for(Car car : cars){
            if (tester.test(car)) {
                System.out.println(car);
            }
        }
    }
    
    interface CheckCar{
        boolean test(Car car);
    }  
}

++ 추가 중입니다.

728x90
반응형