본문 바로가기
개발자의 공부방/자바 기초

자바 기초] 컬렉션

by 쌈빡한 쥬니준 2019. 5. 15.

컬렉션이란?

컨테이너라고도 하며, 여러 원소를 하나의 그룹으로 묶어 관리 해주는 객체.

 

Java Collection Framework (JCF)

컬렉션을 표현하고 다루기 위한 통합된 프레임워크

다양한 방식으로 저장, 검색, 수정, 관리하는 도구를 제공

컬렉션을 일관된 방법으로 다룰 수 있음.

- 인터페이스 : 컬렉션의 기능을 표현.

- 어떻게 표현되는가와 상관없이 일관성 있게 다룬다. (추상 자료형)

- 클래스 : 인터페이스를 구현한 클래스를 제공 (자료 구조)

 


JCF의 구조

JCF의 인터페이스

Set : 순서는 의미가 없으며 중복을 허용하지 않는 자료구조

List와 Queue : 중복을 허용하고 순서에 의미가 있으며 Queue는 FIFO 방식

Map : 원소가 <key, value>의 형태이며 키는 유일해야 함.

 

Collection

|

→ Set → Sorted Set

→ List

→ Queue

 

Map

|

→ Sorted Map

 

JCF의 클래스

Set, List, Queue 에서 공통으로 지원해야 하는 기능을 정의

  Set List Queue Map
해싱 HashSet     HashMap
배열   ArrayList    
트리 TreeSet     TreeMap
연결리스트   LinkedList LinkedIst  
해싱+연결리스트 LinkedHashSet     LinkedHashMap

주요 인터페이스의 간략한 특징

 

인터페이스 설명 구현클래스
List<E> 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용함. Vector, ArrayList, LinkedList, Stack, Queue
Set<E> 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않음. HashSet, TreeSet
Map<K.V>

키와 값의 한 쌍으로 이루어지는 데이터의 집합으로, 순서가 없음.
이때 키는 중복을 허용하지 않지만, 값은 중복될 수 있음.

HashMap, TreeMap, Hashtable, Properties

 

Collection 인터페이스

List와 Set인터페이스의 많은 공통된 부분을 Collection 인터페이스에서 정의하고, 두 인터페이스는 그것을 상속받는다. 따라서 Collection 인터페이스는 컬렉션을 다루는데 가장 기본적인 동작을 정의하고, 그것을 메소드로 제공하고 있다.

Set, List, Queue 에서 공통으로 지원하는 기능.

메소드설명

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

 

HashSet<> 클래스

 

예제

package com.java.Education;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

public class Generics_TEST {
	public static void main(String[] args) {
		
		Set<String> set = new HashSet<String>();
		
		set.add("one"); set.add("two");
		set.add("three"); set.add("four");
		
		System.out.println(set.add(new String("one")));
		System.out.println(set.add(new String("five")));
		/*
		 * add는 해당 컬렉션에 전달된 요소를 추가하는 것.
		 * 11번째 라인에서 set.add("one") 이 있고,
		 * 14번째 라인에서 중복되기 때문에 결과값이 false로 반환된다.
		 * Set 인터페이스는 순서가 없는 집함이자, 데이터의 중복을 허용하지 않는다.
		 */
		
		System.out.println(set.size());
		/* 
		 * size 라는 것은 해당 컬력센의 요소의 총개수를 반환한다. 
		 * 위의 set.add를 총 4개를 썼기에 set.size() 를 하면 결과값은 4가 나온다.
		 * 만약 위에 처럼 set.add(new String("five"))를 했다면 5라고 출력된다.
		 * 
		 * */
		
		for (int i = 0; i < set.size(); i++) {
			System.out.println(set.toString());			
		}
		
		
		System.out.println(set.contains(new String("five")));
		/*
		 * 현재 five라는 요소의 객체가 없기 때문에 false
		 * 위의 System.out.println(set.add(new String("five"))); 활성화 되어 있다면 true
		 * */
		
		
		
		set.remove("four"); //remove는 지우는 것.
		System.out.println(set.size());
	}
}

 

 

ArrayList 클래스

List 인터페이스를 구현한 클래스.

- 크기 조절이 가능한 배열로 구현

같은 자료가 중복될 수 있으며 입력된 순서대로 관리됨.

- 특정 위치의 자료를 참조할 수 있음

List 인터페이스를 살펴봐야함.

순서가 있고 중복을 허용하는 구조

원소를 순차적으로 처리하는 구조

- 첨자에 의한, 특정 위치의 원소처리가 가능

 

예제

package com.java.Education;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class Education_ArrayList {
	public static void main(String[] args) {
		ArrayList<String> Arr = new ArrayList<String>();

		Arr.add("one");
		//Arr.add(1, "one"); // 1번째 자리에 one 을 삽입해라 라는 의미.
		Arr.add("two");
		Arr.add("three");

		/*
		 * 같은 자료가 중복될 수 있고 입력된 순서대로 나오기 때문에
		 * Arr.add(1, "one") 을 활성화하면 for에서는 1번째 자리에서 one이 추가되어 나온다.
		 * ※ 배열은 0부터 시작
		 * one = 0번째 자리
		 * two = 1번째 자리
		 * three = 2번째 자리
		 * */

		for (int i = 0; i < Arr.size(); i++) {
			System.out.println(Arr.get(i));
		}

		System.out.println(Arr.indexOf("one")); //index가 몇번째 자리에 있는지를 알 수 있는 메소드
		System.out.println(Arr.get(2)); // 2번째 자리에 있는 요소를 뽑는 메소드
		System.out.println(Arr.lastIndexOf("three")); //마지막에 있는 것을 알 수 있는 메소드.
		System.out.println(Arr.set(2, "one")); // 대체 하라는 메소드
		
		//Arr.remove(0);
		
		//Collections.sort(Arr);
		
		for(String s : Arr) {
			System.out.println("이것은 TEST: "+s);
		}
		
		Iterator<String> iter = Arr.iterator();
		while(iter.hasNext()) {
			System.out.println("이것은 Iterator 인터페이스를 이용한 요소 출력 : "+iter.next());
		}

	}
}

 

Iterator<E> 인터페이스

컬렉션에 저장된 요소를 차례대로 다룰 수 있음.

다음 메소드를 제공

- boolean hasNext(), E next(), void remove()

HashSet, ArrayList, LinkedList 등에서 Iterator 객체를 리턴하는 메소드가 정의됨.

List<String> list = new ArrayList<String>();

Iterator<String> iter = list.iterator();
while(iter.hashNext){
	System.out.println(iter.next());
}

 

LinkedList 인터페이스

ArrayList와 유사함

- 앞의 예제에서 ArrayList를 LinkedList로 바꾸면 됨.

Queue 인터페이스를 구현함

 

Queue 인터페이스의 메소드

- boolean offer(E), boolean add(E)

- E poll(), E remove()

- E peek(), E element()

- 스택 자료구조에서 필요한 메소드도 제공함

  - void push(E)

  - E pop()

 

예제

package com.java.Education;

import java.util.LinkedList;

public class Education_LinkedList {
	public static void main(String[] args) {
		LinkedList<String> queue = new LinkedList<String>();
		
		queue.offer("one");
		queue.offer("two");
		queue.offer("three");
		queue.offer("four");
		// add 과 같은 추가
		
		String s = queue.poll(); //먼저 들어간 것이 삭제.
		
		while (s!=null) {
			System.out.println(s); //s가 null이 아니면 출력을 하게 한다.
			s = queue.poll();
		}
	}
}

 

HashMap<K,V>인터페이스

(key, value) 을 갖는 원소로 구성되는 컬렉션을 다루기 위한 인터페이스

- 하나의 key에 하나의 value만 대응됨

 

메소드

V put(K key, V value)

V get(Object key)

V remove(Object key)

boolean containsKey(Object key)

Collection<V> values()

Set<K> keyset()

 

HashMap 클래스

해싱을 이용하여 Map 인터페이스를 구현한 클래스

- ArrayList 나 LinkedList 클래스와 다름

 

예제

package com.java.Education;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class Education_Map {
	public static void main(String[] args) {
		List<String> names = new ArrayList<String>();

		Map<String, Integer> lectures;
		Map<String, Map> scores = new HashMap<>();

		names.add("허중탱이");
		names.add("뚠비탱이");

		Iterator<String> it = names.iterator();

		while (it.hasNext()) {
			String name = it.next();
			if (name.equals("허중탱이")) {
				lectures = new HashMap<String, Integer>();
				lectures.put("국어", 100);
				lectures.put("영어", 100);
				lectures.put("수학", 100);
				scores.put(name, lectures);

			} else if (name.equals("뚠비탱이")) {
				lectures = new HashMap<String, Integer>();
				lectures.put("국어", 100);
				lectures.put("영어", 100);
				lectures.put("수학", 100);
				scores.put(name, lectures);
			}

		}
		Iterator<String> it2 = names.iterator();
		while (it2.hasNext()) {
			String name = it2.next();
			System.out.println(name);

			System.out.println("국어: ");
			System.out.println(scores.get(name).get("국어"));

			System.out.println("영어: ");
			System.out.println(scores.get(name).get("영어"));

			System.out.println("수학: ");
			System.out.println(scores.get(name).get("수학"));

		}
	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참조 : http://tcpschool.com/java/java_collectionFramework_concept

댓글0