지네릭스
하나의 컬렉션에는 하나의 타입 객체만 저장이 가능하다. 그러나 컴파일러는 이를 체크해주지 못하는데 컴파일러가 체크할 수 있도록 해주는 기능이 지네릭스
이다.
선언방식
1
2
3
4
5
6
7
8
9
10
| class A<T>{ // 제네릭 클래스
T a;
public void method(T b){
this.a = b
}
}
public T getString(){
return a;
}
|
1
2
3
4
5
| public static void main(String[] args){
A<String> a = new A<String>();
a.method("java"); // 매개변수는 String타입만 가능
String str = a.getString(); // 반환타입 String으므로 별도의 형변환 필요없음
}
|
제약사항
- 객체 생성 시 참조변수와 생성자의 제네릭 타입이 일치해야한다.
1
2
3
| A<String> a = new A<String>(); //가능
A<String> b = new A<Integer>(); // 불일치로 불가능
A<String> c = new A<>(); //<>에 컴파일러가 자동적으로 String을 넣어 가능
|
1
2
3
4
| class B<T>{
static T iv; //불가
static T m(){} //불가
}
|
- static 메소드의 제네릭 타입은 클래스의 제네릭타입과 다르다. 동명이인같은 것이다.
1
2
3
| class B<T>{
static T m(T v1){}
}
|
- 대입된 타입과 다른 타입의 객체는 추가할 수 없다.
1
2
3
4
| List<String> li = new List<>();
li.add(new String());//가능
li.add("asd"); //가능
li.add(1);//불가능, 제네릭타입이 없으면 컴파일러는 형식 체크 못하고 프로그램 실행됨.
|
extends
extends를 사용하면 extends뒤에 적힌 클래스와 그 자손클래스
로 타입을 제한할 수 있다. 인터페이스도 extends뒤에 적는다. 클래스나 인터페이스를 추가할 땐 &을 사용한다.
1
2
3
4
5
6
7
| class A<T extends Animal>{}
...
A<T> a = new A<Animal>(); //가능
A<T> b = new A<Dog>(); //가능
A<T> c = new A<Cat>(); //가능
A<T> d = new A<Phone>(); //불가능
|
와일드카드 ?
여러가지 타입을 대입할 수 있게 해준다. 단,&은 사용하지 못한다.
타입 변수와 다른점은 타입 변수는 객체가 생성될 때 타입이 정해지지만 와일드카드는 타입이 정해지지 않는다. 범위만 정해질 뿐이다.
| 범위 |
---|
<? extends T> | T와 그 자손클래스만 가능 |
<? super T> | T와 그 조상클래스만 가능 |
<?> | 모든 클래스 가능 |
Comments powered by Disqus.