🏫 Open API_JAVA

[48일차] 제네릭 타입 / 멀티 타입 파라미터 / 제네릭 메소드 / 제한된 타입 파라미터 / 와일드카드 타입 / 제네릭 타입의 상속과 구현

Dorothy_YANG 2022. 9. 29. 19:46
728x90

20220929(목)

  • 목차 
    - 제네릭 타입 
    - 멀티 타입 파라미터 
    - 제네릭 메소드
    - 제한된 타입 파라미터 
    - 와일드카드 타입
    - 제네릭 타입의 상속과 구현

< 제네릭 타입 > - class<T>, interface<T>

✨ 제네릭 특징
      : 타입을 매개변수로 미리 정해 놓으면 ➡ 추후 관련된 메소드의 매개변수 타입이 변경된다.

  • 제네릭 타입
    - 타입을 파라미터로 가지는 클래스와 인터페이스
    - 선언 시 클래스 또는 인터페이스 이름 뒤에 <> 부호(=타입 파라미터) 붙임

  • 일반클래스 vs 제네릭클래스
    - 일반클래스 : 제네릭 미사용
    - 제네릭클래스 : 제네릭 사용(타입만 다르고 클래스의 구조를 그대로 쓰고 싶을 경우 사용)

        class ArrayList {
          Integer a;
           }

          class ArrayList {
          String a;
           }
         ➡ 다루고 싶은 데이터가 늘어나는 만큼 클래스가 계속 늘어난다.  🤯🤯
         ----------------------------------------------------------------------------------------------------------------

          <자바제공> 🤩
         class ArrayList  {
           T a;
            }

           ✨ 위 코드구조를 재사용해서 타입별로 사용 😍😍
            ArrayList<Integer> al = new ArrayList<Integer>();
            ArrayList<String> al = new ArrayList<String>();

 

 


< 멀티 타입 파라미터 > - class<K, V>, interface<K, V>

  • 멀티 타입 파라미터
    - 제네릭 타입은 두 개 이상의 타입 파라미터 사용 가능
    - 각 타입 파라미터는 콤마로 구분
       ex) class<K, V >

  • 뒷부분 생략 가능
    ex) Product<Car, String> product2 = new Product<Car, String>();
        ➡  Product<Car, String> product2 = new Product<>(); 😊

 


< 제네릭 메소드 > - <T, R> R method(T t)

  • 제네릭 메소드
    - 메소드에 타입파라미터 작업을 하는 것. / 다양한 데이타타입들을 사용하고 싶은 경우
    - 비교목적 : 하나의 데이타타입에 해당하는 의미만 비교목적으로 사용했었는데,
                        제너릭인 경우에는 여러 데이타타입들 비교목적으로 사용가능

    - 제네릭 메소드 선언 방법
       1) 리턴 타입 앞에 “<>” 기호를 추가하고 타입 파라미터 기술
       2) 타입 파라미터를 리턴 타입과 매개변수에 사용

  • class 클래스 <T> {
    public <E> Box <E> boxing(T t) {return 변수;}
    // public <타입파라미터> 리턴타입 메소드명(매개변수) {...}
    // 얘(제네릭 클래스의 제네릭을 이용하는 메소드)와 구분해야 됨! public T getKind() {return this.kind;} 
    }

     ✨ 제네릭 메소드 문법구성
     public static <타입파라미터> 리턴타입 메소드명(타입 매개변수) {
     return 변수;
     }
--------------------------------------------------------------------------------------------------------------------------
     ✔ 일반메소드 문법구성         😮 똑같은데 <>만 추가!
     public static 리턴타입 메소드명 (타입 매개변수) {
     return 변수;
     }

 


< 제한된 타입 파라미터 > - <T extends 최상위타입>

  • 타입 파라미터 제한
    - 상속 및 구현 관계 이용해 타입 제한
    public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) {...}
    - 상위 타입은 클래스 뿐만 아니라 인터페이스도 가능

     // Number 추상클래스 : Byte, Short, Integer, Long 클래스의 상위클래스
     public class Util {

     // T extends Number : Number 클래스 이거나 Number 클래스를 상속, 구현한 클래스만 사용가능.
     // T extends 인터페이스 : implements 키워드 사용안함.
     public static  리턴타입 메소드명() {</t extends number>}

 


< 와일드카드 타입 >

제네릭타입<?> 제네릭타입<? extends 상위타입> 제네릭타입<? super 하위타입>
Unbounded Wildcards
(제한없음)
Upper Bounded Wildcards
(상위 클래스 제한)
Lower Bounded Wildcards
(하위 클래스 제한)
타입 파라미터를 대치하는 구체적인 타입으로 ~
모든 클래스나
인터페이스 타입
상위 타입이거나
상속받은 하위 타입
하위 타입이나
상위 타입

 


< 제네릭 타입의 상속과 구현 >

  • 제네릭 타입을 부모 클래스로 사용할 경우
    - 타입 파라미터는 자식 클래스에도 기술 ➡ 만들지 않으면 이클립스에서 에러뜸! 🥵
    public class ChildProduct<T, M> extends Product<T, M> {...}
    - 추가적인 타입 파라미터 가질 수 있음
    public class ChildProduct<T, M, C> extends Product<T, M> {...}

  • 제네릭 인터페이스를 구현할 경우
    - 제네릭 인터페이스를 구현한 클래스도 제네릭 타입
728x90