👩💻 BackEnd/☕️ 자바 [Java]
[자바의 정석] 12-2 ~ 12-5. 타입변수, 대입, 지네릭스 용어, 지네릭스 타입과 다형성
minhe2810
2024. 1. 4. 10:18
12-2 타입 변수
- 클래스를 작성할 때, Object 타입 대신 타입변수(E)를 선언해서 사용.
12-3 타입 변수에 대입하기
- 객체를 생성 시, 타입변수(E) 대신 실제 타입(Tv)을 지정(대입)
ArrayList<Tv> tvList = new ArrayList<Tv>();
- 타입은 참조변수와 생성자에 넣어줘야 하며, 서로 타입이 일치해야한다.
- 타입변수 대신 실제 타입이 지정되면, 형변환 생략 가능
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0); // 형변환 불필요
반환타입이 Tv 타입이니까 형변환을 해줄 필요가 없어졌다.
12-4 지네릭스 용어
class Box<T> {}
대입된 타입 (매개변수화된 타입, parameterized type)
- 객체를 만들 때마다 다른 타입을 넣어줄 수 있다.
Box<String> b = new Box<String>();
Box<Tv> c = new Box<Tv>();
Box<T> 지네릭 클래스. 'T의 Box' 또는 'T Box' 라고 읽는다.
T 타입변수 또는 타입 매개변수. (T는 타입문자)
Box 원시타입 (raw type) - 일반 클래스 -> 지네릭 클래스
12-5 지네릭 타입과 다형성
- 참조변수와 생성자의 대입된 타입은 일치해야한다.
- JDK 1.7 부터는 생성자 부분에는 타입을 생략 가능함!
- 부모의 클래스를 상속을 받은 클래스라 할지라도 에러가 발생한다.
class Product {}
class Tv extends Product {}
ArrayList<Tv> list = new ArrayList<Tv>();
ArrayList<Product> list = new ArrayList<Tv>(); // 타입 불일치로 인한 에러
- 지네릭 클래스간의 다형성은 성립.
- 그래도 대입된 타입은 일치해야한다.
List<Tv> list = new ArrayList<Tv>(); // ArrayList 가 List 를 구현
List<Tv> list = new LickedList<Tv>(); // LinkedList 가 List 를 구현
- 매개변수의 다형성도 성립.
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv()); // 가능!
list.add(new Audio()); // 가능!
매개변수가 부모 클래스인 Product 로 잡히면 그의 자손 객체들도 매개변수로 들어갈 수 있기 때문! (다형성)
하지만, 꺼낼 때는 반환 타입을 맞춰줘야하므로 자손을 꺼낼 경우에는 자손의 타입으로 형변환을 해준 뒤에 꺼내야 한다.
Product p = list.get(0);
Tv t = (Tv) list.get(1);
Audio a = (Audio) list.get(2);
해당 게시글은 유튜브 자바의 정석 영상을 시청한 뒤 개인 공부 기록용으로 작성된 글입니다!