-
Java | Lambda Expression 람다식JAVA/JAVA 2020. 2. 14. 00:36
Lambda Expression 람다식
자바에서 제공하는 함수형 프로그래밍 방식
- 자바 8부터 함수형 프로그래밍 지원
- Functional Programming(FP): 함수형 프로그래밍
함수의 구현과 호출만으로 프로그램을 만들 수 있는 프로그래밍 방식 - 함수 이름이 없는 익명 함수를 만드는 것
Lambda 문법
(매개변수) -> {실행 코드;}
- 메소드 이름과 반환형을 없애고 -> 기호 사용
- 매개변수 자료형 생략 가능
- 매개변수가 하나인 경우에는 괄호 생략 가능
- 중괄호 안의 구현 부분이 한 문장인 경우 중괄호 생략 가능
- 중괄호 안의 구현부가 한 문장이더라도 return문은 중괄호 생략 불가
- 중괄호 안의 구현부가 return문 하나라면 중괄호과 return을 모두 생략하고 식만 작성 가능
함수형 인터페이스
- 자바에서는 참조 변수 없이 메소드를 호출할 수 없기 때문에
람다식 구현을 위한 함수형 인터페이스가 필요 - 람다식 구현을 위한 함수형 인터페이스를 만들고
인터페이스에 람다식으로 구현할 메소드 선언 - 람다식은 하나의 메소드를 구현하여 인터페이스형 변수에 대입하기 때문에
인터페이스가 두 개 이상의 메소드를 가질 수 없음 - 람다식은 익명 함수이기 때문에
인터페이스에 메소드가 여러 개 있으면 구분이 불가능함
@FunctionalInterface 어노테이션
- 인터페이스 바로 위에 @FunctionalInterface를 작성하면 함수형 인터페이스라는 뜻
- 메소드를 하나 이상 선언하면 오류 발생
- 필수로 작성해야 하는 것은 아니지만 함수형 인터페이스를 명시적으로 표현하므로
나중에 발생할 오류를 방지할 수 있음
@FunctionalInterface interface 인터페이스명 {}
람다식으로 인터페이스 구현
- 클래스를 따로 생성할 필요 없이 바로 메소드 구현
- 자바는 객체 지향 언어로 객체 생성 없이 메소드 호출 불가
→ 람다식으로 인터페이스 메소드 구현시
컴퓨터 내부에서 익명 클래스를 통한 익명 객체 생성 - 람다식 코드에서 외부 메소드 지역 변수 사용시 해당 변수는 상수로 작용
따라서 외부 메소드의 지역 변수를 출력할 수는 있지만 변수 값 수정은 불가능 - 람다식은 함수의 구현부를 변수에 대입하거나
매개변수로 전달하거나 반환 값으로 사용 가능
즉, 변수처럼 사용 가능
예제 ①
익명 내부 클래스와 람다식으로 함수형 인터페이스 구현
package j200213; // 함수형 인터페이스 @FunctionalInterface interface Xyz2 { public int a(int x, int y); } public class LamTest2 { public static void main(String[] args) { // 익명 내부 클래스로 인터페이스 구현 Xyz2 anonymousInner = new Xyz2() { public int a(int x, int y) { return x + y; } }; int resultA = anonymousInner.a(1, 9); System.out.println(resultA); //10 // 람다식으로 인터페이스 구현 Xyz2 lambda = (x, y) -> x + y; int resultB = lambda.a(4, 5); System.out.println(resultB); //9 } }
예제 ②
람다식을 인터페이스형 변수에 대입한 뒤 메소드를 호출해보고
다시 그 변수를 메소드의 매개변수로 전달하는 예제package j200213; @FunctionalInterface interface Lambda { void showString(String str); } public class LamPara { public static void main(String[] args) { // 람다식을 인터페이스형 변수에 대입 Lambda ld = s -> System.out.println(s); // 그 변수를 사용해 람다식 구현부 호출 ld.showString("Hello lambda"); // Hello lambda // 메소드 매개변수로 람다식 대입 변수 전달 showMyString(ld); // 안녕 람다? } // lambda 인터페이스형 객체를 매개변수로 받는 함수 public static void showMyString(Lambda ld) { ld.showString("안녕 람다?"); } }
예제 ③
반환 값에 람다식을 구현해서 인터페이스 객체를 생성하고
람다식으로 구현한 메소드를 호출해 보는 예제package j200213; @FunctionalInterface interface Return { int plus(int x, int y); } public class LamReturn { public static void main(String[] args) { // returnRT() 메소드로 Return 객체 반환, rt 변수 초기화 Return rt = returnRT(); // rt 객체로 메소드 호출 및 결과 저장 int result = rt.plus(5, 4); // 결과 출력 System.out.println(result); // 9 } // Return 인터페이스 객체 반환 메소드 public static Return returnRT() { /* Return 객체 생성 후 객체 반환 Return rt = (x, y) -> x + y; return rt; */ // 반환 값에 바로 람다식 구현 return (x, y) -> x + y; } }
자바에서 함수형 프로그래밍시 사용할 수 있는 람다식에 대해 살펴보았습니다.
꼭 함수형 프로그래밍이 아니더라도 간략한 표현식 덕분에
메소드가 하나인 인터페이스를 구현할 때는 편리하게 사용할 수 있을 것 같습니다.
또한 람다식은 익명 함수로 변수처럼 사용할 수 있기 때문에
변수에 람다식 구현부를 대입하는 것과 그것을 매개변수로 전달하는 것,
마지막으로 반환 값에 람다식을 직접 구현하는 형식에 대해서는 알아둘 필요가 있겠습니다.'JAVA > JAVA' 카테고리의 다른 글
Java | Enum 열거형 (0) 2020.02.13 Java | JDBC 예제 with Oracle (0) 2020.02.13 Java | JDBC with Oracle (0) 2020.02.13 Java | Properties Class (0) 2020.02.12 Java | Socket & Thread 채팅 프로그램 만들기 (1) 2020.02.12