함수형 인터페이스 정리 - 2

Bruce Han·2023년 1월 13일
0

Java8-정리

목록 보기
2/20
post-thumbnail

이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.

자바에서 미리 정의해둔 자주 사용할만한 함수 인터페이스

Function<T, R>

함수는 하나의 값을 받아서 하나의 값을 리턴하는 것

Function<T,R>에서 T, R은 각각 타입이 다를 수 있기 때문에 <T, T><R, R>이런 식으로 두지 않는다.

이를 apply라는 메서드로 구현할 것

Function

위 사진처럼 Function<Integer, Integer>타입으로 apply()라는 메서드를 Multiply15라는 클래스로 구현했다.

정수 값이 하나 들어오면, 그것에 15를 곲한 정수 값이 반환된다.

Multiply15

이렇게 클래스 하나 더 만들어서 구현한 메서드를 가져오는 것보다 더 깔끔하게 람다 표현식을 활용할 수 있다.

lambda

받는 타입과 반환 타입이 둘 다 Integer형인 Function을 위 사진처럼 정의할 수 있다.

매개변수 i를 받고 i * 15를 반환하는 것을 구현할 수 있다.

lambda2

중괄호로 묶인 긴 소스를 이렇게 한 줄로 줄일 수 있다.

함수 조합

Function인터페이스에서는 함수를 조합할 수 있는 메서드를 제공한다.

  • andThen()
  • compose()

compose()

  • 함수를 적용하기 전 compose()를 걸어두면 그 뒤에 걸어놓은 메서드를 먼저 실행시킴

compose예시
위 예시 사진을 보면, divide3AndMultiply15를 새로 만들어서 multiply15()에 compose()를 적용하여 divide3()을 먼저 실행시키도록 정의했다. divide3AndMultiply15에 apply()로 15라는 값을 넣으면, 3으로 먼저 나누고(divide3), 그 나눠진 값(5)을 multiply15()에 넣는다. 그러면 75라는 값이 나오게 된다.

andThen()

  • compose()의 반대라고 생각하면 된다. compose()는 뒤의 메서드를 먼저 실행시켰다면, andThen()은 앞의 메서드를 먼저 실행시키고, 그 뒤의 메서드를 바로 실행하도록 한다.

andThen예시
위 사진처럼 apply의 매개변수에 10을 넣은 값으로 andThen()을 활용하면, 10에 15를 곱하고(multiply15) 3으로 나눠서(divide3) 50이라는 값을 얻을 수 있게 된다.

BiFunction< T,U, R >

  • 두 개의 입력값(T, U)을 받아서 R 타입을 리턴하는 함수 인터페이스이다.
	R apply(T t, U u)

Consumer< T >

  • T 타입의 매개변수를 받지만 리턴은 하지 않는 함수 인터페이스
	void Accept(T t)

comsumer예시
이런 식으로 리턴 없이 출력으로 활용할 수 있다.

  • 함수 조합용으로 andThen()을 활용할 수 있다.

Supplier< T >

  • T 타입의 값을 제공하는 함수 인터페이스
	T get()
  • 값을 받지 않는 대신 받아올 값을 정의한다.

supplier예시

위 사진처럼 람다 익스프레션에 인자를 넣을 필요가 없으며, 20을 리턴한다고만 정의해주면 무조건 20을 리턴하게 되는 것이다.

단, get()까지 추가로 체이닝을 해줘야지 온전한 20이라는 값을 얻을 수 있다. get()을 추가하지 않으면 레퍼런스가 출력된다.

Predicate< T >

  • Predicate는 어떤 인자 값을 하나 받아서 True/False를 리턴해주는 함수 인터페이스

Predicate예시

"bruce"로 시작하는지 체크할 수 있고, 홀수인지/짝수인지 판별하도록 로직을 만들 수 있다.

Predicate예시2

짝수이면서 100으로 나눈 나머지가 0인지 판별하는 로직이 필요할 때, 즉 and/or 조건을 활용하여 true/false를 체크할 때 and()/or()를 활용할 수 있다.

isEqual(), negate() 등의 메서드도 사용 가능하다.

Predicate예시3
이렇게 negate()를 붙이면 기존에는 true였던 결과가 false로 바뀐다.
그 true/false의 결과에 반대로 만드는 것이 negate()이다.

UnaryOperator< T >

  • Function<T, R>의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스

UnaryOperator예시1
이렇게 매개변수 타입과 반환 타입이 같으면, UnaryOperator를 이용하여 하나로 퉁칠 수 있다.

UnaryOperator예시2

UnaryOperator도 Function을 상속받았기 때문에, Function에서 제공하는 default 메서드를 사용할 수 있다.

BinaryOperator< T >

  • BiFunction<T,U, R>의 특수한 형태로, 동일한 타입의 입력값을 두 개 받아 리턴하는 함수 인터페이스
    • 이 3개의 타입이 전부 다 같을 거라는 가정하에 만들어짐

BinaryOperator예시1

먼저 BiFunction을 이용한 소스이다.

BinaryOperator예시2

BinaryOperator를 활용하면 Integer를 세 번씩이나 작성하지 않아도 된다.

Reference

더 자바, Java 8 - 백기선 강사님 강의를 토대로 정리했습니다.

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글