Java : 제네릭(Generic)

커비·2일 전
0

Java

목록 보기
54/55

Generic (제네릭)

public class Generic<T> {...}

Generic<String> stringGeneric = new Generic<>();
  • Generic<T>의 클래스처럼, 제네릭을 사용한 클래스를 제네릭 클래스라고 함
  • 제네릭에서 <> 사이에 들어가는 변수명 T는 타입 변수라고 함
  • Generic 클래스를 원시타입이라고 함

제네릭의 제한

static T get() {...} // 에러
static void set(T t) {...} // 에러
  • 객체의 static 멤버에 사용할 수 없다.
    : 타입 변수는 인스턴스 변수로 간주되고 모든 객체에 동일하게 동작해야하는 static 필드 특성상 사용할 수 없음
  • 제네릭 배열을 생성할 수 없음

제네릭 문법

public class Generic<T, U, E> {
	public E multiTypeMethod(T t, U u) {...}
}

Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal);
  • 다수의 타입변수를 사용할 수 있음
  • 다형성(상속과 타입의 관계)는 그대로 적용됨
    : 대표 적으로 부모 클래스로 제네릭 타입변수를 지정하고 그 안에 자식 클래스를 넘기는 것은 잘 동작함
public class ParkingLot<T extends Car> {...}

ParkingLot<BMW> bmwParkingLot = new ParkingLot();
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // 에러
  • 와일드 카드를 통해 제네릭의 제한을 구체적으로 정할 수 있음

와일드 카드

<? extends T> : T와 그 자손들만 사용 가능
<? super T> : T와 그 조상들만 가능
<?> : 제한 없음

  • 이렇게 제한하는 이유는 다형성 때문
  • TCar자손클래스들이라고 정의했기 때문에 해당 클래스 내부에서 최소 Car 객체에 멤버를 접근하는 코드를 적을 수 있음
  • 반대로 그러한 코드들이 있을 여지가 있기 때문에 Car 객체의 자손이 아닌 클래스는 제한하는 것

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

// 또는
static <T> void sort(List<T> list, Computor<? super T> c){...}
  • 타입변수를 클래스 내부의 인스턴스 변수 취급하기 때문에 제네릭 클래스의 타입변수를 static 메서드에는 사용할 수 없었지만, 제네릭 메소드의 제네릭 타입변수는 해당 메소드에만 적용되기 때문에 메소드 하나를 기준으로 선언하고 사용할 수 있음
profile
전공은 컴퓨터공학, 복수전공은 해킹보안학, 직장은 방학(파워 구직중)

0개의 댓글