[Java] 함수형 인터페이스, 람다식
GOAL
- 함수형 인터페이스에 대해서 이해할 수 있습니다.
- 함수형 인터페이스와 람다식을 사용할 수 있습니다.
- 자바에서 제공해주는 함수형 인터페이스 종류들을 알 수 있습니다.
함수형 인터페이스
자바 8부터 함수를 일급객체 처럼 다룰 수 있는 함수형 인터페이스를 제공합니다.
함수형 인터페이스의 기본 조건은 SAM(Single Abstract Method)이어야 합니다.
public interface RunSomething {
void doSomething(); // 인터페이스 메소드는 public abstract이며 생략 가능
}
default 메소드나 static메소드가 있어도 추상 메소드가 한 개일 경우 함수형 인터페이스입니다.
@FunctionalInterface // 어노테이션을 붙이면 함수형 인터페이스임을 명시함
// 추상 메소드가 두 개 이상일 경우 컴파일 에러를 잡아줍니다.
public interface RunSomething {
void doSomethig();
static void printName(){
System.out.println("brick");
}
default void turnOff(){
System.out.println("turn off");
}
}
함수형 인터페이스의 사용법 및 람다식
Question : 그럼 메소드 하나 사용하려고 매번 새로운 클래스를 만드는 건 비효율적인 방법 아닌가요??
-> 이런 의문점이 들 수 있습니다. 그래서 Java에서 기본적으로 제공하는 함수형 인터페이스들을 제공해 줍니다.
우선 그 중 하나인 Function인터페이스에 대한 예시를 보여드리겠습니다.
먼저 람다식을 사용하지 않고 익명 클래스(Anonymous Class)를 사용하는 방식으로 보여드리겠습니다.
public class Foo {
public static void main(String[] args) {
Function<String, Integer> toInt = new Function<String, Integer>() {
@Override
public Integer apply(String value) {
return Integer.parseInt(value);
}
};
final Integer number = toInt.apply("100");
}
}
이번엔 람다식을 이용해보겠습니다.
public class Foo {
public static void main(String[] args) {
Function<String, Integer> toInt = value -> Integer.parseInt(value);
final Integer number = toInt.apply("100");
}
}
람다
- (인자 리스트) -> {바디}
인자 리스트
- 인자가 없을 때 : ()
- 인자가 한 개일 때 : (one) 또는 one
- 인자가 여러개 일 때 : (one, two)
- 인자타입은 생략 가능, 컴파일러가 추론
바디
- 화살표 오른쪽에 함수 본문을 정의한다
- 여러 줄인 경우 {}를 사용해서 묶는다.
- 한 줄인 경우에 생략 가능, return도 생략 가능
변수 캡처 (Variable Capture)
- 로컬 변수 캡처
- final 이거나 effective final인 경우에만 참조할 수 있다.
- 그렇지 않을 경우 concurrency 문제가 발생할 수 있어서 컴파일러가 방지한다.
● 자바에서 기본적으로 제공하는 함수형 인터페이스
다음은 자바에서 기본적으로 제공하는 함수형 인터페이스의 몇 가지만 간략하게 표로 정리한 것입니다.
추가적인 인터페이스들은 공식 문서에서 참고하시면 되겠습니다.
References
백기선 - 더 자바8
케빈TV - 모던 자바(자바8) - 못다한 이야기
'Java' 카테고리의 다른 글
Generic Type Erasure는 어떻게 타입캐스팅을 하는건가요? (0) | 2021.12.07 |
---|---|
Java Parallel Programming 성능 테스트 및 고려사항 (JMH) (2) | 2021.07.25 |
HashMap은 어떻게 동작할까? + 자바8에서의 변화 (0) | 2021.06.20 |
[Java] 새로운 날짜/시간 API Time소개, Date의 단점 (0) | 2021.02.10 |