1. 람다식
- 람다식은 간단히 말해서 메서드를 하나의 '식'으로 표현한 것이다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다.
- 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 '익명 함수'이라고도 한다.
int[] arry = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5+1);
(i) -> (int)(Math.random()*5+1);
// 메서드로 표현하면
int method() {
return (int)(Math.random()*5+1;
}
반환타입 메서드이름 (매개변수 선언) {
문장들
}
// 람다식으로 변형
(매개변수 선언) -> {
문장들
}
int max(int am int b) {
return a > b ? a: b;
}
// 람다식으로 변형
(int a, int b) -> {
return a > b ? a : b;
- 반환값이 있는 경우 return을 생략하고 식으로 표현 할 수 있다.
- 람다식에 선언된 매개변수의 타입은 추론이 가능한 경우는 생략 할 수 있다.
1. 함수형 인터페이스
- 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스'라고 부르기로 했다.
- 단, 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약이 있다. 그래야 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다. 반면에 static메서드와 default메서드의 개수에는 제약이 없다.
interface MyFunction {
public abstract int max(int a, int b);
}
// 인터페이스를 구현한 익명 클래스의 객체는 다음과 같이 생성할 수 있다.
MyFunction f = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
};
int big = f.max(5, 3); // 익명 객체의 메서드를 호출
// 람다식으로 표현하면 아래와 같다.
MyFunction f = (int a, int b) -> a > b ? a : b; // 익명 객체를 람다식으로 대체
int big = f.max(5, 3); // 익명 객체의 메서드를 호출
- 람다식 사용하기 이전 인터페이스 활용
interface MyInterface {
public void print();
}
class MyClass1 implements MyInterface {
@Override
public void print() {
System.out.println("MyClass1");
}
}
class MyClass2 implements MyInterface {
@Override
public void print() {
System.out.println("MyClass2");
}
}
public class Test01 {
public static void test(MyInterface mi) {
mi.print();
}
public static MyInterface test2() {
MyInterface mi = new MyInterface() {
@Override
public void print() {
System.out.println("test2()메서드에서 반환된 MyInterface");
}
};
return mi;
}
public static void main(String[] args) {
MyClass1 mc1 = new MyClass1();
MyClass2 mc2 = new MyClass2();
mc1.print();
mc2.print();
MyInterface mi = new MyInterface() {
@Override
public void print() {
System.out.println("익명 클래스로 구현");
}
};
test(mc1);
test(mi);
mi.print();
(new MyInterface() {
@Override
public void print() {
System.out.println("선언, 생성, 호출을 한번에 처리");
}
}).print();
MyInterface mi2 = test2();
mi2.print();
}
}
- 함수형 인터페이스를 구현한 후 객체를 생성하는 방법은 다음의 세가지가 있다.
1. 명령형 스타일 : new를 통해 객체 생성
2. 람다식 : () -> {}
3. 메서드 참조 : 클래스명::메서드명(static 메서드로 선언했을 때) / 참조변수명::메서드명(인스턴스 메서드로 선언했을 때)
728x90
'Programming > JAVA' 카테고리의 다른 글
JAVA - Optional (0) | 2023.06.05 |
---|---|
JAVA - Reflection API (0) | 2023.06.01 |
JAVA - 컬렉션 프레임 워크 (Collections Framework), List, Set, Map ... (1) 그 중 List (0) | 2023.05.18 |
JAVA - Reflection (1) | 2023.05.14 |
JAVA - Class 클래스 (0) | 2023.05.14 |