리턴 값이 있는 람다식
다음과 같이 매게 변수가 있고 리턴값이 있는 추상 메소드를 가진 함수적 인터페이스가 있다고 해보자
public interface MyFunctionalInterface{
public int method(int x, int y);
}
인터페이스를 타켓 타입으로 갖는 람다식은 다음과 같은 형태로 작성해야한다. 람다식에서 매게변수가 두 개인 이유는 method()가 매게변수를 두개 가지기 때문이다. 그리고 method()가 리턴 타입이 있기 때문에 중괄호 {..}에는 return문이 있어야한다.
MyfunctionalInterface fi = (x,y) -> {..return값;}
만약 중괄호 {}에 return문만 있고 return문 뒤에 연산식이나 메소드 호출이 오는 경우라면 다음과 같이 작성할 수 있다.
MyfunctionalInterface fi = (x,y)->{return x+y} -> MyfunctionalInterface fi = (x,y)->x+y;
MyfunctionalInterface fi = (x,y)->{return sum(x,y) -> MyfunctionalInterface fi = (x,y) -> sum(x,y);
람다식이 대입된 인터페이스 참조 변수는 다음과 같이 method()를 호출할수 있다. 매개값으로 2와5를 주면 람다식의 x변수에 2,y 변수에 5가 대입되고 x와 y는 중괄호 {}에서 사용된다.
int result = fi.method(2,5)
public class MyfunctionalInterfaceExample{
public static void main (String[]args){
MyfunctionalInterface fi;
fi=(x,y) -> {
int result = x + y;
return result;
};
System.out.println(2,5);
fi = (x,y) -> {return x+ y ;};
System.out.println(fi.method(2,5));
fi=(x,y) -> x + y;
System.out.println(fi.methid(2,5));
public static int sum(inx x,int y){
return ( x + y );
}
}
}
클래스 멤버 사용
람다식 실행 블록에는 클래스이 멤버인 필드와 메소드를 제약 사항 없이 사용할수 있다. 하지만 this 키워드를 사용할 때에는 주의가 필요하다. 람다식에서 this는 내부적으로 생성되는 익명 객체의 참조가 아니라 람다식을 실행한 객체의 참조이다.
public class UsingThis{
public int outterField = 10;
class Inner {
int innerField = 20;
void method() {
MyFunctionalInterFace fi = () -> {
System.out.println("outterField:" + outterField);
System.out.println("outterField:" + UsingThis.this.outterField +"\n");
System.out.println("innerField:" + innerField);
System.out.println("innerField:" + this.innerField+"\n");
};
fi.method();
}
}
}
}
현재는 필드값을 out,inner로 두개 다르게 했지만 똑같이 한다면 this를 사용해서 어디소속인지 명시해주면 된다.
This Example.this는 Example이라는 클래스에 outter를 참조 한다는말이고
두번째는 this가 앞에 있다 이말은 람다식을 실행한 객체를 뜻한다. 즉, 첫번째 this는 외부객체를 참조하고 두번째는 람다식을 사용한 객체를 참조해서 수행한다는 말이다.
public class UsingThisExample {
public static void main (Strin[]args){
UsingThis usingThis = new UsingThis();
UsingThis.Inner inner = usingThis.new Inner();
inner.methid();
}
}
UsingThis의 객체를 인스턴스로 생성했고 UsingThis안에 inner 안에 있는 람다식도 호출하였다.
그러면 값은 outter = 10 inner = 20 이 나올거다
'JAVA' 카테고리의 다른 글
OOP (0) | 2020.11.09 |
---|---|
람다식(3) (0) | 2020.11.01 |
람다식이란? (0) | 2020.11.01 |
DAO, DTO, VO (0) | 2020.11.01 |
JAVA(데이터타입) (0) | 2020.10.31 |