자바 인 액션_2,3

네코·2022년 7월 30일
0

자바인액션

목록 보기
2/3
post-thumbnail

동작 파라미터화 코드 전달하기

사과 가방에서 원하는 색깔의 사과만 골라서 꺼내는 요구사항이 있다고 가정합니다.


다음과 같이 작성해볼 수 있습니다.
이 상황에서 무게에 대한 조건으로 사과를 골라야하는 요구사항이 추가될 경우
비슷한 형태의 반복되는 코드로 구현하는 경우가 많습니다.

이렇게 구현할 경우 메서드 간의 코드가 중복되는 단점이 생기게 됩니다.

이런 중복의 문제를 해결하기 위해 책에서는 전략 디자인 패턴을 통해 동작 파라미터화를 구현하였습니다.
전략 디자인 패턴은 각 알고리즘을 캡슐화하는 알고리즘 패밀리를 정의해둔 다음,
런타임에 알고리즘을 선택하는 기법을 말합니다.

동작에 대한 여러 클래스들을 정의해두고 런타임에 다양한 동작을 수행할 수 있게 됩니다.

위와 같이 선택 조건을 결정하는 인터페이스를 정의하고 요구사항에 대한 조건을 구현하는 클래스를 만들어 해당 클래스를 파라미터로 전달합니다.
필터링 메소드는 다음과 같이 작성할 수 있습니다.

나아가서

새로운 조건이 추가될 경우 인터페이스를 구현한 클래스를 추가하는 작업이 반복되는 문제가 있습니디. 익명 클래스를 이용하더라도 예전히 불필요한 중복 코드의 작성(predicate 객체 파라미터)을
자바 8에서는 람다를 통해 해결할 수 있습니다.

List<Apple> list = filterApples((Apple apple) -> RED.equals(apple.getColor())); 

람다

함수형 인터페이스를 기대하는 곳에 람다 표현식을 사용할 수 있습니다.

함수형 인터페이스

앞선 예제에서 Predicate<T.>인터페이스의 자리를 람다 표현식으로 대체할 수 있었던 것은 Predicate 인터페이스가 오직 하나의 추상 메서드만을 지정하고 있기 때문입니다.

이렇게 정확히 하나의 추상 메서드를 지정하는 인터페이스함수형 인터페이스라고 합니다.

예시

실행 어라운드 패턴 : 실제 자원을 처리하는 코드를 설정과 정리 두 과정이 둘러싼 형태의 패턴을 의미합니다.
데이터베이스에 데이터를 조작하기 위해 DB 커넥션을 연결하고 쿼리 실행 후 할당한 자원을 닫는 과정이 대표적입니다.

해당 패턴에서 람다가 사용될 수 있습니다.

processFile 메서드는 텍스트 파일을 열고 한줄을 읽어 String 값을 반환합니다.
이 때 2줄을 읽어 반환하거나 읽은 값에 대한 작업을 추가하고자 하는 등 변경 사항에 유연하게 대응하고자 할 때 메서드를 새로 추가하지 않고 메서드의 동작을 파라미터화하여 처리할 수 있습니다.


함수형 인터페이스 종류

함수형 인터페이스는 오직 하나의 추상 메서드를 정의하고 있습니다. 이 추상 메서드는 람다 표현식의 시그니처를 결정한다고 할 수 있습니다.
함수형 인터페이스의 추상 메서드를 함수 디스크립터 라고도 합니다.
자바 8에서는 java.util.function 패키지 내 몇가지 함수형 인터페이스를 정의했습니다.

Predicate

Predicate<T> 인터페이스는 제네릭 형식 객체를 인수로 받아 boolean을 리턴합니다 test 추상메서드를 정의합니다
필터링 등으로 사용됩니다.

Consumer

Consumer<T> 인터페이스는 제네릭 형식 객체를 인수로 받아 void를 반환하는 accept 추상메서드를 정의합니다.
인자로 받은 항목에 동일한 동작을 처리하는 상황에 사용됩니다.

Funtion

Function<T> 인터페이스는 제네릭 형식 객체를 인수로 받아 제네릭 형식 R 객체를 반환하는 추상메서드 apply를 정의합니다.
입력을 출력으로 매핑하는 람다를 정의할 때 활용할 수 있습니다.


메서드 참조

메서드 참조를 만드는 3가지 유형

  • 정적 메서드 참조 : Intger::parseInt;
  • 인스턴스 메서드 참조
  • 기존 객체의 인스턴스 메서드 참조

생성자 참조

예시

정렬 시 함수형 인터페이스 Comparator를 람다로 사용한 경우를 나타낸 것입니다.
또한 inventory 생성시 map()메서드 내 Function 인터페이스를 생성자 참조를 통해 나타냈습니다.

0개의 댓글