[JAVA] List.of vs Arrays.asList 불변 리스트 생성 방법

    반응형

    #List

    Java Language 에서 기본적으로 리스트 객체를 생성하면 가변으로 생성된다. 

    이는 리스트의 정의를 생각하면 당연한 현상이다.

    About List DataStructure : 내부 요소들의 순서를 유지하며, 중복된 요소를 허용한다. 배열과 달리 "동적으로 요소를 추가 혹은 제거가 가능하다." 

    _리스트 관련 포스팅

    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    public class test {
        public static void main(String[] args) {
    
            List<Integer> arrayList = new ArrayList<>();
            List<Integer> linkedList = new LinkedList<>();
    
            arrayList.add(1);
            arrayList.add(2);
            linkedList.add(3);
            linkedList.add(4);
    
            System.out.println("arrayList 출력");
            for (Integer integer : arrayList) {
                System.out.print(integer + " ");
            }
            System.out.println();
    
            System.out.println("linkedList 출력");
            for (Integer integer : linkedList) {
                System.out.print(integer + " ");
            }
        }
    }

     

    #불변리스트

    자바는 한 번 생성한 이후 리스트 내부의 값을 변경할 수 없는 "불변 리스트"를 생성하는 메서드를 제공한다. 

    리스트를 불변 리스트로 생성하면, 가변 리스트로 생성하는 기존 방식 보다 간편하게 리스트를 생성할 수 있으며 데이터의 변경을 막아 메모리 효율 및 성능 최적화에 도움을 줄 수 있다. 

     

    #List.of

    가장 기본적인 방법은 List 인터페이스에서 제공하는 List.of 유틸리티 메서드를 사용해 불변 리스트를 생성하는 것이다.

    불변 리스트 내부의 값 변경을 시도하면 에러를 발생한다. 

    import java.util.List;
    
    public class test {
        public static void main(String[] args) {
    
            List<Integer> immutableList = List.of(1, 2, 3, 4, 5);
            // immutableList.add(10000);
            System.out.println(immutableList);
    
        }
    }
    [1, 2, 3, 4, 5]

    #Arrays.asLsit

    Arrays.asList 유틸리티 메서드로 불변 리스트르 생성하는 방법도 있다. 이렇게 불변 리스트를 생성하면 List.of 메서드를 통해 생성된 불변 리스트와 달리, 값의 추가는 불가능하지만 기존 원소에 접근하여 값을 변경하는 것은 허용된다.

    이는 배열을 생성할 때 기존 배열 내부의 참조값을 그대로 가져다 쓰기에 발생하는 현상이다.

    기존 배열을 그대로 사용한다는 특성으로 인하여 List.of 메서드를 사용해 불변 리스트를 생성하는 것 보다 "약간의 성능상 이점"을 가진다.

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.List;
    
    public class test {
        public static void main(String[] args) {
    
            List<Integer> immutableList = Arrays.asList(1, 2, 3, 4, 5);
            // 값 변경
            immutableList.set(0, 10000);
            // 값 추가 -> 에러발생
            // immutableList.add(10000);
            System.out.println(immutableList);
        }
    }
    [10000, 2, 3, 4, 5]

    #List.of vs Arrays.asList

    Method 요소 추가&삭제 요소 변경 버전호환
    List.of x o JAVA5~
    Arrays.asList x x JAVA1.2~

     

    결론 : 불변 리스트를 생성해야 하는 상황이 발생하면 List.of 메서드를 사용하자.  Arrays.asList 메서드는 하위 호환성을 고려한 레거시 코드를 작성해야 하는 상황이 아니라면 굳이 값의 변경을 허용하는 불완전한 불변 리스트를 사용해 얻는 이점은 미미하다.

    반응형

    댓글

    Designed by JB FACTORY