본문 바로가기
자바

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

by 근즈리얼 2021. 7. 13.
728x90

자바 8이 되면서 기존 자바와 다른 점은 람다표현식을 사용할 수 있다는 것이다.

 

람다표현식은 간결하게 표현할 수 있어 코드의 가독성을 높일 수 있다.

 

람다표현식은 함수형 인터페이스의 인스턴스를 만드는 방법으로 사용할 수 있다.

 

따라서 간단하게 함수형 인터페이스와 람다표현식에 대해 공부해보자!!

 

함수형 인터페이스

- 추상 메서드가 1개만 있는 인터페이스

- @FunctionalInterface 에노테이션으로 표현할 수 있다.

@FunctionalInterface
public interface RunSomething {
    void doit();
}

** 추상메서드 - 메서드가 선언은 되어있지만 내용은 채워지지 않은 메서드

** 자바 8 부터 abstract를 생략할 수 있다.

** 인터페이스 안에 static 함수를 선언할 수 있다.

 

람다표현식

package functional_interface_rambda;

public class Foo {
    public static void main(String[] args) {


        // 익명 내부 클래스
        RunSomething runSomething = new RunSomething() {
            @Override
            public void doit() {
                System.out.println("출력1");
            }
        };

        RunSomething runSomething2 = () -> System.out.println("출력2");

        RunSomething runSomething3 = () -> {
            System.out.println("출력3-1");
            System.out.println("출력3-2");
        };

        runSomething.doit();
        runSomething2.doit();
        runSomething3.doit();
    }
}

- 첫번째로 나온 방법이 기존에 추상메서드를 사용하는 방법이다.

- 두번째와 세번째는 한줄로 표현할 수 있고 없고의 차이다.

 

## 주의

- 쉐도잉, final

package functional_interface_rambda.third;

import java.util.function.Consumer;
import java.util.function.IntConsumer;

public class Foo {

    public static void main(String[] args) {
        Foo foo = new Foo();
        foo.run();
    }

    private void run(){
        int baseNumber = 10;

        //로컬 클래스
        class LocalClass{
            void printBaseNumber(){
                System.out.println(baseNumber);
            }
        }

        //익명 클래스
        Consumer<Integer> integerConsumer = new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(baseNumber);
            }
        };
        
        //람다
        IntConsumer printInt = (i) ->{
            System.out.println(i+baseNumber);
        };
        
        /*
        // baseNumber가 선언되어 있으므로 매개변수로 가져올 수 없다.
        IntConsumer printInt = (baseNumber) ->{
            System.out.println(baseNumber);
        };
        */
        
        //baseNumber++; -> final값이 아니므로 람다식에서 사용할 수 없는 값이 된다.
    }
}

- run메소드 안에 baseNumber는 로컬 클래스와 익명 클래스에 재선언될수 있다. 즉 로컬 클래스와 익명 클래스는 baseNumber를 가릴수 있다.

-> 람다표현식에서 baseNumber를 매개변수로 가져올 수 없다.

- 람다식에서 매개변수로 사용되는 값은 final로 선언된 것이므로 값이 변할 수 없다.

 

728x90

'자바' 카테고리의 다른 글

자바 8 stream 기본  (0) 2021.07.23
인터페이스 기본 메소드(Default Methods)  (0) 2021.07.16
람다식 매소드 레퍼런스  (0) 2021.07.13
문자열 자르기 substring  (0) 2021.02.04
compare 메소드  (0) 2021.01.26

댓글