본문 바로가기

프로그래밍/Java

Java_컬렉션 프레임웍(3)_Iterator, ListIterator, Enumeration, Map과 Iterator, Arrays의 메서드

반응형

③ Iterator, ListIterator, Enumeration

: 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. 

  • Iterator : 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
  • ListIterator : Iterator에 양방향 조회기능추가 (List를 구현한 경우만 사용 가능)
  • Enumeration : Iteraotr의 구버전

 

- Iterator의 정의

public interface Collection {
    ...
    public Iterator iterator();
    ...
}


public interface Iterator {
    boolean hasNext();	// 1. 읽어올 요소가 남아있는지 확인 
    Object next();		// 2. 다음 요소를 읽기
    void remove();
}

→ Collection인터페이스에는 'Iterator를 구현한 클래스의 인스턴스'를 반환하는 iterator()를 정의하고 있다.

 

- Iterator 예제

import java.util.*;

class JavaJungsuk_CollectionFramework_Iterator {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();	//다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        
        Iterator it=list.iterator();
        
        while(it.hasNext()) {		//boolean hasNext()로 읽어올 요소가 있는지 확인.
            Object obj=it.next();	//Object next()로 다음 요소를 읽어옴
            System.out.println(obj);
        }
    }
}

결과
1
2
3
4
5

→ 컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음 반복문, 주로 while문을 사용해서 컬렉션 클래스의 요소들을 읽어올 수 있다.

 

 

import java.util.*;

class JavaJungsuk_CollectionFramework_Iterator {
    public static void main(String[] args) {
        ArrayList list=new ArrayList();	//다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        
        Iterator it=list.iterator();
        
        while(it.hasNext()) {		//boolean hasNext()로 읽어올 요소가 있는지 확인.
            Object obj=it.next();	//Object next()로 다음 요소를 읽어옴
            System.out.println(obj);
        }
        
        it=list.iterator();	//iterator는 일회용이라 다 쓰고나면 다시 얻어와야 함.
        
        while(it.hasNext()) {
            Object obj=it.next();
            System.out.println(obj);
        }
    }
}

결과
1
2
3
4
5
1
2
3
4
5

→ iterator는 1회용이라 다 쓰고나면 다시 얻어와야 한다.

 

 

④ Map과 Iterator

: Map에는 iterator()가 없기 때문에 keySet(), entrySet(), values()를 사용하여 호출해야 한다.

Map map=new HashMap();
    ...
Iterator it=map.entrySet().iterator();
//Iterator it=map.keySet().iterator();
//Iterator it=map.values().iterator();

 

 

⑤ Arrays의 메서드

: Arrays에 정의된 메서드는 모두 static메서드이다.

 

- Arrays의 메서드(1)_복사

<배열의 출력 - toString()>

static String toString(boolean[] a)
static String toString(byte[] a)
static String toString(char[] a)
static String toString(short[] a)
static String toString(int[] a)
static String toString(long[] a)
static String toString(float[] a)
static String toString(double[] a)
static String toString(Object[] a)

→ Arrays에 정의된 toString()은 배열을 출력한다.

 

<배열의 복사 - copyOf(), copyOfRange()>

int[] arr={0,1,2,3,4};
int[] arr2=Arrays.copyOf(arr, arr.length);	//arr2=[0,1,2,3,4]
int[] arr3=Arrays.copyOf(arr, 3);	//arr3=[0,1,2]
int[] arr4=Arrays.copyOf(arr, 7);	//arr4=[0,1,2,3,4,0,0]
int[] arr5=Arrays.copyOfRange(arr, 2, 4);	//arr5=[2,3] 
int[] arr6=Arrays.copyOfRange(arr, 0, 7);	//arr6=[0,1,2,3,4,0,0]

→ copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해 새로운 배열을 만들어 반환한다. 늘 그렇듯이 지정된 범위의 끝은 포함되지 않는다.

 

 

- Arrays의 메서드(2)_채우기, 정렬, 검색

<배열 채우기 - fill(), setAll()>

int[] arr=new int[5];
Arrays.fill(arr, 9);	//arr=[9,9,9,9,9]
Arrays.setAll(arr, (i)->(int)(Math.random()*5)+1);	//arr=[1,5,1,2,1] 람다식

→ fill()은 배열의 모든 요소를 지정된 값으로 채운다.

setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다. 

 

<배열의 정렬과 검색 - sort(), binarySearch()>

int[] arr={3,2,0,1,4};
int idx=Arrays.binarySearch(arr, 2);	//idx=-5 잘못된 결과

Arrays.sort(arr);
System.out.println(Arrays.toString(arr));	//[0,1,2,3,4]
int idx=Arrays.binarySearch(arr, 2);	//idx=2 올바른 결과

→ sort()는 배열을 정렬할 때, binarySearch()는 배열에 저장된 요소를 검색할 때 사용한다.

binarySearch()는 배열에서 지정된 값이 지정된 위치(index)를 찾아서 반환하는데 반드시 정렬된 상태여야 한다. 

 

 

- Arrays의 메서드(3)_비교와 출력

<문자열의 비교와 출력 - equals(), toString()>

int[] arr={0,1,2,3,4};
int[][] arr2D={{11,12}, {21, 22}};

System.out.println(Arrays.toString(arr));	//[0,1,2,3,4]
System.out.pritnln(Arrays.deepToString(arr2D));	//[[11, 12], [21, 22]]

→ toString()으로 배열의 모든 요소를 문자열로 출력할 수 있다.

다차원 배열에는 deepToString()을 사용해야 한다.

 

String[][] str2D=new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2=new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};

System.out.println(Arrays.equals(str2D, str2D2));	//false
System.out.println(Arrays.deepEquals(str2D, str2D2));	//true

→ equals()는 일차원 배열에만 사용 가능하고 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다.

다차원 배열 비교에는 deepEquals()를 사용해야한다. 

 

 

- Arrays의 메서드(4)_변환

<배열을 List로 변환 - asList(Object...a)>

List list=Arrays.asList(new Integer[]{1,2,3,4,5});	//list=[1,2,3,4,5]
List list=Arrays.asList(1,2,3,4,5);	//list=[1,2,3,4,5]
list.add(6);	//UnsupportedOperationException 예외 발생

→ asList()는 배열을 List에 담아서 반환한다. 

→ 주의할 점은 asList()가 반환한 List의 크기를 변경할 수 없기 때문에 추가 또는 삭제가 불가능하다. 저장된 내용은 변경 가능하다. 

 

List list=new ArrayList(Arrays.asList(1,2,3,4,5));

→ 크기를 변경할 수 있는 List가 필요하다면 위와 같이 하면 된다. 

 

반응형