지네릭스(Generics)
컴파일시 타입을 체크해주는 기능 (compile-time type check)
- 객체의 타입 안정성을 높이고 형변환을 생략할 수 있어서 코드가 간결해짐
- 런타임에 발생할 수 있는 에러를 컴파일의 에러로 끌어와서 체크할 수 있게 만듦
// Tv 객체만 저장할 수 있는 ArrayList 생성
ArraysList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컴파일 에러. Tv외 다른 타입은 저장 불가
Tv t = tvList.get(0); // 형변환 불필요. 원래라면 리스트의 반환타입이 Object라서 Tv t = (Tv)tvList.get(0);
타입 변수
지네릭 클래스를 작성할 때, Object타입 대신 타입 변수(E)를 선언해서 사용
타입 변수에 대입하기
- 객체를 생성시, 타입 변수(E) 대신 실제 타입(Tv)을 지정(대입)
// 타입 변수 E 대신에 실제 타입 Tv를 대입
ArrayList<Tv> tvList = new ArrayList<Tv>();
- 타입 변수 대신 실제 타입이 지정되면 형변환 생략 가능
지네릭스 용어
- Box<T> : 지네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽음
- T : 타입 변수 또는 타입 매개변수 (T는 타입 문자)
- Box : 원시 타입 (raw type)
지네릭 타입과 다형성
- 참조 변수와 생성자의 대입된 타입은 일치해야 함
ArrayList<Tv> list = new ArrayList<Tv>(); // OK. 일치
ArrayList<Product> list = new ArrayList<Tv>(); // 에러. 불일치
- 지네릭 클래스간의 다형성은 성립 (여전히 대입된 타입은 일치해야 함)
List<Tv> list = new ArrayList<Tv>(); // OK. 다형성. ArrayList가 List를 구현
List<Tv> list = new LinkedList<Tv>(); // OK. 다형성. LinkedList가 List를 구현
- 매개변수의 다형성도 성립
class Product {}
class Tv extends Product {}
class Audio extends Product {}
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv()); // OK . Product의 자손도 가능
list.add(new Audio()); // OK
< 예제 >
Iterator<E>
클래스를 작성할 때 Object 타입 대신 T와 같은 타입 변수를 사용
HashMap<K,V>
여러개의 타입 변수가 필요한 경우 콤마를 구분자로 선언
HashMap<String, Student> map = new HashMap<String, Student>(); // 생성
map.put("자바왕", new Student("자바왕",1,1,100,100,100)); // 데이터 저장
'JAVA > 자바의 정석' 카테고리의 다른 글
[자바의 정석 - 기초편] 12. (3) 열거형 enum ( 조상 / 멤버 추가 ) (0) | 2023.12.14 |
---|---|
[자바의 정석 - 기초편] 12. (2) 제한된 지네릭 클래스 / 지네릭스의 제약 / 와일드 카드 <?> / 지네릭 메서드 / 지네릭 타입 ( 형변환, 제거 ) (0) | 2023.12.14 |
[자바의 정석 - 기초편] 11. (6) HashMap / Hashtable / Collections 컬렉션 클래스 요약 (0) | 2023.12.13 |
[자바의 정석 - 기초편] 11. (5) HashSet / TreeSet (0) | 2023.12.12 |
[자바의 정석 - 기초편] 11. (4) Arrays / Comparator / Comparable (0) | 2023.12.11 |