[Java8] 함수형 인터페이스 정의와 람다식 구현 방법, 순수함수
- Language/Java
- 2021. 12. 11.
함수형 인터페이스 정의
//추상메서드가 하나만 있으면 함수형 인터페이스다.
//@FunctionalInterface 애노테이션을 붙여서 함수형 인터페이스를 정의 할 수 있다.
public interface RunSomethinig {
//인터페이스는 필드 앞에 abstract 생략 가능
void doIt();
//void doAgain(); @FuctionalInterface 애노테이션이 있으면 에러 발생
//다른 형태의 메서드가 있어도 함수형 인터페이스 이다.
static void printName() {
System.out.println("kang");
}
default void printAge() {
System.out.println("31");
}
}
- 함수형 인터페이스는 추상메서드가 하나만 있는 인터페이스 이다.
- 인터페이스는 필드 앞에 abstract 생략할 수 있다.
- 다른 형태의 메서드가 있어도 추상메서드가 하나만 있다면 함수형 인터페이스다.
- 스프링에서는 @FunctionalInterface 를 붙여서 함수형 인터페이스를 정의 할 수 있다.
- @FuctionalInterface가 있다면 2개 이상의 필드를 선언할수 없다. 컴파일시 에러 난다.
자바8 이전에는 익명 내부 클래스를 사용해서 인터페스를 구현 하였다.
//자바8 이전에는 익명 내부 클래스를 사용해서 인터페이스 구현
RunSomethinig runSomethinig = new RunSomethinig() {
@Override
public void doIt() {
System.out.println("Hello");
}
};
하지만 자바8부터는 아래처럼 람다식으로 함수형 인터페이스를 구현 할 수 있다. 2줄 이상이면 {}로 묶어서 람다식을 구현한다.
//자바8 이후에는 람다식으로 함수형 인터페이스 구현 가능
//한줄일 경우에만 {} 필요없이 아래처럼 사용가능
RunSomethinig runSomethinig = () -> System.out.println("Hello");
//두줄 이상이상이면 경우에만 {} 괄호 묶어서 람다식 구현
RunSomethinig runSomethinig = () -> {
System.out.println("Hello");
System.out.println("good");
};
//만든 함수 실행
runSomethinig.doIt();
람다식으로 쓰면 함수처럼 보이지만 자바에서는 함수형 인터페이스를 구현한 특수한 형태의 객체라고 볼 수 있다.
그래서 () → System.out.prinln("Hello") 이 자체를 리턴하는것도 가능하다.
또 함수가 함수를 리턴하거나 매개변수로 받을수 있다. 이것을 고차함수라 한다.
매개변수가 있는 함수형 인터페이스 람다식으로 구현
public interface RunSomethinig {
int doIt(int number);
}
RunSomethinig runSomethinig = (number) -> {
return number + 10;
};
순수함수
//순수 함수(pure function) 함수 밖에있는 값을 참조하거나 변경하지 않는 함수, 함수는 전달받은 값만을 사용해야 한다.
int baseNumber = 10; //이값을 사용할때 순수 함수라 볼수 없고 선택값에 의존한다. 만약 Final 이면 찮다.
RunSomethinig runSomethinig1 = new RunSomethinig() {
int baseNumber = 10;// 여기도 함수 밖
@Override
public int doIt(int number) {
baseNumber++; //함수 밖에있는 값을 변경하려고 할때 순수함수라 볼수 없다.
return number + baseNumber;
}
};
수학적으로 함수는 전달받은 값이 같으면 항상 같은 결과값이 나와야 한다. 이것을 순수함수(pure function)라고 한다. 순수함수로 볼수 없는 경우는 함수 밖에 있는 값을 변경하려고 하거나 사용하려고 할때 문법적으로 오류는 없지만 순수함수로 볼 수 없다. 코딩할때 순수함수를 달성하기 위해 주의해야 한다.
순수함수를 달성하기 위해선 오로지 함수내부에서 쓰는 값 함수가 전달받은 파라미터 값만을 사용해야 한다.
백기선 더 자바, Java 8 : https://www.inflearn.com/course/the-java-java8/dashboard
'Language > Java' 카테고리의 다른 글
[Java 8] 람다식 문법과 함수형 인터페이스 람다식으로 사용법 변수캡쳐 설명 (0) | 2022.06.14 |
---|---|
[Java8] 자바에서 제공하는 함수형 인터페이스 람다식으로 사용방법 (0) | 2021.12.13 |
[Java] 스트림정의와 Scanner와 BufferedReader차이, BufferedReader사용한 백준 15552번 문제 풀이 (0) | 2021.11.24 |
[Java] Mac OS 자바(jdk 11) 설치와 IntelliJ 설치 방법(Gradle 환경세팅 후 HelloWorld 출력) (2) | 2021.01.20 |
[Java] JDK 환경변수 설정 이유와 세팅 방법 (4) | 2020.01.16 |