[JAVA] 제네릭

일반적인

  • 타입을 구체적으로 지정하지 말고 나중에 지정할 수 있도록 일반화 – Generic
  • 특정 데이터 형식에 바인딩되지 않은 클래스 또는 메서드입니다.

제네릭 클래스

class Basket <T>{ // 제네릭 클래스,  T라는 타입 매겨변수 선언, 임의의 문자로 지정가능 T,K,V (Type, Key, Value) 등 사용
    private T item;
    // static T item; // 클래스 변수에는 사용 불가 - 클래스 변수의 타입이 인스턴스 별로 달라 지게 된다.
// 클래스 변수는 공통적으로 사용해야 하는데 인스턴스별로 타입을 다르게 생성하면 같은 타입이 아니게 된다.
public Basket(T item) { this.item = item; } public T getItem() { return item; } public void setItem(T item) { this.item = item; } }
// 제네릭 클래스 인스턴스화
Basket<String> basket1 = new Basket<String>("Ipad"); // String으로 생성
Basket<Integer> basket2 = new Basket<Integer>(340); // Interger로 생성
                                                         // 타입 매개변수에 치환될 타입으로 기본 타입 사용 불가
                                                         // int -> Integer, double -> Double  (래퍼클래스 사용)
// getter
System.out.println(basket1.getItem());  // Ipad
System.out.println(basket2.getItem()); // 340

// setter
basket1.setItem("Galaxy Tab");
System.out.println(basket1.getItem()); // Galaxy Tab

/*
Ipad
340
Galaxy Tab
*/

제한된 제네릭

  • extend로 지정된 클래스의 하위 클래스만 인스턴스화할 수 있습니다.
  • 인터페이스도 가능합니다.
    즉, 인터페이스를 구현하는 클래스의 인스턴스만 가능합니다.
  • 다형성을 적용할 수 있으며 하위 클래스의 객체 유형을 사용할 수 있습니다.
class LimitBasket <T extends Phone>{  // 제한된 제네릭, 인스턴스화 할때 Phone의 하위 클래스만 지정 가능
                                     // 인터페이스도 가능 구현한 클래스만 사용가능
                                     // 특정클래스를 상속받으면서 인터페이스를 구현한 클래스 타입도 지정 가능
                                     //  <T extend 부모클래스명 & 인터페이스명>

    private T item;

    public LimitBasket(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }

    public void setItem(T item) {
        this.item = item;
    }
}

class Phone{ }
class Iphone extends Phone{}
class Ipad{}
 Basket<Phone> phoneBasket = new Basket<>(new Iphone());
 phoneBasket.setItem(new Iphone()); // Phone의 자식 클래스 이므로 다형성 가능
// phoneBasket.setItem(new Galaxy()); // Phone과 아무사이도 아니기 때문에 에러

 // 제한된 클래스 사용
 LimitBasket<Phone> phoneLimitBasket = new LimitBasket<>(new Phone()); // Phone 자신
 LimitBasket<Iphone> iphoneLimitBasket = new LimitBasket<>(new Iphone()); // Phone의 자식클래스
 //LimitBasket<Galaxy> galaxyLimitBasket = new LimitBasket<new Galaxy>(); // 에러 Phone의 자식클래스가 아님

제네릭 메서드

  • 메서드 유형이 지정되지 않음
  • 제네릭 클래스와 제네릭 메서드의 다양한 매개변수
  • 제네릭 메서드는 정적일 수 있습니다.
class GenericMethod<T>{ // 1. 제네릭 클래스의 타입 매개변수
    private T result;
    public GenericMethod(T result) {
        this.result = result;
    }

    public T getNum() {
        return result;
    }

    public void setNum(T result) {
        this.result = result;
    }

    public <T> void print(T element){ // 2. 제네릭 메소드의 타입 매겨변수,  1과 2는 서로 다르다.
System.out.println(element); //System.out.println(element.length()); // 타입이 지정안됬기 때문에 특정클래스 메서드 사용 불가 } public static <T> void print2(T elemnet){ // 제네릭 메서드는 static 사용가능 System.out.println("static 메서드"); } }
GenericMethod<String> genericMethod = new GenericMethod<>("test");
genericMethod.<Integer>print(123); // 제네릭 메서드
genericMethod.print(1234); // 타입 지정 생략 가능

/*
123
1234
*/

** 래퍼 클래스

  • 개체의 8가지 기본 유형을 준수하는 데이터를 래핑하는 클래스의 래퍼 클래스입니다.
기본 래퍼 래퍼 클래스
바이트 바이트
짧은 짧은
내부 정수
호버링 호버
더블 더블
성격
부울 부울