/ JAVAJUNGSUK

Ch12-2~3. 타입 변수

자바의 정석 기초편

0. 목차



Chapter12. 지네릭스, 열거형, 애너테이션

Ch12 - 2. 타입 변수

Ch12 - 3. 타입 변수 대입하기



Ch12 - 2. 타입 변수


▶ 타입 변수란?

▷ 지네릭 클래스 작성 시, Object 타입 대신 타입 변수<E>를 선언하여 사용
▷ Object 타입 - 일반 클래스 → <E> - 지네릭 클래스
  • 일반 클래스
      public class ArrayList extends AbstractList {
          private transient Object[] elementData;
          public boolean add(Object o) { ... }
          public Object get(int index) { ... }
          ...
      }
    
  • 지네릭 클래스
      public class ArrayList<E> extends AbstractList<E> {
          private transient E[] elementData;
          public boolean add(E o) { ... }
          public E get(int index) { ... }
          ...
      }
    
  • JDK1.5부터 지네릭 클래스로 변경
    • Object는 타입 변수’E’로 작성(타입 변수 변경 가능)



Ch12 - 3. 타입 변수 대입하기


▶ 타입 변수 대입하기란?

▷ 객체 생성 시, 타입 변수 대신 실제 타입을 지정(대입)
// 타입 변수 E 대신 실제 타입 Tv를 대입
ArrayList<E>tvList = new ArrayList<E>();
/* ↓↓↓↓↓
변경
↓↓↓↓↓ */
ArrayList<Tv>tvList = new ArrayList<Tv>();
▷ 타입 변수 대신 실제 타입이 지정되면, 형변환 생략 가능
  • <E>가 있을 때, Object라서 형변환 필요
    ArrayList tvList = new ArrayList();
      
    tvList.add(new Tv());
    Tv t = (Tv)tvList.get(0); // Object 타입을 Tv로 형변환
    
  • <Tv>가 있을 때, 실제 타입이라서 형변환 불필요
    ArrayList<Tv>tvList = new ArrayList<Tv>();
      
    tvList.add(new Tv());
    Tv t = tvList.get(0); // Tv 타입밖에 없으니까 형변환 불필요
    

▶ 실습

<E>로 Tv타입 꺼내보기
package baek;

import java.util.ArrayList;

class Play {
	
	public static void main(String[] args) {
		  ArrayList<E>tvList = new ArrayList<E>();
		  
		  tvList.add(new Tv());
		  Tv t = tvList.get(0); // ERROR!, Object니까 Tv타입으로 안 꺼내짐
		  System.out.println(t);
	}
}

class Tv { }
class Audio { }

// console
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	E cannot be resolved to a type
	E cannot be resolved to a type

	at baek.Play.main(Play.java:8)





<Tv>로 Tv타입 꺼내보기
package baek;

import java.util.ArrayList;

class Play {
	
	public static void main(String[] args) {
		  ArrayList<Tv>tvList = new ArrayList<Tv>();
		  
		  tvList.add(new Tv());
		  Tv t = tvList.get(0);
		  System.out.println(t);
	}
}

class Tv { }
class Audio { }

// console
baek.Tv@4926097b // 오류 안남