Java 11일차
제네릭
제네릭 사용 이유
- 컴파일 시 강한 타입 체크
- 실행 시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 사전에 에러 방지
- 타입 변환(casting) 제거
- Object 타입을 사용하면 모든 종류의 자바 객체 저장 가능 ⇒ 저장할 때 타입 변환 발생, 읽어 올때 타입 변환 발생
- 불필요한 타입 변환 제거하여 프로그램 성능 향상
제네릭 타입(class, interface)
- 타입을 파라미터로 가지는 클래스와 인터페이스
-
타입 파라미터는 일반적으로 대문자 알파벳 한 글자로 표현
public class 클래스명<T> { ... } public interface 인터페이스명<T> { ... }
멀티 타입 파라미터(class<K,V,…>, interface<K, V,…>)
- 제네릭 타입 두 개 이상의 멀티 타입 파라미터 사용 가능
제네릭 메소드(<T,R> R method(T t))
-
매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
// public <타입 파리미터, ...> 리턴타입 메소드명(매개변수, ) { } public <T> Box<T> boxing(T t) { ... }
-
호출 방법
-
코드에서 타입 파라미터의 구체적인 타입 명시적으로 지정
Box<Integer>box = <Integer>boxing(100);
-
컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 함
Box<Integer> box = boxing(100);
-
제한된 타입 파라미터()
- 구체적으로 타입 제한할 수 있음 ⇒
: 숫자 타입만 - 최상위 타입에는 클래스, 인터페이스 모두 가능. 인터페이스에 implements 사용하지 않음
- 메소드의 중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 멤버로 제한
- 하위 타입에만 있는 필드와 메소드는 사용할 수 없음
와일드카드 타입(<?>, <? extends …>, <? super …>)
- 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 구체적인 타입 대신 와일드카드 사용 가능
- 제네릭타입<?> : 모든 클래스나 인터페이스 타입 올 수 있음
- 제네릭타입<? extends 상위타입> : 상위 타입이나 하위 타입만 올 수 있음
- 제네릭타입<? super 하위타입> : 하위 타입이나 상위 타입이 올 수 있음
제네릭 타입 상속, 구현
-
제네릭 타입도 부모 클래스 될 수 있음
public class ChildProduct<T, M, C> extends Product<T, M> { ... }
-
추가적인 타입 파라미터 가질 수 있음