-
람다식(Lamda Expression)JAVA 2023. 3. 15. 12:00
함수형 프로그래밍(functional programming)
- 데이터를 어떻게 처리할지에 대한 함수를 정의하고 이를 데이터 처리부로 보내 데이터를 처리하는 기법
- 함수를 전달 개체로 본다.
- 동일 데이터에 대해서 어떤 함수를 사용하냐에 따라 결과가 달라진다.(데이터 처리의 다형성)
- 메소드 : 클래스 또는 객체 안에서 객체의 기능을 정의한 것
람다식
- 자바에서 함수형 프로그래밍을 위해 추가
- Java 8부터 지원
- 따로 이름을 정의하지 않고 사용.
람다식: (매개변수, ...) -> { 처리 내용 }- 자바는 객체지향 언어이기 때문에 람다식을 익명 구형 객체로 처리한다.
//익명 구현 객체public void action(Calculable calculable) {int x = 10;int y = 4;calculable.calculate(x,y); //데이터를 제공하고 추상 메소드를}//람다식action( (x,y) -> {int result = x + y;System.out.println(result);});
함수형 인터페이스(functional interface)
- 추상 메소드가 하나만 정의되어 있는 인터페이스
- 인터페이스의 익명 구현 객체를 람다식으로 표현하려면 인터페이스가 단 하나의 추상 메소드만 가져야 한다.(= 함수형 인터페이스만 람다식으로 표현 가능)
- @FunctionalInterface 어노테이션 사용(생략 가능)
- 컴파일 과정에서 추상 메소드가 하나만 있는지 검사
//함수형 인터페이스@FunctionalInterfacepublic interface Calculable {//추상 메소드void calculate(int x, int y);}public class LamdaExample {public static void main(String[] args) {//더하기action((x,y) -> {int result = x + y;System.out.println("result : " + result);});//뺴기action((x,y) -> {int result = x - y;System.out.println("result : " + result);});}public static void action(Calculable calculable) {//데이터int x = 10;int y = 4;//데이터 처리calculable.calculate(x, y);}}
매개변수가 없는 람다식
- 함수형 인터페이스의 추상 메소드에 매개변수가 없는 경우
- 안드로이드 개발 시 UI에 대한 처리할 때 자주 사용
() -> {실행문1;실행문2;}매개변수가 있는 람다식
- 데이터 타입 생략 가능
- 매개변수의 순서와 개수가 중요
(데이터타입 매개변수, ...) -> {실행문1;실행문2;}(var 매개변수, ...) -> {실행문1;실행문2;}(매개변수, ...) -> {실행문1;실행문2;}
리턴 값이 있는 람다식
- 함수형 인터페이스의 추상 메소드에 리턴 값이 있으면 람다식 내부에 return 문을 작성해야 한다.
- return 문 한 줄만 있는 경우에는 return 키워드를 생략하고 연산식이나 메소드 호출하는 문장으로 대체할 수 있다.
//실행문이 여러 개일 경우(매개변수, ...) -> {실행문1;실행문2;return 값;}//return 문만 작성하는 경우(매개변수, ...) -> 값;
메소드 참조
- 메소드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거하는 것을 목적으로 한다.
- 람다식에 비해 코드는 간략해지지만 가독성은 람다식보다 떨어진다.
- 가독성을 위해 일부러 람다식을 사용하기도 한다.
정적 메소드와 인스턴스 메소드 참조
- 인스턴스 메소드는 객체 참조 변수를 먼저 선언한 다음 참조 변수로 메소드 참조가 가능하다.
정적 메소드 참조
//람다식(a, b) -> { return 클래스.staticMethod(a, b); }(a, b) -> 클래스.staticMethod(a, b)//정적 메소드 참조클래스 :: staticMetchod인스턴스 메소드 참조
//람다식(a, b) -> { return 참조변수.instanceMetchod(a, b); }(a, b) -> 참조변수.instanceMetchod(a, b)//인스턴스 메소드 참조참조변수:: instanceMetchod
매개변수의 메소드 참조
- 형식은 정적 메소드 참조와 동일하다.
//람다식(a, b) -> { a.instatnceMetho(b); }//매개변수의 메소드 참조클래스 :: instanceMethod
생성자 참조
- 람다식이 단순히 객체를 생성하고 리턴하도록 구성되어 있는 경우
- 매개변수의 개수는 인터페이스의 추상 메소드에 정의된 매개변수에 의해 결정된다.
//람다식(a, b) -> { return new 클래스(a, b); }(a, b) -> new 클래스(a, b)//생성자 참조클래스 :: new- 인터페이스의 추상 메소드가 어떻게 선언되어 있는지 확인해야 올바른 람다식 작성 및 메소드,생성자 참조가 가능하다.
'JAVA' 카테고리의 다른 글
스트림(Stream) (0) 2023.03.16 StringTokenizer를 이용한 문자열 파라미터 변환 (0) 2023.03.15 문자열 관련 클래스 (0) 2023.03.14 System 클래스 (0) 2023.03.13 Object 클래스 (0) 2023.03.13