제네릭이 자바에서 아주 중요하다.
과연 제네릭이 뭘까?
제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이다.
타입을 파라미터화 해서 컴파일시 구체적인 타입이 결정되도록 하는것이다. (자바 5부터 추가된 기능)
어렵다.
제네릭은 컬렉션에 널리 사용된다. 간단하게 컬렉션 ArrayList와 List를 통해 알아보자.
// ArrayList
ArrayList<String> arrList = new ArrayList<String>();
// List
List<Integer> list = new ArrayList<Integer>();
현재 ArrayList를 보면 <>안에 String , List의 <>안에Integer가 들어가 있다.
이 <>를 제네릭이라고 하는데, 이 <>에 어떠한 타입을 선언해주어 해당 ArrayList, List등이 사용할 객체의 타입을
지정해준다는 뜻이다. <T> 이런 것을 타입 파라미터라고 한다.
즉, 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 할 필요가 없게하고, 내가 사용하고 싶은 데이터 타입만
사용할 수 있게 해준다는 것이다.
public class Generics {
public static void main(String[] args) {
ArrayList<Sports> arrList = new ArrayList<Sports>();
arrList.add(new Sports());
arrList.add(new Soccer());
arrList.add(new Baseball());
Sports sports = arrList.get(0);
Soccer soccer = (Soccer) arrList.get(1);
}
}
class Sports{}
class Soccer extends Sports{}
class Baseball extends Sports{}
"제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이다."
에서 위 예제의 클래스 내부는 ArrayList클래스가 될것이고 외부에서 결정한 데이터 타입이 Sports가 되는것이다.
그렇다면 ArrayList 클래스를 추측해볼수가있다.
ArrayList <T>{ ~~ } 라는것을 추측을 해볼수가 있다.
제네릭 사용시 장점
1. 타입의 안정성 - 의도하지 않은 타입의 객체가 저장되는 것을 막고, 다른 타입의 객체로 인한 타입형태가 맞지 않아
발생하는 문제를 없애준다. (컴파일시 강한 타입체크를 할수 있다.)
2. 불필요한 형변환을 줄여 코드가 간결함 - 타입을 미리 명시함으로서 다른 타입의 객체가 저장되지 않아서 객체를
꺼내 사용할때 형변환으로 타입을 맞출 필요가 없어서 코드가 간결해진다.
비제네릭 - public class Box{} 은 안보이지만 아래처럼 extends Object가 생량되어있는것이다.
이렇게 되면 아래처럼 사용시 빈번한 타입변환이 발생되며 성능이 저하된다.
모든 객체는 Object의 자식이므로 모두 넣을수 있지만 빼서 사용할때는 형변환을 꼭해야한다. (비효율적)
타입 파라미터 T를 만들어도 box 생성시 타입을 구체적으로 정하지 않으면 자동으로 <Object>가 붙는다.
효율적인 제네릭 사용법