Language/Java

함수형 인터페이스와 람다 표현식 소개

JUNGKEUNG 2022. 6. 15. 23:25

함수형 인터페이스

  • 인터페이스 안에 추상 메소드가 하나만 있는것을 말한다.
  • 함수형 인터페이스를 사용하고 싶으면 @FunctionalInterface 어노테이션을 사용하면 된다. 
  • @FunctionalInaterface는 자바에서 지원하기 때문에 import 할 필요가 없고 @FunctionalInaterface을 안써도 사용이 가능하지만 함수형 인터페이스인걸 알리기 위해 사용해주는것이 좋다 
  • @FunctionalInterface을 사용하면 추상 메소드가 2개 이상일시 @FunctionalInterface에 에러 표시가 나타난다.
  • static,default 사용하여 다른 메소드를 사용이 가능하다 
@FunctionalInterface
public interface RunSomething {
    void doIt();

    static void printName() {
        System.out.println ("Keesun");
    }

    default void printAge() {
        System.out.println ("40 ");
    }
}

 

 

 

 

익명 내부 클래스

  • 클래스 선언과 객체의 생성을 동시에 하며 단 한번만 사용될 수 있고 오직 하나의 객체만 생성할 수 있는 일회용 클래스이다. 
  • 이름이 없기 때문에 생성자도 가질 수 없다.
  • 부모 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 단 하나의 클래스를 상속 받거나 하나의 인터페이스만을 구 현할 수 있다.
public class Foo {
    public static void main(String[] args) {
        // 익명 내부 클래스 anonymous inner class
        RunSomething runSomething = new RunSomething () {
            @Override
            public void doIt() {

            }
        };
    }
}

 

 

람다 표현식

  • 익명 함수라고도 불리며, 객체를 생성하지 않아도 메서드를 사용할 수 있다.
  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다
  • 코드를 줄일 수 있다
  • 메소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수 있다.
public class Foo {
    public static void main(String[] args) {
        RunSomething runSomething = () -> System.out.println("Hello");

        runSomething.doIt();
    }
}

 

 

자바에서 함수형 프로그래밍

함수를 First class object로 사용할 수 있다

  • 변수나 데이터 구조안에 넣을수 있다.
  • 파라미터로 전달 할 수 있다
  • 동적으로 프로퍼티 할당이 가능
  • 리턴값으로 사용할 수 있다

순수 함수 (Pure function)

  • 사이드 이팩트가 없다 (함수밖에 있는 값을 변경하지 않는다)
  • 상태가 없다 (함수 밖에 있는 값을 사용하지 않는다)

고차 함수 (Higher-Order Function)

  • 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
public class Foo {

    public static void main(String[] args) {
        RunSomething runSomething = (number) -> {
            return number + 10;
        };

        System.out.println(runSomething.doIt(1)); // 11 (순수함수)
        System.out.println(runSomething.doIt(1)); // 11
        System.out.println(runSomething.doIt(1)); // 11
        System.out.println(runSomething.doIt(2)); // 12
        System.out.println(runSomething.doIt(2)); // 12
        System.out.println(runSomething.doIt(2)); // 12
    }
}

 

 

참고


백기선 - 더 자바, Java8
https://www.inflearn.com/course/the-java-java8/dashboard

'Language > Java' 카테고리의 다른 글

함수형 인터페이스와 람다 표현식  (0) 2022.06.18
자바에서 제공하는 함수형 인터페이스  (0) 2022.06.18
java8과 java11 차이점  (0) 2022.05.08
클래스 로더 시스템  (0) 2022.05.05
JVM 구조  (0) 2022.05.05