람다식은 익명함수를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.
람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.
Runnable runnable = new Runnable() { // 익명 구현 객체
public void run() {...}
};
Runnable runnable = () -> {...}; // 람다식
람다식은 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다.
람다식은 인터페이스 변수에 대입된다. 이 말은 람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻이 된다. 인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다.
인터페이스 변수 = 람다식;
근데 모든 인터페이스를 람다식의 타겟으로 사용할 수는 없다. 람다식이 하나의 메소드를 정의하기 때문에 두 개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다. 하나의 추상 메소드가 선언된 인터페이스만이 람다식의 타겟이 될 수 있는데, 이러한 인터페이스를 함수적 인터페이스라고 한다. 함수적 인터페이스를 작성할 때 두 개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능이 있는데, 인터페이스 선언 시 @FunctionalInterface 어노테이션을 붙이면 된다.
@FunctionalInterface
public interface ExInterface {
public void method1();
public void method2(); // 컴파일 오류
}
매개변수가 없는 람다식
함수형 인터페이스의 추상 메소드는 람다식에서 익명 구현 객체를 통해 구현이 된다는 것을 알았다.
그렇다면 매개변수가 없는 추상 메소드를 람다식으로 구현 하는 방법을 알아보자.
// ExInterface.java
public interface ExInterface {
public void method();
}
// Main.java
public class Main {
public void main(String[] args) {
ExInterface ei;
ei = () -> {
String str = "method call 1";
System.out.println(str);
};
ei.method();
ei = () -> { System.out.println("method call 2"); };
ei.method();
ei = () -> System.out.println("method call 3");
ei.method();
}
}
이런 방법들로 만들 수 있다.
매개 변수가 있는 람다식
// ExInterface.java
public interface ExInterface {
public void method(int a);
}
// Main.java
public class Main {
public void main(String[] args) {
ExInterface ei;
ei = (x) -> {
int result = 5 * x;
System.out.println(result);
};
ei.method(2);
ei = () -> { System.out.println(x * 6); };
ei.method(2);
ei = () -> System.out.println(x * 7);
ei.method(2);
}
}
리턴 값이 있는 람다식
// ExInterface.java
public interface ExInterface {
public int method(int a, int b);
}
추상 메소드에 리턴 값이 있어야 한다면, 람다식 중괄호 {} 안에서 추상 메소드의 리턴 타입에 맞는 return 값을 입력하면 된다.
// Main.java
public class Main {
public void main(String[] args) {
ExInterface ei;
ei = (x, y) -> {
int result = x + y;
return result
};
System.out.println(ei.method(2, 6));
ei = (x, y) -> { return x + y };
System.out.println(ei.method(2, 7));
ei = (x, y) -> x + y; // return 문만 있을 경우 중괄호 {} 와 return 생략 가능
System.out.println(ei.method(2, 7));
ei = (x, y) -> sum(x, y); // return 문만 있을 경우 중괄호 {} 와 return 생략 가능
System.out.println(ei.method(2, 8));
}
public static int sum(int x, int y) {
return x + y;
}
}
'개발 관련 지식 > JAVA' 카테고리의 다른 글
람다식 메소드 참조 (0) | 2020.04.07 |
---|---|
람다식에서 클래스 멤버와 로컬 변수 사용 (0) | 2020.04.07 |
제네릭 타입의 상속과 구현 (0) | 2020.04.06 |
제한된 타입 파라미터 (0) | 2020.04.06 |
제네릭 메소드 (0) | 2020.04.06 |