Java

[Java] List -> Map 으로 변환하는 이유

블로그 주인장 2024. 4. 5.

List to Map 

Java 프로그래밍을 진행할 때 List를 Map으로 변환하는 방법과 그 이유에 대해 알아보겠습니다.

특히, 데이터를 효율적으로 탐색하고 순서를 유지하고자 할 때 이 방식이 어떻게 유용하게 작용하는지 살펴보겠습니다.

 

 

문제 상황

예를 들어, 상품 번호 리스트를 기반으로 특정 상품들의 정보를 데이터 베이스에서 조회하는 상황이라고 가정해보겠습니다.

이 때, 상품 번호의 순서대로 상품 정보를 유지하면서 효율적으로 조회하는 방법이 필요합니다.

 

List에서 Map으로 변환하는 이유

Map으로 변환하는 주된 이유는 효율적인 탐색과 순서 유지입니다.

 

List에서 특정 요소를 찾기 위해서는 리스트를 처음부터 끝까지 순회해야합니다.

이는, 탐색 시간이 요소의 수에 비례하여 증가하는 시간 복잡도(O(n)) 를 가지게 됩니다.

 

반면, Map을 사용하면 Key를 이용해 직접적으로 값을 접근할 수 있기 때문에, 탐색 시간 복잡도가 상수 시간(O(1))에 가깝게 됩니다.

따라서 특정 요소에 해당하는 객체들을 빠르게 찾기 위해서 Map으로 변환합니다.

 

 

또한, List의 순서대로 객체를 반환하기 위해서 Map을 사용합니다.

 

데이터베이스에서 반환된 객체들의 순서는 List와 일치하지 않을 수 있습니다.

Map을 사용한다면, 원래의 리스트 순서대로 Map에서 객체를 찾아 순서를 유지한 채로 리스트를 재구성할 수 있습니다.

 

아래 실제 코드 예시로 확인해보겠습니다.

 

실제 코드 예시

아래 코드는 상품번호(productNumber) 리스트를 받아 해당 상품 정보를 조회합니다.

조회한 상품 정보를 원래 리스트의 순서대로 정렬하여 반환하는 간단한 예시 코드입니다.

 

먼저, 상품 정보를 담을 Product 클래스와 상품 정보 조회 메서드를 가정한 ProductRepository 인터페이스를 정의합니다.

public class Product {
    private String productNumber;
    private String name;

    // 생성자, getter, setter 생략

    public String getProductNumber() {
        return productNumber;
    }

    // toString() 메서드 오버라이드 등 추가적인 구현
}

public interface ProductRepository {
    List<Product> findAllByProductNumberIn(List<String> productNumbers);
}

 

productNumbers 리스트를 받아 해당하는 Product 객체들을 조회하고, 원래 리스트의 순서대로 정렬하여 반환하는 메서드를 구현합니다.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class ProductService {

    private ProductRepository productRepository;

    public List<Product> findProductsBy(List<String> productNumbers) {
        // 데이터베이스에서 상품 번호 리스트에 해당하는 상품 정보 조회
        List<Product> products = productRepository.findAllByProductNumberIn(productNumbers);

        // 조회된 상품 정보를 상품 번호를 키로 하는 Map으로 변환
        Map<String, Product> productMap = products.stream()
            .collect(Collectors.toMap(Product::getProductNumber, p -> p, (p1, p2) -> p1));

        // 원래 상품 번호 리스트의 순서대로 상품 정보를 정렬하여 반환
        return productNumbers.stream()
            .map(productMap::get)
            .collect(Collectors.toList());
    }
}

 

위의 코드는 데이터베이스에서 조회한 Product 객체들을 상품번호를 Key로 하는 Map으로 변환합니다.

 

원래 productNumbers 리스트의 순서에 따라 상품 정보를 효율적으로 탐색하고 정렬하는 과정을 보여줍니다.

 

이러한 변환 과정을 통해, 효율적인 탐색과 순서 유지라는 2가지의 목적을 달성할 수 있습니다.

 

 

References

Java Stream API 공식문서

 

Java Collectors 공식문서

 

Java Map Interface 공식문서

 

 

 

 

 

본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다.

반응형

댓글