개발이슈/JAVA

Java 8의 람다와 메서드 참조를 이용한 회원 검색 기능 개선

kalkin 2023. 12. 6. 15:08

Java 8의 등장으로 람다 표현식과 메서드 참조는 Java 프로그래밍에서 큰 변화를 가져왔습니다. 이 글에서는 이러한 기능을 활용해 회원 검색 기능을 어떻게 개선할 수 있는지 살펴보겠습니다.

기존 코드: Java 8 이전의 접근 방식

회원 정보를 검색하는 기능을 구현한다고 가정해 봅시다. Java 8 이전에는 다음과 같이 구현할 수 있습니다.

 

public class MemberService {

    public List<Member> searchMembersByName(List<Member> members, String name) {
        List<Member> result = new ArrayList<>();
        for (Member member : members) {
            if (member.getName().equals(name)) {
                result.add(member);
            }
        }
        return result;
    }
}

위 코드는 회원 리스트에서 특정 이름을 가진 회원을 찾아 리스트로 반환합니다. 전통적인 for-loop와 조건문을 사용하여 구현되었습니다.

 

개선된 코드: Java 8 람다 표현식과 메서드 참조 사용

Java 8을 이용하면 위의 코드를 더 간결하고 효율적으로 개선할 수 있습니다.

public class MemberService {

    public List<Member> searchMembersByName(List<Member> members, String name) {
        return members.stream()
                      .filter(member -> member.getName().equals(name))
                      .collect(Collectors.toList());
    }
}

이제 searchMembersByName 메서드는 스트림 API와 람다 표현식을 사용하여 구현됩니다. filter 메서드는 람다 표현식 member -> member.getName().equals(name)을 사용하여 이름이 일치하는 회원만 필터링합니다.

 

람다 표현식

람다 표현식은 함수형 인터페이스를 간단하고 명료하게 구현할 수 있게 해줍니다. 위 예제에서 filter 메서드에 전달된 member -> member.getName().equals(name)는 Predicate<Member> 인터페이스의 구현체를 제공합니다.

 

메서드 참조

메서드 참조는 람다 표현식을 더욱 간결하게 만들어 줍니다. 예를 들어, Member 클래스에 이름을 비교하는 메서드가 있다면, 메서드 참조를 사용할 수 있습니다.

public class Member {
    // 기타 필드 및 메서드

    public boolean isNameEquals(String name) {
        return this.name.equals(name);
    }
}

// 서비스 클래스에서 메서드 참조 사용
public List<Member> searchMembersByName(List<Member> members, String name) {
    return members.stream()
                  .filter(member -> member.isNameEquals(name))
                  .collect(Collectors.toList());
}

위 코드에서 member -> member.isNameEquals(name)는 Member 클래스의 isNameEquals 메서드를 활용합니다. 이렇게 하면 코드의 의도가 더 명확해지고, 재사용성도 높아집니다.

 

결론

Java 8의 람다 표현식과 메서드 참조를 사용하면 코드의 가독성과 유지보수성이 크게 향상됩니다. 특히, 스트림 API와 함께 사용하면 데이터 컬렉션을 처리하는 복잡한 로직도 간단하고 명료하게 표현할 수 있습니다.