👩‍💻 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);

 

 

해당 게시글은 유튜브 자바의 정석 영상을 시청한 뒤 개인 공부 기록용으로 작성된 글입니다!