개발소설

[JAVA] 제네릭 (Generic) 본문

자바

[JAVA] 제네릭 (Generic)

ChaeHing 2023. 3. 7. 18:43

제네릭(Generic)

  • 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정 할 수 있도록 일반화 해두는것 - 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
*/

 

제한된 제네릭 

  • extends로 지정한 클래스의 하위 클래스들만 인스턴스 가능
  • 인터페이스도 가능, 인터페이스를 구현한 클래스들만 인스턴스
  • 다형성 적용 가능, 하위 클래스의 객체의 타입을 사용 할 수 있다.
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의 자식클래스가 아님

제네릭 메서드

  • 메서드 타입 미지정 가능
  • 제네릭 클래스와 제네릭 메서드의 매개변수는 서로 다른값
  • 제네릭 메서드는 static 사용 가능
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
*/

와일드카드

  • 어떠한 타입으로도 대체될 수 있는 타입 피라미터
<? extends T> // 상한 제한, T와 T를 상속받는 하위 클래스 타입만 타입 피라미터로 사용
<? super T> // 하한 제한, T와 T의 상위 클래스 타입만 타입 피라미터로 사용

<?> // <? extends Object> 와 같다.

 

** 래퍼 클래스

  • 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)
기본 타입래퍼 래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

'자바' 카테고리의 다른 글

[JAVA] 람다 (Lambda)  (0) 2023.03.08
[JAVA] 애너테이션 (Annotation)  (0) 2023.03.08
[JAVA] 컬렉션 프레임 워크 (Collection Framework)  (0) 2023.03.08
[JAVA] 예외 처리(Exception Handling)  (0) 2023.03.07
[JAVA] 열거형(enum)  (0) 2023.03.07
Comments