혜야의 코딩스토리

[자바의 정석] 지네릭스 본문

꿈 : 멋진 개발자 🧸/자바의 정석

[자바의 정석] 지네릭스

hyeya_ 2022. 5. 23. 20:53

[지네릭스란?]

(제네릭,제너릭)

-컴파일 시 타입을 체크(강화)해주는 기능(compile-time type check)

-객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여 준다.

 

[지네릭스의 장점]

1.타입 안정성을 제공한다.

2.타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

 

Runtime에러보다 Compile에러가 낫다.

Runtime에러는 프로그램이 죽어버리지만

Compile에러는 수정이 가능하니까!!!!

→ 프로그래머가 실수할 수 있는 에러 중에서 어떤 것들을 컴파일 에러로 끌어올 수 있는가??

☆ 컴파일러에게 타입정보를 더 주고 컴파일 에러로 끌어오는 것이 지네릭스!!

 

[타입 변수]

-지네릭스 클래스를 작성할 때, Object타입 대신 타입 변수(E)를 선언해서 사용.

 

[타입 변수에 대입하기]

-객체 생성시, 타입변수(E)대신 실제 타입(Tv)을 지정(대입)

-타입 변수 대신 실제 타입이 지정되면, 형변환 생략가능

 

[지네릭스 용어]

Box<T> : 지네릭 클래스, ‘TBox’또는 ‘T Box’라고 읽는다.

T : 타입 변수 또는 매개변수. (T는 타입 문자)

Box : 원시 타입(raw type)

 

[지네릭 타입과 다형성]

1. 참조변수와 생성자에 대입된 타입은 일치해야 한다.

class Product{ }

class Tv extends Product{ }

class Audio extends Product{ }

→ 지네릭스의 데이터타입은 조상, 자손인 상속관계여도 타입 매개변수는 일치해야 함

ArrayList<Tv>             list = new ArrayList<Tv>( ); //OK. 일치

ArrayList<Product>   list = new ArrayList<Tv>( );   //에러. 불일치

 

2. 지네릭 클래스 간의 다형성은 성립 (여전히 대입된 타입은 일치해야 함)

List<Tv> list = new ArrayList<Tv>( );  //OK. 다형성. ArrayList가 List를 구현

List<Tv> list = new LinkedList<Tv>( ); //OK. 다형성. LinkedList가 List를 구현

 

3. 매개변수의 다형성도 성립.

ArrayList<Product> list = new ArrayList<Product>( );

list.add(new Product( ));

list.add(new Tv( ));        //OK. Product자손이니까

list.add(new Audio( ));   //OK.

add메서드를 보면

boolean add(E e) {…} => boolean add(Product e) {…}

//다형성에 의해 Product객체와 그 자손 객체가 가능한 것..

 

[제한된 지네릭 클래스]

-extends로 대입할 수 있는 타입을 제한

-인터페이스인 경우에도 extends를 사용

 

[지네릭스의 제약]

-타입 변수에 대입은 인스턴스 별로 다르게 가능

-static멤버에 타입 변수 사용 불가

-객체, 배열 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능

(new연산자 뒤에 타입 변수 사용불가~)

 

[와일드 카드<?>]

-하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능

<? extends T> 와일드 카드의 상한 제한. T와 그 자손들만 가능 ->가장 많이 쓰임

<? super T> 와일드 카드의 하한 제한. T와 그 조상들만 가능

<?> 제한 없음. 모든 타입이 가능 <? extends Object>와 동일

-메서드의 매개변수에 와일드 카드를 사용