함수형 프로그래밍은 순수함수(pure function)를 구현하고 호출함으로써 외부 자료에 부수적인 영향(side effect)를 주지 않도록 구현하는 방식이다. 순수함수란 매개변수만을 사용하여 만드는 함수, 즉 ,함수 내부에서 함수 외부에 있는 변수를 사용하지 않아 함수가 수행되더라도 외부에는 영향을 주지 않는다.
함수를 기반으로 하는 프로그래밍이고 입력받는 자료 이외에 외부 자료를 사용하지 않아 여러 자료가 동시에 수행되는 병렬 처리가 가능하다. 함수형 프로그래밍은 함수의 기능이 자료에 독립적임을 보장한다. 이는 동일한 자료에 대한 동일한 결과를 보장한다는 뜻이고 다양한 자료에 대해 같은 기능을 수행할 수 있다.
int add(int x, int y){
return x+y;
}
(int x, int y) -> {return x+y;}
str->{System.out.println(str);}
x, y -> {System.out.println(x+y);} //오류
str-> System.out.println(str);
str-> return str.length(); //오류
(x, y) -> x+y;
str -> str.length;
람다식을 선언하기 위한 인터페이스
익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메서드만을 선언해야함
@FunctionalInterface 애노테이션(annotation)
함수형 인터페이스라는 의미, 내부에 여러개의 메서드를 선언하면 에러남
람디식 구현과 호출
public static void main(String[] args) {
MyNumber max = (x, y)->(x>= y)? x:y; // 람다식을 인터페이스 자료형 max 변수에 대입
System.out.println(max.getMax(10, 20));// 인터페이스 자료형 변수로 함수 호출
}
}
public interface StringConcat {
public void makeString(String s1, String s2);
}
public class StringConCatImpl implements StringConcat{
@Override
public void makeString(String s1, String s2) {
System.out.println( s1 + "," + s2 );
}
}
클래스를 생성하고 메서드 호출하기
public class TestStringConcat {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
StringConCatImpl concat1 = new StringConCatImpl();
concat1.makeString(s1, s2);
}
}
StringConcat concat2 = (s, v)->System.out.println(s + "," + v ); //System.out.println(i);
concat2.makeString(s1, s2);
StringConcat concat3 = new StringConcat() {
@Override
public void makeString(String s1, String s2) {
System.out.println( s1 + "," + s2 );
}
};
concat3.makeString(s1, s2);
익명 내부 클래스에서와 마찬가지로 람다식 내부에서 에서도 외부에 있는 지역 변수의 값을 변경하면 오류가 발생함
특정 자료형으로 변수를 선언 한 후 값을 대입함 int a = 10;
매개 변수로 전달하여 사용함 int add(int x, int y)
메서드의 반환 값으로 반환 하기 return num;
인터페이스형 변수에 람다식 대입하기
함수형 인터페이스
interface PrintString{
void showString(String str);
}
PrintString lambdaStr = s->System.out.println(s); //람다식을 변수에 대입
lambdaStr.showString("hello lambda_1");
showMyString(lambdaStr);
public static void showMyString(PrintString p) {
p.showString("hello lambda_2");
}
public static PrintString returnString() { //반환 값으로 사용
return s->System.out.println(s + "world");
}
PrintString reStr = returnString();
reStr.showString("hello ");