자바

[자바 개념] Collection과 Collections

라임온조 2023. 1. 6. 18:09

1. Collectoin

1) 개념

여러 원소를 담을 수 있는 자료구조

2) Collection이 나오게 된 이유

  • 배열은 여러 개의 데이터를 다루기에 편리하지만, 삽입과 삭제가 불편하다
  • 또한 배열은 선언시에 크기도 함께 선언해야 해서, 크기가 정해지지 않은 경우 사용이 불편하다.
  • 컬렉션은 배열이 가진 고정된 크기라는 단점을 해결하기 위해 객체들을 쉽게 삽입, 삭제, 검색할 수 있도록 한 가변의 컨테이너이다.

3) Collection 특징

  • 컬렉션은 많은 자료구조를 만들어 제공한다
  • 컬렉션은 Generic 기법으로 되어있다.
    • 특정 타입만 다루지 않고 여러 종류의 타입으로 변신하도록 하기 위해
  • 컬렉션 요소는 객체만 가능
    • primitive 타입은 사용할 수 없다
    • 하지만 primitive타입을 써도 자동박싱에 의해 Wrapper클래스 타입으로 변환되어 객체로 저장한다

4) Collection 종류

java.util.* 에서 다양한 collection 인터페이스와 클래스를 제공한다

  • Vector<E>
    • 가변크기 배열, 자동으로 크기 조절
    • 객체의 삽입, 삭제, 이동이 쉬움
//선언
Vector<Integer> v = new Vector<Integer>();
Vector<String> v = new Vector<String>(Arrays.asList("a", "b")) // 생성시 값 추가
//add
v.add(3);
v.add(2, 3); //index 2의 위치에 3 삽입
v.add(null);
//get
v.get(1); //index 1에 있는 원소 return
//size
v.size(); //v의 크기 값 return
//remove
v.remove(1); //index 1에 있는 값 삭제
v.remove(Integer.valueOf(1)); //숫자 1을 삭제
//contain
v.contains(2); //v가 2를 가지고 있으면 t, 아니면 f return
  • ArrayList<E>
    • 가변크기 배열
    • Vector와 거의 동일
    • 스레드 간 동기화를 지원하지 않기 때문에 다수의 스레드가 동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 우려가 있다
    • 멀티스레드 동기화를 위한 시간 소모가 없어서 Vector보다 속도가 빨라 단일 스레드 응용에는 더 효과적이다
  • LinkedList<E>
    • 연결리스트
    • 요소들을 양방향으로 연결하여 관리한다는 점 제외하고 Vector나 ArrayList와 비슷
    • 맨 앞과 맨 뒤를 가리키는 head, tail 레퍼런스를 가지고 있다.
  • Stack<E>
// import
import java.util.Stack;

// 생성
Stack<Integer> s = new Stack<Integer>();
Stack<String> s = new Stack<String>();

// 각종 메소드
s.push("c") //스택에 요소 삽입
s.pop() //스택 맨 위에 있는 요소 삭제 후 return
s.peek() //스택 맨 위에 있는 요소 확인
s.clear() //스택 전체 제거
s.empty() //스택이 비어있으면 true, 비어있지 않으면 false return
s.size() //스택의 총 크기 return
s.contains("a") //스택에 a있는지 확인 후 있으면 true, 없으면 false return
  • HashSet<E>
    • set 인터페이스를 구현한 클래스
    • 중복해서 저장할 수 없고 저장 순서가 유지되지 않음
HashSet<Integer> hs = new HashSet<Integer>();
hs.add(4); // 4를 삽입
hs.remove(3); //3이라는 숫자를 삭제
hs.size() //hs의 사이즈 리턴
  • TreeSet<E>
    • HashSet과 마찬가지로 Set 인터페이스를 구현한 클래스
    • 객체를 중복해서 저장할 수 없고 저장 순서가 유지되지 않음
    • 이진 탐색 트리(BinarySearchTree) 구조라 추가와 삭제에는 시간이 조금 더 걸리지만 정렬, 검색에 높은 성능을 보임
    • TreeSet은 이진탐색트리 중에서도 성능을 향상시킨 레드-블랙 트리(Red-Black Tree)로 구현
  • HashMap<K,V>
    • 키와 값으로 이루어짐
    • 해시 함수를 통해 키와 값이 저장되는 곳을 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어있는 순서 또한 상관 없다
    • 빠른 검색과 삽입이 필요한 경우에 적합
    • 장점
      • vector나 ArrayList와 달리 요소의 삽입 삭제 시 다른 요소들의 위치 이동이 필요 없어 삽입과 삭제 시간이 빠르다(해시 함수는 아주 간단한 코드로 이루어져 있기 때문에)
      • 검색은 더 빠르다(get 메소드가 호출되면 해시 함수가 key가 저장된 위치를 단번에 찾아내기 때문에 vector나 ArrayList처럼 모든 요소를 하나씩 비교할 필요가 없다)
    • 단점
      • index 사용이 불가능하고 key만 사용가능하다
// 선언
HashMap<String, Integer> h = new HashMap<String, Integer>();
HashMap<String, String> h = new HashMap<String, String>(){{
	put("김", "a");
   	put("이"," b");
}}
// put
h.put("김씨", 100);
// get
h.get("김씨");//key가 김씨인 곳의 value를 return
// remove
h.remove("김씨"); //key가 김씨인 쌍을 삭제
// size
h.size() // 요소의 개수 알아내기
// keySet
m.keySet() // m에 해당하는 map의 모든 key를 가지고 있음
// getOrDefault
h.getOrDefault("3", 0) // h에서 "3"이라는 key가 존재하면 해당 key의 value를 반환하고, 존재하지 않으면 0이라는 default 값을 return
// containsKey
h.containseKey(키값) // h에서 키값이 존재하는지 여부를 t/f로 리턴
// for문 돌기
for(String key : m.keySet()){

}

2. Collections

1) 개념

java.util에 포함되어 Collection을 다루는 유용한 메소드를 제공한다

2) 특징

  • Collections의 메소드는 모두 static 타입이라 Collections 객체를 생성할 필요가 없다
  • Collections 클래스는 java.lang.Comparable을 상속받는 element(int, char, double, String 등)에 대해서만 작동한다
  • 사용자 정의 클래스의 경우 java.lang.Comparable을 상속받아야 한다

3) 메소드

// sort
Collections.sort(array) //array를 정렬시켜 이걸 수행하고 난 후 array는 정렬이 되어 있다
// reverse
Collections.reverse(array) //array를 반대로 정렬시켜 이걸 수행하고 난 후 array는 반대로 정렬 되어 있다
// max
Collections.max(array) //최댓값 return
// min
Collections.min(array) //최솟값 return
// binary search
Collections.binarySearch(array, 10) //array에서 10이라는 값을 binarySearch한 후 값이 있으면 index return, 값이 없으면 (-삽입될 위치-1) return

'자바' 카테고리의 다른 글

[자바 개념] switch  (0) 2023.01.12
[자바 개념] Math  (0) 2023.01.12
[자바 개념] 배열, Arrays, ArrayList  (0) 2023.01.11
[자바 개념] Wrapper  (0) 2023.01.11
[자바 개념] Character, String  (0) 2023.01.06