JAVA/자바의 정석

[자바의 정석 - 기초편] 12. (1) 지네릭스 Generics ( 타입 변수 / 용어 / 타입 / 다형성 / Iterator<E> / HashMap<K,V> )

서영22 2023. 12. 13. 03:11

 지네릭스(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));  // 데이터 저장