Dreaming Dean
Hello, I'm Studying
  • Secure
  • Java
  • Oracle
  • +others
Coding.
I AM STUDYING PROGRAMING LANGUAGE. IF YOU WANT TO SEE MY WORK THE PROGRAMMING PROJECT, CHECK IT OUT MY BLOG AND GITHUB.

Collection Framework 컬렉션 프레임워크(2/2)

Dean92
2017. 6. 9. 16:54

Iterator

Iterator는 컬렉션 프레임워크에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준환 한 것이다.

  • Collection 인터페이스에는 iterator라는 이름의 메소드가 다음의 형태로 정의되어 있다.
  • Iterater<E> iterator() { …. }
  • iterator 메소드가 반환하는 참조값의 인스턴스는 Iterator<E> 인터페이스를 구현하고 있다.
  • iterator 메소드가 반환한 참조값의 인스턴스를 이용하면 컬렉션 인스턴스에 저장된 인스턴스의 순차적 접근이 가능하다.
  • iterator 메소드의 반환형이 Iterator<E>이니, 반환된 참조값을 이용해서 Iterator<E>에 선언된 함수들만 호출하면 된다.
  • ▼ Iterator인터페이스에 정의된 메소드들

    메소드 설명
    boolean hasNext() 참조할 다음 번째 요소Element가 존재하면 true를 반환한다.
    E next() 다음 번 요소를 반환한다.
    void remove() 현재 위치의 요소를 삭제한다.


    import java.util.Iterator;
    import java.util.LinkedList;
    
    public class IteratorTest {
    
    	public static void main(String[] args) {
    		LinkedList<String> list = new LinkedList<String>();
    		list.add("First");
    		list.add("Second");
    		list.add("Third");
    		list.add("Fourth");
    		
    		// iterator 메소드가 생성하는 인스턴스를 '반복자'라고 한다.
    		Iterator<String> itr = list.iterator();
    		
    		System.out.println("반복자를 이용한 1차 출력과 \"Third\" 삭제");
    		
    		while(itr.hasNext()) {
    			String curStr = itr.next();
    			System.out.println(curStr);
    			if(curStr.compareTo("Third")==0) {
    				itr.remove();
    			}
    		}
    		
    		System.out.println("\n\"Third\" 삭제 후 반복자를 이용한 2차 출력");
    		itr = list.iterator();
    		while(itr.hasNext()) {
    			System.out.println(itr.next());
    		}
    	}
    }
    


    Iterator의 장점
  • 반복자를 사용하면 컬렉션 클래스의 종류에 상관없이 동일한 형태의 데이터 참조방식을 유지할 수 있다.
  • 따라서 컬렉션 클래스의 교체에 큰 영향이 없다.
  • 컬렉션 클래스 별 데이터 참조방식을 별도로 확인할 필요가 없다.

  • 컬렉션 클래스 기본자료형 저장

    ArrayList arr = new ArrayList();      //error
    LinkedList linl = new LinkedList();   //error
    
    기본 자료형 정보를 이용해서 제네릭 인스턴스는 생성 불가능하다. 그러므로 Wraper 클래스를 기반으로 컬렉션 인스턴스를 생성해야 한다.
    import java.util.Iterator;
    import java.util.LinkedList;
    
    public class IteratorTest {
    
    	public static void main(String[] args) {
    		LinkedList<Integer> list = new LinkedList<Integer>();
    		list.add(10);		// Auto Boxing
    		list.add(20);		// Auto Boxing
    		list.add(30);		// Auto Boxing
    
    		Iterator<Integer> itr = list.iterator();
    
    		while(itr.hasNext()) {
    			int num = itr.next();	// Auto Boxing
    			System.out.println(num);
    		}
    	}
    }
    

    Auto Boxing과 Auto Unboxing의 도움으로 정수 단위의 데이터 입출력이 매우 자연스럽다.


    HashSet

    HashSet은 Set인터페이스를 구현하는 대표적인 컬렉션으로 Set의 특징과 같이 중복된 요소를 저장하지 않는다. HashSet은 ArrayList와 달리 저장순서를 유지 하지 않는다.

  • List<E>를 구현하는 클래스들과 달리 Set<E>를 구현하는 클래스들은 데이터의 저장순서를 유지하지 않는다.
  • List<E>를 구현하는 클래스와 달리 Set<E>를 구현하는 클래스들은 데이터의 중복저장을 허용하지 않는다. 단, 동일 데이터에 대한 기준은 프로그래머가 정의한다.
  • Set<E>를 구현하는 클래스는 “집합”의 성격을 지닌다.
  • import java.util.HashSet;
    import java.util.Iterator;
    
    public class IteratorTest {
    
    	public static void main(String[] args) {
    		HashSet<String> hSet = new HashSet<String>();
    		hSet.add("First");
    		hSet.add("Second");
    		hSet.add("Third");
    		hSet.add("First");
    		
    		System.out.println("저장된 데이터 수 : " + hSet.size());
    		
    		Iterator<String> itr = hSet.iterator();
    		while(itr.hasNext()) {
    			System.out.println(itr.next());
    		}
    	}
    }
    

    동일한 문자열의 인스턴스는 저장되지 않았다.


    TreeSet

    TreeSet은 이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션이다. TreeSet은 Set인터페이스를 구현하여 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장되므로 저장순서를 유지하지 않아도 된다.

  • TreeSet<E> 클래스는 트리라는 자료구조를 기반으로 데이터를 저장한다.
  • 데이터를 정렬된 순서로 저장하며 HashSet<E>와 마찬가지로 데이터의 중복을 허용하지 않는다.
  • 정렬의 기준은 프로그래머가 직접 정의한다.
  • import java.util.Iterator;
    import java.util.TreeSet;
    
    public class IteratorTest {
    
    	public static void main(String[] args) {
    		TreeSet<integer> sTree = new TreeSet<integer>();
    		sTree.add(1);
    		sTree.add(2);
    		sTree.add(4);
    		sTree.add(3);
    		sTree.add(2);
    		
    		System.out.println("저장된 데이터 수 : " + sTree.size());
    		
    		Iterator<integer> itr = sTree.iterator();
    		while(itr.hasNext()) {
    			System.out.println(itr.next());
    		}
    	}
    }
    

    데이터는 정렬되어 저장이 되며, iterator메소드의 호출로 생성된 반복자는 오름차순의 데이터 참조를 진행한다.


    HashMap

    HashMap은 Map을 구현하여 키Key와 값Value을 묶어서 하나의 데이터로 저장한다. HashMap은 해싱Hashing을 사용하여 많은 양의 데이터를 검색하는데 높은 성능을 보여준다.

  • Map 인터페이스를 구현하는 컬렉션 클래스는 key-value 방식의 데이터 저장을 한다.
  • Value는 저장할 데이터를 의미하고, Key는 value를 찾는 열쇠를 의미한다.
  • Map 를 구현하는 대표적인 클래스로는 HashMap과 TreeMap 이 있다.
  • TreeMap 은 정렬된 형태로 데이터가 저장된다.
  • import java.util.HashMap;
    
    public class IteratorTest {
    
    	public static void main(String[] args) {
    		HashMap<Integer, String> hMap = new HashMap<Integer, String>();
    		
    		hMap.put(new Integer(3), "정동현");
    		hMap.put(5, "안상현");
    		hMap.put(8, "양동구");
    		
    		System.out.println("6학년 3반 8번 학생 : " + hMap.get(new Integer(8)));
    		System.out.println("6학년 3반 5번 학생 : " + hMap.get(5));
    		System.out.println("6학년 3반 3번 학생 : " + hMap.get(3));
    		
    		hMap.remove(5);		// 5번 데이터 제거
    		System.out.println("6학년 3반 5번 학생 : " + hMap.get(5));
    	}
    
    }
    

    Comments