Generics
다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에서 컴파일 시에 타입 체크
Compile - 컴파일시 타입체크가 안전하다.
Runtime - 동작 중에 오류 발생 가능 ex) instanceof
미리 사용할 타입을 명시해 형 변환을 하지 않아도 된다.
객체 타입에 대한 안전성 향상 및 형 변환의 번거로움 감소
표현
클래스 또는 인터페이스 선언 시 <>에 타입 파라미터 표시
public class 클래스 이름<타입 파라미터> {}
public interface 인터페이스 이름<타입 파라미터> {}
타입 파라미터 (Type Parameter)
단순히 임의의 참조형 타입
컴파일 시 타입 파라미터들은 대입된 타입으로 대체된다.
- T : reference Type
- E : Element
- K : Key
- V : Value
객체 생성
변수와 생석 부분 타입은 반드시 같아야 한다.
클래스 이름<String> generic = new 클래스 이름<String>();
클래스 이름<String> generic = new 클래스 이름<>();
클래스 이름 generic = new 클래스 이름(); // 타입 참조 필요 경고
타입 파리미터 제한
필요에 따라 구체적인 타입으로 제한 가능
제한하고자 하는 범위의 기준으로 extends
혹은 super
사용
인터페이스로 제한할 경우 extends
사용이 가능하다.
클래스와 인터페이스 제약 조건을 같이 사용할 경우 &
로 연결
와일드 카드
와일드 카드 <?>
어떠한 타입도 될 수 있다.
Generic type<?> // 타입 제한 없음(Object)
Generic type<? extends T> // T 또는 T를 상속받은 타입으로 제한
Generic type<? super T> // T 또는 T의 조상 타입으로 제한
제네릭 메서드 (Generic method)
메서드의 파라미터와 리턴타입으로 타입 파라미터를 가지는 메서드
메서드 선언부에 제네릭 타입이 선언된 메서드
접근제한자 <Type Parameter> 리턴타입 메서드이름(파라미터) {
...
}
파라미터가 제네릭 타입 경우 오버로딩은 성립하지 않는다. -> 컴파일 에러 발생
제네릭 타입은 컴파일러가 컴파일 시점에서만 사용하기 때문에 오버로딩이 아닌 메서드 중복 정의가 된다.
static 메서드 정의 가능하다.
메서드에 선언된 제네릭 타입은 지역변수처럼 메서드 내애서만 사용되어 static과 무관하다.
제한
모든 객체에 대해 동일하게 동작해야하는 static 멤버에는 사용할 수 없다.
제네릭의 타입 파라미터는 인스턴스 변수로 간주된다.
배열 타입의 참조 변수로 선언은 가능하지만 제네릭 배열을 생성하는 것은 제한된다.
new T 배열이름[배열크기]; // 제한
new 연산자는 컴파일 시점에서 타입 T를 정확하게 알아야 한다
'Java' 카테고리의 다른 글
컬렉션 프레임워크(Collection Framework) (0) | 2022.07.28 |
---|---|
예외(Exception) 2 (0) | 2022.07.28 |
예외(Exception) 1 (0) | 2022.07.26 |
인터페이스(interface) (0) | 2022.07.25 |
추상 클래스(abstract class) (0) | 2022.07.25 |