해당 포스팅은 모던 자바 인 액션의 2장 동작의 파라미터화 부분을 읽고 개인적으로 정리한 내용입니다.
이번 장에서 공부할 내용
- 변화하는 요구사항에 대응
- 동작의 파라미터화
- 익명 클래스
- 람다 표현식
이번 장은 동작의 파라미터화에 대해서 자세하게 배웁니다. 동작을 파라미터화 하면 코드 중복 문제를 해결해주고,
그로인해 유지보수가 수월해진다는 장점이 가장 기억에 남습니다.
이제부터 왜 동작 파라미터가 필요해졌고, 어떻게 만들 수 있는지에 대해서, 그리고 이 과정들을 이해하기 위해 필요한 개념들에 대해서 설명해 보겠습니다.
항상 변화하는 소프트웨어
소프트웨어는 항상 변화하는 입장에 놓여 있습니다. 고객의 변화하는 요구사항에 유연하게 대응하기 위한 기능이 자바에 필요해졌고, 그것이 바로 자바 8부터 추가된 동작 파라미터 기능입니다.
동작 파라미터
동작 파라미터는 동작이 아직 결정되지 않은 코드 블럭을 의미합니다.
정렬할 때 사용하는 이 인터페이스는 메서드를 하나 가지고 있는데 이 메서드는 인터페이스의 추상 메서드이기 때문에 어떤 동작이 실행될지는 실제로 사용되는 시점에 정해집니다.
동작 파라미터는 동작을 파라미터로 받아서 런타임 시점에 동작을 결정할 수 있는 기능이라고 생각하시면 됩니다.
이렇게 되면 상당히 많은 부분을 더 추상화 할 수 있습니다.
1. 리스트의 모든 요소에 대해서 어떤 동작을 수행할 수 있음
2. 리스트 관련 작업을 끝낸 다음에 어떤 동작을 수행할 수 있음
3. 에러가 발생하면 정해진 어떤 다른 동작을 수행할 수 있음
이렇게 동작 파라미터로 다양한 동작을 런타임 시정에 결정할 수 있게 되고 이 부분이 코드 중복을 상당히 해소해 줍니다.
2.1 변화하는 요구사항에 대응하는 코드 만들어 보기
상황: 농부가 저한테 사과들 중에서 녹색만 필터링 하는 기능을 만들어 달라고 요구 했습니다.
요구사항: 사과들 중에서 녹색만 필터링하는 기능
문제점: 그런데 만약 녹색말고 빨간색도 필터링하는 기능을 만들어 달라고 한다면? -> 비슷한 기능의 메서드 작성 -> 중복!
여기 사과의 색깔이 GREEN 이라면 List에 담아 반환해주는 메서드가 하나 있습니다.
현재 상황의 문제점은 Apple의 Color의 종류만큼 비슷한 메서드를 만들어 줘야 한다는 점입니다.
코드가 상당히 중복될 거 같습니다. -> 거의 비슷한 코드가 존재한다면 그 코드를 추상화 하자!
색깔 파라미터화
색깔을 추상화 색에 대해서 좀 더 유연한 코드를 만들었습니다.
농부의 요구사항은 더 추가됩니다.
요구사항: 색깔말고 사과가 가진 멤버변수 weight에 대해서도 필터링 할 수 있게 기능
문제점: 사과의 필터링 조건이 추가될 때마다 메서드를 추가... -> 비교하는 부분의 코드가 중복됨
2.2 동작 파라미터화
이제 동작 파라미터를 적용해보려고 합니다. 비교하는 부분의 코드를 파라미터화 해볼건데 그 전에 할 일이 있습니다.
선택 조건을 결정하는 인터페이스를 정의해 봅시다.
참 거짓을 판단하는 함수를 Predicate 라고 합니다.
이제 이 인터페이스를 구현하는 클래스를 만들어 주면 됩니다.
이렇게 다양한 선택 조건을 처리하는 클래스를 만들어 주면 됩니다.
이제 p라는 ApplePredicate 객체에 따라서 선택 조건이 달라진다는 것을 확인할 수 있습니다!
전략 패턴
위 형태의 패턴을 전략 패턴이라고 부릅니다. 전략 패턴은 알고리즘을 캡슐화 해서 런타임 시점에 알고리즘을 선택할 수 있게 해주는 기법입니다. 전략 패턴을 여기서 다루는 것은 무리이고 따로 포스팅 해서 올려보겠습니다!
2.3 복잡한 과정 간소화
그런데 이런 filterApple에 동작을 넣어주기 위해서 인터페이스를 만들어 주고, 또 이 인터페이스를 상속하는 메서드를 만들고, 추상 메서드까지 구현해야 하는 과정이 복잡하기도 하고, 귀찮기도 합니다.
문제점: 함수형 인터페이스의 추상 메서드를 구현하기 위해 클래스를 생성/인스턴스화 해야 하는 번거로움이 존재
익명 클래스
익명 클래스는 자바의 지역 클래스와 비슷한 개념 입니다. 익명 클래스는 말 그대로 이름이 없는 클래스입니다.
익명 클래스를 이용하면 클래스 선언과 인스턴스화를 동시에 할 수 있습니다.
즉, 즉석에서 필요한 구현을 만들어서 사용할 수 있습니다.
익명 클래스 사용하기
이런 식으로 클래스와 인스턴스를 생성하는 코드를 작성할 수 있습니다.
하지만 여전히 많은 코드라인을 차지합니다.
그리고 익명 클래스의 사용은 코드를 장황하게 합니다. 그렇게 되면 가독성이 떨어지고, 유지보수하는데도 시간이 많이 걸립니다.
한눈에 이해할 수 있는 코드가 좋은 코드!
람다 표현식의 사용
람다에 대해서는 다음 장에서 자세하게 배워봅시다!
https://agh-dev.tistory.com/13
이번 포스팅에서는 동작 파라미터의 필요성과 만드는 법에 대해서 알아보았습니다. 다음 장은 람다 표현식으로 이 동작 파라미터를 어떻게 좀 더 간결하게 표현할 수 있는지에 대한 내용과, 만드는 법, 관련된 자바 API 등을 한번 배워봅시다!
'도서 > 모던 자바 인 액션' 카테고리의 다른 글
모던 자바 인 액션 - 7장 - 병렬 데이터 처리와 성능 (0) | 2023.08.10 |
---|---|
모던 자바 인 액션 - 6장 - 스트림으로 데이터 수집 (0) | 2023.08.05 |
모던 자바 인 액션 - 5장 다양한 스트림 활용 (0) | 2023.08.02 |
모던 자바 인 액션 - 4장 스트림 활용 (0) | 2023.07.31 |
모던 자바 인 액션 - 3장 람다 표현식 (0) | 2023.07.28 |