용어 정리하고 가기
1. Type Parameter (타입 파라미터)
- generic 타입을 명시하기 위한 곳
- 정의된 타입 파라미터가 내부적으로 실제 타입으로 변환
- 예제 : T
2. Type Argument (타입 인수)
- 제네릭 클래스 생성 시에, 사용할 타입을 작성하는 곳
- 예제 : Integer
3. Parameterized Type
- Type Argument에 의해서 Type Parameter(T)가 치환된 전체 데이터 타입
- 예제 : Age<Integer>
제네릭
- 클래스나 인터페이스명 뒤에 "< >" 부호가 붙고, 그 사이에 타입 파라미터를 넣음 <T>
- 데이터 타입을 파라미터로 가지는 클래스와 인터페이스를 선언하여 사용할 수 있음
- 타입 파라미터는 일반적으로 대문자 알파벳 한 글자로 표현함
- 특정 클래스나 인터페이스를 다양한 타입으로 사용 및 저장할 필요가 있는 경우에 제네릭을 사용하면 편리함
- 제네릭을 통해 타입을 지정함으로써, 타입 변환(형 변환)을 줄이게 되어 프로그램 성능에 유리
제네릭의 선언과 생성
클래스, 인터페이스와 메서드에서 아래와 같은 방법으로 제네릭을 선언할 수 있음
1. 제네릭 선언하기
// 클래스에 제네릭 선언하기
class GenericClass <T> { // T: 타입 파라미터
T element;
void setElement(T element) {
this.element = element;
}
T getElement() {
return element;
}
}
2. 제네릭 생성하기
클래스명<타입> 참조변수명 = new 클래스명<타입>();
클래스명<타입> 참조변수명 = new 클래스명<>(); // 생성자 다음의 타입은 생략 가능
- 제네릭 클래스를 생성할 때에 사용할 타입을 명시하면, 정의된 타입 파라미터가 내부적으로 실제 타입으로 변환되어 처리가 됨
- 클래스 내부에서 사용될 데이터의 타입을 외부에서 지정해 주는 것
- 타입이 매개변수화 된 것
제네릭 객체 생성하고 사용하기
1. 제네릭 클래스
2. 제네릭 인터페이스
3. 제네릭 메서드
1. 제네릭 클래스
개념
- 클래스 선언 시에, 클래스명 오른쪽에 <T>가 선언된 것
class GenericClass <T> {
}
형태
1. 제네릭 클래스 선언
public class 클래스명 <T> {
}
2. 제네릭 클래스의 인스턴스 생성
클래스명 <타입> 참조변수명 = new 클래스명<타입>();
클래스명 <타입> 참조변수명 = new 클래스명<>(); // 생성자 다음의 타입은 생략 가능
예제
2. 제너릭 인터페이스
개념
- 인터페이스 선언 시,인터페이스명 오른쪽에 <T>가 선언된 것
- 인터페이스를 구현한 클래스에서도 오버라이딩한 메서드를 제네릭 타입에 맞춰서 구현해주어야 함
형태
1. 제네릭 인터페이스 선언
public interface 인터페이스명 <T> {
}
2. 제네릭 인터페이스를 구현한 클래스
class 클래스명<T> implements 인터페이스명 <T> {
}
3. 제네릭 인터페이스를 구현한 클래스의 인스턴스 생성
클래스명 <타입> 참조변수명 = new 클래스명<타입>();
클래스명 <타입> 참조변수명 = new 클래스명<>(); // 생성자 다음의 타입은 생략 가능
예제
interface Category<T> {
public void addCategory(T t, int index);
public T getCategory(int index);
}
// 인터페이스를 구현하는 클래스도 제네릭 타입 맞춰서 구현해야 함
class Animal<T> implements Category<T> {
private T[] array;
public Animal() { // 인스턴스 생성시, array 배열 생성
array = (T[]) new Object[5];
}
@Override
public void addCategory(T element, int index) {
array[index] = element;
}
@Override
public T getCategory(int index) {
return array[index];
}
}
public class Test {
public static void main(String[] args) {
Animal<String> animal = new Animal();
animal.addCategory("String Type의 강아지", 1);
animal.addCategory("String Type의 고양이", 2);
String name = animal.getCategory(2);
System.out.println(name); //String Type의 고양이
}
}
3. 제너릭 메서드
개념
- 메서드 선언부에 <T>가 선언된 메서드
- 직접 메서드에 <T> 제네릭을 설정함으로써, 동적으로 타입을 받아와 사용할 수 있는 독립적으로 사용 가능한 메서드
예제
1. 클래스의 타입 파라미터를 가져와서 사용하는 메서드
- 클래스의 데이터 타입이 정해지면
- 그 타입으로 해당 메서드들의 리턴 타입과 매개변수의 타입이 정해짐
2. 독립적으로 타입을 할당하여 운영하는 제네릭 메서드
- 제네릭 클래스에 정의된 타입 파라미터와 제네릭 메서드에 정의된 타입 파라미터는 별개
출처
'JAVA' 카테고리의 다른 글
[JAVA] Queue 인터페이스 (0) | 2024.04.28 |
---|---|
[JAVA] 공변성이 없는 제네릭, 제네릭 와일드 카드 (0) | 2024.04.26 |
[JAVA] 제네릭이란? (정의, 타입 파라미터, 사용하기) (0) | 2024.04.25 |
[JAVA] Set 인터페이스(HashSet, LinkedHashSet, TreeSet) (0) | 2024.04.25 |
[JAVA] List 인터페이스(ArrayList, Vecror, LinkedList, Stack) (0) | 2024.04.25 |