Be ready to study forever - 개발자 꿈나무
[JAVA 문법] 12. Generics 본문
Generics
Generics는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시에 타입체크를 해주는 기능이다. 예를들면 ArrayList는 Object 타입의 모든 클래스를 담을 수 있다. 이런 과정에서 발생할 수 있는 문제는 데이터를 꺼내 올 때 타입이 다른 경우 오류를 낼 수 있는 가능성 이 있기 때문에 ArrayList<String> arrayList = new ArrayList<String> 과 같이 Generics를 활용해서 한가지 타입만 받을 수 있도록 한 것이다.
1. Generics의 선언
위쪽 코드의 경우 발생 할 수 있는 문제는 새 객체를 생성하면 item은 Object클래스이기 때문에 모든 타입의 매개변수를 받을 수 있다. 위에 언급한 것과 같이 이럴 경우 형변환의 문제로 인해 오류 발생 가능성이 크다. 반면에, 아래에 Generic타입 T를 선언해 주면 새 객체를 생성하고 <>안에 원하는 클래스의 타입을 넣으면 그 객체는 매개변수로 한가지 타입만 받게 된다.
*클래스에 generic 타입이 있지만 <>로 선언해주지 않는 경우 Object 타입으로 간주하며 경고 메세지를 받는다.
2. Generics용어
3. Generics의 제한
Generics의 static 변수의 타입이나, static함수의 매개변수는 Generic 타입 변수로 선언할 수 없다. 그리고 T[] arr = T[length]; 처럼 배열은 Generic타입으로 선언할 수 없다.
3. Generic 클래스의 객체 생성과 사용
1. 참조변수와 생성자에 대입된 타입(매개변수화 된 타입)이 일치해야 한다.
2. 참조변수와 생성자에 대입된 타입이 상속관계에 있어도 허용되지 않는다
3. Generic클래스의 타입이 상속관계에 있고 대입된 타입이 같은 것은 허용된다.
4. Generics의 매개변수 타입 제한하기
매개변수 타입을 선언하면 모든 클래스가 매개변수 타입으로 들어올 수 있다. 이를 일정한 타입으로 제한하고 싶다면 <T extends Fruits>처럼 제한 할 수 있다. 이 뜻은, ClassName이라는 클래스를 상속받은 클래스만 타입으로 들어올 수 있다는 뜻이다.
5. 와일드 카드
와일드 카드는 T라는 클래스를 상속받은<? extends T>, 혹은 T라는 클래스가 상속받는<? super T> 클래스들은 자유롭게 타입으로 들어올 수 있게 된다. 여기서 <T extends Fruits>(매개변수 타입제한)와 <? extends Fruits>(와일드카드) 의 차이점은 매개변수 타입제한은 처음에 객체를 선언할 때 들어올 수 있는 클래스를 Fruits클래스를 상속받는 클래스 들로 제한한 것이고, 와일드 카드는 Fruits클래스를 상속받은 클래스들은 모두 한 객체 안에 매개변수로서 들어올 수 있다는 것이다.
이와 같이 static은 <T>매개변수 타입을 받을 수 없지만 (FruitBox<? extends Fruit> box)으로 fruit타입으로 고정해 놓아 static을 사용할 수 있게 만들어 놓았다. 그리고 그 밑에를 보면 알 수 있듯이 Fruit타입을 상속받은 Apple역시 매개변수로 가능하게 되었다.
6. Generic메서드
제네릭 메서드란 매개 변수 타입을 리턴타입, 매개변수의 타입으로 가지는 메서드를 말한다.
쉽게 얘기해서 클래스에서 받은 매개변수 타입을 활용하는 메서드라고 생각하면 된다.
활용방식은 접근제어자 <T> 반환타입<T> function_name(T value ){ }로 작성할 수 있다.
예제
지네릭 메서드의 활용
지네릭 메서드를 활용하면 복잡한 매개변수타입도 핸들링 수월하게 핸들링 할 수 있다.
public static void printAll(ArrayList<? extends Product> list1,
ArrayList<? extends Product> list2){
...
}
public static <T extends Product> void printAll(ArrayList<T> list1,
ArrayList<T> list2){
...
}
//위의 코드와 아래의 코드가 같음
제네릭 타입의 형변환
'Programming > JAVA' 카테고리의 다른 글
[JAVA] Annotation - 에너테이션 (0) | 2020.07.29 |
---|---|
[JAVA 문법] Enums - 열거형 (0) | 2020.07.29 |
[JAVA 문법] Collection Framework - Map (0) | 2020.07.28 |
[JAVA 문법] Collection Framework - Set (0) | 2020.07.28 |
[JAVA 문법]Collection Framework - Lists (0) | 2020.07.28 |