ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다식
    JAVA/람다 2023. 8. 7. 14:33

    람다식을 간단히 표현하자면 함수(메서드)를 간단히 표현한 것이다.

     

    int max(int a, int b) {
        return a > b ? a : b;
    }

    위와 같은 메서드가 있을 때 람다식을  표현하면 아래와 같이 짧게 표현이 가능하다.

    (int a, int b) -> a > b ? a : b

    반환값이 있는 경우, 식이나 값만 적고 return 문을 생략할 수 있다. return을 생략할 때에는 ;를 생략한다.

    (a, b) -> a > b ? a : b

    또한 매개변수의 타입이 추론 가능하면 생략도 가능하다.

     

     

     

     

    람다식 작성 시 주의사항

    1. 매개변수가 하나인 경우, 괄호는 생략 가능 (단, 타입이 있을 때는 생략 불가)

    --->   int a -> a * a는 안됨 (int a) -> a * a라 해야지 에러가 안난다.

    2. 블록 안의 문장이 하나뿐 일 때, 괄호는 생략 가능 (끝에 ;도 붙이면 안됨)

    --->   (int i) -> System.out.println(i) 로 표기 가능

     

     

     

     

    함수형 인터페이스

    람다식을 함수처럼 다루기 위해서는 함수형 인터페이스를 선언해서 사용해야 한다.

    public class Main {
        public static void main(String[] args) {
            MyFunction f = new MyFunction() {
                @Override
                public int max(int a, int b) {
                    return a > b ? a : b;
                }
            };
            
            int value = f.max(3, 5);
            System.out.println(value);
        }
    }
    
    @FunctionalInterface // 함수형 인터페이스는 하나의 추상 메서드만을 가져야 한다.
    interface MyFunction {
        public abstract int max(int a, int b);
    }

    람다식을 사용하지 않았을 때에는 위와 같은 코드로 작성되는데 람다식을 사용하면 코드가 훨신 짧아지게 된다.

    public class Main {
        public static void main(String[] args) {
            // 람다식을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다.
            MyFunction f = (a, b) -> a > b ? a : b;
            
            int value = f.max(3, 5);
            System.out.println(value);
        }
    }
    
    @FunctionalInterface // 함수형 인터페이스는 하나의 추상 메서드만을 가져야 한다.
    interface MyFunction {
        public abstract int max(int a, int b);
    }

    람다식을 이용해서 인터페이스를 자동으로 오버라이딩해서 인터페이스의 max라는 메서드를 사용할 수 있게 되어진다.

     

     

     

    람다식은 메서드인데, 호출할 때 필요한 이름이 없다. 그렇기 때문에 함수형 인터페이스에 있는 추상메서드를 통해서 람다식을 호출할 수 있다.

     

    람다식을 사용할 때에는 (a, b) -> a > b ? a : b 라고 한 번 사용하고 끝이었는데 함수형 인터페이스를 통해 f.max()라는 메서드로 계속 호출할 수 있게 되었다.

     

     

     

     

    람다식 예제

    public class Main {
        public static void main(String[] args) {
            List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
            
            Collections.sort(list, new Comparator<String>() {
                @Override
                public int compare(String s1, String s2) {
                    return s2.compareTo(s1);
                }
            });
        }
    }

    위의 익명 객체를 람다식으로 교체하면 아래와 같아진다.

    public class Main {
        public static void main(String[] args) {
            List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
    
            Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
        }
    }

    람다식을 사용하면 코드도 간결해지고 훨씬 이해하기 쉬워진다.

Designed by Tistory.