-
자바 100제 Part.4 / 14 ~ 19개발자 수업/인터넷 강의 2021. 9. 27. 20:08
1. 컬렉션 프레임워크의 ArrayList 기반으로 2차원 배열을 만들어 요소를 추가하고 출력
import java.util.ArrayList; public class Java100_collection_FrameworkArrayListTwoArr{ public static void main(String[] args){ // 객체 생성 ArrayList<Integer[]> arr = new Array List<Integer[]>(); // 요소 추가 -> add() arr.add(new Integer[]{11, 12, 13, 14}); arr.add(new Integer[]{21, 22, 23, 24}); arr.add(new Integer[]{31, 32, 33, 34}); // 요소 출력 for(int i=0; i<arr.size(); i++){ System.out.println(arr.get(i)[0]); // 11, 21, 31 } // 전체 요소 출력 -> 이중 반복문 -> 안쪽 배열의 사이즈를 미리 체크 -> System.out.println(arr.get(0).size()); // Err -> 컬렉션 프레임워크 타입의 길이를 알고싶을 때 사용 System.out.println(arr.get(0).length()); // Err -> 문자열의 길이를 알고싶을 때 사용 System.out.println(arr.get(0).length); // 4 -> 배열의 길이를 알고싶을 때 사용 // 전체 요소 출력 for(int i=0; i<arr.size(); i++){ for(int j=0; j<arr.get(i).length; j++){ System.out.println(arr.get(i)[j]); } System.out.pritnln(); } } }
2. Iterator 개념과 이를 이용하여 ArrayList 요소를 순회 및 삭제하는 코드 구현
[1] Iterator(반복자)란 무엇인가?
사전적 의미 -> '반복자'라는 의미에서 어느정도 유추할 수 있듯이 Collection에 대한 '반복자'
컬렉션 프레임워크 내에는 다양한 컬렉션들이 있는데 요소(=원소)를 읽어올 때 Iterator 인터페이스로 표준화 함
보통 for 반복문을 사용하여 순회할 때 -> index로 각 요소를 순회하나 -> Iterator(반복자)를 이용하면 조금 더 편리하게 할 수 있음
Iterator(반복자)는 인터페이스다 -> 인터페이스 내 선언된 메서드들이 있다 -> 주요 메서드는 hasNext(), next(), remove() -> 각각의 반환 타입은 boolean, Object(제네릭), void
hasNext() -> 다음 요소가 있는지를 검사하여 true를 리턴
next() -> 다음 요소를 리턴 후 다음 위치로 커서가 이동 -> Iterator에서는 삭제하지 않고 커서만 이동
remove() -> 제거
next() 메서드의 경우 배열에 값이 없을 때 사용하면 당연히 오류 발생(주의)
따라서, 사전에 hasNext() 메서드를 사용하여 다음 요소가 있는지 확인 후 next() 메서드로 안전하게 요소를 가져오기
임포트 필요 -> import java.util.Iterator;
import java.util.ArrayList; import java.util.Iterator; public class Java100_collection_FrameworkArrayListWithIterator2{ public static void main(String[] args){ // 객체 생성 ArrayList<String> list = new ArrayList<String>(); // 지금은 String 생략 가능하게 업글됨 // 요소 추가 -> add() list.add("Alligator"); list.add("Hippo"); list.add("Ostrich"); list.add("Donkey"); // Iterator(반복자) 객체 생성 -> 이 과정도 중요 // Collection 인터페이스 -> iterator() 메서드를 정의하고 있고 -> 이를 상속받는게 List, Set 인터페이스 // List, Set 인터페이스를 상속받아 구현한 클래스들 객체를 통해서 iterator() 메서드를 사용 가능 Iterator<String> iter = list.iterator(); // Iterator(반복자) 메서드 사용 -> hasNext(), next(), remove() System.out.println(iter.hasNext()); // true -> 첫 번째 요소인 악어가 있으니까 System.out.println(iter.next()); // Alligator System.out.println(iter.hasNext()); // true -> 두 번째 요소인 하마가 있으니까 System.out.println(iter.next()); // Hippo System.out.println(iter.hasNext()); // true -> 세 번째 요소인 타조가 있으니까 System.out.println(iter.next()); // Ostrich System.out.println(iter.hasNext()); // true -> 첫 번째 요소인 당나귀가 있으니까 System.out.println(iter.next()); // Donkey System.out.println(iter.hasNext()); // false // 요소 출력 -> 향상된 for문 for(String s : list) System.out.println(s); // 요소 출력 -> while 반복문 사용 // 배열 요소 전체를 출력 // Hippo 요소만 출력 및 삭제 while(iter.hasNext()){ String str = iter.next() if("Hippo".equals(str)){ iter.remove(); System.out.println("하마 삭제"); } // System.out.println(iter.next()); } for(String s:list) System.out.println(s); } }
3. Iterator(반복자)를 쓰는 이유에 대해 설명
컬렉션 프레임워크를 쓸 때 한 번 이상은 꼭 만나게 되는 에러 메세지 : java. util.ConcurrentModificationException
이 오류 메세지는 보통 컬렉션 list 요소를 반복문 안에서 돌리면서 값을 삭제하고자 할 때 발생
보통 반복문 안에서 remove() 메서드를 호출할 때 발생
그 외에도, Iterator(반복자) 객체의 생성 순서에 따라서도 발생
한 행씩 삭제하는 경우에는 별 문제가 없으나, 반복문 안에서 순회하면서 삭제시에는 반복문 들어가기 전의 기존 list 배열의 size(length)나 index 정보 등이 변경되면서 -> 순회 시 정보가 맞지 않아 오류가 발생
이를 해결하기 위해서는 Iterator(반복자)를 사용하여 순회하고 -> 그 때 iter.remove() 메서드로 처리
import java.util.ArrayList; import java.util.Iterator; public class Java100_collection_FrameworkArrayListWithIteratorWhyUse{ public static void main(String[] args){ // 객체 생성 ArrayList<Integer>list = new ArrayList<>(); // 요소 추가 list.add(1); list.add(2); list.add(3); list.add(4); // Iterator(반복자) 객체 생성 Iterator<Integer> iter = list.iterator(); // 출력 -> 요소 삭제 전 for(Integer num:list) System.out.print(num + " "); System.out.println(); // 요소 삭제 -> 반복문 없이 한 개의 요소만 삭제 // System.out.println(list.get(1)); // 2 // list.remove(1); // 2 삭제 // System.out.println(list.get(1)); // 3 // 요소 삭제 -> while 반복문 사용 while(iter.hasNext()){ Integer i = iter.next(); if(i==2){ iter.remove(i); System.out.println(i +"번 삭제"); } } // 출력 -> 요소 삭제 후 for(Integer num:list) System.out.print(num+" "); System.out.println(); } }
4. 1부터 10 사이의 숫자가 무작위로 10개 출력되는 코드를 작성
public class Java100_package_MathRandom{ public static void main(String[] args){ // 반복문 -> 랜덤 숫자 생성, 0을 제외하려면?? for(int i=0; i<10; i++){ System.out.println(((int)(Math.random() * 10) + 1) + " "); } } }
'개발자 수업 > 인터넷 강의' 카테고리의 다른 글
자바 100제 Part.4 / 8 ~ 13 (0) 2021.09.27 자바 100제 Part.4 / 1 ~ 7 (0) 2021.09.23 자바 100제 Part.3 / 24 ~ 28 (0) 2021.09.22 자바 100제 Part.3 / 14 ~ 23 (0) 2021.09.18 자바 100제 Part.3 / 5 ~ 13 (0) 2021.09.17