제네릭에서 배열의 제한
GStack<Integer>[] gs = new GStack<Integer>[10]; //컴파일 오류
T[] a = new T[10]; //컴파일 오류
- 제네릭 클래스 또는 인터페이스 타입의 배열 선언 불가
- 제네릭 타입 배열 허용하지 않음
return (T)stck[tos]; //예제 7-9 참고
- 제네릭 타입 배열 불가하므로 타입 매개변수 T로 강제 캐스팅
- 예제 7-9에서는 Object 타입으로 배열 생성 후 타입 캐스팅함
public void myArray(T[] a) { ... }
- 제네릭 타입 배열 선언 허용
제네릭 메소드
- 클래스의 일부 메소드만 제네릭으로 구현 가능
class GenericMethodEx{
static <T> void toStack(T[] a, GStack<T> gs){
for(int i=0; i<a.length; i++){
gs.push(a[i]);
}
}
}
- toStack() 메소드를 제네릭으로 구현
- 타입 매개변수는 메소드의 리턴 타입 앞에 선언
static<T> void toStack(T[] a, GStac<T> gs){ ... }
- 위 toStack()에서 <T>가 타입 매개변수 선언
- 제네릭 메소드 호출 시, 컴파일러가 메소드의 인자를 통해 이미 타입을 알고 있으므로 타입 명시 불필요
Object oArray = new Object[100];
GStack<Object> objectStack = new GStack<Object>();
GenericMethodEx.toStack(oArray, objectStack); //타입 매개변수를 명시하지 않아도 Object로 유츄
제네릭의 장점
- 컴파일 시에 타입이 결정(동적x)되므로 안전한 프로그래밍 가능
- 런타임 타입 충돌 문제 방지
- 타입 캐스팅 절차 불필요
- ClassCastException
예제 7-10 예제 7-9의 GenericStack을 이용하여 매개변수로 주어진 스택의 내용을 반대로 만드는 제네릭 메소드 reverse() 작성
더보기
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 GenericMethodExample {
public static <T> GenericStack<T> reverse(GenericStack<T> a){
GenericStack<T> s=new GenericStack<>();
while(true) {
T tmp;
tmp=a.pop(); //스택이 비었는지 확인-원래 스택에서 요소 하나를 꺼냄
if(tmp==null) { break;} //비었을 때 while문 종료
else s.push(tmp); //안 비었으면 새로운 스택에 꺼낸 요소를 삽입(위쪽에 있던 요소가 아래쪽으로->reverse)
}
return s; //reverse된 스택을 반환
}
public static void main(String[] args) {
GenericStack<Double> gs=new GenericStack<>();
for(int i=0; i<5; i++) {
gs.push(new Double(i));
} //스택에 5개의 요소 push
gs=reverse(gs); //자동 타입 유추
for(int i=0; i<5; i++) {
System.out.println(gs.pop());
}
}
}
'java > 개념' 카테고리의 다른 글
문자 스트림과 파일 입출력 (0) | 2024.06.19 |
---|---|
입출력 스트림 (0) | 2024.06.19 |
제네릭 만들기 (0) | 2024.06.10 |
LinkedList<E> 클래스 (0) | 2024.06.10 |
HashMap<K, V> 클래스 (0) | 2024.06.09 |