본문 바로가기
JAVA

자바 제네릭(Generic)

by mingutistory 2020. 4. 14.
728x90

제네릭이란?

사전적 의미 : 포괄적인, 통칭의

클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법. 인스턴스를 생성 할 때 정의하는 기법.

매개 변수의 데이터 타입과 관련이 있음.

 

Class Person<T> {

   public T info; 

 

Person 클래스를 인스턴스 화 할 때 데이터 타입을 정의 해주는 것

ex ) Person<String> p1 = new Person<String>();

Person<StringBuilder> p2 = new Person<StringBuilder>(); 

 

T, S에 올 수 있는 데이터 타입은 참조형 타입만 올 수 있음. 기본 데이터 타입은 Wrapper 클래스를 통해서 이용. 

 

메소드 레벨의 제네릭

public <U> void printInfo(U info) {

  System.out.println(info);

U가 info의 제네릭 타입임을 명시해줌. 

사용시에는 p1.<U>printInfo(data); // 하지만 생략 가능. 

 

제네릭의 제한

class Person<T extends Info> {}

Info 클래스 혹은 Info 클래스를 상속 받고 있는 자식 클래스만 들어 올 수 있음 > 아닌 경우 컴파일 에러.

인터페이스로 제한 가능하지만 <T impelments Info> 이런 식으로 사용하는 것이 아니라 그대로 <T extends Info>로 사용.

 

제네릭으로 디자인된 클래스 사용 구문

ArrayList<String> list = new ArrayList<String>(); 

 

제네릭의 특징

1. 클래스 내부에서 사용하는 타입을 다이아몬드 지시자로 받을 수 있다.

2. 명확하지 않는 형 변환 과정을 생략 할 수 있다. 

ArrayList<String>과 같은 명시적인 표현을 통해서 ArrayList 객체 내부에 어떤 형태의 클래스가 있는지 확인 가능하므로 불필요한 형 변환 코드 사용을 줄이고 오류를 줄일 수 있음. 

3. 하나의 클래스로 다양하게 처리 할 수 있다. 

제네릭이 존재하지 않았다면 StringArrayList, IntegerArrayList와 같이 각각의 데이터 타입을 제공하는 ArrayList 클래스가 필요 했을 것. 코드의 재사용이 용이하다. 

 

Hashtable<String, String> hashTable = new Hashtable<String, String>(); // 여러 개의 타입 변수 받을 수 있음. 

 

와일드 카드 (E, K, V, T, N ..) 

 

 

 

참고 :

생활코딩 자바 제네릭 

자바를 다루는 기술, 길벗

300x250

댓글