ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Java의 컬렉션 프레임워크
    Language/Java 2020. 4. 19. 16:21

     

     

    오늘은 컬렉션 프레임워크에 대해 알아보겠습니다.

    코딩을 하다 보면 코드상에서 데이터를 어딘가에 담아 사용할 일이 아주 많습니다. 자바에서는 이 역할을 Collections와 Map 등의 인터페이스가 하게 됩니다.

    그렇다면 우리가 자주 사용하는 컬렉션 프레임워크의 종류와 역할에 대해 알아보도록 하겠습니다.

     

     

     

     

    1. List

     

    순서가 있는 데이터의 집합, 데이터의 중복을 허용하는 자료구조입니다.

    데이터를 넣으면 순차적으로 데이터가 들어갑니다.

     

    Array / ArrayList / LinkedList의 차이

     

    흔히 알고 있는 Array 배열은 생성 시 그 크기를 정해주고 변경할 수 없다는 치명적인 단점이 있습니다. 뿐만 아니라 중간에 데이터를 끼워 넣을 수 없고(덮어써 짐), 중간의 데이터를 지우는 경우 중간이 비어있는 리스트가 됩니다. 

     

    이러한 단점을 보완한 것이 ArrayList입니다. ArrayList는 배열과 마찬가지로 index를 갖습니다. 그래서 원하는 데이터를 찾기가 용이합니다.

    또한, 크기를 정해주지 않고 그저 입력하는 데이터를 순서대로 넣어줍니다. 중간에(원하는 위치에) 데이터를 끼워 넣을 수 있고, 중간의 데이터를 지우는 경우 그 뒤의 데이터들이 줄줄이 한 칸씩 당겨집니다.

    배열이 가지고 있는 단점을 보완한 자료구조이지만 삽입과 삭제의 과정이 빠르지는 않습니다.(중간에 데이터가 들어가는 경우, 그 뒤의 모든 데이터들을 움직여야 하기 때문)

     

    LinkedList는 index가 없습니다. 각각의 데이터 즉, 노드가 연결된 노드의 정보만을 가지고 있습니다. 따라서 중간에 데이터를 넣거나 제거하는 경우, 해당 노드와 연결된 노드의 정보만 수정해주면 됩니다. 덕분에 LinkedList는 데이터를 조작하는 속도가 빠릅니다. 단, index가 없기 때문에 데이터를 찾는 데는 속도가 빠르지 않습니다.

     

    Vector

    ArrayList와 동일한 구조이나 Vector는 자동 동기화를 보장합니다. 따라서 멀티스레드 환경에서 안정적입니다.

     

    2. Set

     

    순서를 유지하지 않으며, 중복을 허용하지 않는 자료구조입니다. 집합의 개념으로 보시면 됩니다.

    또한, set은 index가 없기 때문에 데이터를 검색하기 위해서는 iterator() 메소드로 Iterator를 생성하고 데이터를 가져와야 합니다.

     

    Iterator란?

    자바 컬렉션 프레임워크에 저장된 데이터를 얻어내기 위해 사용하는 인터페이스입니다.  Collection인터페이스에는 iterator를  반환하는 iterator() 메소드를 정의하고 있으므로, Collection을 구현(implements)한 List, Set 하위 클래스에서는 iterator() 메소드를 통해 데이터를 얻어오는 것이 가능합니다.

     

    public class Collection {
      public static void main(String[] args) {
              List list = new ArrayList();
    
              list.add("A");
              list.add("B");
              list.add("C");
              list.add("D");
              list.add("E");
              list.add("F");
    
              Iterator <String> iterator = list.iterator();
    
              while(iterator.hasNext()) {
                  String str = iterator.next();
                  System.out.println(str);
              }
          }
    }
    
    // 결과
    // A
    // B
    // C
    // D
    // E
    // F
    public class Collection {
    	public static void main(String[] args) {
    		HashSet<Integer> set = new HashSet();
    		
    		for(int i=0; i<100; i++) {
    			set.add(i);
    		}
    		
    		Iterator <Integer> iterator = set.iterator();
    		
    		while(iterator.hasNext()) {
    			int num = iterator.next();
    			System.out.println(num);
    		}
    	}
    }
    
    // 결과
    // 1
    // 2
    // 3
    // 4
    // ...
    // 98
    // 99
    // 순서가 잘 나오네,,,?

    HashSet

    HashSet은 값을 저장할 때 인스턴스의 해시값을 기준으로 저장하기 때문에, 저장한 순서가 유지되지 않습니다. 따라서 순서대로 꺼낼 수 없습니다.

     

    TreeSet

    TreeSet 또한 중복된 데이터를 저장할 수 없고, 입력 순서를 유지하지 않습니다. 단, HashSet과 달리 데이터를 정렬합니다. (기본 오름차순)

     

    3. Map

     

    Map은 key와 value의 쌍으로 이루어진 데이터의 집합입니다. 입력한 순서를 유지하지 않고, key에 대한 중복을 허용하지 않습니다.

    따라서 중복된 key에 대한 데이터를 입력하면 기존의 value값이 새로 입력한 value값으로 업데이트됩니다. 

     

    Map에 저장되어있는 데이터를 가져오는 방법으로는 가져오려는 데이터의 key값을 입력하여 하나씩 가져오는 방법, 또는 keySet(), entrySet() 메소드를 이용해 Set컬렉션에 key 및 value값을 저장하여 iterator를 이용한 반복문을 통해 가져올 수 있습니다.

     

    HashMap

    HashMap은 해싱을 이용해 검색을 하기 때문에 많은 양의 데이터를 검색하는데 유리합니다.

     

    public static void main(String[] args) {
    		HashMap <String, Integer> hmap = new HashMap();
    		hmap.put("이윤호", 90);
    		hmap.put("이민호", 90);
    		hmap.put("김범", 70);
    		hmap.put("황찬성", 80);
    		hmap.put("강유미", 100);
    		
    		if(hmap.containsKey("김범")) {
    			System.out.println(hmap.get("김범"));
    		}
            
            // 출력
            // 70
    		
    		Set<Entry<String, Integer>> set = hmap.entrySet();
    		Iterator<Entry<String, Integer>> iterator = set.iterator();
            
            // Map은 iterator() 메소드가 없으므로 데이터를 Set에 담은 후 iterator()호출
    		
    		while(iterator.hasNext()) {
    			Map.Entry<String, Integer> e = (Map.Entry<String, Integer>)iterator.next();
    			System.out.println("이름 : "+e.getKey()+", 점수 : "+e.getValue());
    		}
            
            // 출력
            // 이름 : 황찬성, 점수 : 80
    	// 이름 : 김범, 점수 : 70
    	// 이름 : 강유미, 점수 : 100
    	// 이름 : 이민호, 점수 : 90
    	// 이름 : 이윤호, 점수 : 90
    	}

    최근 HashMap에 관련된 문제를 풀다가 유용한 메소드를 알게 되어 소개하려고 합니다.

    getOrDefault() 메소드는 해당 키가 존재하면 키의 value를 반환하고, 키가 존재하지 않으면 default값을 반환합니다.

    public class CollectionTest {
    	public static void main(String[] args) {
    		HashMap <String, Integer> hmap = new HashMap();
    		hmap.put("이윤호", 90);
    		hmap.put("이민호", 90);
    		hmap.put("김범", 70);
    		hmap.put("황찬성", 80);
    		hmap.put("강유미", 100);
    		
    		System.out.println("이윤호 : "+ hmap.getOrDefault("이윤호", 0));
    		System.out.println("이윤호 : "+ hmap.getOrDefault("이민호", 0));
    		System.out.println("이윤호 : "+ hmap.getOrDefault("김범", 0));
    		System.out.println("이윤호 : "+ hmap.getOrDefault("황찬성", 0));
    		System.out.println("이윤호 : "+ hmap.getOrDefault("강유미", 0));
    		System.out.println("박해미 : "+ hmap.getOrDefault("박해미", 0));
        }
    }
    
    // 출력
    // 이윤호 : 90
    // 이민호 : 90
    // 김범 : 70
    // 황찬성 : 80
    // 강유미 : 100
    // 박해미 : 0
    

     

     

    HashTable

    HashTable은 HashMap과 동일하게 사용할 수 있습니다. 단, HashTable은 동기화를 보장하므로 멀티 스레드에서 안정성을 보장합니다.

     

     

     

    'Language > Java' 카테고리의 다른 글

    [JAVA] 정렬 메소드 sort() / Comparable / Comparator  (0) 2020.07.04
    [JAVA] Enum이란?  (0) 2020.03.15
    [JAVA] Reflection  (0) 2020.02.01
    [JAVA] Generic Type  (0) 2020.02.01
    [JAVA] Reader/Writer  (0) 2019.12.07
Designed by Tistory.