제네릭이란?
타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것
컬렉션, 람다식, 스트림에서 사용
제네릭을 사용하는 이유?
1. 컴파일 시 강한 체크 타입하여 에러를 사전에 방지
-> 실행 시 타입에러 나는 것을 방지해준다
2. 타입 변환을 제거
-> 빈번한 타입 변환은 애플리케이션 성능 저하로 이루어짐
제네릭 타입이란?
타입을 파라미터로 가지는 클래스, 인터페이스 말한다.
public class Box<T> { ... }
사용할 때에는
Box<String> box = new Box<>( );
*Box box = new Box();와 같이 T자리에 구체적인 타입 지정해주지 않으면 Object가 들어간다.
제네릭 타입 선언 시 두 개이상 타입 파라미터를 사용할 수 있다 ---> 멀티 타입 파라미터
public class Box<T,V> { .... }
public interface Box<K, V> { .... }
사용할 때에는
Box<Tv,String> box = new Box<>();
제네릭 메소드?
매개변수 타입이나 리턴타입에 타입 파라미터를 갖는 메소드를 말한다.
제네릭 메소드 선언 방법
public<타입파라미터,..> 리턴타입 메소드명(매개변수,...) { ... }
public <T> Box<T> boxing(T t) { .... }
제네릭 메소드를 가지는 클래스
public class Util {
public static <T> Box<T> boxing(T t){
Box<T> box = new Box<T>();
box.setT(t);
return box;
}
}
public static <T> Box<T> boxing(T t)
<T> : 타입 파라미터
Box<T> : 리턴타입
boxing(T t) : 메소드명(매개변수)
사용 할때에는
Box<Integer> box1 = Util.<Integer>boxing(100); // 타입 지정
Box<String> box2 = Util.boxing("홍길동"); // 타입 지정 생략 : 컴파일러가 "홍길동"을 보고 타입유추하여 T자리에 String으로 변환
제한된 타입 파라미터?
타입 파라미터를 상속 및 구현관계를 이용해서 제한할 수 있다.
public <T extends 상위타입> 리턴타입 메소드명(매개변수1, 매개변수2, ...) { ... }
--> 상위타입에는 클래스 또는 인터페이스가 올 수 있다.
--> 여기서 extends는 상속의 개념이 아닌 종류라는 의미! 따라서 인터페이스가 와도 extends를 써준다.
--> 1) 상위타입에 "Box 클래스" 가 올 경우
해당 메소드의 타입 타라미터는 Box클래스의 타입파라미터이거나, Box클래스의 자식클래스의 타입 파라미터가 올 수 있다.
2) 상위타입에 "product 인터페이스"가 올 경우
해당 product 인터페이스의 구현 클래스인 productimpl(구현객체)의 타입 파라미터가 올 수 있다.
--> 주의할점
메소드의 구현부 { }에는 상위타입의 (필드,메소드)만 사용할 수 있다.
하위 타입에만 존재하는 필드와 메소드는 사용할 수 없다!
와일드 카드 타입?
- 이미 선언되어 있는 제네릭 타입을 매개변수나 리턴타입으로 사용할 때, 타입 파라미터를 제한할 목적으로 사용한다.
** <T extends 상위타입>은 제네릭 타입을 선언할 때 타입 파라미터를 제한하기 위해 쓴다.
- 와일드 카드 타입의 세가지 형태
1. 제네릭타입<?> : Unbounded Wildcards (제한없음)
2. 제네릭타입<? extends 상위타입> : Upper Bounded Wildcards (상위 클래스 제한)
3. 제네릭타입<? super 하위타입> : Lower Bounded Wildcards (하위 클래스 제한)
예를 들어, (상위) A >B >C >D >E (하위) 일 경우
<? extends C> : C, D, E 가능
<? super C> : A, B, C 가능
제네릭 타입의 클래스 상속 & 제네릭 타입의 인터페이스 구현
1. 제네릭 타입의 클래스를 상속하려면 자식 클래스도 제네릭이어야 하고, 타입파라미터도 그대로 기술 해야한다 +필요에 따라 추가도 가능
public class ChildProduct<T,M,C> extends Product<T,M> { ... }
2. 제네릭 타입의 인터페이스를 구현하려면 구현클래스도 제네릭이어야 하고, 타입 파라미터도 그대로 기술
public class StorageImpl<T> implements Storage<T> { ... }
본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.
'Java 공부' 카테고리의 다른 글
14장 람다식 (0) | 2019.05.31 |
---|---|
13장 제네릭(Generic)(8)_확인문제 (0) | 2019.05.27 |
13장 제네릭(Generic)(6)_제네릭 타입의 상속과 구현 (0) | 2019.05.25 |
13장 제네릭(Generic)(5)_와일드 카드 타입 (0) | 2019.05.24 |
13장 제네릭(Generic)(4)_제한된 타입 파라미터 (0) | 2019.05.23 |