-
Java 제네릭(Generic) 정리(3)_generic의 extends, super, wildcardJava 2023. 8. 11. 20:06
generic의 extends, super, wildcard
- extends 예시
- <K extends T> : T와 T의 자손 타입만 가능 (K는 들어오는 타입으로 지정 됨) - 상한 경계
- 상한 경계인 extends 뒤에 오는 타입이 최상위 타입으로 한계가 정해지는 것이다.
- Integer, Long, Byte, Double, Float, Short 같은 수를 표현하는 래퍼 클래스만으로 제한하고 싶은 경우 Number 클래스를 상속
class A {} class B extends A {} class D extends A {} class C extends B {} class E extends D {} <T extends B> // B와 C타입만 올 수 있음 <T extends E> // E타입만 올 수 있음 <T extends A> // A, B, C, D, E 타입이 올 수 있음 /* Integer, Long, Byte, Double, Float, Short 같은 수를 표현하는 래퍼 클래스만으로 제한하고 싶은 경우, Number 클래스를 상속 */ public class NumClass <K extends Number> {} public class Main { public static void main(String[] args) { NumClass<Integer> temp1 = new NumClass<Integer>(); NumClass<String> temp2 = new NumClass<String>(); // Bound mismatch error } }- super 예시
- <K super T> : T와 T의 부모(조상) 타입만 가능 (K는 들어오는 타입으로 지정 됨) - 하한 경계
- 하한 경계인 super 뒤에 오는 타입이 최하위 타입으로 한계가 정해지는 것이다.
- 클래스를 상위 타입으로 자료를 조작할 때 사용한다. (업캐스팅)
- 더 큰 범위인 상위 타입을 가지고 코드를 작성
class A {} class B extends A {} class D extends A {} class C extends B {} class E extends D {} <K super B> // B와 A타입만 올 수 있음 <K super E> // E, D, A타입만 올 수 있음 <K super A> // A타입만 올 수 있음- generic의 와일드카드
- <?> = <? extends Object>
- Object는 모든 API 및 클래스의 최상위 타입으로 어떤 타입이든 상관 없다는 의미를 가진다.
- 데이터가 아닌 기능에 초점을 맞춘 경우에는 <?>를 사용한다.
- 와일드 카드와 특정 타입의 차이점
- Number와 이를 상속하는 Integer, Short, Double, Long 등의 타입이 지정될 수 있으며, 객체 혹은 메소드를 호출 할 경우 K는 지정된 타입으로 변환이 된다.
- <K extends Number>
- Number와 이를 상속하는 Integer, Short, Double, Long 등의 타입이 지정될 수 있으며, 객체 혹은 메소드를 호출 할 경우 지정 되는 타입이 없어 타입 참조를 할 수는 없다.
- <? extends T> // T와 T의 자손 타입만 가능
- Number와 이를 상속하는 Integer, Short, Double, Long 등의 타입이 지정될 수 있으며, 객체 혹은 메소드를 호출 할 경우 K는 지정된 타입으로 변환이 된다.
* Generic 장점
- 잘못된 타입이 들어올 경우 컴파일 단계에서 방지할 수 있다.
- 관리가 편하고 코드의 재사용성이 증가한다.
* Generic 단점
- generic을 이해하기 어렵다.
- 계층구조가 복잡해지면 어려워진다.
* 응용 예제
- <E extends Comparable<? super E>> = "E 자기 자신 및 조상 타입과 비교할 수 있는 E" 의미한다.
- "E 타입 또는 E 타입의 슈퍼클래스가 Comparable을 의무적으로 구현해야한다" 라는 의미
// 2. Comparable<? super E>의 하위 타입이어야 하므로 Comparable가 구현되어야한다. // 3. <? super E>를 보면 E를 포함한 상위 타입 객체가 올 수 있다. (Comparable 구현부) public class SampleClass <E extends Comparable<? super E>> { // code.. } public class SuperClass { // code.. } public class TempClass extends SuperClass implements Comparable<SuperClass> { // 4. E(TempClass) 보다 상위 객체(SuperClass)가 온다면 제대로 정렬이 안되거나 에러가 날 가능성이 있기 때문에 <? super E>로 보호한다. @Override public int compareTo(SuperClass o) { // code.. }; } public class Main { public static void main(String[] args) { // 1. SampleClass의 E는 TempClass가 되어야한다. SampleClass<TempClass> a = new SampleClass<TempClass>(); } }출처)
'Java' 카테고리의 다른 글
자바 생성자(Constructor) 정리 (0) 2023.08.11 Java 특정 값 배열에 포함 여부 (String, int) (0) 2023.08.11 Java 제네릭(Generic) 정리(2)_static을 이용한 Generic (0) 2023.08.11 Java 제네릭(Generic) 정리(1) (0) 2023.08.11 Java 배열과 list를 이용해 2차원 구현 (0) 2023.08.11 - extends 예시