카테고리 없음

[명품 Java Programming] 7장 제네릭과 컬렉션

pental 2022. 6. 17. 14:33

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

컬렉션 (Collection)은 안드로이드를 비롯한 자바 프로그램을 작성하는데 빼놓을수 없는 중요한 도구이다.

컬렉션은 대체로 다음과 같이 설명 할 수 있다.

  • Element 객체들의 저장소
  • 고정 크기의 배열을 다루는 어려움 해소
  • 다양한 객체들의 삽입, 삭제, 검색 등의 관리 용이

배열의 경우 여러 개의 데이터를 다루는 데 편리한 자료 구조이지만, 삽입 삭제가 빈번하게 일어나며, 데이터의 크기를 예측 할 수 없는 응용프로그램에서 사용하기에는 불편하다.

배열 )

  • 고정 크기 이상의 객체를 관리할 수 없다.
  • 배열의 중간에 객체가 삭제되면 응용프로그램에서 자리를 옮겨야 한다.

컬렉션 )

  • 가변 크기로서 객체의 개수를 염려할 필요 없다.
  • 컬렉션 내의 한 객체가 삭제되면 컬렉션이 자동으로 자리를 옮겨준다.

컬렉션은 제네릭(Generics)이라는 기법으로 구현되어 있으며 컬렉션의 경우 배열이 가진 고정 크기의 단점을 극복하기 위해서 객체들을 쉽게 삽입, 삭제, 검색할 수 있는 가변 크기의 컨테이너로 구성되어있다.


정리하자면,

  • 컬렉션은 제네릭 기법으로 구현됨
  • 컬렉션의 요소는 객체만 가능하다.
    • 기본적으로 int, char, double 등의 기본 타입은 사용 불가능하다.
  • 제네릭
    • 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화 시키는 기법
      • <E>, <K>, <V> : 타입 매개 변수, 즉 요소 타입을 일반화 한 타입
    • 제네릭 클래스 예시
      • 제네릭 스택 : Stack <E>
        • E에 특정 타입으로 구체화
        • 정수만 다루는 스택 Stack <Integer>
        • 문자열만 다루는 스택 Stack <String>

제네릭의 기본 개념

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);
        }
    }
}