제네릭 클래스 작성
- 기존의 클래스 작성 방법과 유사하게 작성
- 클래스 이름 다음 <와 > 사이에 일반화된 타입 매개변수 추가
public class MyClass<T>{
T val; //T 타입 변수 val
void set(T a){
val = a;
}
T get(){
return val;
}
}
제네릭 클래스에 대한 레퍼런스 변수 선언
- 타입 매개변수에 구체적인 타입 작성
MyClass<String> s; //<T>를 String으로 구체화
List<Integer> li; //<E>를 Integer로 구체화
Vector<String> vs; //<E>를 String으로 구체화
제네릭 객체 생성: 구체화(specialization)
- 제네릭 타입 클래스에 구체적인 타입을 대입하여 객체 생성
- 컴파일러에 의해 이루어짐
- 제네릭 구체화에 기본 타입 사용 불가
MyClass<String> s = new MyClass<String>();
s.set("hello");
System.out.println(s.get()); //"hello" 출력
MyClass<Integer> n = new MyClass<Integer>();
n.set(5);
System.out.println(n.get()); //5 출력
public class MyClass<String>{ //컴파일러에 의해 String으로 구체화된 MyClass<String>
String val; //String 타입의 변수 val
void set(String a){
val = a;
}
String get(){
return val;
}
}
타입 매개변수
- 제네릭 클래스 내에서 제네릭 타입 객체의 생성이 허용되지 않음(타입 매개변수 타입의 객체 생성 x)
public class MyVector<E>{
E create(){
E a = new E(); //MyVector<E>의 타입 매개변수가 E이므로 E타입 객체 생성x, 컴파일 오류
return a;
}
}
- 컴파일러가 MyVector<E> 클래스의 new E() 라인을 컴파일할 때 E의 구체적인 타입을 알 수 없어 호출된 생성자 결정 불가
- 객체 생성 시 어떤 크기의 메모리를 할당해야 할지 알 수 없음
예제 7-9 제네릭 클래스로 스택 자료 구조를 선언하고 String과 Integer 스택을 각각 사용하는 코드
import java.util.*;
class GenericStack<T>{
int tos; //인덱스
Object[] stck; //스택에 요소를 저장할 공간 배열
public GenericStack() {
tos=0;
stck=new Object[10];
}
public void push(T item) { //스택에서 값 출력
if(tos==10) { return; } //스택이 꽉 찼을 때
else {
stck[tos]=item;
tos++;
}
}
public T pop() {
if(tos==0) {return null;} //스택이 비어 있을 때
tos--;
return (T) stck[tos];
}
}
public class MyStack {
public static void main(String[] args) {
GenericStack<String> stringStack=new GenericStack<>();
stringStack.push("Seoul");
stringStack.push("Busan");
stringStack.push("LA");
GenericStack<Integer> intStack=new GenericStack<>();
intStack.push(1);
intStack.push(3);
intStack.push(5);
for(int i=0; i<3; i++) {
System.out.println(stringStack.pop());
}
for(int i=0; i<3; i++) {
System.out.println(intStack.pop());
}
}
}

line 9와 line 23
제네릭 클래스에서 제네릭 타입의 객체를 생성할 수 없고, 이와 마찬가지로 배열도 생성할 수 없으므로 Object 배열로 생성
stck=new T[10]; //이렇게 썼으면 컴파일 오류
return (T)stck[tos];
- 배열을 Object[] 배열로 선언하였으므로 강제 캐스팅하여 리턴해야 함
'java > 개념' 카테고리의 다른 글
입출력 스트림 (0) | 2024.06.19 |
---|---|
제네릭과 배열 (0) | 2024.06.10 |
LinkedList<E> 클래스 (0) | 2024.06.10 |
HashMap<K, V> 클래스 (0) | 2024.06.09 |
Iterator<E> 인터페이스 (0) | 2024.06.09 |