/ JAVAJUNGSUK

Ch12-1. Generics

자바의 정석 기초편

0. 목차



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

Ch12 - 1. Generics



Ch12 - 1. Generics


▶ 지네릭스(Generics)란?

▷ 컴파일 시, 타입을 체크 해 주는 기능(compile-time type check) - JDK1.5부터
▷ ArrayList - Object[] - 모든 종류 객체 저장 가능
▷ ArrayList - String[] - String 객체만 저장 가능
ArrayList<Tv>tvList = new ArrayList<Tv>(); // 지네릭스 설정

tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컴파일에러! Tv 외 다른 타입은 저장 불가
  • 지네릭스 無
    ArrayList tvList = new ArrayList();
      
    tvList.add(new Tv());
    Tv t = (Tv)tvList.get(0); // Object 타입을 Tv로 형변환
    
  • 지네릭스 有
    ArrayList<Tv>tvList = new ArrayList<Tv>();
      
    tvList.add(new Tv());
    Tv t = tvList.get(0); // Tv 타입밖에 없으니까 형변환 불필요
    


▶ 실습

▷ ArrayList에 10, 20, “30” 넣기
ArrayList list = new ArrayList();

list.add(10);
list.add(20);
list.add("30");

System.out.println(list);

// console
[10, 20, 30]
▷ list에서 “30” -(Integer)→ 30 으로 꺼내기
ArrayList list = new ArrayList();

list.add(10);
list.add(20);
list.add("30");

Integer i = (Integer)list.get(2); // 컴파일러 체크 통과

System.out.println(list);

// console
형변환 에러 발생 : 실행  발생 에러
컴파일이 볼 때, -list [10, 20, 30]→ Object[] 배열 Object를 Integer로 꺼내기? OK
  • 컴파일러의 한계 : 실제로는 뭐가 들어있는지 볼 수 없음
실행 중 보니까, -list [10, 20, 30]→ list[2] = Object가 아닌 String! ERROR!
실행 시 에러는 프로그램을 죽여버림
그래서 최대한 실행 시 발생 에러보다 컴파일 에러로 드러나게 하는 게 좋음 → 지네릭스


▷ Integer 지네릭스 사용하여 10, 20, “30” 넣기
ArrayList<Integer> list = new ArrayList<Integer>(); // Integer만 들어갈 수 있는 ArrayList

list.add(10);
list.add(20);
list.add("30"); // 컴파일 에러!
  • 지네릭스 설정 → 애초에 String은 들어가지도 않음
▷ Object 지네릭스 사용하여 10, 20, “30” 넣기
ArrayList<Object> list = new ArrayList<Object>();

list.add(10);
list.add(20);
list.add("30");

String i = (String)list.get(2); // 컴파일러가 볼 때는 Object니까 String으로 형변환 해 줘야 함

System.out.println(list);
System.out.println(i);

// console
[10, 20, 30]
30
  • <Object>
    • JDK1.5 이전 지네릭스 생략 가능
    • JDK1.5 이후 지네릭스 생략 불가
  • 일반 클래스 ArrayList -JDK1.5→ 지네릭 클래스 ArrayList<E>
    public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    
    • 클래스 내 Object 타입이 있는 클래스만 지네릭 클래스로 변경

▶ 지네릭스의 장점

▷ 타입 안정성 제공
  • Class Cast Exception : 형변환 에러 예방
▷ 타입 체크와 형변환을 생략하여 코드가 간결해짐


▶ 지네릭스 = 실행 중 에러를 컴파일 시 에러로 끌어오는 것

▷ 실행 중 에러 예방 예시

String str1 = ""; // 0
String str1 = null; // NullPointerException 발생