Dev/Java

동작 파라미터화 코드 전달하기 (마지막)

아콩2 2022. 5. 29. 19:58
반응형

복잡한 과정 최소화

동작 파라미터화 코드 전달하기 (2) 처럼 사과를 필터링 하는 새로운 조건이 필요할때마다
클래스를 구현해야 한다는건 상당히 번거로운 작업이며 시간 낭비이다. 심지어 만들어둔 클래스를 나중에 가서 사용하지 않는다면 재활용도 안되는 쓰레기코드,,는 말이 너무 심하고 ! 하여튼 이러한 번거러움을 개선하기 위해 자바는 클래스의 선언과 인스턴스화를 동시에 수행할 수 있도록 익명 클래스 라는 기법을 제공한다.

익명 클래스를 이용하면 코드의 양은 줄일 수 있지만 익명 클래스가 모든 것을 해결하는 것은 아니다. 이번 챕터의 궁극적인 목표인 람다 표현식을 사용해서 더 가독성 있는 코드를 구현하는 방법을 알아보자.

다섯 번째 시도 : 익명 클래스 사용

List<Apple> redApples = filterApples(inventory, new ApplePredicate(){
    public boolean test(Apple apple) {
        return RED.eqauls(apple.getColor));
    }
});

익명 클래스로 인터페이스를 구현하는 여러 클래스를 선언하는 과정을 조금 줄일 수 있지만 여전히 만족 스럽지 않다.
코드 조각을 전달 하는 과정에서 결국은 객체를 만들고 명시적으로 새로운 동작을 정의하는 메서드를 구현해야 한다는 점은 변하지 않는다.

코드의 장황함은 나쁜 특성이다. 장황한 코드는 구현하고 유지보수하는 데 시간이 오래 걸릴 뿐 아니라 읽는 즐거움을 뺏는 요소로, 개발자로부터 외면 받는다. 한눈에 이해 할 수 있어야 좋은 코드다.

동작 파라미터화를 이용하면 요구사항 변화에 더 유연하게 대응할 수 있으므로 모든 프로그래머가 동작 파라미터화를 사용하도록 권장한다.
다음번에 공부할 내용은 람다식인데 맛보기로 람다 표현식을 이용해서 어떻게 코드를 간결하게 정리할 수 있는지 확인해보자

여섯 번째 시도 : 람다 표현식 사용

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

이전 코드에 비하면 훨씬 간단해지면서 문제를 더 잘 설명하는 코드가 되었다. 이렇게 복잡성 문제를 해결 할 수 있다.

라고 책의 저자는 설명하지만 내가 람다식에 익숙하지 않아서인지 문제를 더 잘 설명했다는 말엔 공감이 안된다,,람다 극복 후 다시 이 글을 읽어보면 그땐 공감할ㄷ지둥


위의 사진은 지금까지 공부한 내용을 간결하게 요약한 그래프이다. 동작 파리미터화를 사용 할 수록 유연한 코드를 작성할 수 있고 클래스나 익명 클래스를 사용하는것 보단 람다를 사용하는 하면 더 간결한 코드를 작성 할 수 있다.

일곱 번째 시도 : 리스트 형식으로 추상화

public interface Preidcate<T> {
    boolean test(T t);
}

public static <T> List <T> filter(List<T> list, Predicate<T> p) { 
    List<T> result = new ArrayList<>();
    for(T e : list){ 
        if(p.test(e)) {
            result.add(e);
        }
    }
    return result;
}

이제 바나나,오랜지,문자열 등의 리스트에 필터 메서드를 사용할 수 있다.

List<Apple> redApples = filter(inventory,(Apple apple) -> RED.equlas(apple.getColor)));

List<Integer> evenNumbers = filter(numbers,(Integer i) -> i % 2 == 0);

이처럼 람다를 사용하게 되면 유연성과 간결함 두 마리 토끼를 모두 잡을 수 있었땅. 자바 8이 아니면 불가능한 일이다(이건 책 저자 의견일뿐,,)

+) 문득 든 생각인데 동작 파라미터화와 람다식을 사용하기 위해서는 구현해야하는 인터페이스에는 메서드 1개만 정의 되어야 하는거 아닌가? 메서드에 인자로 전달 할 거기 때문에 인터페이스에는 메서드 1개만 있어야 한다는게 넘 당연한거라서 언급이 안된건가? 혹시 이 글을 보고 계신 분들 중에 정답을 알고 계신다면 알려쥬세여,, 저도 한번 찾아보고 공유할만한 내용이다 판단되면 따로 추가 포스팅 하겠습니당. 뭔가 아주 중요한 개념일것만 같은 느낌,,,


마치며

자바 인 액션을 공부 한 뒤에 요약 + 나의 생각 및 경험 을 추가 하고 싶었는데 막상 다 쓰고 나니 그냥 복붙만 한 느낌이다.
그리고 아직은 나의 경험을 깔끔하게 덧붙이는게 어렵기도 하다. 노력해~ 극복해~

동작 파라미터화, 람다에 대해 잘 알지 못했는데 예제 코드 자체는 익숙하단 느낌을 받았다.
왜 그런가 생각 해보니 구현 할 때 스택 오버플로우에서 복붙을 하거나 인텔리제이를 사용하면서 별 생각 없이 alt + tab을 눌러서
코드 자체의 형태?에는 익숙하지만 왜 이렇게 쓰는지는 몰랐던 것 같다. 앞으로는 복붙 하거나 alt + tab을 누른 뒤 왜 이렇게 하라고 했을까? 하는 고민을 해봐야 겠다고 다짐했다,,,

그리고 여담으로 이 책의 저자가 자바 뽕에 취해있는건지 진짜 자바만 되는건지 궁금해졌다. 지금 당장은 필요하지 않아서 새로운 언어를 공부하는걸 회피했는데 이번 기회에 새로운 언어를 공부해서 진짜 자바가 zi존인지 아닌지 확인해봐야겠다. 코틀린 딱

REPERENCE

Modern Java in Action

반응형