What I Learned
함수형 프로그래밍
함수를 객체처럼 쓸 수 있다. (함수를 변수인 것처럼 타입으로 지정하거나, 인자값으로 넘기거나, 리턴값으로 받을 수 있다. => 함수리터럴)
- 자바7 이전에 매개변수로 함수를 넣고싶을 때에는 메소드 하나만을 멤버로 가지는 클래스를 생성하고 그 클래스의 인스턴스를 매개변수로 넣는 복잡한 과정을 거쳐야 했다.
함수형 프로그래밍의 특징
- 인풋과 아웃풋이 분명히 있다.
- 외부환경에 독립적이다.
- 1번과 2번의 결과로 항상 동일한 아웃풋을 반환한다. 이것을 순수함수라고도 한다.
- 여러 변수들(외부환경)이 변하게 되면 프로그램의 특정 상태가 변할 수 있는데 함수형 프로그래밍에서는 외부환경에 독립적이라 부수작용으로부터 독립적이다.
Lambda
함수/메소드를 간단한 식으로 표현하는 방법. 메소드를 람다식으로 표현하면 메소드의 이름과 반환값이 없어져서 익명함수라고도 부른다. (함수와 메소드는 근본적으로 동일한 것이지만 메소드는 클래스에 종속되는 반면 함수는 클래스에 독립적이다.)
- 람다식 작성
- 인풋과 아웃풋의 타입은 예측이 가능해 보통 생략할 수 있는 편이다.
- 람다식은 문장이 아니라 '식'이므로 마지막에 세미콜론은 생략한다. 단, 인터페이스에 람다식을 지정해주는 문장이라면 당연히 세미콜론은 붙여야 한다.
- 'return'도 생략 가능.
- Curly bracket 안의 문장이 하나일 경우 {} 또한 생략 가능하고 이 경우에는 세미콜론이 필요없지만 문장이 여러개일 경우엔 {}과 ;를 꼭 붙여주자.
함수형 인터페이스
함수형 프로그래밍에서는 함수를 변수처럼 쓸 수 있다고 하는데 함수를 어떤 변수타입에 넣어야 할까? 답은 인터페이스를 지정해주어야 한다.
- 새로운 인터페이스 만들기
새 인터페이스 안에 추상형 메소드 하나만을 선언하고, (이걸 FunctionalInterface라고 한다. 인터페이스 선언 전에 @FunctionalInterface 아노테이션을 붙이면 메소드가 두개일 때 오류를 띄워준다!) 메인부에서 이 인터페이스의 객체를 생성하면서 메소드를 오버라이딩 해주면 객체.메소드이름(매개변수)의 형식으로 사용할 수 있고, 메인부 바깥에서 메소드를 지정해준 후 메인부에서 변수를 만들어 지정해주는 식으로도 사용할 수 있다.
@FuntionalInterface
interface Func {
public abstract int add(int a, int b);
}
public static void main(String[] args) {
Func f = new Func() {
public int add(int a, int b) {
return a + b;
}
} // 람다식을 쓰지 않고 풀어서 쓴 것
Func f = (a, b) -> a + b; // 새로 생성한 Func f 객체에 람다식으로 오버라이딩.
}
- java.util.Function 패키지
보통의 메소드는 타입이 비슷해서 앞서 이용했던 새로운 인터페이스를 만들기보단 일반적으로 자주 쓰이는 형식의 메소드를 함수형 인터페이스로 정의해놓은 패키지의 인터페이스를 쓰는 것이 좋다.
Untitled