ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java | Lambda Expression 람다식
    JAVA/JAVA 2020. 2. 14. 00:36

    Lambda Expression 람다식

    자바에서 제공하는 함수형 프로그래밍 방식

    • 자바 8부터 함수형 프로그래밍 지원
    • Functional Programming(FP): 함수형 프로그래밍
      함수의 구현과 호출만으로 프로그램을 만들 수 있는 프로그래밍 방식
    • 함수 이름이 없는 익명 함수를 만드는 것

    Lambda 문법

    (매개변수) -> {실행 코드;}
    • 메소드 이름과 반환형을 없애고 -> 기호 사용
    • 매개변수 자료형 생략 가능
    • 매개변수가 하나인 경우에는 괄호 생략 가능
    • 중괄호 안의 구현 부분이 한 문장인 경우 중괄호 생략 가능
    • 중괄호 안의 구현부가 한 문장이더라도 return문은 중괄호 생략 불가
    • 중괄호 안의 구현부가 return문 하나라면 중괄호과 return을 모두 생략하고 식만 작성 가능

    함수형 인터페이스

    • 자바에서는 참조 변수 없이 메소드를 호출할 수 없기 때문에
      람다식 구현을 위한 함수형 인터페이스가 필요
    • 람다식 구현을 위한 함수형 인터페이스를 만들고
      인터페이스에 람다식으로 구현할 메소드 선언
    • 람다식은 하나의 메소드를 구현하여 인터페이스형 변수에 대입하기 때문에
      인터페이스가 두 개 이상의 메소드를 가질 수 없음
    • 람다식은 익명 함수이기 때문에
      인터페이스에 메소드가 여러 개 있으면 구분이 불가능함

    @FunctionalInterface 어노테이션

    • 인터페이스 바로 위에 @FunctionalInterface를 작성하면 함수형 인터페이스라는 뜻
    • 메소드를 하나 이상 선언하면 오류 발생
    • 필수로 작성해야 하는 것은 아니지만 함수형 인터페이스를 명시적으로 표현하므로
      나중에 발생할 오류를 방지할 수 있음

     

    @FunctionalInterface
    interface 인터페이스명 {}

    람다식으로 인터페이스 구현

    • 클래스를 따로 생성할 필요 없이 바로 메소드 구현
    • 자바는 객체 지향 언어로 객체 생성 없이 메소드 호출 불가
      → 람다식으로 인터페이스 메소드 구현시
      컴퓨터 내부에서 익명 클래스를 통한 익명 객체 생성
    • 람다식 코드에서 외부 메소드 지역 변수 사용시 해당 변수는 상수로 작용
      따라서 외부 메소드의 지역 변수를 출력할 수는 있지만 변수 값 수정은 불가능
    • 람다식은 함수의 구현부를 변수에 대입하거나
      매개변수로 전달하거나 반환 값으로 사용 가능
      즉, 변수처럼 사용 가능

    예제 ①

    익명 내부 클래스와 람다식으로 함수형 인터페이스 구현

    package j200213;
    
    // 함수형 인터페이스
    @FunctionalInterface
    interface Xyz2 {
        public int a(int x, int y);
    }
    
    public class LamTest2 {
    
        public static void main(String[] args) {
    
            // 익명 내부 클래스로 인터페이스 구현
            Xyz2 anonymousInner = new Xyz2() {
                public int a(int x, int y) {
                    return x + y;
                }
            };
            int resultA = anonymousInner.a(1, 9);
    
            System.out.println(resultA);    //10
    
            // 람다식으로 인터페이스 구현
            Xyz2 lambda = (x, y) -> x + y;
            int resultB = lambda.a(4, 5);
    
            System.out.println(resultB);    //9
    
        }
    
    }

    예제 ②

    람다식을 인터페이스형 변수에 대입한 뒤 메소드를 호출해보고
    다시 그 변수를 메소드의 매개변수로 전달하는 예제

    package j200213;
    
    @FunctionalInterface
    interface Lambda {
        void showString(String str);
    }
    
    public class LamPara {
    
        public static void main(String[] args) {
            // 람다식을 인터페이스형 변수에 대입
            Lambda ld = s -> System.out.println(s);
    
            // 그 변수를 사용해 람다식 구현부 호출
            ld.showString("Hello lambda"); // Hello lambda
    
            // 메소드 매개변수로 람다식 대입 변수 전달
            showMyString(ld);     // 안녕 람다?
    
        }
    
        // lambda 인터페이스형 객체를 매개변수로 받는 함수
        public static void showMyString(Lambda ld) {
            ld.showString("안녕 람다?");
        }
    }

    예제 ③

    반환 값에 람다식을 구현해서 인터페이스 객체를 생성하고
    람다식으로 구현한 메소드를 호출해 보는 예제

    package j200213;
    
    @FunctionalInterface
    interface Return {
        int plus(int x, int y);
    }
    
    public class LamReturn {
    
        public static void main(String[] args) {
    
            // returnRT() 메소드로 Return 객체 반환, rt 변수 초기화
            Return rt = returnRT();
    
            // rt 객체로 메소드 호출 및 결과 저장
            int result = rt.plus(5, 4);
    
            // 결과 출력
            System.out.println(result);    // 9
        }
    
        // Return 인터페이스 객체 반환 메소드
        public static Return returnRT() {
            /*
            Return 객체 생성 후 객체 반환
            Return rt = (x, y) -> x + y;
            return rt;
            */
            // 반환 값에 바로 람다식 구현
            return (x, y) -> x + y;
        }
    }

    자바에서 함수형 프로그래밍시 사용할 수 있는 람다식에 대해 살펴보았습니다.

    꼭 함수형 프로그래밍이 아니더라도 간략한 표현식 덕분에

    메소드가 하나인 인터페이스를 구현할 때는 편리하게 사용할 수 있을 것 같습니다.

    또한 람다식은 익명 함수로 변수처럼 사용할 수 있기 때문에

    변수에 람다식 구현부를 대입하는 것과 그것을 매개변수로 전달하는 것,
    마지막으로 반환 값에 람다식을 직접 구현하는 형식에 대해서는 알아둘 필요가 있겠습니다.

     

    'JAVA > JAVA' 카테고리의 다른 글

    Java | Enum 열거형  (0) 2020.02.13
    Java | JDBC 예제 with Oracle  (0) 2020.02.13
    Java | JDBC with Oracle  (0) 2020.02.13
    Java | Properties Class  (0) 2020.02.12
    Java | Socket & Thread 채팅 프로그램 만들기  (1) 2020.02.12

    댓글

Designed by Tistory.