제네릭이란??
데이터의 타입을 일반화한다는 의미
제네릭을 왜 사용하는가?
1.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 지정하는 방법을 말한다.
2.
컴파일시에 미리 타입검사를 시행하게 되면 클래스나 메소드 내부에서 사용하는 객체의 타입 안정성을 높일 수 있음
3.
반환값에 대한 타입 변환 및 타입 검사에 들어가는 코드 생략이 가능해진다.
4.
잘못된 타입이 사용되는 경우 컴파일 에러를 발생시키며,
반환받은 값을 instanceof로 타입 비교하여 다운캐스팅을 할 필요가 없어진다.
제네릭 설정하는방법은?
제네릭 설정은 클래스 선언부 마지막부분에 다아몬드 연산자를 이용하여 작성하게된다.
다이아몬드 연산자 내부에 작성하는 영문자는 관례상 대문자로 한다.
public class GenericTest<T> {
* 다이아몬드 연산자 내부에 작성한 T는 타입 변수라고 부른다.
* 타입 변수를 자료형 대신 사용할 것이다. 가상으로 존재하는 타입이며
* T가 아닌 다른 영문자를 사용해도 무방하다.
* 또한 여러 개의 타입 변수를 작성할때는 ,를 이용해서 여러개 기술할수 도 있다.
* 사용하는 쪽에서 제네릭 클래스 이용할시
* 실제 사용할 타입을 타입변수 자리에 맞춰서 넣어주게 되면 컴파일 시점에 타입이
결정하게된다.
*
*현재 해당 필드는 타입이 결정되지 않은 상태이다.*
private T value;
*메소드를 사용할 때에도 구체적인 타입대신 T를 이용할 수 있다.*
public void setValue(T value) {
this.value = value;
}
--------------------------------------------------------------------------------------
package com.greedy.section01.generic;
public class Application {
public static void main(String[] args) {
GenericTest<String> gt2 = new GenericTest<String>();
gt2.setValue("홍길동");
System.out.println(gt2.getValue());
System.out.println(gt2.getValue() instanceof String);
* jdk 1.7부터 타입 선언 시 타입 변수가 작성되면 타입 추론이 가능하기 때문에
* 생성자쪽의 타입을 생략하고 사용할 수 있게 한다.
* 단, 타입이 명시되지않은 빈 다이아몬드 연산자는 사용해한다.
GenericTest<String> gt3 = new GenericTest();
gt3.setValue("홍길동");
System.out.println(gt3.getValue());
System.out.println(gt3.getValue().charAt(0));
}
}
Java
복사
와일드카드(WildCard)
•
제네릭 클래스 타입의 객체를 메소드의 매개변수로 받을 때 그 객체의 타입을 제한 가능
<?> :제한 없음
<? extends Type>
: 와일드카드의 상한 제한 (Type과 Type의 후손을 이용해 생성한 객체만 매개변수로사용 가능)
<? super Type>
: 와일드카드 하한 제한 (Type과 Type의 부모를 이용해 생성한 객체만 매개변수로 사용 가능)
타입변수에서 인터페이스 상속할 시 주의할점
타입변수에서 인터페이스를 상속할 시 implements 키워드 대신 extends 키워드를 사용한다.
public class RabbitFarm<T extends Animal> 정상
public class RabbitFarm<T extends Rabbit>/*extends Animal*/ {
/*1. 해당클래스는 타입 변수를 작성하여 제네릭 클래스를 만들었다.*/
private T animal;
public RabbitFarm() {
}
public RabbitFarm(T animal) {
this.animal = animal;
}
public void setAnimal(T animal) {
this.animal = animal;
}
public T getAnimal() {
return this.animal;
}
}
Java
복사