본문 바로가기

Java 공부

13장 제네릭(Generic)(7)_정리

제네릭이란?

타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것

컬렉션, 람다식, 스트림에서 사용


제네릭을 사용하는 이유?

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> { ... }








본 포스팅은 이것은 자바다 책을 참고하여 작성하였습니다.