지네릭스 (Generics)
-
컴파일이 타입을 체크해주는 기능 (compile - time type check) - JDK1.5
ClassCastException : 형변환 에러 (실행시발생하는에러)
컴파일에러가 더낫다 > 실생시발생에러를 어떻게 컴파일에러 단으로 끌고올수있을까 ? - 실행시발생할에러를 > 컴파일러에서 에러를 뜨게할수있게 하는게 지네릭스
- 형변환생략가능 , 코드 간결가능
- 타입체크 안정성 up,
타입변수
- 클래스를 작성할때 , Object 타입 대신 타입변수(E) 를 선언해서 사용
일반적으로 타입변수는 E, 엘리먼트 (배열의요소) or T Type
- 객체 생성시 ,실제타입을 예 <>를 지정되면 형변환생략가능
다형성
- 참조변수 의 <> 타입과 생성자 의 <>타입이 일치해야함// JDK1.7부터 생성자에 타입지정생략가능
- 조상이여도 타입이안맞으면 자손사용못함
지네릭 클래스
- 인터페이스인(Eatable) 경우에도 exntends 를 사용 // implements X
- 지네릭 클래스에 선언되면 static메서드에서 사용불가 // static메서드 자체에 선언된 것은 가능합니다. iv와 lv의 차이와 비슷하죠. 같은 이름이어도 전혀 다른 것들이죠.
지네릭의 제약
-
타입변수에 대입은 , 인스턴스별로 다르게가능
-
static멤버에 X // static은 모든 인스턴스에 공통이니까
-
타입변수<>로 배열선언만가능; // 객체,배열생성 X new 연산자다음에 T 불가 new 다음 <>뭐가올지아직안정해짐
앞의 동사로 ,변수명으로 어떤 무슨기능구현해놨는지 ,파악하자
와일드카드 <?>
- 서로다른 타입이대입된 지네릭 객체를다루기위한것
- <? extends T> 자손가능
- <? super T> 부모가능
- <?> // 제한없음 <와 >
지네릭 메서드
- 호출할때마다 다른타입대입 할수있게하는것
- 지네릭 클래스의 타입변수 <> 와 ,다른타입변수..( 값은 같아도 ,달라도 된다)
-
이유는 스태틱메서드 내에서 고정된 LV 니까
- 메서드 호출시 타입<>대입해야함 (<>대부분생략가능) // 에러시 클래스, this. 넣으면됨
- Juicer.<Fruit >makeJuice(fruitbox);
지네릭 타입의 형변환
- 지네릭 타입과 원시 타입 서로 형변환가능하지만 , 권장하지않는다 (추후에러가능)
- 지네릭 타입들끼리는 형변환안됨
- 와일드카드<>지네락타입은 형변환가능
지네릭 타입의 제거
- 컴파일러가 알아서 지네릭타입을제거 , 필요한곳에 알아서 형변환 // 하위호환성땜에 / C#은 반대 ;
- 지네릭 타입의 경계제거
Leave a comment