ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다 표현식
    STUDY/백엔드 2021. 5. 6. 17:19

    람다 표현식(lamda expression)이란?

    메소드를 하나의 식으로 표현한 것을 말한다. 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 람다 표현식은 메소드의 매개변수로 전달될 수도 있고, 메소드의 결과값으로 반환될 수도 있다.

     

    메소드

    int max(int x, int y) {
        return x > y ? x : y;
    }

     

    람다 표현식

    (x, y) -> x > y ? x : y;

     

    장점

    1. 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다.

    2. 지연연산 수행 - 람다는 지연연상을 수행함으로써 불필요한 연산을 최소화 할 수 있다.

    3. 병렬처리 가능 - 멀티쓰레디를 활용하여 병렬처리를 사용 할 수 있다.

     

    단점

    1. 람다식의 호출이 까다롭다.

    2. 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어진다.

    3. 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어뜨릴 수 있다.

     

    람다 표현식 작성

     

    1. 자바에서는 화살표(->) 기호를 사용하여 람다 표현식을 작성할 수 있다.

    (매개변수목록) -> { 함수몸체 }

     

    2. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.

    (int x, int y) -> x+y
    (x, y) -> x+y  // type 생략

     

    3. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.

    (int x) -> x+1
    (x) -> x+1  // type 생략
    x -> x+1   // 괄호 생략

     

    4. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. (이때 세미콜론(;)은 붙이지 않음.)

    (int x, int y) -> { x+y }
    (x, y) -> x+y  // type, {} 생략

     

    5. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.

    (int x, int y) -> x+y  // {} 생략
    (x, y) -> x+y  // type, {} 생략
    (x, y) -> { return x+y; }  // type 생략, return문으로 이루어져 {} 생략불가

     

    6. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 된다. (이때 세미콜론(;)은 붙이지 않음)

     

    예제

    [기존]
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("study lamda expression");
        }
    }).start();

    [람다 표현식]
    new Thread(()->{
        System.out.println("study lamda expression");
    }).start();

     

    함수형 인터페이스(functional interface)

     

    람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야 한다.

     

    참조변수의타입 참조변수의이름 = 람다 표현식

     

    위 문법처럼 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 부른다. @FunctionalInterface 어노테이션을 사용해서 함수형 인터페이스임을 명시할 수 있고, 어노테이션을 인터페이스의 선언 앞에 붙이면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다. 함수형 인터페이스는 추상 클래스와는 달리 단 하나의 추상 메소드만을 가져야 하고, 두 개 이상의 메소드가 선언되면 오류를 발생시킨다. 

    @FunctionalInterface
    public interface Calc{
        public int cal(int first, int second);
    }

    //메소드가 두개이므로 오류가 발생한다.
    @FunctionalInterface
    public interface Calc{
        public int min(int first, int second);
        public int max(int first, int second);
    }

     

    예제

    @FunctionalInterface
    interface Calc { // 함수형 인터페이스의 선언
        public int cal(int x, int y);
    }
     
    public class Lambda1 {
    public static void main(String[] args){
            Calc maxNum = (x, y) -> x > y ? x : y; // 추상 메소드의 구현
            System.out.println(maxNum.cal(5, 15));  // 함수형 인터페이스의 사용
        }
    }

    [결과] : 15

    public class Lambda2 {
    public static void main(String[] args){
            Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현
            System.out.println(minNum.cal(5, 15));  // 함수형 인터페이스의 사용
        }
    }

    [결과] : 5

     

    tcpschool.com/java/java_lambda_concept

    'STUDY > 백엔드' 카테고리의 다른 글

    Java Bean Validation  (0) 2021.05.07
    @Transactional  (0) 2021.05.07
    Optional  (0) 2021.05.06
    Stream  (0) 2021.04.28
    Spring Batch  (0) 2021.03.03
Designed by Tistory.