728x90
제네릭(지네릭, Generics)
- 컴파일 시 타입을 체크해주는 기능(compile-time type)
//Tv객체만 저장할 수 있는 ArrayList를 생성
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
// tvList.add(new Audio()); //컴파일 에러. Tv 외 다른 타입 불가
package chapter12;
import java.util.ArrayList;
public class Study01Test1 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(10);
list.add(20);
list.add("30"); //String 추가
// Integer integer = (Integer)list.get(2); //컴파일 OK(컴파일러 한계)
System.out.println(list); //형변환 에러(실행시 발생하는 에러)
//수정
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(10);
list1.add(20);
// list1.add("30"); //String 추가. 컴파일 에러
list1.add(30); //타입 체크가 강화됨
Integer integer1 = list1.get(2); //형변환 생략 가능
System.out.println(list);
}
}
- 객체의 타입 안정성을 높임(ClassCastException)
- 형변환의 번거로움을 줄여줌 → 코드의 간결화
- 컴파일 에러 > 런타임에러 => 수정 가능하기 때문
String str1 = null;
String str2 = ""; //빈문자열
str1.length(); //NullPointException
str2.length(); //0
타입 변수
- 클래스를 작성할 때, Object 타입 대신 타입 변수(E)를 선언해서 사용
※Type(T), E(Element). 타입 변수는 대문자 한글자로 선언
타입 변수에 대입
- 객체 생성 시, 타입 변ㅅ누(E) 대신 실제 타입(ex Tv)을 지정(대입)
ex) ArrayList<Tv> tvList = new ArrayList<Tv>(); - 참조 변수와 생성자에 작성, 참조 변수와 생성자에 작성하는 타입 변수는 일치해야함
- 타입 변수 대신 실제 타입이 지정되면, 형 변환 생략 가능
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(index); //형변환 불필요
package chapter12;
import java.util.ArrayList;
class TvS2T1{
}
class AudioS2T1{
}
public class Study02Test1 {
public static void main(String[] args) {
ArrayList<TvS2T1> list = new ArrayList<TvS2T1>(); //Tv 타입의 객체만 저장 가능
list.add(new TvS2T1());
// list.add(new AudioS2T1());
TvS2T1 tvS2T1 = list.get(0);
}
}
제네릭 용어
- Box<T>
제네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽음 - T
타입 변수 또는 타입 매개변수.(T는 타입 문자) - Box
원시 타입(raw type). 일반 클래스 -> 제네릭 클래스 - 제네릭 클래스 선언
class Box<T>{} - 제네릭 타입 호출
Box<String> b = new Box<String>();
String 대입된 타입(매개변수화된 타입, parameterized type). 생성할 때마다 바뀔 수 있음
제네릭 타입과 다형성
- 참조 변수와 생성자의 대입된 타입은 일치해야함
Array<Tv> list = new ArrayList<Tv>();
ArrayList<Product> list = new ArrayList<Tv>(); //에러 - 제네릭 클래스 간의 다형성은 성립(단, 대입된 타입은 일치해야함)
List <Tv> list = new ArrayList<Tv>(); //ArrayList가 List를 구현(다형성)
List<Tv> list = new LinkedList<Tv>(); //LinkedList가 List를 구현(다형성) - 매개변수의 다형성도 성립
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv());
list.add(new Audio());
package chapter12;
import java.util.ArrayList;
import java.util.List;
class ProductS3T1{}
class TvS3T1 extends ProductS3T1{}
class AudioS3T1 extends ProductS3T1{}
public class Study03Test1 {
public static void printAll(ArrayList<ProductS3T1> list) {
for(ProductS3T1 productS3T1 : list) {
System.out.print(productS3T1);
}
}
public static void main(String[] args) {
ArrayList<ProductS3T1> productList = new ArrayList<ProductS3T1>();
ArrayList<TvS3T1> tvList = new ArrayList<TvS3T1>();
// ArrayList<ProductS3T1> tvList = new ArrayList<TvS3T1>(); //에러
// List<TvS3T1> tvList = new ArrayList<TvS3T1>(); //가능. 다형성
productList.add(new TvS3T1());
productList.add(new AudioS3T1());
tvList.add(new TvS3T1());
tvList.add(new TvS3T1());
printAll(productList);
// printAll(tvList); //컴파일 오류 발생
}
}
728x90