달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2010. 12. 13. 13:25

제네릭스 (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{}

// Product클래스의 자손객체들을 저장할 수 있는 ArrayList를 생성

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 에도 적용된다.


:
Posted by 유쾌한순례자