Language Study/Java

[모던 자바 인 액션] 동작 파라미터화 코드 전달하기

지미닝 2024. 7. 23. 18:50

동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다.

 

동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 대해 효과적으로 대응할 수 있는데, 코드블럭의 실행은 나중으로 미뤄진다. 나중에 실행될 메서드의 인수로 코드 블록을 전달할 수 있고, 결과적으로 코드 블럭에 따라 메서드의 동작이 파라미터화된다.

  • 리스트의 모든 요소에 대해서 '어떤 동작'을 수행할 수 있음
  • 리스트 관련 작업을 끝낸 다음에 '어떤 다른 동작'을 수행할 수 있음
  • 에러가 발생하면 '정해진 어떤 다른 동작'을 수행할 수 있음

동작 파라미터로 위와 같은 기능들을 구현할 수 있다.

 

 프레디케이트를 활용하여 선택 조건을 결정하는 인터페이스를 아래와같이 정의할 수 있다.

위 조건에 따라 filter 메서드가 다르게 동작할 것이라고 예상할 수 있다.

 

 이런 패턴을 전략 디자인 패턴이라고 부른다. 전략 디자인 패턴은 각 알고리즘(전략이라 불리는)을 캡슐화하 는 알고리즘 패밀리를 정의해둔 다음에 런타임에 알고리즘을 선택하는 기법이다.

 

 컬렉션 탐색 로직과 각 항목에 적용할 동작을 분리할 수 있다는 것이 동작 파라미터화의 강점이다. 메서드가 다른 동작 을 수행하도록 재활용할 수 있다. 따라서 유연한 API를 만들 때 동작 파라미터화가 중요한 역할을 한다.

 

익명 클래스

 자바는 클래스의 선언과 인스턴스화를 동시에 수행할 수 있도록 익명 클래스라는 기법을 제공한다. 익명 클래스를 이용하면 코드의 양을 줄일 수 있다. 하지만 익명 클래스가 모든 것을 해결할 수 있는 것은 아니다.

 

익명 클래스란, 자바의 지역 클래스(블록 내부에 선언된 클래스)와 비슷한 개념이다. 이름이 없는 클래스이다. 이를 활용하면 클래스 선언과 인스턴스 화를 동시에 할 수 있다. 즉, 즉석해서 필요한 구현을 만들어서 사용할 수 있다.

 

동작 파라미터를 활용하기 위해 람다 표현식을 활용해서도 간단하게 구현할 수 있다.

List<Apple> result = filterApples(inventory, (Apple apple) -> RED.equals(apple.getColor()));

 

리스트 방식을 통해서도 추상화 할 수 있다. 

 

정리

  • 동작 파라미터화에서는 메서드 내부적으로 다양한 동작을 수행할 수 있도록 코드를 메서드 인수로 전달한다.
  • 동작 파라미터화를 이용하면 변화하는 요구사항에 더 잘 대응할 수 있는 코드를 구현할 수있으며 나중에 엔지니어링 비용을 줄일 수 있다.
  • 코드 전달 기법을 이용하면 동작을 메서드의 인수로 전달할 수 있다. 하지만 자바 8 이전 에는 코드를 지저분하게 구현해야 했다. 익명 래스로도 어느 정도 코드를 깔끔하게 만 들 수 있지만 자바 8에서는 인터페이스를 상속받아 여러 클래스를 구현해야 하는 수고를 없앨 수 있는 방법을 제공한다.