- Java Functional하게 사용하기 - 12022년 02월 03일 21시 20분 14초에 업로드 된 글입니다.작성자: jCurve728x90반응형
자바에서도 functional programming을 지원하고자 jdk1.8부터 java.util.function 패키지를 활용해서 함수를 객체의 형태로 풀어내 프로그래밍이 가능해졌습니다.
기존의 "문제를 어떻게 풀어갈까?"에 대해 집중했던 객체 지향 프로그래밍은 명령형 프로그래밍의 범주이고
"무엇을 할까?"에 집중하는 함수형 프로그래밍은 선언형 프로그래밍의 범주로 봅니다.
함수형 프로그래밍 관련하여 글을 보면 많은 사람이 함수를 1급 시민으로서 사용하게 된다는 글을 작성하였는데
이는
- 함수/메서드의 매개변수로서 전달할 수 있는가?
- 함수/메서드의 반환값이 될 수 있는가?
- 변수에 담을 수 있는가?
위의 조건을 충족하는 것을 말합니다.
우선 java.util.function 패키지를 보면 @FunctionalIterface 애너테이션이 붙은 인터페이스들을 볼 수 있는데
함수를 하나의 객초 표현해서 사용합니다.
크게
Function<T,R> : T를 받아 R을 반환하는 functional interface
Predicate<T> : T를 받아 true or false를 반환하는 functional interface
Supplier<T> : 입력 파라미터 없이 T를 반환하는 functional interface
Consumer<T> : T를 받아 사용하는 (반환값이 없는) functional interface
Operator: 입력 타입과 반환 타입이 동일한 functional interface
로 볼 수 있습니다.
functional interface는 일반적으로 interface를 구현하듯이 구현해서 클래스를 만들고 사용하는 방식
익명 클래스로 사용
람다(익명 함수) 사용
이러한 방식이 있는데
익명 클래스 vs 익명 함수
익명 클래스는 컴파일 이후 별도의 분리된 클래스 파일이 생성되는데 이는 jar 파일에 크기가 커진다.
반면 lambda는 private method가된다.
이유는 invokedynamic이라는 bytecode 명령을 사용해 메서드 실행시점에 동적으로 private method가 생성되는 것
익명 클래스는 또한 2개 이상의 추상 메서드를 가지는 경우에 , functional interface는 람다 ( 익명 함수)를 사용한다.
위와 같은 이유로 funtional interface에서는 lambda를 사용해서 표현하는 것이 간단할 뿐더러 효율적이다.
lambda의 경우
- 매개변수의 타입이 유추 가능할 경우 타입 생략 가능
- 매개변수가 하나일 경우 괄호 생략 가능
- 바로 리턴하는 경우 중괄호 생략 가능
위의 경우 처럼 생략할 수 있는 많은 상황이 있기 때문에 더욱 간결하게 표현 가능하다.
새로운 메서드를 등록하는 것도 좋죠 근데 이미 만들어진 클래스의 메서드가 있으면 그걸 사용해서(메서드 레퍼런스) 간편하게 만들 수 있습니다.
//ClassName::staticMethodName Function<String, Integer> function1 = Integer::parseInt; function1.apply("10") //return 10 //objectName::instanceMethodName String hello = "hello"; Predicate<String> predicate = hello:equals; predicate.test("hello") // return true //Classname::instanceMethodName Function<String, Integer> function2 = String::length; function2.apply("Hello world") //return 11 //ClassName::new class A { } A::new
기존 메서드를 재사용하기 때문에 편리하긴 하나 생략이 많아서 사용할 메서드를 미리 기억하고 있어야 하는데
사실 기억해서 만들어두기만 하면 사용할 때는 intelliJ 같은 똑똑한 IDE가 알려주니까 그렇게까지 단점은 아닌거 같다.
반응형'JAVA' 카테고리의 다른 글
Java Functional하게 사용하기 - 3 (0) 2022.02.12 Java Functional하게 사용하기 - 2 (0) 2022.02.07 private method test 기능을 테스트할까? 구현을 테스트할까? (0) 2021.07.12 Iterator 정리 (0) 2021.05.15 Comparable와 Comparator 정리 (0) 2021.04.14 댓글