본문 바로가기

Back-End/JAVA

람다식과 함수형 인터페이스

람다식과 함수형 인터페이스

람다식 : 익명 함수 라고도 불린다. 자바에서는 인터페이스의 익명 클래스를 간략히 표현하는데 사용된다.

함수형 인터 페이스

  • 람다식 형태로 익명 클래스가 만들어질 수 있는 인터페이스
    • 조건 : 추상 메서드가 하나만 있어야 한다.
      • 람다식과 1:1 대응이 될 수 있어야 하므로
      • @FunctionalInterface 로 강제

반환값도 없고 파라미터도 없을 때

@FunctionalInterface
public interface Printer {
    void print();
    
    // void say (); // 둘 이상의 메서드는 불가하다
}
Printer printer1 = new Printer() {
    @Override
    public void print() {
       System.out.println("람다식이 없었을 때 방식") //익명 클래스 방식
    }
};

Printer printer2 = () -> {
     System.out.println("인자도 반환값도 없는 람다식");
}

Printer printer3 = () -> System.out.println("반환 값이 없을 때는 {} 생략 가능하다.");

Printer printer4 = () -> {
     System.out.println("코드가 여러줄 일 때는");
     System.out.println("{}가 필요하다");
};

반환값이 있을 때

@FunctionalInterface
public interface Returner {
    Object returnObj ();
}
Retuner returner1 = () -> {return 1;};

Retuner returner2 = () -> 1; // 반환 코드만 있을 시 {}와 return 생략이 가능하다

Object returned1 = returner1.returnObj();

Object returned2 = returner2.returnObj();

반환값도 있고 파라미터가 1개일 때

@FunctionalInterface
public interface SingleParam {
    int func (int i);
}
SingleParam square = (i) -> i * i;

SingleParam cube = i -> i * i * i;

int squared = square.func(3); // 9

int cubed = cube.func(3)l //27

반환값도 있고 파라미터가 2개 일 때

@FunctionalInterface
public interface DoubleParam {
    int func(int a, int b);
}
DoubleParam add = (a,b) -> a + b;

DoubleParam multyAndPrint = (a,b) -> {
    int result = a * b;
    return result;
};

Double added = add.func(3,5); // 8

Double multyAndPrinted = multyAndPrint.func(3,5); // 15

근데 이와 같이 우리가 인터페이스를 굳이 계속 만들어줘야하나..? 라는 생각이 들것이다.
그래서 자바에서는 자주 사용하는 인터페이스를 util로 제공한다.

함수형 인터페이스 메서드 인자(들) 타입 반환 값 타입
Runnable run    
Supplier<T> get   T
Consumer<T> accept T  
BiConsumer<T ,U> accept T, U  
Function<T, R> apply T R
BiFunction<T, U, R> apply T, U R
Predicate<T> test T Boolean
BiPredicate<T, U> test T, U Boolean
UnaryOperator<T> apply T T
BinaryOperator<T> apply T,T T

'Back-End > JAVA' 카테고리의 다른 글

문자열(String)의 메서드  (0) 2024.11.28
Math, Random 클래스  (2) 2024.11.19
래퍼 클래스  (0) 2024.11.19
불변 String 클래스와 가변 StringBuilder  (1) 2024.11.19
람다와 스트림  (1) 2024.11.19