본문 바로가기
개발/TIL

[명품 자바 프로그래밍] 7장 - 제네릭과 컬렉션

by candosh 2023. 6. 7.

컬렉션(collection)의 개념

 

- 요소(element) 객체들의 저장소

  • 객체들의 컨테이너라고도 불림
  • 요소의 개수에 따라 크기 자동 조절
  • 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동

- 고정 크기의 배열을 다루는 어려움 해소

- 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이

 

컬렉션을 위한 자바 인터페이스와 클래스

인터
페이스
Collection<E> Map<K, V>
Set<E> List<E> Queue<E>  
클래스 HashSet<E> ArrayList<E> Vector<E> LinkedList<E> HashMap<K,V>
    Stack<E>    

** LinkedList는 List<E>에도 속함

*** ArrayList<E> : 동기화 X, Vector<E> : 동기화 O

 

컬렉션과 제네릭

 

- 컬렉션은 제네릭(generics) 기법으로 구현됨

- 컬렉션의 요소는 객체만 가능

  • 기본적으로 int, char, double 등의 기본 타입 사용 불가
  • JDK 1.5부터 자동 박싱/ 언박싱으로 기본 타입 값 객체로 자동 변환

- 제네릭

  • 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화시키는 기법
  • <E>, <K>, <V> : 타입 매개 변수 - 요소 타입을 일반화한 타입

- 제네릭 클래스 사례

  • 제네릭 스택 : Stack<E>
  • E에 특정 타입으로 구체화
  • 정수만 다루는 스택 Stack<Integer>
  • 문자열만 다루는 스택 Stack<String>

 

제네릭의 기본 개념

: 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메소드를 작성하는 기법

 

Vector<E>의 특성

 

- java.util.Vector

  • <E>에서 E대신 요소로 사용할 특정 타입으로 구체화

- 여러 객체들의 삽입, 삭제, 검색하는 컨테이너 클래스

  • 배열의 길이 제한 극복
  • 원소의 개수가 넘쳐나면 자동으로 길이 조절

- Vector에 삽입 가능한 것

  • 객체, null
  • 기본 타입은 Wrapper 객체로 만들어 저장

- Vector에 객체 삽입

  • 벡터의 맨 뒤에 객체 추가
  • 벡터의 중간에 객체 삽입

- Vector에서 객체 삭제

  • 임의의 위치에 있는 객체 삭제 가능 : 객체 삭제 후 자동 자리 이동

 

Vector<E> 클래스의 주요 메소드

  • E elementAt(int index) : 인덱스 index의 요소 리턴
  • E get(int index) : 인덱스 index 요소 리턴
  • int capacity() : 벡터의 현재 용량 리턴
  • int size() : 벡터가 포함하는 요소의 개수 리턴
  • int clear() : 벡터의 모든 요소 삭제
  • boolean remove(Object o) : 객체 o와 같은 첫 번째 요소를 벡터에서 삭제

 

컬렉션과 자동 박싱/ 언박싱

- JDK 1.5부터 자동 박싱/ 언박싱이 작동하여 기본 타입 값 사용 가능

Vector<Integer> v = new Vector<Integer>();
v.add(4); // 4 -> Integer.valueOf(4)로 자동 박싱
int k = v.get(0); //Integer 타입이 int 타입으로 자동 언박싱, k = 4

- 제네릭 타입 매개 변수를 기본 타입으로 구체화할 수는 없음

** 오류 : Vector <int> v = new Vector<int> ( );

 

컬렉션의 순차 검색을 위한 Iterator

 

- Iterator<E> 인터페이스

  • Vector<E>, ArrayList<E>, LinkedList<E>가 상속 받는 인터페이스
  • 리스트 구조의 컬랙션에서 요소의 순차 검색을 위한 메소드 포함
  • Iterator<E> 인터페이스 메소드
메소드 설명
boolean hashNext() 방문할 요소가 남아 있으면 true 리턴
E next() 다음 요소 리턴 : has next next
void remove() 마지막으로 리턴된 요소 제거

 

- iterator() 메소드 : iterator객체 반환

  • iterator객체를 이용하여 인덱스 없이 순차적 검색 가능
Vector<Integer> v = new Vector<Integer> ();
Iterator<Integer> it = v.iterator();
while(it.hasNext()){ //모든 요소 방문
	int n = it.next(); //다음 요소 리턴
    ...
}

 

HashMap<K,V>

 

: 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션

  • java.util.HashMap
  • K는 키로 사용할 요소의 타입, V는 값으로 사용할 요소의 타입 지정
  • 키와 값이 한 쌍으로 삽입
  • 키는 해시맴에 삽입되는 위치 결정에 사용
  • 값을 검색하기 위해서는 반드시 키 이용
  • 삽입, 삭제, 검색이 빠른 특징
    • 요소 삽입 : put() 메소드
    • 요소 검색 : get() 메소드

예) HashMap<String, String> 생성, 요소 삽입, 요소 검색

HashMap<String, String> h = new HashMap<String, String> ();
h.put("apple", "사과"); // "apple" 키와 "사과" 값의 쌍을 해시맵에 삽입
String kor = h.get("apple"); // "apple"키로 값 검색, kor는 "사과"

** 값을 바꾸면, 그 값의 자리는 같고 새로운 값이 얹히는 것, 즉 키 값은 동일

*** key 값들은 중복되면 안 됨


명품 JAVA Programming - 개정판 4판/ 황기태