Java/Java 8

함수형 프로그래밍

김관현 2024. 7. 18. 14:32

함수형 인터페이스 : 추상 메서드가 1개인 인터페이스

 

함수형 인터페이스는 '추상 메서드가 1개인 인터페이스' 라는 조건만 성립하면 되기에 default method 가 추가되어도 상관없다. 

 

@FunctionalInterface
public interface FuncInterface {
    
    int plusTen(int num); //abstract 자동 생략
    
    default void printHello() {
        System.out.println("Hello");
    }
    
    default void printHiHello() {
        System.out.println("HiHello");
    }
}

 

@FunctionalInterface 라는 애노테이션은 함수형 인터페이스를 만들기 위해 필수적인 애노테이션은 아니다.

해당 인터페이스가 함수형 인터페이스인지 검사해주는 애노테이션이다.

 

 

public class Practice {
    
    public static void main(String[] args) {
        FuncInterface fi = new FuncInterface() {
            @Override
            public int plusTen(int n) {
                return n + 10;
            }
        };
        
        //FuncInterface fi = n -> {n + 10;};
        System.out.println(fi.plusTen(10));
    }
}

 

람다식을 사용하여 익명 클래스를 짧게 표현할 수 있다.

 

 

함수형 프로그래밍

순수 함수형 프로그래밍을 한다면 side effect 가 없다. 

 

순수 함수형 프로그래밍으로 수학적인 함수를 만들 수 있는데 수학적인 함수란 입력받은 값이 같다면 결과 값이 항상 같은 함수를 말한다.

=> 멀티 스레딩 시 안전

 

 

함수를 First class object 로 사용이 가능하다.

 

함수를 매개변수로 받거나 리턴할 수도 있다.

 

public class Practice {

    public static void main(String[] args) {
        
        plusFive(n -> {return n + 10;}, 10);
    }
    
    public static void plusFive(FuncInterface fi, int a) {
        fi.plusTen(a);
        System.out.println(fi.plusTen(a));
    }
}

 

 

자바가 제공하는 함수형 인터페이스

 

1. Function<T, R> : T 타입을 받아서 R 타입을 반환

 

2. Consumer<T> : T 타입을 받고 반환 X

 

3. Supplier<T> : 매개변수 X, T 타입 반환

 

4. Predicate<T> : T 타입을 받아서 boolean 반환

 

5. Runnable : 매개변수 X, 반환 X

 

6. Operator<T> : T 타입 받고 T 타입 반환

 

자주 보이는 것들 위주로 적었다.

여기에 쓰이지 않은 인터페이스들은 대부분 파생형태라 쉽게 사용법을 짐작할 수 있을 것이다.

 

Iterator<E> 의 default method 이다

 default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

 

여기서 <? super E> 가 의미하는 것은 E 와 E의 부모타입만 받겠다는 뜻이다.

 

<? extends E> 는 super 와 반대로 E 와 E의 자식타입만 받겠다는 뜻이다.

댓글수0