[Java] Collection

나르·2021년 6월 18일
2

JAVA

목록 보기
3/18
post-thumbnail
post-custom-banner

📖 Collection

컬렉션(collection)이란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다

즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다.

List와 Set 인터페이스는 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의됩니다.
또 자바의 Collection은 인터페이스이며, Collections는 클래스임을 주의해야 합니다.

📘 주요 인터페이스

인터페이스구현클래스 특징
SetHashSet
TreeSet
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
ListLinkedList
Vector
ArrayList
Stack, Queue
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
MapHashtable HashMap TreeMap
Properties
키(Key), 값(Value)의 쌍으로 이루어진 데이터의 집합
순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.

📘 주요 메소드

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

📖 List

ArrayList는 인덱스를 이용해 배열 요소에 빠르게 접근할 수 있습니다.

하지만 배열은 크기를 변경할 수 없는 인스턴스기 때문에, 크기를 늘리기 위해서는 새 배열을 생성하고 기존 요소들을 옮겨야 하므로 요소의 추가 및 삭제가 오래걸리는 단점을 가지게 됩니다.

JDK 1.2부터 제공된 LinkedList는 ArrayList의 단점을 극복하기 위해 배열 대신 연결리스트를 사용합니다
연결 리스트는 저장된 요소가 비순차적으로 분포되며, 이러한 요소들 사이를 링크(link)로 연결하여 구성합니다.

Vector는 JDK 1.0부터 사용해 온 ArrayList 클래스와 같은 동작을 수행하는 클래스입니다.

📘 예제

ArrayList<Integer> arrList = new ArrayList<Integer>();

// add() 메소드를 이용한 요소의 저장
arrList.add(40);
arrList.add(20);
arrList.add(30);
arrList.add(10);


// for 문과 get() 메소드를 이용한 요소의 출력
for (int i = 0; i < arrList.size(); i++) {
  System.out.print(arrList.get(i) + " ");
}
//40 20 30 10                                   

// remove() 메소드를 이용한 요소의 제거
arrList.remove(1);


// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (int e : arrList) {
  System.out.print(e + " ");
} 
//40 30 10
                                 
// Collections.sort() 메소드를 이용한 요소의 정렬
Collections.sort(arrList);


// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<Integer> iter = arrList.iterator();

while (iter.hasNext()) {
  System.out.print(iter.next() + " ");
}
//10 30 40 

// set() 메소드를 이용한 요소의 변경
arrList.set(0, 20);

for (int e : arrList) {
  System.out.print(e + " ");
}
//20 30 40

// size() 메소드를 이용한 요소의 총 개수
System.out.println("리스트의 크기 : " + arrList.size());
//리스트의 크기 : 3

📖 Set

HashSet는 내부적으로 HashMap 인스턴스를 이용하여 요소를 저장하며 검색 속도가 매우 빠릅니다.
TreeSet는 데이터가 정렬된 상태로 저장되는 이진 검색 트리(binary search tree)의 형태로 요소를 저장합니다.
Set에서는 요소의 저장 순서를 바꿔도 저장되는 순서에는 영향을 미치지 않습니다.

📘 예제

HashSet<String> hs01 = new HashSet<String>();
HashSet<String> hs02 = new HashSet<String>();

// add() 메소드를 이용한 요소의 저장
hs01.add("홍길동");
hs01.add("이순신");

System.out.println(hs01.add("임꺽정"));
//true
System.out.println(hs01.add("임꺽정")); // 중복된 요소의 저장
//false


// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (String e : hs01) {
  System.out.print(e + " ");
}
//홍길동 이순신 임꺽정

// add() 메소드를 이용한 요소의 저장
hs02.add("임꺽정");
hs02.add("홍길동");
hs02.add("이순신"); 

// iterator() 메소드를 이용한 요소의 출력
Iterator<String> iter02 = hs02.iterator();

while (iter02.hasNext()) {
  System.out.print(iter02.next() + " ");
}
//홍길동 이순신 임꺽정

// size() 메소드를 이용한 요소의 총 개수
System.out.println("집합의 크기 : " + hs02.size()); //집합의 크기 : 3

📖 Map

HashMap 클래스는 해시 알고리즘(hash algorithm)을 사용하여 검색 속도가 매우 빠릅니다.
HashMap은 Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없지만 같은 값을 다른 키로 저장하는 것은 가능합니다.

Hashtable 클래스는 HashMap 클래스와 같은 동작을 하는 클래스입니다.
현재에는 기존 코드와 호환성을 위해서만 남아있으므로, Hashtable보다는 HashMap을 사용하는 것이 좋습니다.

TreeMap 클래스는 키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리(binary search tree)의 형태로 저장합니다.

📘 예제

HashMap<String, Integer> hm = new HashMap<String, Integer>();

// put() 메소드를 이용한 요소의 저장
hm.put("삼십", 30);
hm.put("십", 10);
hm.put("사십", 40);
hm.put("이십", 20);


// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
System.out.println("맵에 저장된 키들의 집합 : " + hm.keySet());

for (String key : hm.keySet()) {
  System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
/*
맵에 저장된 키들의 집합 : [이십, 삼십, 사십, 십]
키 : 이십, 값 : 20
키 : 삼십, 값 : 30
키 : 사십, 값 : 40
키 : 십, 값 : 10
*/

// remove() 메소드를 이용한 요소의 제거
hm.remove("사십");

// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<String> keys = hm.keySet().iterator();

while (keys.hasNext()) {
  String key = keys.next();
  System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}

// replace() 메소드를 이용한 요소의 수정
hm.replace("이십", 200);


for (String key : hm.keySet()) {
  System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
} 
/*
키 : 이십, 값 : 200
키 : 삼십, 값 : 30
키 : 십, 값 : 10
*/

// size() 메소드를 이용한 요소의 총 개수
System.out.println("맵의 크기 : " + hm.size());
profile
💻 + ☕ = </>
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 8월 24일

오옹 .... 잘 보고 갑니다

답글 달기