Generic 문법

김나영·2023년 6월 22일
0

Java 문법 종합반

목록 보기
19/21

용어

public class Generic<T> { ... }
Generic<String> stringGeneric = new Generic<>();
  • 제네릭 클래스

  • <> 사이에 들어가는 변수명 T는 타입 변수

  • Generic 클래스를 원시 타입이라고 함

제한

  • 객체의 static 멤버에 사용 불가능

    • 타입 변수는 인스턴스 변수로 간주되고, 모든 객체에 동일하게 동작해야하는 static 필드 특성상 사용 불가

    • static은 인스턴스화를 시키지 않아도 사용 가능

  • 제네릭 배열을 생성 할 수 없음

public class Generic<T, U, E> { // 제네릭 클래스
    public E multiTypeMethod(T t, U u) { ... } // T타입, U타입이 들어가있음
}
Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal); // 실제로 제네릭 클래스 사용법
                          // long타입, int 타입이 들어가야함 

문법

  • 다수의 타입변수 사용 가능

    • ex) 하나는 출력 타입으로 쓰고 두 개는 입력 타입으로 사용 가능
  • 다형성 즉, 상속과 타입 관계는 그대로 적용

    • 부모 클래스로 제네릭 타입변수를 지정하고 그 안에 자식 클래스르 넘기는 것은 잘 동작
  • 와일드 카드를 통해 제네릭의 제한을 구체적으로 정할 수 있음

    1. <? extends T> : T와 그 자손들만 사용 가능

    2. <? super T> : T와 그 조상들만 가능

    3. <?> : 제한 없음

public class ParkingLot<T extends Car> { ... } // Car 클래스와 그 자식 클래스들만 가능
ParkingLot<BMW> bmwParkingLot = new ParkingLot(); // 
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!
  • ParkingLot이라는 클래스를 기반으로만드는 인스턴스들은 Car 클래스에 상속을 받은 BMW는 가능하지만 Iphone은 Car 클래스에 상속을 받은 게 아니기 때문에 Error 발생

  • 메서드 스코프로 제네릭을 별도로 선언 가능

  • 실제로 제네릭 타입을 부여하면서 해당 메서드만 적용되는 제네릭 타입변수를 선언 수있고 사용할 수 있음

  • 타입변수를 클래스 내부의 인스턴스 변수 취급하기 때문에 제네릭 클래스의 타입변수를 static 메서드에서는 사용할 수 없었지만, 제네릭 메소드의 제네릭 타입변수는 해당 메소드에만 적용되기 때문에 하나를 기준으로 선언하고 사용 가능

    • 즉, 메서드 기준으로도 제네릭 타입이 적용 가능
  • 제네릭 클래스 안에 제네릭 메서드가 있다고 한다면?

public class Generic<T, U, E> {
		// Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
    static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
}
  • 제네릭 클래스에서 로 선언

  • 제네릭 메서드 안에서도 T로 선언했다고 할 때

  • 두 개가 독립적으로 선언만 된 것

  • 실제로 구현해서 쓸 때는 각각 다른 타입을 입력해서 사용

    • ex) 클래스의 는 String, 메서드 호출할 때의 는 int

0개의 댓글