Java List 컬렉션 주요 操作 가이드

Java List는 Java 컬렉션 프레임워크에서 가장 빈번하게 사용되는 인터페이스 중 하나이다. 본 문서에서는 List의 다양한 操作 방법을 상세히 설명한다.

1. 기본 데이터 타입 List 정렬

간단한 문자열 또는 Integer 같은 기본 타입의 List는 Collections.sort() 메서드를 사용하여 쉽게 정렬할 수 있다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSortingExample {

    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("banana");
        fruits.add("apple");
        fruits.add("cherry");
        
        System.out.println("정렬 전: " + fruits);
        
        Collections.sort(fruits);
        
        System.out.println("정렬 후: " + fruits);
    }
}

실행 결과는 사전순으로 정렬된 apple, banana, cherry가 출력된다.

2. 복잡한 객체(List) 정렬 방법

복합 객체들을 담고 있는 List를 정렬하려면 Comparable 인터페이스를 구현하거나, Comparator를 사용해야 한다.

2.1 Comparable 인터페이스 구현

Comparable을 구현하면 자체 비교 로직을 정의할 수 있다.

public class Product implements Comparable<Product> {

    private String productName;
    private Integer price;
    
    public Product(String productName, Integer price) {
        this.productName = productName;
        this.price = price;
    }
    
    public String getProductName() {
        return productName;
    }
    
    public void setProductName(String productName) {
        this.productName = productName;
    }
    
    public Integer getPrice() {
        return price;
    }
    
    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public int compareTo(Product other) {
        int result = this.productName.compareTo(other.productName);
        if (result == 0) {
            result = this.price.compareTo(other.price);
        }
        return result;
    }
    
    @Override
    public String toString() {
        return "Product{name='" + productName + "', price=" + price + "}";
    }
}

2.2 정렬 구현 예제

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ProductSortDemo {

    public static void main(String[] args) {
        List<Product> products = new ArrayList<>();
        products.add(new Product("laptop", 1200));
        products.add(new Product("laptop", 800));
        products.add(new Product("phone", 900));
        products.add(new Product("tablet", 500));
        
        System.out.println("정렬 전:");
        products.forEach(System.out::println);
        
        Collections.sort(products);
        
        System.out.println("\n정렬 후:");
        products.forEach(System.out::println);
    }
}

이 코드는 상품명을 먼저 정렬하고, 동일商品名일 경우 가격순으로 정렬한다.

3. List를 String으로 변환

List의 모든 요소를 특정 구분자로 연결하여 String으로 변환할 수 있다.

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

public class ListToStringExample {

    public static void main(String[] args) {
        List<String> colors = Arrays.asList("red", "green", "blue");
        
        String result = String.join("-", colors);
        System.out.println("결과: " + result);
        
        // stream API를 활용한 방법
        String streamResult = colors.stream()
                .collect(Collectors.joining(", "));
        System.out.println("Stream 결과: " + streamResult);
    }
}

실행 결과는 red-green-blue와 red, green, blue가 각각 출력된다.

4. String을 List로 변환

문자열을 특정 구분자로 분리하여 List로 변환하는 방법을 알아본다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StringToListExample {

    public static void main(String[] args) {
        String data = "apple,banana,orange,grape";
        
        // 방법 1: split + Arrays.asList
        List<String> fruits = new ArrayList<>(Arrays.asList(data.split(",")));
        
        System.out.println("변환 결과: " + fruits);
        
        // 방법 2: Stream API 활용
        List<String> streamList = Arrays.stream(data.split(","))
                .map(String::trim)
                .toList();
        
        System.out.println("Stream 결과: " + streamList);
    }
}

5. List와 Set 상호 변환

List는 중복을 허용하고 순서가 유지되는 반면, Set은 중복을 허용하지 않는다. 필요에 따라 상호 변환이 가능하다.

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListSetConversion {

    public static void main(String[] args) {
        List<String> sourceList = new ArrayList<>();
        sourceList.add("dog");
        sourceList.add("cat");
        sourceList.add("bird");
        sourceList.add("dog");
        
        System.out.println("원본 List: " + sourceList);
        
        // List → Set 변환 (중복 제거)
        Set<String> targetSet = new HashSet<>(sourceList);
        System.out.println("Set 변환: " + targetSet);
        
        // Set → List 변환
        List<String> convertedList = new ArrayList<>(targetSet);
        System.out.println("List 재변환: " + convertedList);
    }
}

중요한 점은 List에서 Set으로 변환 시 중복 데이터가 제거되고, 순서가 보장되지 않을 수 있다는 것이다.

6. 배열과 List 상호 변환

배열과 List 사이의 변환은 빈번하게 사용되는 操作이다.

6.1 배열을 List로 변환

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayToListExample {

    public static void main(String[] args) {
        String[] names = {"tom", "jerry", "mike"};
        
        // 방법 1: Arrays.asList() - 고정 크기 List 반환
        List<String> fixedList = Arrays.asList(names);
        System.out.println("고정 List: " + fixedList);
        
        // 방법 2: 새로운 ArrayList 생성 (권장)
        List<String> mutableList = new ArrayList<>(Arrays.asList(names));
        mutableList.add("alice");
        System.out.println("가변 List: " + mutableList);
    }
}

Arrays.asList()로 생성된 List는 크기가 고정되어 있어 add(), remove()Operation이 불가능하다. 수정 가능한 List가 필요하면 새로운 ArrayList로 감싸야 한다.

6.2 List를 배열로 변환

import java.util.ArrayList;
import java.util.List;

public class ListToArrayExample {

    public static void main(String[] args) {
        List<String> countries = new ArrayList<>();
        countries.add("korea");
        countries.add("japan");
        countries.add("china");
        
        // 방법 1: toArray() 사용
        String[] array1 = new String[countries.size()];
        countries.toArray(array1);
        
        // 방법 2: toArray(T[] array) 직접 전달
        String[] array2 = countries.toArray(new String[0]);
        
        System.out.println("배열 길이: " + array2.length);
    }
}

7. List 내 요소 포함 여부 확인

특정 값이 List에 포함되어 있는지 확인하려면 contains() 메서드를 사용한다. 특히 List 타입의 경우 Boxing/Unboxing을 고려해야 한다.

import java.util.ArrayList;
import java.util.List;

public class ListContainExample {

    public static void main(String[] args) {
        List<Long> userIds = new ArrayList<>();
        userIds.add(100L);
        userIds.add(200L);
        userIds.add(300L);
        
        // 기본 타입 값 확인
        Long searchId = 200L;
        if (userIds.contains(searchId)) {
            System.out.println("ID " + searchId + " 존재함");
        }
        
        // int를 Long으로 변환하여 확인
        int intValue = 100;
        if (userIds.contains((long) intValue)) {
            System.out.println("int 값 " + intValue + " 존재함");
        }
        
        // Integer 객체를 Long으로 변환
        Integer integerValue = 300;
        if (userIds.contains(integerValue.longValue())) {
            System.out.println("Integer 값 존재함");
        }
    }
}

정리

Java List는 다양한 操作을 지원한다. 정렬은 Collections.sort() 또는 Comparator를 활용하고, 변환은 Arrays.asList(), toArray() 메서드를 사용하며, 포함 여부는 contains() 메서드로 확인한다. 각 操作의 특성을 이해하고 상황에 맞게 활용해야 한다.

태그: java list collections ArrayList 정렬

6월 27일 05:09에 게시됨