1. 함수형 프로그래밍과 람다식
자바는 객체 지향 프로그래밍이기 때문에 어떤 기능이 필요하면 클래스를 먼저 만들고 클래스 안에 기능을 구현한 메서드를 만든 후 그 메서드를 호출해야 한다. 즉, 클래스가 없으면 메서드를 사용할 수 없다.
함수형 프로그래밍(FP)는 함수의 구현과 호출만으로 프로그램을 만들 수 있는 프로그래밍 방식이다.
자바8부터 함수형 프로그래밍 방식인 람다식을 제공한다.
2. 람다식 구현하기
람다식은 함수 이름이 없는 익명 함수를 만드는 것이다.
3. 람다식 문법 살펴보기
1. 매개변수 자료형과 괄호 생략하기
1) 매개변수 자료형 생략O
2) 매개변수가 하나인 경우, 괄호 생략O
// 매개 변수 1개 괄호 생략
str -> {System.out.println(str)};
// 매개 변수 2개 이상 괄호 생략X
(x, y) -> {System.out.println(x + y)}
x, y -> {System.out.println(x + y)} // 오류
2. 중괄호 생략하기
1) 중괄호 안의 구현부가 한 문장인 경우, 중괄호 생략O
단, return문은 중괄호 생략X
// 구현부 한 문장인 경우, 중괄호 생략
str -> System.out.println(str);
// 구현부 한 문장이어도 return 문은 중괄호 생략X
str -> {return str.length();}
str -> return str.length(); // 오류
3. return 생략하기
1) 중괄호 안의 구현부가 return 문 1개라면, 중괄호 & return 모두 생략O
// 구현부 return 문 1개인 경우, 중괄호 & return 모두 생략
str -> str.length();
4. 람다식 사용하기
1) 함수형 인터페이스 선언하기
람다식을 구현하기 위해서는 인터페이스를 만들고 내부에 추상 메서드를 선언한다.
// 함수형 인터페이스 명시
@FunctionalInterface
public interface MyNumber {
int getMax(int num1, int num2);
}
2) 람다식 구현과 호출
람다식을 인터페이스형 변 수에 대입하고 인터페이스형 변수로 메서드를 호출한다.
public class TestMyNumber {
public static void main(String[] args) {
MyNumber max = (x, y)->(x>= y)? x:y; // 람다식을 인터페이스 자료형 max 변수에 대입
System.out.println(max.getMax(10, 20));// 인터페이스 자료형 변수로 함수 호출
}
}
5. 함수형 인터페이스
자바에서는 참조 변수 없이 메서드를 호출할 수 없으므로,
람다식을 구현하기 위해 함수형 인터페이스를 만들고 인터페이스에 람다식으로 구현할 메서드를 선언한다.
람다식은 오직 하나의 메서드만 선언한 함수형 인터페이스를 구현할 수 있다!! (람다식은 익명함수로 구현하기 때문에 인터페이스에 메서드가 여러개면 어떤 메서드를 구현한 것인지 모호해짐)
1. @FuctionalInterface 어노테이션
@FuctionalInterface 은 추상 메서드가 단 하나만 존재하는 함수형 인터페이스를 뜻한다.
이 인터페이스에 메서드를 1개 이상 선언하면 오류가 난다.
6. 객체 지향 프로그래밍 방식과 람다식 비교
람다식을 사용하면 기존의 객체 지향 프로그래밍 방식보다 간결한 코드를 구현할 수 있다.
1. 클래스에서 인터페이스 구현하기
1) 함수형 인터페이스를 구현할 클래스에서 추상 메서드 재정의
2) 인터페이스를 구현한 클래스의 인스턴스를 생성하여 참조변수로 메서드 호출
2. 람다식으로 인터페이스 구현하기
람다식으로 인터페이스를 구현하면 클래스를 따로 생성할 필요 없이 메서드를 구현한다.
1) 인터페이스 형 변수에 람다식 대입
2) 위의 인터페이스형 변수로 메서드 호출
7. 익명 객체를 생성하는 람다식
Q. 람다식이 객체 없이 인터페이스 구현만으로 메서드를 호출할 수 있는 이유는?
람다식으로 메서드를 구현해서 호출하면 컴퓨터 내부에서 익명 클래스가 생성되고 이을 통해 익명 객체가 생성되기 때문이다.
1. 람다식에서 사용하는 지역변수
람다식도 익명 내부 클래스가 생성되므로 외부 메서드의 지역 변수는 상수가 된다.
따라서 람다식 구현부에서 지역 변수를 변경하면 오류가 발생한다.
8. 함수를 변수처럼 사용하는 람다식
람다식을 이용하면 구현된 함수를 변수처럼 사용할 수 있다.
1. 인터페이스형 변수에 람다식 대입하기
// 1. 인터페이스형 변수에 람다식 대입
PrintString lambdaStr = s -> System.out.println(s);
lambdaStr.showString("hello");
2. 매개변수로 전달하는 람다식
메서드의 매개변수 자료형이 람다식의 인터페이스형인 경우,
매개변수를 인터페이스 형으로 받는 메서드에 람다식을 대입한 변수를 전달한다.
// 1. 인터페이스형 변수에 람다식 대입
PrintString lambdaStr = s -> System.out.println(s);
lambdaStr.showString("hello");
// 2. 매개변수로 전달하는 람다식
showMyString(mabdaStr);
3. 반환 값으로 쓰이는 람다식
메서드의 반환형을 람다식의 인터페이스형으로 선언한 경우, 구현한 람다식을 반환할 수 있다.
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 14. 예외 처리 (0) | 2022.05.11 |
---|---|
[JAVA] 13-3. 스트림 (0) | 2022.05.10 |
[JAVA] 13-1. 내부 클래스 (0) | 2022.05.10 |
[JAVA] 12-5.컬렉션 프레임워크_Map 인터페이스 (0) | 2022.05.09 |
[JAVA] 12-4.컬렉션 프레임워크_Set 인터페이스 (0) | 2022.05.09 |