람다식이란
함수(메서드)를 간단한 식(expression)으로 표현하는법
ex) int max (int a , int b){
return a>b ? a :b
}
위 식을
(a,b) -> a > b ? a : b
와 같이 표현할 수 있다.
람다식은 익명함수(이름없는 함수 이다)
int max(int a , int b){
return a > b ? a : b
}
위 식에서
반환 타입 과 함수명을 지우고 화살표를 추가한다.
이 상태를 익명 함수라 한다.
(int a , int b) -> {
return a > b ? a : b;
}
함수와 메서드의 차이
근본적으로는 동일하다 , 함수는 일반적 용어 , 메서드는 객체지향 개념의 언어
함수는 클래스에 독립적 , 메서드는 클래스에 종속적이다
람다식 작성하기
1.메서드의 이름과 반환타입을 제거하고 '->' 을 블록{}안에 추가한다.
int max (int a , int b) {
return a > b ? a : b
}
위 함수를
(int a , int b) -> {
return a > b ? a : b;
}
2. 반환값이 있을 경우 , 식이나 값만 적고 return 을 생략 가능 (끝에 ';' 도 제거)
(int a , int b) -> a > b ? a : b
3. 매개변수의 타입이 추론 가능하면 생략 가능 (대부분의 경우 생략 가능)
(a , b) -> a > b ? a : b
람다식 작성 주의 사항
1.매개변수가 하나인 경우 () 생략 가능 , 타입이 없을 대만
(a) -> a * a
a -> a * a
(int a) -> a * a 는 타입이 있기 때문에 'int a' 로 만들지 못한다.
2. 블록안에 문장이 하나 뿐일때 {} 생략가능
(int i) -> {
system.out.println(i)
}
위를 다음과 같이 생략
(int i) -> system.out.println(i);
람다식은 익명객체 이다.
위에서 람다식은 익명함수라고 했지만
사실 람다식은 익명 객체 이다.
그래서
(a,b) -> a>b ? a:b
라는 식은
new Object(){
int max(int a, int b){
return a > b ? a : b
}
}
위 같은 익명 객체의 형태와 같다,
람다식은 익명객체 라서
람다식을 다루기 위해서는 참조변수가 필요하다.
Object obj = new Object(){
int max (int a , int b){
return a > b ? a : b
}
}
이때 람다식을 받는 참조변수의 타입은 어떤타입이어야 할까
(타입?) obj = (a,b) -> a>b ? a:b
int value = obj.max(3,5)
이렇게 호출할 경우 에러가 발생한다.
정확히는 작동은 하는데 Obj 안에 max 란 함수가 없다. 그래서 호출이 불가능하다.
즉 위에서 참조변수를 다음과 같이 받았지만 Object obj = new Object()
실제로 Object 안에 Max란 함수가 존재하지 않기 때문에 호출이 불가능한것이다.
그래서 결론적으로
람다는 익명객체이기 때문에 참조변수에 넣어주어야 한다.
그러기 위해서는 함수형 인터페이스가 필요하다.
람다식 Object obj = (a,b) -> a>b ? a:b는
Object obj = new Object(){
int max(int a, int b){
return a > b ? a : b
}
}
와 같다.
'JAVA' 카테고리의 다른 글
람다6 메소드 참조 (0) | 2023.03.15 |
---|---|
람다5 함수 두개를 연결 andThan (0) | 2023.03.15 |
람다4 Predicate 람다 조건식 (0) | 2023.03.15 |
람다3 함수형 인터페이스 (0) | 2023.03.15 |
람다2 (0) | 2023.03.14 |