Build Up
람다식
- 자바언어에서 함수형 프로그래밍 기법을 지원하는 문법 요소
- 익명 클래스(함수형 인터페이스) 이용해야 한다.
함수형 인터페이스
단하나의 추상메소드만을 갖는 인터페이스
- supplier
- consume
- predicate
- 등이 있음
장점
- 코드 가독성 증가
- 메서드 만드는 과정 없이 바로 처리 가능
단점
- 익명함수,클래스로 재사용 안됨
- 디버깅 어렵다.
What
일급객체란
다른 객체들에 일반적으로 적용가능한 연산을 지원하는 객체
특히나 JAVA는 Lamda로 지원한다.
일급객체의 조건
- 변수나 데이터에 담을 수 있어야 한다.
- 함수의 파라미터로 전달할 수 있어야 한다.
- 함수의 리턴값으로 사용할 수 있어야 한다.
결론적으로 JAVA 는 위 조건을 모두 충족시키지 못한다.
JAVA와 javascript 비교
변수나 데이터에 담을 수 있어야 한다. (js는 함수를 객체로 취급)
- JAVA 메소드는 변수의 할당할 수 없는 반면 javascript 가능하다.
- 하지만 java17의 switch문은 가능하다.
// JAVA public class Main { public static void hello(){ System.out.println("Hello World"); } public static void main(String[] args) { Object a = hello(); // !! 메서드를 변수에 할당 불가능 } } // javascript const hello = function() { console.log("Hello World"); }
함수의 파라미터로 전달할 수 있어야 한다. (call back)
- JAVA 메소드는 입력값으로 보내는 행위가 불가능하지만 자바스크립트는 콜백 함수 형태로 자유롭게 전달이 가능하다.
// JAVA public class Main { public static void hello(){ System.out.println("Hello World"); } public static void print(Object func) { func(); } public static void main(String[] args) { print((Object) hello) // !! static 메서드를 함수 매개변수로 전달 불가능 } } //javascript const hello = function() { console.log("Hello World"); } function print(func) { func(); } print(hello);
함수의 리턴값으로 사용할 수 있어야 한다. [js-closure]
- JAVA의 메소드의 리턴값을 메소드 자체를 반한행위는 불가능하다. [1번문항] 하지만 javascript는 클로저 기법을 통해 구성할 수 있다.
const hello = function() { console.log("Hello World"); return function() { console.log("Hello World 22"); } } const hello2 = hello(); hello2();
JAVA의 Lamda는 일급객체를 충족한다.
변수나 데이터에 담을 수 있어야 한다.
import java.util.function.Consumer; public class Main { public static void main(String[] args) { Consumer<String> c = (t) -> System.out.println(t); // 람다식을 인터페이스 타입 변수에 할당 c.accept("Hello World"); } }
함수의 파라미터로 전달할 수 있어야 한다.
import java.util.function.Consumer; public class Main { // 메소드 매개변수로 람다 함수를 전달 public static void print(Consumer<String> c, String str) { c.accept(str); } public static void main(String[] args) { print((t) -> System.out.println(t) ,"Hello World"); } }
함수의 리턴값으로 사용할 . 수있어야 한다.
import java.util.function.Consumer; public class Main { public static Consumer<String> hello() { // 람다 함수 자체를 리턴함 return (t) -> { System.out.println(t); }; } public static void main(String[] args) { Consumer<String> c = hello(); c.accept("Hello World"); } }