본문 바로가기

Java

람다식이란? #2 사용법 및 예제

자바는 메소드만 인자로 전달하려면 반드시 객체를 만들어서 전달해야 했다.

Java8에 람다식이 생기면서, 마치 함수만 전달하는 것처럼 간편하게 문법을 사용할 수 있게 되었다.

 

람다식 기본 문법

(타입 매개변수, ...) -> { 실행문; ... }

 

(타입 매개변수, ...)는 오른쪽 중괄호 { } 블록을 실행하기 위해 필요한 값을 제공하는 역할을 한다.

 

이때, 매개 변수의 이름은 개발자가 자유롭게 지정할 수 있다.

 

 ' -> ' 기호는 매개 변수를 이용해서 중괄호 { }를 실행한다는 뜻으로 해석하면 된다.

 

 

 

함수적 인터페이스(@FunctionalInterface)  <출처: https://palpit.tistory.com/671[palpit Vlog]>

 

  모든 인터페이스를 람다식의 타겟 타입으로 사용할 수 없다. 람다식이 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다.

 

  하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟 타입이 될 수 있는데, 이러한 인터페이스를 함수적 인터페이스(functional interface)라고 한다. 

1
2
3
4
5
6
@FunctionalInterface
public interface MyFunctionalInterface {
    public void method();
    public void otherMethod(); // Compile Error
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

  함수적 인터페이스를 작성할 때 두 개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능이 있는데, 인터페이스 선언 시 @FunctionalInterface 어노테이션을 붙이면 된다.

 

  이 어노테이션은 두 개 이상의 추상 메소드가 선언되면 컴파일 오류를 발생시킨다.

 

@FunctionalInterface 어노테이션은 선택사항이다. 이 어노테이션이 없더라도 하나의 추상 메소드만 있다면 모두 함수적 인터페이스지만 실수로 두 개 이상의 추상 메소드를 선언하는 것을 방지하고 싶다면 붙여주는 것이 좋다.

 

 

#예제

 

- 매개변수와 리턴값이 없는 람다식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@FunctionalInterface
public interface MyFunctionalInterface {
    public void method();
}
 
public class MyFunctionalInterfaceExam {
 
    public static void main(String[] args) {
        MyFunctionalInterface fi;
 
        fi = () -> {System.out.println("method call2"); };
 
        fi = () -> System.out.println("method call2");
 
    }
 
}

 

- 매개변수가 있고 리턴값이 없는 람다식

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@FunctionalInterface
public interface MyFunctionalInterface2 {
    public void method(int x);
}
 
public class MyFunctionalInterfaceExam2 {
 
    public static void main(String[] args) {
        MyFunctionalInterface2 fi;
 
        fi = (x) -> {
            int result = x * 5;
            System.out.println(result);
        };
 
        fi = x -> System.out.println(x * 5);
    } 
}

 

- 매개변수와 리턴값이 있는 람다식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@FunctionalInterface
public interface MyFunctionalInterface3 {
    public int method(int x, int y);
}
 
public class MyFunctionalInterfaceExam3 {
 
    public static void main(String[] args) {
 
        MyFunctionalInterface3 fi;
 
        fi = (x, y) -> {
            int result = x + y;
            return result;
        };
 
        fi = (x, y) -> {
            return x + y;
        };
 
        fi = (x, y) -> x + y;
 
        fi = (x, y) -> sum(x, y);
    }
 
    public static int sum(int x, int y) {
 
        return x + y;
   }

 

'Java' 카테고리의 다른 글

추상화와 추상 클래스  (0) 2020.06.02
람다식이란? #1 개념 및 특징  (0) 2020.04.03