람다 lambda
람다는 JDK 1.8에서 추가 된 기능으로 메소드를 하나의 식으로 표현한 것이다.
메소드를 람다식으로 표현하면 메소드 이름이 없는 익명함수라고 할 수 있다.
처음에 f(x, y) = x * y 이렇게 쓰던 것이 (x, y) -> x * y 이렇게 변경할 수 있다.
또한 람다식을 사용하는 장점은 바로 단순함이다!
람다식을 활용하면 컬렉션, 스트림을 연계하여 데이터를 쉽게 조작할 수 있으며 불필요하게 반복되는 코드도 제거할 수 있다.
러닝커브가 존재하며, 객체지향 프로그래밍 사싱에 위배되기 때문에 호불호가 갈리긴 하지만
최근에는 람다와 스트림을 적극적으로 이용하는 추세이다.
람다식은 매개변수의 타입은 추론이 가능하기 때문에 명시적으로 작성하지 않아도 된다.
또한 매개변수가 한 개만 존재하는 경우 ()을 생략할 수 있으며, 실행문에 한 줄 경우 {}은 생략이 가능하다.
인터페이스에 정의된 추상메소드를 활용하기 위해서는 3가지 방법이 있다.
1. 인터페이스를 상속받은 클래스를 정의하여 기능을 완성 후 사용하는 방법
2. 익명클래스를 활용하여 메소드 재정의 후 사용하는 방법
3. 람다식을 활용하는 방법
1. 방법
Calculator c1 = new CalculatorImpl();
System.out.println("10과 20의 합은 : " + c1.sumTwoNumber(10, 20));
2.방법
Calculator c2 = new Calculator() {
@Override
public int sumTwoNumber(int a, int b) {
return a + b;
}
};
System.out.println("20과 30의 합은 : " + c2.sumTwoNumber(20, 30));
3. 마지막으로 람다식을 이용한 방법
Calculator c3 = (x, y) -> x + y;
System.out.println("40과 50의 합은 : " + c3.sumTwoNumber(40, 50));
자바에서는 메소드를 독립적으로 선언하는 것은 불가능하다.
클래스나 인터페이스 내부에만 선언되기 때문에 메소드를 가지는 클래스나 인터페이스가 필요하다.
람다식은 그 중 인터페이스를 활용하게 된다. 하지만 모든 인터페이스에 메소드를 작성한다고 람다식으로 활용할 수 있는 것은 아니다. 인터페이스 내부에 하나의 추상 메소드가 선언 된 인터페이스만 람다식의 타깃이 될 수 있다.
함수적 인터페이스(functional interface)
해당 조건을 만족하는지 컴파일 시점에 체크해주는 기능이 @FunctionalInterface 어노테이션이다.
추상 메소드가 2개 이상이면 컴파일 에러 발생!!
@FunctionalInterface
public interface Calculator {
public int sumTwoNumber(int a, int b);
//public int minusTwoNumber(int a, int b);
}
람다식을 사용하기 위해 인터페이스 내에서 하나의 추상메소드만 작성할 수 있기 때문에,
관리해야 하는 인터페이스가 너무 많아질 수 있다. 그래서 이때 내부 인터페이스를 활용하는 방법을 사용할 수 있다.
OuterCalculator.Sum sum = (x,y) -> x+y;
OuterCalculator.Minus minus = (x,y) -> x-y;
OuterCalculator.Multiple multiple = (x,y) -> x*y;
OuterCalculator.Devide devide = (x,y) -> x/y;
System.out.println("20과 10의 합 : "+ sum.sumTwoNumber(20, 10));
System.out.println("20과 10의 차 : "+ minus.MinusTwoNumber(20, 10));
System.out.println("20과 10의 곱 : "+ multiple.multpleTwoNumber(20, 10));
System.out.println("20과 10의 나누기 : "+ devide.devideTwoNumber(20, 10));
>
20과 10의 합 : 30
20과 10의 차 : 10
20과 10의 곱 : 200
20과 10의 나누기 : 2
'java' 카테고리의 다른 글
Stream을 사용해 보자 (0) | 2023.04.06 |
---|---|
람다(lambda)식 API (0) | 2023.04.06 |
ENUM 열거형이란? (0) | 2023.04.05 |
java Exception13 (1) | 2023.01.09 |
java Collection12-Set,Linked,Map (0) | 2023.01.09 |