[명품 Java Programming] 7장 제네릭과 컬렉션
명품 자바 프로그래밍 7장 제네릭과 컬렉션
컬렉션 (Collection)은 안드로이드를 비롯한 자바 프로그램을 작성하는데 빼놓을수 없는 중요한 도구이다.
컬렉션은 대체로 다음과 같이 설명 할 수 있다.
- Element 객체들의 저장소
- 고정 크기의 배열을 다루는 어려움 해소
- 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이
배열의 경우 여러 개의 데이터를 다루는 데 편리한 자료 구조이지만, 삽입 삭제가 빈번하게 일어나며, 데이터의 크기를 예측 할 수 없는 응용프로그램에서 사용하기에는 불편하다.
배열 )
- 고정 크기 이상의 객체를 관리할 수 없다.
- 배열의 중간에 객체가 삭제되면 응용프로그램에서 자리를 옮겨야 한다.
컬렉션 )
- 가변 크기로서 객체의 개수를 염려할 필요 없다.
- 컬렉션 내의 한 객체가 삭제되면 컬렉션이 자동으로 자리를 옮겨준다.
컬렉션은 제네릭(Generics)이라는 기법으로 구현되어 있으며 컬렉션의 경우 배열이 가진 고정 크기의 단점을 극복하기 위해서 객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변 크기의 컨테이너로 구성되어있다.
정리하자면,
- 컬렉션은 제네릭 기법으로 구현됨
- 컬렉션의 요소는 객체만 가능하다.
- 기본적으로 int, char, double 등의 기본 타입은 사용 불가능하다.
- 제네릭
- 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화 시키는 기법
- <E>, <K>, <V> : 타입 매개 변수, 즉 요소 타입을 일반화 한 타입
- 제네릭 클래스 예시
- 제네릭 스택 : Stack <E>
- E에 특정 타입으로 구체화
- 정수만 다루는 스택 Stack <Integer>
- 문자열만 다루는 스택 Stack <String>
- 제네릭 스택 : Stack <E>
- 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화 시키는 기법
제네릭의 기본 개념
JDK 1.5에서 도입되었으며 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메소드를 작성하는 기법이다.
Vector <E>
- java.util.Vector
- <E> 에서 E 대신 Element로 사용할 특정 타입으로 구체화
- 여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스
- 배열의 길이 제한 극복 (고정 크기가 아닌, 가변 크기)
- 원소의 개수가 넘쳐나면 자동으로 길이 조절
- Vector에 삽입가능한 것
- 객체, NULL
- 기본 타입은 Wrapper 객체로 만들어 저장
- Vector 객체 삽입
- 벡터의 맨 뒤에 객체 추가
- 벡터 중간에 객체 삽입
- Vector 객체 삭제
- 임의의 위치에 있는 객체 삭제 가능
- 객체 삭제 후 자동 자리 이동
Vector <Integer>
벡터의 생성
Vector<Integer> v = new Vector<Integer>(7);
생성한 벡터에 요소 삽입
v.add(5);
v.add(4);
v.add(-1);
벡터의 요소 개수 및 벡터의 용량
int n = v.size(); // 요소의 개수
int c = v.capacity(); // 벡터의 용량
요소 중간 삽입
v.add(2,100)
// Error v.size()인 요소의 개수보다 더 큰곳에 삽입 불가능
v.add(5,100)
요소 얻어내기
Integer object = v.get(1);
int i = object.intValue();
요소 삭제
v.remove(1);
//// Error 인덱스 4에 요소 객체가 없으므로 오류가 발생
v.remove(4);
마지막 요소
int last = v.lastElement();
모든 요소 삭제
v.removeAllElements();
정수만 다루는 Vector<Integer> 컬렉션 활용
- 정수만 다루는 벡터를 생성하고, 활용하는 기본 사례를 보인다.
import java.util.Vector;
public class VectorEx{
public static void main(String[] args){
Vector<Integer> v = new Vector<Integer> 0;
v.add(5);
v.add(4);
v.add(-1);
v.add(2,100);
System.out.println("Count of Elements in Vector : " + v.size());
System.out.println("Current Vector Capacity : " + v.capacity());
for(int i = 0; i < v.size(); i++){
int n v.get(i);
System.out.println(n);
}
int sum = 0;
for(int i = 0; i < v.size(); i++){
int n = v.elementAt(i);
sum += n;
}
System.out.println("Sum of Vector Elements : " + sum);
}
}
Point 클래스만 다루는 Vector<Point> 컬렉션 활용
- 점 (x, y)를 표현하는 Point 클래스를 만들고, Point의 객체만 다루는 벡터를 작성하라.
import java.util.Vector;
class Point{
private int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
public String toString(){
return "(" + x + "," + y + ")";
}
}
public class PointVectorEx{
public static void main(String[] args){
Vector<Point> v = new Vector<Point>();
v.add(new Point(2,3);
v.add(new Point(-50, 20);
v.add(new Point(30, -8);
v.remove(1);
for(int i = 0; i < v.size(); i++){
Point p = v.get(i);
System.out.println(p);
}
}
}