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

함수형 인터페이스 (Functional Interface)

  • 추상 메서드를 딱 하나만 가지고 있는 인터페이스
  • SAM (Single Abstract Method) 인터페이스
  • default , static 메서드가 사용 가능하다.
    • static은 재정의가 불가하지만 default는 재정의가 가능하다.
    // 추상화 메소드가 딱 1개라면 함수형 인터페이스 이다.
    // 이 규칙을 위반하면 애노테이션에서 컴파일 에러가 발생한다.
    @FunctionalInterface
    public interface RunSomething {
        void doIt();
        static void printTestA(){
            System.out.println("테스트A");
        }
        default void printTestB(){
            System.out.println("테스트B");
        }
    }

람다 표현식 (Lambda Expressions)

  • 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
  • 코드를 줄일 수 있다.
  • 메서드 매개변수 , 리턴 타입 , 변수로 만들어 사용할 수도 있다.
    public static void main(String[] args) {

        // 익명 내부 클래스  anonymous inner class
        RunSomething runSomething = new RunSomething() {
            @Override
            public void doIt() {
                System.out.println("익명 내부 클래스!");
            }
        };

        // 함수형 인터페이스 라면 , 추상 메서드가 한 개라면
        // ALT + SHIFT + ENTER 사용 시 람다 표현식으로 변경 가능하다. (인텔리제이)
        RunSomething runSomething2 = () -> {
            System.out.println("함수형 인터페이스!");
        };
        runSomething2.doIt();
    }

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

  • 함수를 First class object로 사용할 수 있다.
    • First class object란?
      • 변수나 데이터에 할당할 수 있어야 한다.
      • 객체의 인자로 넘길 수 있어야 한다.
      • 객체의 리턴값으로 리턴할 수 있어야한다.
  • 순수 함수 (Pure function)
    • 사이드 이펙트가 없다. (함수 밖에 있는 값을 변경하지 않는다.)
    • 상태가 없다. (함수 밖에 있는 값을 사용하지 않는다.)
  • 고차 함수 (Higher-Order Function)
    • 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
  • 불변성
    public static void main(String[] args) {
    
        int base1 = 10;
        RunSomething runSomething = new RunSomething() {
            int base2 = 10;
            @Override
            public int doIt(int number) {
                base1++;
                base2++;
                return number + base1 + base2;
            }
        };
    }
  • base1 부분은 컴파일 에러가 발생된다.
  • base2 부분은 base1을 걷어낸다면 컴파일 에러가 나지는 않지만 순수한 함수라고 볼 수 없다.
    public static void main(String[] args) {
        RunSomething runSomething = new RunSomething() {
            int base2 = 10;
            @Override
            public int doIt(int number) {
                return number + base2;
            }
        };
        base2++;
    }

 

  • base2++ 로 인해 컴파일 에러가 발생한다.
  • doIt 메서드 안에서는 지역 변수가 참조가 가능하지만 , 변경할 수 없는 변수(final)라고 가정하고 참조한다.

 

 

 

더 자바, Java 8 - 인프런

자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이

www.inflearn.com