Post

지네릭스

지네릭스

하나의 컬렉션에는 하나의 타입 객체만 저장이 가능하다. 그러나 컴파일러는 이를 체크해주지 못하는데 컴파일러가 체크할 수 있도록 해주는 기능이 지네릭스이다.

  • 타입 안정성 제공
  • 타입체크와 형변환 생략 가능

선언방식

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을 넣어 가능 


  • static멤버에는 제네릭 타입사용 불가
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와 그 조상클래스만 가능
<?>모든 클래스 가능


This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.