기록과 정리

제네릭(Generic)에 대하여 본문

IT/Java

제네릭(Generic)에 대하여

zepetto 2022. 2. 11. 09:52

제네릭(Generics)

컴파일시 타입 체크해주는 기능으로 , 파라미터화 하여 타입이 결정되도록 하는 기능. JDK 1.5에 도입이 되었으며 이전에는 Object타입으로 모든 데이터 타입을 받아주는 형식으로 개발을 하였고 (Generic이 필요한 시점의 코드) 의도하지 않는 타입을 받거나 , 모든 타입을 받아주었기 때문에 프로그램 성능저하를 일으킬 수도 있을 것 같다.

 

 제네릭을 사용하면 컴파일 시점에 에러테크를 할 수 있으며, 자바 라이브러리에 많이 쓰이고 있어 라이브러리 분석 또는 실제 업무에서 쓰이기 때문에 알고 넘어가도록 하자.

장점

1. 타입의 안정성을 높인다. - 의도하지 않은 타입의 객체 저장을 막고, 잘못 형변환 되어 발생할 수 있는 오류를 막는다.

2. 형변환의 번거로움을 줄인다.

 

사용

Generic 예시
결과

MyArray라는 class를 만들고 <T>  타입 변수를 주었다 . String도 받고 Integer도 받을 수 있다. 타입변수는 클래스뿐 아니라 메서드의 매개변수나 반환값으로도 사용 가능하다.

( 타입 변수의 자리에는 기본 타입 (primitive type)을 사용할 수 없다. Integer와 같은 Wrapper class를 사용하도록 하자. )

메서드에서 타입변수 , T는 각자의 T이다. super -&gt; 하단 설명참조

타입 변수의 제한

extends - 타입을 제한하여 특정 타입만을 사용하도록 제한할 수 있다.( 단, interface를 제한하고 싶을 시에도 implements가 아닌 extends를 사용한다.)

 

Integer 를 상속받는 또는 Integer만 타입 변수로 받을 수 있는 클래스를 생성 후 , String 을 타입변수로 넣어보면 컴파일 에러가 남을 볼 수 있다.

 

혹 클래스와 인터페이스 둘다 상속받고 구현해야할 때는 '&' 를 이용하여 타입변수를 지정할 수 있다.

 

와일드카드

이름을 제한 두지 않음에 표현하는 타입변수에 사용되는 기호

<?> - 타입 변수의 모든 타입을 사용할 수 있다.

<? extends T> - T 또는 T를 상속 받는 자손 클래스만 사용 가능.

<? super T> - T 또는 T를 상속받는 조상 클래스만 사용 가능.

 

타입의 종류  (T , E , K , V...)

이는 암묵적으로(?) 사용하는 규칙일 뿐 아래와 같이 사용할 필요는 없다. R을 사용하든 T를 사용하든 무방하지만 통상적으로 알기 쉽게 하기 위함으므로 참고 바란다.

 

T : Type

E : Element

K : Key

V : Value

N : Number

'IT > Java' 카테고리의 다른 글

Iterable과 Iterator  (0) 2022.02.18
자바의 정석 6장) 객체지향 프로그래밍 1  (0) 2021.12.06
Date와 Time API  (0) 2021.08.31
Java Optional  (0) 2021.08.23
Java8 Stream API (스트림 API)  (0) 2021.08.12