Java 8 람다 표현식 마스터하기: 함수형 프로그래밍 가이드
람다 표현식은 Java 8에 도입되었으며 Java 8의 가장 큰 기능으로 꼽힙니다. 람다 표현식은 함수형 프로그래밍을 용이하게 하고 개발을 크게 단순화합니다.
구문
람다 표현식은 다음 구문으로 특징지어집니다.
parameter -> expression body
람다 표현식의 중요한 특징:
- 선택적 타입 선언 - 매개변수 타입을 선언할 필요 없음. 컴파일러가 매개변수 값에서 추론
- 선택적 매개변수 괄호 - 단일 매개변수는 괄호 불필요. 다중 매개변수는 괄호 필요
- 선택적 중괄호 - 본문이 단일 문장이면 중괄호 불필요
- 선택적 return 키워드 - 본문이 반환할 단일 표현식이면 컴파일러가 자동 반환. 중괄호는 표현식이 값을 반환함을 나타낼 때 필요
람다 표현식 예제
원하는 에디터로 다음 Java 프로그램 생성 (예: C:\JAVA).
Java8Tester.java
public class Java8Tester {
public static void main(String args[]) {
Java8Tester tester = new Java8Tester();
// 타입 선언 있음
MathOperation addition = (int a, int b) -> a + b;
// 타입 선언 없음
MathOperation subtraction = (a, b) -> a - b;
// 중괄호와 return 문 함께 사용
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 중괄호와 return 문 없이 사용
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// 괄호 없음
GreetingService greetService1 = message -> System.out.println("Hello " + message);
// 괄호 있음
GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
greetService1.sayMessage("Mahesh");
greetService2.sayMessage("Suresh");
}
interface MathOperation { int operation(int a, int b); }
interface GreetingService { void sayMessage(String message); }
private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
}
결과 검증
javac 컴파일러로 클래스 컴파일:
C:\JAVA> javac Java8Tester.java
Java8Tester 실행:
C:\JAVA> java Java8Tester
다음 출력 생성:
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh
위 예제에서 고려해야 할 중요한 점:
- 람다 표현식은 주로 함수형 인터페이스(단일 메서드만 있는 인터페이스)의 인라인 구현을 정의하는 데 사용됨. 위 예제에서 다양한 타입의 람다 표현식으로
MathOperation 인터페이스의 operation 메서드 구현. 또한 GreetingService의 sayMessage 구현 정의
- 람다 표현식은 익명 클래스의 필요성을 없애고 Java에 매우 간단하면서 강력한 함수형 프로그래밍 기능 제공
범위(Scope)
람다 표현식을 사용하면 모든 final 변수 또는 실질적으로 final인 변수(한 번만 할당된 변수)를 참조할 수 있습니다. 변수에 두 번째 값이 할당되면 람다 표현식은 컴파일 오류를 던집니다.
범위 예제
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String args[]) {
GreetingService greetService1 = message -> System.out.println(salutation + message);
greetService1.sayMessage("Mahesh");
}
interface GreetingService { void sayMessage(String message); }
}
결과 검증
C:\JAVA> javac Java8Tester.java
C:\JAVA> java Java8Tester
Hello! Mahesh