ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 제네릭(Generic) 정리(3)_generic의 extends, super, wildcard
    Java 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의 자손 타입만 가능

     

    * 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>();
    	}
    }

     

     

    출처)

    https://st-lab.tistory.com/153

Designed by Tistory.