혜야의 코딩스토리
[자바의 정석] 지네릭스 본문
[지네릭스란?]
(제네릭,제너릭)
-컴파일 시 타입을 체크(강화)해주는 기능(compile-time type check)
-객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여 준다.
[지네릭스의 장점]
1.타입 안정성을 제공한다.
2.타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.
Runtime에러보다 Compile에러가 낫다.
Runtime에러는 프로그램이 죽어버리지만
Compile에러는 수정이 가능하니까!!!!
→ 프로그래머가 실수할 수 있는 에러 중에서 어떤 것들을 컴파일 에러로 끌어올 수 있는가??
☆ 컴파일러에게 타입정보를 더 주고 컴파일 에러로 끌어오는 것이 지네릭스!!
[타입 변수]
-지네릭스 클래스를 작성할 때, Object타입 대신 타입 변수(E)를 선언해서 사용.
[타입 변수에 대입하기]
-객체 생성시, 타입변수(E)대신 실제 타입(Tv)을 지정(대입)
-타입 변수 대신 실제 타입이 지정되면, 형변환 생략가능
[지네릭스 용어]
Box<T> : 지네릭 클래스, ‘T의 Box’또는 ‘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>와 동일
-메서드의 매개변수에 와일드 카드를 사용
'꿈 : 멋진 개발자 🧸 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] 쓰레드 (0) | 2022.05.23 |
---|---|
[자바의 정석] 컬레션 프레임웍(collections framework) (0) | 2022.05.23 |
[자바의 정석] java.rang패키지와 유용한 클래스/ 날짜와 시간 & 형식화 (0) | 2022.05.23 |
[자바의 정석] 예외처리 (0) | 2022.05.14 |
[자바의 정석] 객체지향개념 수기 정리 :) (2) | 2022.05.08 |