제네릭스 (Generics) <발행 No. 공개 No.> Study/Java2010. 12. 13. 13:25
JDK 1.5 로 업 해서 사용할때 가장 적응 안되고 지금도 잘 모르겠고 이러한 부분이다.
자바의 정석 과 기타 인터넷 자료들을 참고하여 정리해두고 계속 봐야 겠다.
참고사이트 : http://cafe.naver.com/javachobostudy/37197
http://www.ibm.com/developerworks/kr/library/j-jtp04298.html#author
참고서적 : 자바의정석 576p ~
정리시작!
컬렉션클래스 <저장할 객체의 타입> 변수명 = new 컬렉션클래스 <저장할 객체의 타입>();
그리고 이게 좋은게 저장된 객체를 꺼낼 때 형변환이 필요가 없다고 한다. (왜냐하면 이미 알고 있기때문에..)
상위 타입을 지정해서 할 수 도 있고..
ex) 자바의 정석 예제에서 발췌
class Product{}
class Tv extends Product{}
class Audio extends Product{}
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv()); // 컴파일 에러가 발생하지 않는다.
list.add(new Audio()); // 컴파일 에러가 발생하지 않는다.
ArrayList가 Product타입의 객체를 저장하도록 지정하면, 이들의 자손인 Tv와 Audio타입의 객체도 저장할 수 있다.
다만 꺼내올 때 원래의 타입으로 형변환해야 한다.
제네릭스에서도 다형성을 적용해서 아래와 같이 할 수 있다.
List<Tv> tvList = new ArrayList<Tv>(); // 허용
그러나 Product클래스가 Tv클래스의 조상이라 할지라도 아래와 같이 할 수는 없다.
ArrayList<Product> list = new ArrayList<Tv>(); // 허용 안함~!!!
그래서 아래와 같이 메서드의 매개변수 타입이 ArrayList<Product>로 선언된 경우
이 메서드의 매개변수로는 ArrayList<Product>타입의 객체만 사용할 수 있다. 그렇지 않으면 컴파일 에러가 발생한다.
public static void printAll(ArrayList<Product> list){
System.out.println("test");
}
public static void main(String args[]){
ArrayList<Product> productList = new ArrayList<Product>();
ArrayList<Tv> tvList = new ArrayList<Tv>();
printAll(productList);
printAll(tvList); // 컴파일 에러
}
음 그러니까 선언이 된걸로만 사용이 가능하다.!
컬렉션 클랙스 뿐만 아니라 iIterator 에도 적용된다.
'Study > Java' 카테고리의 다른 글
[면접정리]동기화를 자주 사용시 (쓸때없이 사용시) (0) | 2011.01.26 |
---|---|
[면접정리]Beans Pattern의 문제점 (0) | 2011.01.26 |
[면접정리]SQL INJECTION 방어법 (0) | 2011.01.26 |
[면접정리]Garbage Collection (0) | 2011.01.25 |
[면접정리]객체지향에 대해서 설명 (0) | 2011.01.25 |
static 멤버 클래스를 많이 사용하자 (0) | 2010.12.12 |
태그 클래스보다는 클래스 계층을 사용하자 (0) | 2010.12.12 |
타입을 정의할 때만 인터페이스를 사용 (0) | 2010.12.12 |
인터페이스 (0) | 2010.12.11 |
추상 클래스보다는 인터페이스를 사용하자 (0) | 2010.12.09 |