ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 람다식(Lambda Expressions) 이란?
    Java 2020. 4. 18. 23:09
    반응형

    람다식이란 "식별자없이 실행가능한 함수"

    람다식은 익명함수(anonymous function)을 생성하기 위한 식으로 객체 지향 언어보다 함수 지향 언어에 가깝다.

    함수적 프로그래밍을 위해 자바 8부터 람다식(Lambda Expressions)을 지원하면서 기존의 코드 패턴이 많이 달라졌다.자바스크립트에서 주로 봤었던 문법들을 이제 자바에서도 사용 할 수 있다.

    이 람다식의 사용 목적은 인터페이스가 가지고 있는 메소드를 간편하게 즉흥적으로 구현해서 사용하는 것이 목적이다.

    람다시 기본 사용법

    //기본
     
    (매개변수, ...) -> { 실행문 ... }

    (매개변수, ...)는 오른쪽 중괄호 { } 블록을 실행하기 위해 필요한 값을 제공하는 역할을 한다.. 매개 변수의 임의로 지정 할 수 있으며 인자타입도 명시하지 않아도 된다. -> 기호는 매개 변수를 이용해서 중괄호 { } 바디를 실행한다는 뜻이다.

    //여러가지 사용방법
     
    ( parameters ) -> expression body
     
    ( parameters ) -> { expression body }
     
    () -> expression body
     
    () -> { expression body }

     

    ( parameters ) -> expression body - 함수에 파라메터가 있는 경우, 단일 오퍼레이션 또는 반환값만 존재할 경우

    (int a, int b) -> return a+b;

     

    ( parameters ) -> { expression body } - 함수에 파라메터가 있는 경우, 여러 오퍼레이션이 필요한 경우 중괄호로 감싼다.

    (int a, int b) -> {
    int c = 10;
       int d = a+* 10;
           
    return d;
    };

     

    () -> expression body - 함수에 파라메터가 없는 경우, 단일 오퍼레이션 또는 반환값만 존재할 경우

    () -> return 10;

     

    () -> { expression body } - 함수에 파마메터가 없는 경우, 여러 오퍼레이션이 필요한 경우 중괄호로 감싼다.

    () -> {
       int a = 10;
       int b = 20;
       
       return a+b;
    }

     

    메소드

    int min(int x, int y) {
     
        return x < y ? x : y;
     
    }

    람다 표현식

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

    위의 예제처럼 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다.

    그런데 자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라 한다.

    따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.

    람다식의 유의사항

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

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

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

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

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

    예제1)

    //기존
    new Thread(new Runnable() {
     
        public void run() {
     
            System.out.println("전통적인 방식의 일회용 스레드 생성");
     
        }
     
    }).start();
     
     
    //람다
    new Thread(()->{
     
        System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
     
    }).start();

    예제2)

    @FunctionalInterface
    interface Run{
        int exec(int a,int b);
    }
    class Home{
        public void test(Run run) {
        int out = run.exec(5,5);
        System.out.println("Number is "+out);
        }
    }

    예를들기 위해 이라는 Home이라는 Class와 Functional Interface를 만들었다.

     Functional Interface란 함수가 하나만 존재하는 Interface를 의미한다.

    자바는 java.util.function 패키지를 통해 여러 상황에서 사용할 수 있는 다양한 함수형 인터페이스를 미리 정의하여 제공한다.

    람다식 사용X

    Home h = new Home();
    h.test(new Run() {
        public int exec(int a, int b) {
        System.out.println("My Name is 홍길동");
        System.out.println("Hello Java World ");
        System.out.println("parameter number is "+a+","+b);
        return 10;
        }
    });

    람다식 사용O

    Home h = new Home();
    h.test((a,b) ->{
        System.out.println("This is 홍길동");
        System.out.println("Hellow Java World ");
        System.out.println("parameter number is "+a+","+b);
        return 10;
    });

    결과

    This is 홍길동
    Hello Java World
    parameter number 5,5
    Number is 10

     

    람다식 장점

    1. 코드를 간결하게 만들 수 있다.

    2. 코드가 간결하고 식에 개발자의 의도가 명확히 드러나므로 가독성이 향상된다.

    3. 함수를 만드는 과정없이 한번에 처리할 수 있기에 코딩하는 시간이 줄어든다.

    4. 병렬프로그래밍이 용이하다.

     

    람다식 단점

    1. 람다를 사용하면서 만드는 무명함수는 재사용이 불가능하다.

    2. 디버깅이 다소 까다롭다.

    3. 람다를 남발하면 코드가 지저분해질 수 있다. (비슷한 함수를 계속 중복생성할 가능성이 높음)

    4. 재귀로 만들경우에는 다소 부적합한면이 있다.

    람다식 간단 예제

    1. 두개의 숫자 더하기

    interface Cal{
        public int calExec(int a, int b);
    }
     
    public class Ramda {
        //람다식 문법 (매개변수 목록)->{실행문}
        public static void run(Cal cal) {
            int k = 10;
        int m = 20;
        int value = cal.calExec(k, m);
        System.out.println(value);
        }
        public static void main(String[] args) {
        run((i,j)->{
            return i+j;
        });
        }
    }

     

    2. 두개의 숫자중 큰 수 찾기

    public class Ramda2 {
        @FunctionalInterface//함수형 인터페이스 체크 어노테이션
        public interface GetNumber{
          int getMaxNumber(int num1, int num2);
        }
        public static void main(String[] args) {
          GetNumber max = (x,y)->(x>=y)? x:y;
          System.out.println(max.getMaxNumber(1030));
        }
    }

     

    3. Runnable 인스턴스 생성

    public class RunnableExec {
        public static void main(String[] args) {
            Runnable runnable = () -> {
                for (int i = 0; i < 30; i++) {
                    System.out.println(i);
                }
            };
            Thread thread = new Thread(runnable);
            thread.start();
        }
    }

     

    4. Thread 호출

    Thread thread = new Thread( () -> {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    });

     

    본문의 출처 https://coding-factory.tistory.com/265 , http://tcpschool.com/java/java_lambda_concept

    반응형

    댓글

Designed by Tistory.