티스토리 뷰

Java

명품 JAVA Programming Chap07 제네릭과 컬렉션

개발자 쿠키 2022. 8. 16. 19:44

Chap07 

  1. 컬렉션과 제네릭
  2. 제네릭 컬렉션 활용
  3. 제네릭 만들기

7.1 컬렉션과 제네릭 

  1. 컬렉션:  배열이 가진 고정 크기의 단점을 극복하기 위해 객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변 크기의 컨테                  이너(container)이다.
  2. 컬렉션의 특징
    1. 제네릭(generics)이라는 기법으로 만들어져 있다. 컬렉션 클래스의 이름에는 <E>, <K>, <V> 등이 항상 포함된다. 이들은 '타입 매개변수' 라고 하며, Vector<E>에서 E대신 Integer와 같이 구체적인 타입을 지정하면, Vector<Integer>는 정수 값만 저장하는 벡터로, Vector<String>은 문자열만 저장하는 벡터로 사용할 수 있다. 컬렉션을 일반화시키기 위해 <E>를 사용하는 것이다. E를 일반화시킨 타입 or 제네릭 타입이라고 부른다.
    2. 컬렉션의 요소는 객체들만 가능하다.
  3. 제네릭 타입 매개변수
    1. E: Element를 의미하며 컬렉션에서 요소임을 나타냄
    2. T: Type을 의미
    3. V: Value를 의미
    4. K: key를 의미

7.2 제네릭 컬렉션 활용 

  • Vector<E>: 배열을 가변 크기로 다룰 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬력센 클래스이다.
  • 벡터 생성
Vector<Integer> v = new Vector<Integer>();
메소드 설명
boolean add(E element) 벡터의 맨 뒤에 element 추가
void add(int index, E element) 인덱스 index에 element를 삽입
int capacity() 벡터의 현재 용량 리턴
boolean addAll(Collection<? extends E>c) 컬렉션 c의 모든 요소를 벡터의 맨 뒤에 추가
void clear() 벡터의 모든 요소 삭제
boolean contains(Object o) 벡터가 지정된 객체o를 포함하고 있으면 true 리턴
E elementAt(int index) 인덱스 index의 요소 리턴
E get(int index) 인덱스 index의 요소 리턴
int indexOf(Object o) o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1 리턴
boolean isEmpty() 벡터가 비어 있으면 true 리턴
E remove(int index) 인덱스 index의 요소 삭제
boolean remove(Object o) 객체 o와 같은 첫 번째 요소를 벡터에서 삭제
void removeAllElements() 벡터의 모든 요소를 삭제하고 크기를 0으로 만듦
int size() 벡터가 포함하는 요소의 개수 리턴
Object[] toArray() 벡터의 모든 요소를 포함하는 배열 리턴
  • 벡터의 요소 삽입: add()
  • 벡터 내의 요소 알아내기: get() or elementAt()
  • 벡터의 크기와 용량 알아내기: size(), capacity()
  • 벡터의 요소 삭제: remove()

 

  • ArrayList<E>: 가변 크기의 배열을 구현한 컬렉션 클래스로서 경로명은 java.util.ArrayList이며, Vector 클래스와 거의                           동일하다. 크게 다른 점은 ArrayList는 스레드 간에 동기화를 지원하지 않기 때문에, 다수의 스레드가                             동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 우려가 있다. 하지만 멀                           티스레드 동기화를 위한 시간 소모가 없기 때문에, ArrayList는 Vector보다 속도가 빨라, 단일 스레드 응                         용에는 더 효과적이다.
  • ArrayList의 생성
ArrayList<String> a = new ArrayList<String>();
  • HashMap<K, V>: 경로명이 java.util.HashMap이며, '키'와 '값'의 쌍으로 구성되는 요소를 다룬다.
    • 해시맵의 장단점
      • 첫째, 요소의 삽입, 삭제 시간이 매우 빠르다.
      • 둘째, 요소 검색은 더욱 빠르다.
      • 셋째, 인덱스를 이용하여 요소에 접근할 수 없고 오직 '키'로만 검색해야 한다.
    • 해시맵 생성
      • HashMap<String, String> h = new HashMap<String, String>();
    • 해시맵에 요소 삽입: put()
    • '키'로 '값'읽기: get()
    • '키'로 요소 삭제: remove()
    • 요소 개수 알아내기: size()
    • 해시맵의 전체 검색: keySet()
  • LinkedList<E>: List<E> 인터페이스를 구현한 클래스로서 경로명이 java.util.LinkedList이다. 요소들을 양방향으로 연                          결하여 관리한다는 점을 제외하고 Vector, ArrayList와 거의 같다. 

 

  • Collections 클래스 활용
    • sort(): 컬렉션에 포함된 요소들의 정렬
    • reverse(): 요소를 반대 순으로 정렬
    • max(), min(): 요소들의 최대값과 최솟값 찾아내기
    • binarySearch(): 이진 검색
  • Collections 클래스의 메소드는 모두 static 타입이므로 Collections 객체를 생성할 필요는 없다.
본래 Collections 클래스는 java.lang.Comparable을 상속받는 element에 대해서만 작동한다. int, char, double 등의 기본 타입과 String 클래스는 이 조건을 충족하지만, 사용자가 클래스를 작성하는 경우 java.lang.Comparable을 상속받아야 한다.

7.3 제네릭 만들기

  • 제네릭 클래스
    • 제네릭 객체 생성 - 구체화
  • 제네릭과 배열
    • 제네릭에서는 배열에 대한 제한을 두고 있다. 제네릭 클래스 또는 인터페이스 타입의 배열은 선언할 수 없다.
  • 제네릭의 장점
    • 동적으로 타입이 결정되지 않고 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능
    • 런타인 타입 충돌 문제 방지
    • 개발 시 타입 캐스팅 절차 불필요
    • ClassCastException 방지

7장 요약

  • 컬렉션은 요소들의 리스트나 집합을 관리하는 자료 구조로서 크기를 자동 조절하여 크기에 구애받지 않고 요소의 추가, 삭제, 검색 등을 쉽게 할 수 있어 배열보다 용이하다.
  • 주요한 컬렉션 클래스에는 Vector<E>, ArrayList<E>, HashMap<K, V>, LinkedList<E>, Stack<E> 등이 있다.
  • Vector나 ArrayList등은 요소 객체들이 리스트 형식으로 순차적으로 저장되며, 인덱스로 검색할 수 있어 배열을 대신할 때 매우 효과적이다.
  • HashMap 컬렉션에는 '키'와 '값'의 쌍으로 저장되고, '키'를 이용하여 요소가 검색된다. 삽입, 삭제, 검색 속도가 매우 빠른 장점이 있고, 요소의 순서가 필요 없고 '키'를 이용하여 삽입하고 검색하는 응용에 매우 적합하다.
  • 컬렉션은 JDK 1.5버전 이후 제네릭 기법으로 만들어져 있다.
  • 제네릭은 일반화시킨 타입을 사용하여 특정 타입에 중속되지 않도록 클래스나 인터페이스, 메소드를 일반화시키는 기법이다. 그러므로 제네릭에 구체적인 타입을 지정하여 특정 타입으로 변신하여 사용할 수 있다.
  • 컬렉션 요소로는 객체들만 사용된다.
  • int, char, double 등의 기본 타입을 컬렉션의 요소로 삽입하려면 Wrapper 클래스를 이용하여 기본 타입을 객체로 만들어 사용하면 된다.
  • Collection<E> 인터페이스를 구현한 컬렉션의 경우 iterator() 메소드를 호출하면 Iterator 객체를 리턴하며, 이 객체를 이용하여 인덱스 없이 컬렉션의 요소에 대해 순차 검색이 가능하다.
  • Colections 클래스는 컬렉션에 대해 요소 정렬, 검색, 최대 최솟값 구하기 등 다양한 유틸리티 메소드를 제공한다.
  • 제네릭을 이용하면 컴파일 시에 타입이 결정되어 불필요한 오류를 방지하므로 안전한 프로그래밍이 가능하다.
  • 제네릭 클래스 또는 인터페이스 선언은 타입 매개변수를 클래스나 인터페이스 이름 다음에 추가하여 선언한다.
  • 제네릭 타입으로 제네릭 클래스 내에서 객체와 배열을 생성할 수 없다.

명품 JAVA Programming - 황기태, 김효수 - 내용을 정리한 내용입니다.