ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 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

    댓글