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 이후 지네릭스 생략 불가
- JDK1.5 이전 지네릭스 생략 가능
일반 클래스 ArrayList -JDK1.5→ 지네릭 클래스 ArrayList<E>
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- 클래스 내 Object 타입이 있는 클래스만 지네릭 클래스로 변경
- 클래스 내 Object 타입이 있는 클래스만 지네릭 클래스로 변경
▶ 지네릭스의 장점
▷ 타입 안정성 제공
- Class Cast Exception : 형변환 에러 예방
▷ 타입 체크와 형변환을 생략하여 코드가 간결해짐
▶ 지네릭스 = 실행 중 에러를 컴파일 시 에러로 끌어오는 것
▷ 실행 중 에러 예방 예시
String str1 = ""; // 0
String str1 = null; // NullPointerException 발생