람다식은 식별자 없이 실행가능한 함수 를 말한다. 자바8 버전부터 지원하는 기술로 함수적인 프로그래밍을 위함이다.
자바는 객체지향언어이다. 그런데 함수지향적인 코드가 가능하게 된 것은 요즘 함수지향적 프로그래밍이 자주 언급되고있기때문에 자바에서도 이를 지원한 것으로 보인다.
함수형 프로그래밍에서 다루는 개념을 잠깐 살펴보자.
함수지향에서 함수는 1급 객체라는 표현을 쓴다. 1급 객체의 특징은 다음과 같다.
위의 특징은 변수가 가지는 특징들이다. 함수지향에서는 함수를 변수처럼 취급할 수 있다는게 큰 특징이다.
함수형 프로그래밍에서는 데이터가 변할 수 없는데, 이를 불변성 데이터라고 한다. 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
순수 함수란 함수형 프로그래밍에서 필수적인 개념으로 다음과 같은 조건을 만족하는 함수를 의미한다.
-동일한 인자를 주면 동일한 결과를 리턴
-부수효과가 없어야함
-외부의 상태를 변화시키지는다.
-인자로 들어온 값을 변화시키지않는다.
-평가시점이 중요하지않다.
이밖의 고차함수, 합성함수등의 개념등이 더 있지만 개인적으로 객체지향의 이점을 이용하기위해 자바를 배우는 입장으로 함수지향은 지금 자세히 공부할 생각은 없다.
자바에서 함수형 프로그래밍은 인터페이스를 통해 제공된다.
//람다식 사용을 위한 인터페이스
interface Test{
int add(int x, int y);
}
//테스트해보기
public class LambdaTest{
public static void main(String[] args){
//람다식
Test test = (int x, int y)->x + y;
}
}
위와 같이 람다식을 사용하면 인터페이스를 따로 구현받는 클래스를 정의 할 필요 없이 익명함수로 사용이 가능하다. 중요한 것은 인터페이스 하나당 하나의 함수만 만들 수 있다는 것 이다. 익명함수를 사용하기 때문에 함수를 구분하지 못하는것 이다.
그래서 람다식을 사용하는 인터페이스를 정의할 때
@FunctionalInterface
interface Test{
public void add(int x , int y);
}
위와 같이 @FunctionalInterface
라는 어노테이션을 붙여주면 된다.
@FunctionalInterface
interface Test{
public int check(int x , int y);
}
public class LambdaTest{
public static void main(String[] args) {
Test t = (int x, int y)-> (x > y) ? x : y;
System.out.println(t.check(90, 40));
}
}
문법적인 생략이 있지만 문법을 자세히 다루지는 않겠다. 함수지향은 추후에 필요해지면 공부할 생각이다.