본문 바로가기
Today I learned

컬렉션 프레임워크 그리고 Iterator, Enumeration

by soheemon 2019. 4. 5.

http://tcpschool.com/java/java_collectionFramework_iterator

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

위 페이지를 참고하여 작성하였습니다-

 

자바에서 컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.

(쉽게말해 데이터를 저장하는 자료구조와, 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은것!)

이러한 컬렉션 프레임워크는 자바의 인터페이스를 사용하여 구현된다.

 

컬렉션 프레임워크 주요 인터페이스

컬렉션 프레임워크에서는 데이터를 저장하는 자료구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의하고 있다.

1. List 인터페이스 => List<E> 순서가 있는 데이터의 집합으로 데이터의 중복을 허용함.

 - 구현클래스: Vector, ArrayList, LinkedList, Stack, Queue

2. Set 인터페이스 => Set<E>

 - 구현클래스: HashSet, TreeSet

3. Map 인터페이스 => Map<K, V>

 - HashMap, TreeMap, Hashtable, Properties

주요 인터페이스 간의 상속관계

http://tcpschool.com/java/java_collectionFramework_concept

위 그림에서 <E>나, <K, V>라는것은 컬렉션 프레임워크를 구성하는 모든 클래스가 제네릭으로 표현되어 있음을 알려준다.

 

제네릭이란?

자바에서 제네릭이란 데이터 타입을 일반화한다는것을 의미한다.

제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법입니다.

=> 예를들어, List에 String타입의 객체만 담을수 없고 Integer는 담을 수 없게끔.. 타입을 미리 지정해 두는것.

 

컬렉션 클래스

컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스를 컬렉션 클래스 라고 한다.

컬렉션 프레임워크의 모든 컬렉션 클래스는 List와 Set, Map인터페이스중 하나의 인터페이스를 구현하고 있습니다.

 

컬렉션 인터페이스

List와 Set인터페이스의 많은 공통된 부분을 Collection인터페이스에서 정의하고, 두 인터페이스는 그것을 상속받습니다.

Collection인터페이스에서 제공하는 주요 메서드는 다음과 같다.

메소드설명

boolean add(E e) 해당 컬렉션(collection)에 전달된 요소를 추가함. (선택적 기능)
void clear() 해당 컬렉션의 모든 요소를 제거함. (선택적 기능)
boolean contains(Object o) 해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인함.
boolean equals(Object o) 해당 컬렉션과 전달된 객체가 같은지를 확인함.
boolean isEmpty() 해당 컬렉션이 비어있는지를 확인함.
Iterator<E> iterator() 해당 컬렉션의 반복자(iterator)를 반환함.
boolean remove(Object o) 해당 컬렉션에서 전달된 객체를 제거함. (선택적 기능)
int size() 해당 컬렉션의 요소의 총 개수를 반환함.
Object[] toArray() 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환함.

 

자바의 컬렉션 프레임워크는 컬렉션에 저장된 요소를 읽어오는 방법을 Iterator 인터페이스로 표준화 하고 있다.

Collection 인터페이스에서는

Iterator 인터페이스를 구현한 클래스의

인스턴스를 반환하는 iterator()메서드를 정의하여 각 요소에 접근하도록 하고 있다.

 

//연결리스트를 반복자(iterator)를 사용하여 순회하는 예제

LinkedList는 컬렉션프레임워크 List인터페이스를 구현하는 클래스이고, (Iterator또한 구현하고있다?) 아무튼.. Iterator메서드는 해당 컬렉션객체를 Iterator타입으로 반환하여.. List던.. Map이던.. Set이던.. 요소들을 하나하나 가져올수 있는듯하다.

 

LinkedList<Integer> lnkList = new LinkedList<Integer>();

lnkList.add(4);
lnkList.add(2);
lnkList.add(3);
lnkList.add(1);

 
Iterator<Integer> iter = lnkList.iterator();

while (iter.hasNext()) {
    System.out.print(iter.next() + " ");
}

Iterator 인터페이스는 다음과 같은 메서드를 사용하여 컬렉션의 각 요소에 접근할 수 있다.

메소드설명

boolean hasNext() 해당 이터레이션(iteration)이 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next() 이터레이션(iteration)의 다음 요소를 반환함.
default void remove() 해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거함. (선택적 기능)

Enumeration<E> 인터페이스

예제에서 종종 Enumeration인터페이스가 들어가는 코드가 있다.

Iterator랑 비슷한동작을 하는것같아서 뭐지했는데..

Iterator의 구버전인것 같음.. 현재에는 기존코드와의 호환성을 위해서만 남아있다고 한다.

Enumeration인터페이스보다 Iterator 인터페이스를 사용하는것이 좋다고 한다-

 

ListIterator<E>인터페이스

Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스이다.

컬렉션의 요소에 접근할때 한방향으로만 이동 할 수 있었던 Iterator의 단점을 보완한 인터페이스라고 할수 있다-

<! ListIterator 인터페이스는 List컬렉션 클래스의 listIterator()메서드를 통해서만 사용 할 수 있다>

댓글