제네릭과 컬렉션

바그다드·2023년 2월 10일
0

객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변 크기의 컨테이너

Collection FrameWork란?

다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
- 자료구조객체들은 제네릭을 사용하지 않으면 Object타입을 저장

특징

1. 제네릭이라는 기법으로 만들어짐
	- <E>, <K>, <V> 등을 타입매개변수라고 하고, 특정 타입만 다루지 않고 
    여러 종류의 타입을 지원하도록 컬렉션을 일반화(제네릭) 시키기 위해 사용
2. 컬렉션의 요소로는 객체만 가능
	- 기본 타입을 넣을 경우 자동 박싱으로 wrapper클래스로 변환하여 삽입
    

제네릭

데이터의 타입을 일반화(generalize)하는 것

- E : Element 컬렉션의 요소를 의미
- T : Type
- V : Value
- K : Key

Vector

가변 크기의 배열을 구현한 컬렉션 클래스
요소의 삽입, 삭제에 따라 요소의 위치와 크기를 조절

public static void main(String[] args) {
      Vector<Integer> v = new Vector<Integer>();
      //벡터 맨 뒤에 삽입
      v.add(5);
      v.add(4);
      v.add(-1);

      //벡터 중간에 삽입(index,value)
      v.add(2,100);

      System.out.println("벡터 크기 : " + v.size());
      System.out.println("백터 현재 용량 : " + v.capacity());

      for (int i=0; i<v.size(); i++){
          //get(i) 벡터의 i번째 값
          int n = v.get(i);
          System.out.println(n);
      }

      for (int i=0; i<v.size(); i++){
          //elementAt(i) 벡터의 i번째 값
          int n = v.elementAt(i);
          System.out.println(n);
      }

      // addAll(Collection<E> c) : c의 모든 요소를 벡터의 맨 뒤에 추가
      // clear : 벡터의 모든 요소 삭제
      // contains(Object o) :  벡터가 o를 포함하고 있으면 true 반환
      // indexOf(Object o ) : o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1
      // isEmpty() : 벡터가 비어 있으면 true
      // remove(int index) : 인덱스의 요소 삭제
      // remove(Object o) : o와 같은 첫 번째 요소 삭제
      // removeAllElements : 벡터의 모든 요소 삭제 후 크기를 0으로 설정
      // toArray() : 벡터의 모든 요소를 포함하는 배열 리턴
  }

ArrayList

가변 크기의 배열을 구현한 컬렉션 클래스

  • Vector 클래스와 거의 동일하나 ArrayList는 스레드 간에 동기화를 지원하지 않아, 다수의 스레드가 동시에 요소를 삽입/삭제할 때 데이터가 훼손될 수 있음
    하지만 멀티스레드 동기화로 인한 소요 시간이 없어 단일 스레드 응용에서는 더 효과적임

       //예제
       public static void main(String[] args) {
           // ArrayList 생성
           ArrayList<String> a = new ArrayList<String>();
    
           // 키보드로부터 4개의 이름을 입력받아 ArrayList에 삽입
           Scanner scanner = new Scanner(System.in);
           for (int i=0;i<4;i++){
               System.out.print("이름을 입력하세요>>");
               String s = scanner.next();
               // ArrayList 맨 뒤에 삽입
               a.add(s);
           }
    
           // ArrayList에 들어 있는 모든 이름(요소) 출력
           for (int i=0; i<a.size(); i++){
               // get(i) : ArrayList의 i번째 요소 가져오기
               String name = a.get(i);
               System.out.print(name + " ");
           }
    
           // 가장 긴 이름 출력
           int longestIndex = 0; // 가장 긴 이름의 인덱스 번호 저장
           for (int i=0; i<a.size(); i++){
               if(a.get(longestIndex).length() < a.get(i).length())
                   longestIndex = i;
           }
           System.out.println("\n가장 긴 이름은 : " + a.get(longestIndex));
           scanner.close();
    
           // ArrayList 메서드
           // add(E element) : 맨 뒤에 element 삽입
           // add(int index, E element) : index위치에 element 삽입
           // addAll(Collection<E> c) : c의 모든 요소를 ArrayList의 맨 뒤에 추가
           // clear : ArrayList의 모든 요소 삭제
           // contains(Object o) :  ArrayList가 o를 포함하고 있으면 true 반환
           // elementAt(int index) : 인덱스의 요소 리턴
           // get(int index) : 인덱스의 요소 리턴
           // indexOf(Object o) : o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1
           // isEmpty() : ArrayList가 비어 있으면 true
           // remove(int index) : 인덱스의 요소 삭제
           // remove(Object o) : o와 같은 첫 번째 요소 삭제
           // size() : ArrayList 크기 리턴
           // toArray() : ArrayList의 모든 요소를 포함하는 배열 리턴
       }

Iterator

컬렉션에서 요소를 순차 검색할 때 사용하는 인터페이스
Iterator의 요소는 컬렉션의 매게 변수와 동일한 타입이어야 함

//예제
  public static void main(String[] args) {
      // 정수 값만 다루는 제네릭 벡터 생성
      Vector<Integer> v = new Vector<>();
      v.add(5);
      v.add(4);
      v.add(-1);
      v.add(2, 100);

      // Iterator를 이용하여 모든 정수 출력
      Iterator<Integer> it = v.iterator(); // Iterator 생성
      // 다음 요소가 남아있으면 true
      while (it.hasNext()){
          //next() 다음 요소 리턴
          int n = it.next();
          System.out.println(n);
      }

      // Iterator를 이용하여 모든 정수 더하기
      int sum = 0;
      // Iterator를 다시 설정해줘야 함
      it = v.iterator();
      while (it.hasNext()){
          int n = it.next();
          sum += n;
      }
      System.out.println("벡터에 있는 정수 합 : " + sum);
  }

  // Iterator 메소드
  // hasNext() : 방문할 요소가 남아 있으면 true
  // next() : 다음 요소 리턴
  // remove() : 마지막으로 리턴된 요소 제거

HashMap<K,V>

키(Key)와 값(Value)이 한쌍으로 구성되는 요소를 다루는 컬렉션
해시함수를 이용해 데이터가 저장되는 위치를 결정
Hash코드를 이용한 자료구조는 Object의 equals()와 hashCode()를 구현해야 함

  • 해시맵 장단점
    1. 요소의 삽입, 삭제가 매우 빠름
    2. 검색은 더 빠름
      • Vector나 ArrayList처럼 모든 요소를 하나씩 비교하지 않고 해시 함수가 key가 저장된 위치를 바로 찾아냄

LinkedList

List 인터페이스를 구현한 클래스
Vector나 ArrayList와 비슷하지만 List 각 요소들을 양방향으로 연결한다는 차이가 있음

  • head, tail레퍼런스를 가져 원하는 위치에 삽입이 가능하고 인덱스를 이용하여 요소에 접근할 수 있음

Collection 클래스에서 지원하는 메소드

  1. sort() - 컬렉션의 모든 요소 정렬
  2. reverse() - 요소들을 반대로 정렬
  3. max(), min() - 요소들의 최대, 최솟값 찾기
  4. binarySearch() - 이진탐색
  • Collection 클래스의 모든 메소드는 static으로 객체를 생성할 필요가 없음
profile
꾸준히 하자!

0개의 댓글