JaPark Bug World
[JAVA] 함수형 인터페이스와 람다 - 함수형 인터페이스와 람다 표현식 소개 본문
함수형 인터페이스와 람다 표현식 소개
함수형 인터페이스(Functional interface)
- 추상 메소드를 딱 하나만 가지고 있는 인터페이스
- SAM(single Abstract Method) 인터페이스
- @FunctionalInterface 애노테이션을 가지고 있는 인터페이스
// @FunctionalInterface 사용하여 오로지 추상메서드 하나만 존재하도록 명시
@FunctionalInterface
public interface RunSomething {
// abstract는 생략할 수 있다.
void doIt();
}
> @FunctionalInterface을 선언하게 되면 메소두가 2개인 경우 error 발생
람다 표현식(Lambda Expresstions)
- 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.
- 코드를 줄일 수 있다.
- 메소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.
리턴 타입이 없는 경우
// java8 이전 방식에는 익명 내부 클래스를 사용
RunSomething runSomething = new RunSomething() {
@Override
public void doIt() {
System.out.println("Hello");
}
};
runSomething.doIt();
RunSomething runSomething = () -> System.out.println("Hello");
runSomething.doIt();
리턴 타입이 있는 경우
@FunctionalInterface
public interface StopSomething {
int stop(int number);
}
StopSomething stopSomething = (number) -> number + 10;
stopSomething.stop(5);
블럭안에 코드가 2줄 이상인 경우
RunSomething runSomething = () -> {
System.out.println("Hello");
System.out.println("World");
};
runSomething.doIt();
자바에서 함수형 프로그래밍
- 함수를 First class object로 사용할 수 있다.
- 1급 객체란?
- 변수나 데이터에 할당 할 수 있다.
- 객체의 인자로 넘길 수 있어야 한다.
- 객체의 리턴값으로 리턴 할 수 있어야 한다.
- 자바에서 함수는 변수에 할당하지 못하기 때문 1급 객체에 해당하지 않는다, 그러나, 함수형 인터페이스를 통해 변수에 함수를 할당 할 수 있도록 작업이 가능하다.
- 1급 객체란?
- 순수함수 (pure function)
- 사이드 이팩트 만들 수 없다. (함수 밖에 있는 값을 변경하지 못한다.)
- 상태가 없다. (함수 밖에 정의되어 있는)
- 외부에서 데이터가 변경되지 않고 입력받은 값이 동일한 경우 결과값이 같아야한다.
- 고차 함수 (High-Order Function)
- 함수를 인자로 전달받거나 함수를 결과로 반환하는 함수
- 함수가 함수를 매개변수로 받을 수 있고 함수를 리턴할 수도 있다.
- 불변성
인프런 더 자바, Java8 백기선님 강의를 참고하여 정리한 내용입니다.
'개발새발 > 더 자바, Java 8' 카테고리의 다른 글
[JAVA] 함수형 인터페이스와 람다 - 메소드 레퍼런스 (0) | 2024.04.01 |
---|---|
[JAVA] 함수형 인터페이스와 람다 - 람다 표현식 (0) | 2024.03.31 |
[JAVA] 함수형 인터페이스와 람다 - 자바에서 제공하는 함수형 인터페이스 (0) | 2024.03.29 |