[Java] Collection Framework, 제네릭 Generic

Nam_JU·2022년 8월 11일
0

Java

목록 보기
3/4

Java Collection Framework

  • Java Collection Framework는 객체들을 관리하기 위해 사용하는 컨테이너 클래스들의 집합이다
  • 컨테이너 클래스들의 종류는 크게 List, Set, Queue, Map 계열로 구분한다.
  • 각 계열에 따라 객체들을 저장하고 관리하는 방식의 차이가 있다.
  • 컬렉션 프레임워크 클래스들을 잘 활용하기 위해서는 각 클래스들의 특징과 저장방식에 대한 이해가 필요하다

컬렉션 관련 인터페이스들과 클래스들은 java.util.*패키지에 포함되어 있다.

  • Collection interface: 순서없는 객체들의 집합
  • List interface : 순차적 나열로 순서 지정이 가능한 객체들의 집합
  • Set interface : 중복을 허용하지 않는 객체들의 집합
  • Queue interface : FIFO 선입선출구조
  • Map : 키와 vlaue 쌍으로 대응하는 객체들로 이루어진 집합

컬렉션 클래스 고려사항

  • 저장 객체의 추가 삭제와 같은 데이터의 변경이 자주 발생하는지
  • 저장 객체의 빠른 탐색이 최우선인지 필요한지
  • 저장 메모리를 최대한 효율적으로 사용하고자 하는지


제네릭 Generic

  • 제네릭은 Java5에서 추가된 기능으로 특히 객체를 수집, 관리하는 컬렉션을 이용할때 반드시 사용한다.
  • 제네릭을 사용하면 데이터를 저장하는 시점에 어떤 데이터를 저장할 것인지 명시할 수 있다
  • 이를 통해 사용하고자 하는 데이터의 타입을 명확히 선언할 수 있고, 정확한 데이터의 사용여부를 컴파일 시점에 확인할 수 있다.

제네릭과 컬렉션

  • Object 클래스는 최상위 클래스로서 Java의 모든 클래스를 참조할 수 있다.
  • 모든 클래스를 참조할 수 있다는 것은 편리할 수 있지만 오류를 발생시킬 수 있는 여지가 크다
  • 만약 Object 배열에 다양한 객체의 참조를 넣었을때, 객체의 구분없이 배열에 담을 수 있다는 것은 편리하지만 다시 꺼낼때는 문제가 발생한다.

데이터의 최소 단위는 객체. 컬렉션 프레임 워크의 클래스들은 객체를 저장하는 역할을 한다.
예를들어 int 타입의 정수들을 100개 모은다고 가정했을 때 primitive타입의 배열을 선언 할 수 있지만 자바 컬렉션 프레임워크의 클래스들은 사용할 수 없다.
왜냐하면 컬렉션 타입의 클래스들은 저장하는 대상이 객체 단위이기 때문에 primitive타입의 데이터들을 저장할 수 없다.
따라서 primitive 타입의 데이터들을 객체 형태로 변환해주는 클래스들인 Wrapper 클래스를 사용해야한다


Collection 인터페이스

java.util.Collection 인터페이스

  • 컬렉션 프레임워크의 최상위 인터페이스이다
  • 요소(객체)에 대한 삽입, 삭제, 탐색의 기능을 정의한다

List 인터페이스

  • List 계열의 컬렉션은 저장 요소를 순차적으로 관리하며 중복된 값과 null값을 요소로 가질 수 있다
  • 요소에 대한 접근은 배열과 마찬가지로 인덱스를 통해 접근한다
  • 배열 자료구조 형태로 데이터를 저장할 때 저장 데이터의 특성에 따라 적절한 List 계열의 클래스들을 활용한다.
  • List인터페이스를 구현한 대표클래스는 ArrayList, LinkedList, Vector클래스가 있다

ArrayList

  • ArrayList 클래스는 내부에 배열을 갖고 있다. 따라서 고정 길이 저장공간으로 요소들을 관리한다
  • ArrayList 클래스의 내부 배열이 요소를 담을 수 있는 용량을 capacity라고 한다
  • 내부 배열 용량을 넘어 요소를 저장할 경우 내부적으로 용량을 늘린 새로운 배열을 만들어 요소를 담는다
  • 요소에 대한 접근은 배열과 마찬가지로 인덱스를 통해 접근한다.
  • 길이를 명시할 필요가 없다
  • 추가 삭제가 빈번한 데이터의 관리에는 적합하지 않다


LinkedList

  • LinkedList 클래스는 집합하는 각 요소들을 노드(node)로 표현하고, 각 노드들을 서로 연결하여 리스트를 구성한다.
  • 요소를 갖는 각 노드들은 다음 노드에 대한 참조 정보를 통해 접근한다
  • 노드는 필요할 경우 만들어서 연결하여 사용하기 때문에, 미리 정의된 용량의 개념이 없다
  • List 인터페이스를 구현한 다른 클래스들과 마찬가지로 인덱스를 통해 요소에 접근한다
  • 고정길이 데이터를 사용할때는 얼마를 쓸지 몰라서 capacity에 정의를 했다면 linkedList는 용량에 대한 개념이 없이 노드를 추가해서 사용
  • ArrayList와 달리 요소의 추가, 삭제에 대한 부하가 적은 반면 메모리의 사용은 더 많다는 특징을 갖는다.


Set 인터페이스

  • Set 인터페이스를 구현한 컬렉션 클래스들의 가장 큰 특징은 저장하는 요소들의 중복을 허용하지 않는다는 것이다
  • 유일성을 보장
  • 하나의 요소를 꺼내는 방법이 없음 꺼낸다면 전체의 요소를 순회하여 꺼내는 방식을 사용
  • Set 인터페이스의 구현 클래스들은 equals() 메소드를 이용해 저장 요소의 중복을 검사한다
  • Set 인터페이스가 정의하고 있는 추상 메소드 중에는 단일 요소를 꺼내기 위한 get() 메소드가 존재하지 않는다
  • Set 인터페이스를 구현한 주요 클래스는 HashSet, LinkedHashSet, TreeSet 등이 있다

Map 인터페이스

  • Map 인터페이스가 갖는 대표적인 특성은 요소를 저장하기 위해서는 유일한 Key와 함께 저장해야 한다
  • List, Set, Queue와 달리 Map 인터페이스는 Collection 인터페이스를 상속하지 않는다
  • 저장형태가 다르기 때문 (ket, value)
  • Map 인터페이스는 내부에 Entry 인터페이스를 가지고 있으며 Entry는 키와 값을 가진 객체의 순서 쌍이다.
  • Map인터페이스의 주요 구현 클래스는 HashMap, LinkedHashMap, TreeMap 등이 있다.

  • HashMap에 요소를 저장하기 위해서는 Key, value 값이 필요하며 값의 경우 중복이 가능하다
    (Key값은 반드시 달라야함. 유일성보장을 위해)
  • HashMap 클래스는 저장되는 요소의 순서를 보장하지 않는다
  • LinkedHashMap 클래스는 요소를 추가한 순서를 보장한다
  • TreeMap 클래스는 요소의 키에 대한 정렬된 순서를 보장하며 이를 위해서는 객체가 Comparable 인터페이스를 구현하고 있어야 한다.

Iterator 인터페이스

  • Iterator 인터페이스는 컬렉션 객체가 가지고 있는 요소들을 순회 할 수 있는 기능들을 명세한 인터페이스이다.
  • Collection 인터페이스를 구현한 클래스(list, set, Queue)들은 iterator()메소드를 통해 Iterator 구현 객체를 반환한다.
  • Map 구현 클래스의 경우 Map.values()메소드를 통해 값 요소들을 Collection 타입으로 객체를 반환 받은 이후에 다시 Iterator 구현 객체를 이용하여 순회할 수 있다



참고자료
https://pridiot.tistory.com/63
https://www.youtube.com/watch?v=nWeWIH7TFXA&t=646

profile
개발기록

0개의 댓글