java, list 및 array의 초기화 및 사용하기

배열과 리스트를 다루는 다양한 방법

  • 자바에는 배열(array)과 리스트(list, collection)이 있다.
  • 배열은 단순하고 본연의 기능에 충실하다. 하지만 인자의 갯수가 고정이고 기능이 단순한다. 리스트는 배열에 대비하여 인자의 갯수를 동적으로 할당할 수 있고 다양한 기능을 제공하고 stream api를 사용할 수 있다는 장점이 있다.
  • 이번 블로그는 배열 및 리스트의 기본적인 초기화 방법이나 사용 방법, 컬렉션의 주요 기능을 간단하게 정리하고자 한다.

배열의 초기화 및 사용

  • 배열은 객체이므로 new int[3];의 형태로 사용한다.
  • ints3, ints4 처럼 초기화 역시 가능하다.
  • java.util.Arrays는 배열 사용시 매우 좋은 정적 메서드를 제공한다. 자주 사용하는 매서드는 아래와 같다.
    • toString : 리스트는 toString()가 오버라이딩된 것과 달리 배열은 해쉬값을 리턴한다. toString을 보기 좋게 만들어 준다.
    • fill : 배열을 특정 값으로 채운다.
int[] ints1 = new int[3];
ints1[0] = 0; // 참고로 기본 타입의 숫자의 초기값은 0이다.
ints1[1] = 1;
ints1[2] = 2;

int[] ints2 = new int[3];
Arrays.fill(ints2, 3);

System.out.println(Arrays.toString(ints2));

int[] ints3 = {1, 2, 3};
int[][] ints4 = {
                    {1,2,3}
                    ,{1,2,3}
                };

리스트의 초기화

기본적인 방법

  • 배열은 기본타입으로 사용 가능하다. 하지만 리스트는 객체만 가능하며 래퍼타입으로 선언해야 한다.
ArrayList<Integer> ints1 = new ArrayList<>();
ints1.add(1);
ints1.add(2);

ArrayList<Integer> ints2 = new ArrayList<>(ints1);
System.out.println(ints1 == ints2); // false

배열을 리스트로 변환하기 : 배열의 성질을 가진 리스트

  • Arrays.asList
  • 리스트는 초기화를 위한 팩터리 메서드를 제공한다. 특히 배열 및 가변인자(varargs)를 리스트로 변환하기 위한 다양한 기능이 제공된다.
List<Integer> asList1 = Arrays.asList(1, 2);
List<Integer> asList2 = Arrays.asList(new Integer[2]);
  • asList는 일종의 브릿지로서 배열에 의존적인 리스트(컬렉션)을 제공한다. 타입은 리스트이나 내부에서 사용하는 실제 객체는 배열로 보인다.
  • 리스트의 크기는 고정되어 있다. (Returns a fixed-size list backed by the specified array.) 그러므로 add 메서드를 사용할 수 없다.
  • 리스트의 내부를 수정할 수 있다. (The list returned by this method is modifiable) set 메서드를 사용한다.
List<Integer> asList = Arrays.asList(1,2);

asList.add(3); // 예외 발생 UnsupportedOperationException.class;

asList.set(1, 3);
asList.get(1); // 3
  • List.of
  • Arrays.asList와 사용 및 동작이 거의 유사하다. 하지만 중요한 차이점이 있는데 List.of는 객체의 불변을 보장한다. List.of의 리턴타입은 ImmutableCollections.List이다.
List<Integer> listOf = List.of(1, 2);
listOf.set(1, 3); // UnsupportedOperationException.class
asList.add(3); // UnsupportedOperationException.class

리스트(컬렉션)의 성격 정하기 : synchronized, immutable

  • 컬렉션은 List, Set, Map 등을 아우르는 데이터 타입이다.
  • 컬렉션은 개발자에게 편리한 기능을 제공한다. 병렬처리에 유리하도록 동기처리를 해주거나, 객체의 내부 메모리가 변경되지 않도록 불변 처리 가능하다. 이러한 기능은 Collections 클래스의 정적 메서드를 활용한다.
List<Integer> unmodifiableList = Collections.unmodifiableList(new ArrayList<>());
List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>());
  • Collections.unmodifiableList로 감싼 객체는 변경 불가능하다 원본이 된 객체는 변경 된다!
  • 데이터가 예상치 못한 변경이 발생할 수 있으므로 반드시 위와 같이 사용한다!
ArrayList<Integer> originList = new ArrayList<>();
originList.add(1);

List<Integer> unmodifiableList = Collections.unmodifiableList(originList);

// unmodifiableList은 변경 불가능하다!
unmodifiableList.add(2); // UnsupportedOperationException.class!!

// 다만, 원본 객체는 변경 가능하다!
originList.add(2);

// 원본 객체의 변경에 수정불가객체가 영향을 받는다!
unmodifiableList.size(); // 사이즈가 1에서 2로 변경된다.
unmodifiableList.get(1); // 값 2가 추가되었다!
  • 위의 기능 이외에 Collections는 sort, fill, max, min 등 다양한 기능을 제공한다.