제네릭
인스턴스(객체)화 시에 다룰 데이터 타입을 확정하여 명시한다.
다양한 타입의 객체들을 다루는 메서드나 클래스에 컴파일 시의 타입 체크를 해주는 기능
다룰 객체의 타입을 미리 명시하여 객체의 형 변환 불필요 (불러올때 형 변환이 필요없음)
List<?> test = new ArrayList<참조타입>();
//와일드 카드라고 하며, 아무 참조타입 대입가능
List<참조타입> test = new ArrayList<참조타입>();
// 위와 같은 지정된 참조타입으로만 데이터 저장과 호출 가능
▶ 제네릭의 장점
- 타입의 안정성
- 형 변환 작업 필요하지 않음.
- 코드가 더 간결해진다. 형 변환 코드 생략으로 인해
▶ 제네릭 다형성
슈퍼클래스가 참조타입으로 올 수 있는 형태로 제네릭도 사용이 가능하다.
클래스, 인터페이스도 활용이 가능하다.
List<? extends 슈퍼클래스> test = new ArrayList<서브클래스>();
// 슈퍼클래스 참조타입으로 슈퍼클래스 상속받은 서브클래스 전체 대입가능
List<? super 서브클래스> test = new ArrayList<서브클래스 및 슈퍼클래스>();
// 해당 서브 클래스 참조타입으로 해당 서브클래스와 슈퍼클래스 대입가능
<!> 제네릭 변수 표기
T : type(자료형)
E : Element(배열 혹은 집합)
K : key
V : value
제네릭 실습
List<String> list = null;
list = new ArrayList<String>();
//list = new ArrayList<integer>(); //타입이 달라 에러발생
list.add("홍길동");
String getData = list.get(0);
참조타입 부분의 제네릭 선언 부분과 인스턴스화시 제네릭 선언부분 참조타입이 동일해야 한다.
참조타입 부분의 제네릭 선언 부분과 인스턴스화시 제네릭 선언 부분 참조타입이 다를시 에러가 발생한다.
값을 넣을 때에는 제네릭에 선언된 참조타입으로만 값을 선언하며,
값을 호출할 때에도 제네릭에 선언된 참조타입으로만 값을 호출한다.
제네릭의 참조타입 중 <?> 타입은 모든 타입을 허용한다.
List<?> list = null;
▶ 제네릭을 활용한 다형성
interface MyIn{}
class My implements MyIn{}
List<? extends MyIn> myList = null;
List<My> my = new ArrayList<My>();
my.add(new My());
myList = my;
MyIn getMy = myList.get(0);
서브클래스를 리스트로 담는다.
슈퍼클래스를 리스트에 담아 인스턴스화 한다.
제네릭이 슈퍼클래스로 선언된 리스트에 업케스팅 된다.
슈퍼클래스가 참조타입으로 하여 서브클래스를 호출 가능하다.
'JAVA' 카테고리의 다른 글
컨넥션 풀 (0) | 2020.05.14 |
---|---|
JVM (JAVA VIRTUAL MACHAIN) (0) | 2020.05.14 |
필터 (Filter) (0) | 2020.05.12 |
Servlet (서블릿) (0) | 2020.05.08 |
인터페이스 (0) | 2020.05.07 |