람다 Lambda
사전 지식
1. 익명 객체(=익명 클래스)
2. 익명 클래스
1) new 조상클래스 ( ) { 구현부 }
2) new 인터페이스 ( ) { 구현부 }
3. 익명 객체가 메서드의 매개변수로 통째로 들어 가는 경우
ex. a.method( ); → a.method( new 조상클래스 ( ) { } );
4. 함수형 인터페이스의 의미 : "추상메서드를 1개만 가지고 있는 인터페이스"를 의미한다.
5. 람다함수(람다 메서드)를 "익명함수"라고 부르나 실제로는 함수가 아니다. 엄격히 말해서
익명객체이다.
그 이유는 익명객체를 람다함수로 전환가능하며, 람다함수를 익명객체로 전환하기 때문에 람다함수의 레벨은
함수(method)가 아니라 클래스(객체)이다. - 자바의 정석
7. 람다식(익명객체)를 다루기 위한 참조변수(f)의 타입은 함수형 인터페이스로 한다.
8. 람다식에는 메서드 이름이 생략되어 있지만, 참조변수f가 람다식 안에 있는 메소드를 호출하기 위해서는
메서드의 이름을 알아야 한다. ex - f.max(3,5)
자바의 정석
함수형 인터페이스
interface MyFunction {
public abstract int max(int a, int b) //추상메서드
}
함수형 인터페이스에 있는 int max() 메서드를 익명클래스(익명객체)를 이용해서 오버라이딩을 해 보자
class noneLambda {
public static void main(String[] args) {
MyFuction f = new MyFunction(){
@Overriding // 추상메서드가 오버라이딩 됨
public int max(int a, int b) {
return a > b? a: b;
}
};
int big = f.max(5, 3); //익명객체(익명클래스)의 max메소드를 호출
}
}
익명클래스(익명객체)를 람다식으로 대체해 보자
class Lambda {
public static void main(String[] args) {
MyFuction f = (int a, int b) -> a > b? a: b; //익명객체를 람다식으로 대체
int big = f.max(5, 3);//람다식의 max함수가 호출된다. (람다식에 max 메서드명이 생략되었을지라도)
}
}
똑같은 것 한번더
함수형인터페이스
@FunctionalInterface
public interface MyFunction {
void myMethod(); // 매개변수 없음, 리턴값이 없음
}
함수형 인터페이스에 있는 void myMethod() 메서드를 익명클래스(익명객체)를 이용해서 오버라이딩을 해 보자
class noneLambda {
public static void main(String[] args) {
MyFunction f = new MyFunction() {
@Override //추상메서드가 오버라이딩 됨
public void myMethod() {
System.out.println("myMethod오버라이딩");
}
};
f.myMethod(); //익명객체의 myMethod메서드를 호출
}
}
익명클래스(익명객체)를 람다식으로 대체해 보자
class noneLambda {
public static void main(String[] args) {
MyFunction f = () ->System.out.println("myMethod오버라이딩");
f.myMethod(); //람다식의 myMethod를 호출함 (람다식에 myMethod 메서드명이 생략되었을지라도)
}
}
결론 :
함수형 인터페이스의 추상메서드 → 익명객체를 이용해서 오버라이딩 → 함수를 포함한 익명객체를 람다식으로 변환
→ 람다식을 참조하는 참조변수 f는 람다식을 호출 ex) f.max(3,5); , f.myMethod();
매개변수의 타입이 함수형 인터페이스인 경우
@FunctionalInterface
public interface MyFunction {
void run(); // 매개변수 없음, 리턴값이 없음
}
class Lambda {
static void execute(MyFunction f) { //참조변수f는 람다식을 받음
f.run(); //매개변수로 받은 람다식을 호출함
}
public static void main(String[] args) {
MyFunction f1 = () ->System.out.println("run메서드 오버라이딩");
execute(f1);
execute( () -> System.out.println("매개변수로 람다식을 줌") );
}
}
출력결과
'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
Optional <T> (0) | 2022.10.30 |
---|---|
메서드 참조 (0) | 2022.10.30 |
Comparable (0) | 2022.10.27 |
생성자 (0) | 2022.10.26 |
객체변수와 객체 (0) | 2022.10.26 |