2023.10.31 - [JAVA] - [JAVA] 제네릭(Generic, 일반화) - 1
Object 타입을 사용하여 관리하는 데이터는 Object 타입으로 저장 가능
Object o = nc.getData();
➡️만약, Onject 타입을 실제 데이터타입으로 변환하는 경우 잘못된 타입 변환(다운캐스팅)으로인해 ClassCastException 발생 가능
➡️ 다운캐스팅 필요
String name = (String)o;
➡️String 타입이 아닌 다른 타입 데이터가 저장된 경우 예외 발생하므로 변환 전 반드시 instanceof 연산자를 통한 타입 체크 필수
제네릭을 사용한 클래스 정의
- 클래스 정의 시점에서 클래스명 뒤에 <> 기호를 사용해서 "가상의 자료형" 명시 => 가상의 자료형은 보통 1글자 영문 대문자 사용(주로 E 또는 T 사용)
- 가상의 자료형은 클래스 정의 시점에서 정확한 자료형을 명시하지 않지만 클래스 정의 시점에서 데이터타입 대신 사용 가능
- 해당 클래스의 인스턴스 생성 시점에서 가상의 자료형을 대신할 실제 자료형을 지정하면 클래스 내의 가상의 자료형이 실제 자료형으로 대체됨 => 즉, 인스턴스 생성 시점에서 어떤 자료형으로도 변형 가능함
class GenericClass<T> {
// 클래스 내에서 데이터타입 대신 제네릭 타입 T를 타입으로 지정 가능함
T member; // 멤버변수 member 의 데이터타입이 T 로 지정됨(실제 데이터타입X)
public T getMember() {
return member;
}
public void setMember(T member) {
this.member = member;
}
}
제네릭 타입 사용 시 주의사항
- static 멤버 내에서 제네릭 타입 파라미터 사용 불가
✔️제네릭 타입은 인스턴스 생성 시점에서 실제 데이터타입으로 변환되는데 static 멤버는 인스턴스 생성 시점보다 먼저(클래스 로딩 시점) 로딩되므로 데이터타입이 지정되지 않은 상태이기 때문에 사용이 불가능함! - new 연산자 사용 시 제네릭 타입 파라미터 사용 불가!
- instanceof 연산자 사용 시 제네릭 타입 파라미터 사용 불가!
class GenericClass2<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public void compare() {
Object o = new Object();
}
}
➡️static 멤버변수에 제네릭타입 파라미터 사용 불가
➡️인스턴스 생성 시점보다 먼저 메모리에 로딩되므로 타입 변경 불가능
➡️인스턴스 생성(new) 시 제네릭타입 파라미터로 생성자 호출 불가!
➡️컴파일 시점에서 생성자 타입이 확인 불가능하므로 사용할 수 없다!
➡️static 메서드에 제네릭 타입 파라미터 사용 불가!
➡️인스턴스 생성 시점보다 먼저 메모리에 로딩되므로 타입 변경 불가능
➡️instanceof 연산자에 제네릭타입 파라미터 사용 불가!
➡️컴파일 시점에서 T 의 데이터타입 확인이 불가능하므로 true, false 를 미리 판별할 수 없으며, 형변환 등의 수행이 불가능!
'JAVA' 카테고리의 다른 글
[JAVA] 익명(anonymous) 객체 (2) (0) | 2023.11.14 |
---|---|
[JAVA] 익명(anonymous) 객체 (1) (1) | 2023.11.14 |
[JAVA] 제네릭(Generic, 일반화) - 1 (0) | 2023.10.31 |
[JAVA] enum type (2) (0) | 2023.10.31 |
[JAVA] enum type (1) (1) | 2023.10.31 |