제네릭(Generic, 일반화)
-객체에서 사용할 데이터타입을 클래스 정의 시점에서 미리 명시하지 않고,
객체를 실제 사용하는 시점에서 데이터타입을 지정하는 것.
= 클래스 내의 데이터타입을 객체 생성 시 변경할 수 있도록 하는 것
-클래스 또는 인터페이스명 뒤에 <> 기호를 붙이고 해당 기호 사이에 제네릭타입으로 사용할 데이터타입을 명시
=> 주의! 참조 데이터타입만 지정 가능하다! (기본 데이터타입은 Wrapper 클래스 타입으로 대체)
<제네릭 타입 지정 기본 문법>
클래스명<제네릭타입명> 변수명 = new 클래스명<제네릭타입명>();
ex) List<lnteger> list = new ArrayList<Integer>();
=> List 객체의 Object 타입 파라미터가 integer 타입으로 변경됨
제네릭 타입을 지정하지 않은 ArrayList 객체 사용
List list = new ArrayList();
제네릭 타입을 미 지정 시 기본적으로 임시 데이터타입이 object로 고정되는데
대부분이 메서드 파라미터에 오브젝트 타입이 사용되므로 모든 데이터타입의 데이터를 사용할 수 있다.
=> 데이터 저장시 편리할 수 있지만, 데이터를 꺼내서 사용할 때
해당 데이터타입을 각각 판별하지 않을 경우 오류 발생 가능성이 있음.
Collection API들은 대부분 제네릭 타입을 사용하여 정의되어 있으므로
인스턴스 생성 시점에서 제네릭 타입에 사용할 데이터타입을 지정하면
Object 타입 대신 파라미터 타입이 지정된 타입으로 변경됨
따라서, 데이터 저장 시점에서 잘못된 데이터 판별이 가능하며
데이터를 사용하는 시점에서는 별도의 판별없이 지정된 타입을 사용해도 오류가 발생하지 않는다.
List<Integer> list2 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
//제네릭 타입을 Integer로 지정할 경우
//내부의 Object 타입 파라미터가 integer 타입으로 변경됨
//=> 따라서, 정수 외의 다른 데이터타입은 사용 시점에서 바로 오류가 발견됨.
list2.add(1);
list2.add(2);
//list2.add(3.14); // 컴파일 시점에서 잘못된 데이터 발견 가능
//list2.add("Four"); // 컴파일 시점에서 잘못된 데이터 발견 가능
list2.add(3);
for(int i = 0; i < list2.size(); i++) {
// 제네릭 타입을 Integer 타입으로 지정했으므로
// get() 메서드를 통해 데이터를 꺼낼 때 별도의 판별 또는 형변환 없이
// 바로 int형 변수에 저장 가능 = int형 데이터만 저장되었기 때문
int data = list2.get(i); // 타입 판별, 형변환 불필요
System.out.println("정수 : " + data);
}
제네릭을 사용한 클래스(인터페이스) 정의
-클래스 정의 시점에서 클래스명 뒤에 <> 기호를 사용하여 "가상의 자료형" 명시
=> 보통 1글자의 영문 대문자를 사용(주로 E(Element) 또는 T(Type) 사용)
-가상의 자료형이므로 클래스 정의 시점에서는 정확한 자료형을 알 수 없음
=> 클래스 내에서 실제 자료형 대신 임시 자료형을 지정 가능
- 해당 클래스의 인스턴스를 생성하는 시점에서 가상의 자료형을 대체할 자료형을
제네릭 타입으로 지정하면 해당 자료형으로 대체됨
class GenericClass<T> {
// 이 클래스 내에서는 T 라는 이름이 자료형으로 사용되어 질 수 있다!
// => 결정되지 않은 자료형으로, 인스턴스 생성 시 대체됨
T member;
public T getMember() {
return member;
}
public void setMember(T member) {
this.member = member;
}
}
// 사용할 데이터에 대한 타입을 미리 지정하여 클래스를 정의하는 일반 클래스
class NormalClass {
Object member; // 저장 가능한 데이터타입 : 모든 타입(미리 결정됨)
public Object getMember() {
return member;
}
public void setMember(Object member) {
this.member = member;
}
}
class MemberBean {
int num;
String name;
public MemberBean(int num, String name) {
super();
this.num = num;
this.name = name;
}
}
'develop > Java' 카테고리의 다른 글
예외(Exception) (0) | 2021.04.12 |
---|---|
중첩 클래스 (0) | 2021.04.12 |
Collection Framework(컬렉션 프레임워크) (0) | 2021.04.04 |
java.lang / java.util (0) | 2021.03.23 |
StringBuilder, StringBuffer 클래스 (0) | 2021.03.23 |