지네릭스 - 컴파일시 타입을 체크해 주는 기능
예제
ArrayList<Integer> list = new ArrayList<Integer>(); //integer만 들어감
ArrayList<Object> list1 = new ArrayList<Object>(); //모든 형태를 넣으려면
list1.add(10);
list1.add("20");
String i = (String)list1.get(1); //list.get이 Object여서 형변환을 해주어야함
타입변수 - 클래스를 작성 할때 Object대신 타입변수 (E)를 선언함
HashMap의 지네릭스
형태 - HashMap<K,V>
HashMap<String,Value> map = new HashMap<>(); //생성자에는 형을 지정하지않아도됨
map.put("hello",new Value("자바","파이썬"));
지네릭스의 제한
class FruitBox<T extends Fruit> {}
FruitBox<Apple> apple = new FruitBox<Apple>();
interface FruitBox<T extends Fruit>{}
지네릭스 안에 extends라고 명시하면 Fruit의 자손만 타입으로 받을 수 있다.
인터페이스의 경우에도 implent~가 아닌 extends로 한다.
- static멤버에 타입 변수는 사용 불가... (static은 모든 인스턴스에 공통이기 때문에)
class Box<T> {
static T item; } //불가
- 배열 생성할 때 타입 변수 사용불가 , 배열 선언은 가능( new는 확정된 타입만 올수 있음)
class Box<T> {
T[] item; //가능
T[] items = new T[] //불가 new다음에는 확정된 타입만 가능 }
지네릭스 와일드 카드 <?>
와일드 카드 - 타입이 일치하지 않아도 가능
<? extends T > T와 그 자손들만 가능
<? super T> 그 조상들만 가능
<?> 모든 타입이 가능 <? extends Object> 와 동일
ex - ArrayList<? extends Object> list = new ArrayList<Tv>();
지네릭 메서드
지네릭 타입이 선언된 메서드
static <T> String project()
클래스의 타입변수<T>와 메서드의 <T>는 다름 ( 지역변수 , 전역변수)
메서드를 호출할때 타입을 대입
지네릭의 형변환
지네릭타입과 원시 타입간의 형변환은 경고가 뜬다.
지네릭 타입의 제거
컴파일러는 지네릭 타입을 제거하고 필요한 곳에 형변환을 넣음.
'IT 관련 > JAVA' 카테고리의 다른 글
자바 쓰레드 (0) | 2022.08.25 |
---|---|
자바 enum(열거형) , 애너테이션(어노테이션) (0) | 2022.08.23 |
자바 HashMap , TreeMap (0) | 2022.08.14 |
자바 HashSet , TreeSet (0) | 2022.08.11 |
자바 Arrays (0) | 2022.08.11 |