Language/JAVA

#List와 배열 : 자료형 변환(캐스팅) + 컬렉션 순회하면서 특정 원소 삭제

paran21 2022. 1. 18. 10:02

자바에서 자료형 변환을 캐스팅이라고 한다.

기본형 또는 부모와 자식간의 관계인 경우 캐스팅을 활용할 수 있다.

그 외에는 String.valueOf와 같은 각 클래스의 메소드를 사용해야 한다.

 

 

List에서 배열로 전환

List에 담겨있는 제네릭과 변환되는 배열의 클래스가 같아야 한다.

List<String> array = new ArrayList<>();

 

1) for문을 사용

String[] arr = new String[array.size()];

int size = 0;

for(String item : array) {

  arr[size++] = item;

}

 

List<Integer> list = new ArrayList<>();

int[] num = new int[list.size()];

for (int i = 0; i < list.size(); i++) {

  num[i] = list.get(i);

}

 

 

2) List의 메소드 활용

String[] arr = array.toArray(new String[array.size()]);

 

3) Stream 활용

String[] arr = array.stream().toArray(String[]::new);

String[] arr = Stream.of(array).toArray(new String[0]);

 

배열에서 List로 변환

String[] arr = new String[] {"a", "b", "c"};

 

1) for문을 사용

List<String> array = new ArrayList<>();

for (String item : arr) {

   array.add(item);

}

 

2) Arrays의 메소드 사용

  • List<String> array = Arrays.asList(arr);
    • 이 경우에는 고정된 사이즈의 리스트를 리턴하여 add, remove와 같은 메소드를 사용할 수 없다.
  • List<String> array = new ArrayList<>(Arrays.asList(arr));
    • 이렇게 remove 메소드가 구현된 java.util.ArrayList로 감싸면 가능하다.
    • Arrays.asList가 속한 java.util.arrays.ArrayList에는 remove가 구현되어 있지 않다.
    • 그러나 이경우, 리스트를 순회하면서 특정 원소 삭제는 불가능하다
      • ConcurrentModificationException 발생
      • for문으로 인덱스를 이용해도, 삭제 시마다 리스트가 짧아져서 건너띄고 다음 인덱스를 체크.
  • 컬렉션을 순회하면서 원소를 삭제하는 경우
    • Iterator 인터페이스의 remove를 사용
    • 자바8에서는 Collection 인터페이스에 removeIf 메소드 이용
    • Stream의 filer 사용 (여기에 collect까지 쓰면 필터가 적용된 리스트를 얻을 수 있다)

3) Stream 활용

  • List<String> array = Stream.of(arr).collect(Collectors.toList());

 

 

 

참고자료

http://devhyun.com/blog/post/13

http://www.daleseo.com/how-to-remove-from-list-in-java/