목차
자바에서 컬렉션(Collection)은
여려 개의 데이터를 쉽고 효율적으로 저장하기 위한 객체들의 모음이다.
int[] arr = new int[3];
String[] fruits = new String[3];
일반적인 배열은 이렇게 선언된다.
하지만 배열은 크기가 고정되어 있기 때문에, 처음 정한 크기를 넘어서는 데이터를 저장할 수 없다.
예를 들어,
arr[3] = 10;
처럼 배열의 범위를 벗어난 인덱스에 접근하게 될경우 ArrayIndexOutOfBoundsException오류가 발생한다.
하지만 컬렉션을 사용할경우,
List<String> list = new ArrayList<>();
배열처럼 크기를 미리 지정하지 않아도 된다.
list.add("사과");
list.add("딸기");
이런식으로 데이터를 추가하면 컬렉션의 크기가 자동으로 증가한다.
List<String> list = new ArrayList<>(); //<>내부는 생략가능
//데이터 추가
list add("사과")
//데이터 가져오기
System.out.println(list.get(0));
//데이터 삭제
list.remove(1)
//컬렉션의 크기 반환
System.out.println(list.size());
//데이터 검색
System.out.println(list.contains("사과"));
//데이터 수정
list.set(0, "사과");
//모든 데이터 삭제
list.clear();
//데이터 존재 여부 확인
System.out.println(list.isEmpty());
제네릭(Generic)은 클래스나 메서드에서 변수를 선언할때 미리 데이터 타입을 정하는것이 아닌,
사용할 때 타입을 결정하는 기능이다.
미리 변수 타입을 지정해놓으면
다른 타입의 데이터를 사용할 때 코드를 재사용하기 어려워진다.
또한 String타입 으로 선언되어 있는데, 실수로 Integer 로 받을경우와 같은 오류 처리를 할 수 없다.
제네릭을 사용하면 사용할 타입을 컴파일 시기에 결정하기 때문에, 하나의 코드로 여러타입을 처리할 수 있으며 타입 안정성도 높아진다.
public class GenericBox<T>{
//속성
private T item;
//생성자
public GenericBox(T item){
this.item=item;
}
//게터
public T getItem(){
return this.item;
}
public void printItem(T item){ //일반메서드 다운캐스팅을 직접 해줘야하는 번거로음이 있음
System.out.println(item);
}
public <S> void printBoxItem(S item){ //다운캐스팅까지 알아서 해줌
System.out.println(item);
}
}
public class Main{
public static void main(String[] args){
// 1. 재사용 가능(컴파일시 타입소거: T -> Object)
GenericBox<String> strGBox = new GenericBox<>("ABC");
GenericBox<Integer> intGBox = new GenericBox<>(100);
GenericBox<Double> doubleGBox = new GenericBox<>(0.1);
// 2. 타입 안정성 보장(컴파일시 타입소거: 자동으로 다운캐스팅)
String strGBoxItem = strGBox.getItem();
Integer intGBoxItem = intGBox.getItem();
Double doubleGBoxItem = doubleGBox.getItem();
System.out.println("strGBoxItem = " + strGBoxItem);
System.out.println("intGBoxItem = " + intGBoxItem);
System.out.println("doubleGBoxItem = " + doubleGBoxItem);
}
}