자바는 객체를 기반으로 프로그램을 만들기 때문에 어떤 기능이 필요하다면,
클래스를 만들고 그 클래스 내부에 기능을 구현한 메서드를 만들어서 사용해야한다.
그러나 자바에서도 "함수형 프로그래밍"을 "람다식"을 통해서 지원한다.
객체 지향 프로그래밍 언어인 자바에서 함수형 프로그래밍을 구현한 것이다.
람다식의 문법은 다음과 같다.
(매개변수) -> {실행문;}
🤔 자바에서는 참조 변수 없이 메서드를 호출 할 수 없다.
👉 함수형 인터페이스의 참조 변수를 사용해서 람다식을 구현하고, 참조변수를 통해서 호출한다.
➡️ 함다식은 되도록이면 생략할 수 있는 부분을 생략하여 간단하게 구현해야한다.
람다식으로 구현할 메서드를 선언한다.
⚠️ 함수형 인터페이스는 메서드를 하나만 포함하고 있어야한다. 따라서 오류를 방지하기위해 @FunctionalInterface
애노테이션을 사용해야한다.
@FunctionalInterface
interface AddCalculation {
int add (int num1, int num2);
}
인터페이스형 변수를 선언하고 변수에 람다식을 대입한다.
AddCalculation addCalculation = (num1, num2) -> num1 + num2 ;
인터페이스형 변수의 자료형은 인터페이스형이므로 해당 메서드를 호출 할 수 있다.
System.out.println(addCalculation.add(3,4));
✍️ 전체 코드
@FunctionalInterface
interface AddCalculation {
int add (int num1, int num2);
}
public class LambdeTest {
public static void main(String[] args) {
AddCalculation addCalculation = (num1, num2) -> num1 + num2 ;
System.out.println(addCalculation.add(3,4));
}
}
사실 인터페이스 참조변수에 람다식을 대입하는 과정중에 람다식을 기반으로 메서드 오버라이딩을 한 익명 클래스가 생성된다. 이를 통해 객체가 생성되는 것이다.
람다식도 익명 내부 클래스의 일종으로 람다식 내부에서는 외부의 지역변수가 상수로 취급된다. 따라서 외부의 지역 변수를 변경할 수 없고, 변경하려고 하면 오류가 발생한다.
✍️ 예시코드
@FunctionalInterface
interface AddCalculation {
int add (int num1, int num2);
}
public class LambdeTest {
public static void main(String[] args) {
int i = 10;
AddCalculation addCalculation = (num1, num2) -> {
//i = 4; 람다식 내부에서 변경하면 오류발생
return num1 + num2; // 람다식 내부
};
//화살표 함수는 세미콜론
System.out.println(addCalculation.add(3,4));
}
}
람다식은 구현된 함수를 변수처럼 사용한다.
✅ 변수의 용도
1. 특정 자료형으로 변수선언 후 값 대입하여 사용하기
2. 매개변수로 전달하기
3. 메서드의 반환값으로 반환하기
👉 람다식으로 구현된 함수도 변수처럼 사용할 수 있다.
람다식을 변수에 대입하면 이를 자료형이 인터페이스형인 매개변수로 전달할 수 있다.
@FunctionalInterface
interface PrintString {
void showString(String str);
}
public class LambdeTest {
public static void main(String[] args) {
//람다식 구현
PrintString lambdaStr = s-> System.out.println(s);
lambdaStr.showString("안녕");
//람다식을 매개변수로 전달
showMyString(lambdaStr);
}
public static void showMyString(PrintString p) { //매개변수의 자료형은 인터페이스형
p.showString("Hi");
}
}
👉 실행화면
안녕
Hi
메서드의 반환형을 람다식의 인터페이스 형으로 선언하면 구현한 람다식을 반환한다.
package Do_It_Java.Do_It_Java_13;
@FunctionalInterface
interface PrintStirg {
void showString(String str);
}
public class LambdeTest {
public static void main(String[] args) {
//람다식을 변수로 반환받기
PrintStirg reStr = returnString();
reStr.showString("세상은 ");
}
public static PrintStirg returnString() {
return s -> System.out.println(s + "world");
//인터페이스형을 생햑해도 된다.
}
}
👉 실행화면
세상은 world
개강을 앞두고 잠시 공부를 쉬었는데 다시 파이팅해야겠다!!!