함수형 프로그래밍과 람다식
함수 구현과 호출만으로 프로그래밍이 수행되는 방식
함수형 프로그래밍은 순수함수를 구현하고 호출함으로써 외부 자료에 부수적인 영향을 주지 않도록 구현하는 방식입니다.
함수 내부에서 함수 외부에 있는 변수를 사용하지 않아 외부에 영향을 주지 않는다
병렬처리가 가능하다
함수의 기능이 자료에 독립적임을 보장한다
동일한 자료에 대해 동일한 결과를 보장하고 다양한 자료에 대해 같은 기능을 수행
람다식 문법
익명함수 만들기
매개 변수와 매개변수를 이용한 실행문
두 수를 입력 받아 더하는 add() 함수
int add(int x, int y)
{
return x+y;
}
람다식 표현
(int x, int y)->{return x+y;}
str->{System.out.println(str);}
str-> System.out.println(str);
기존 방식은 인터페이스와 인터페이스를 구현하는 클래스를 만들고 인터페이스의 가상함수를 오버라이드하여서 구현해서 사용한다
예를들어 글자와 글자를 합치는 단순한 기능을 만들어 보자
인터페이스를 사용해서 구현한다고 해보자
먼저 인터페이스 StringConcat 를 다음과 같이 만들고 순수가상함수도 선언하였다
"@FunctionalInterface" 어노테이션을 사용하면 함수 2개이상 선언을 할 수 없게 만든다
람다용으로 사용할 인터페이스에는 함수를 하나만 선언해야 한다
@FunctionalInterface
public interface StringConcat {
public void makeString(String s1, String s2);
}
그리고 이를 구현하는 StringConcatImpl 클래스를 만들고 makeString 함수를 오버라이드 하였다.
public class StringConcatImpl implements StringConcat{
@Override
public void makeString(String s1, String s2) {
System.out.println(s1+","+s2);
}
}
그리고 사용은 다음과 같이 할 수 있다
String s1 = "Hello";
String s2 = "World";
StringConcatImpl sci = new StringConcatImpl();
sci.makeString(s1, s2);
출력결과
Hello,World
이제 같은 기능을 람다식으로 만들어보자
String s1 = "Hello";
String s2 = "World";
StringConcat concat = (s, t)-> System.out.println(s + "," + t);
concat.makeString(s1, s2);
StringConcat 인터페이스 클래스타입으로 concat 를 선언하고 makeString 함수의 구현부[(s, t)-> System.out.println(s + "," + t)]를 대입하여 준다
concat 를 인스턴스처럼 사용해서 makeString을 호출한다
출력결과
Hello,World
위에서 람다식은 사실 익명 개체를 만드는 것이다 람다식은 다음과 같이 변환된다
StringConcat concat = new StringConcat() {
@Override
public void makeString(String s1, String s2) {
System.out.println(s1+","+s2);
}
};
다른예제도 보자
인터페이스를 선언하고 순수가상함수 선언
람다용으로 사용할 인터페이스에는 함수를 하나만 선언해야 한다
@FunctionalInterface
public interface Calc {
public int calc(int x, int y);
}
함수의 구현부를 람다를 써서 구현하였다
public class CalcTest {
public static void main(String[] args) {
Calc add = (x, y)->x+y;
Calc sub = (x, y)->x-y;
Calc multi = (x, y)->x*y;
Calc div = (x, y)->x/y;
System.out.println(add.calc(4, 2));
System.out.println(sub.calc(4, 2));
System.out.println(multi.calc(4, 2));
System.out.println(div.calc(4, 2));
}
}
다른 예제
@FunctionalInterface
public interface MyNumber {
int getMax(int num1, int num2);
}
public class MyNumberTest {
public static void main(String[] args) {
MyNumber mn = (x, y)-> x > y ? x : y;
System.out.println(mn.getMax(5, 7));
}
}