728x90
class GStack <T> { // 제네릭 스택 선언. 제네릭 타입 T 나중에 GStack<String> stringStack = new GStack<String>(); 이렇게 불릴 때 필요
int tos;
Object [] stck; // 스택에 요소를 저장할 공간 배열
public GStack() {
tos = 0;
stck = new Object [10]; //타이밍이 달라서 배열일 때는 Object로 정의
}
public void push(T item) {
if (tos == 10) // 스택이 꽉 차서 더 이상 요소를 삽입할 수 없음 동적 할당할건데(meta data) 이건 최상위 클래스로 정의되어 있어야함.
return;
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) {
GStack<String> stringStack = new GStack<String>(); // String 타입의 GStack 생성
stringStack.push("seoul");
stringStack.push("busan");
stringStack.push("LA");
for(int n=0; n<3; n++)
System.out.println(stringStack.pop()); // stringStack 스택에 있는 3개의 문자열 팝
GStack<Integer> intStack = new GStack<Integer>(); // Integer 타입의 GStack 생성
intStack.push(1);
intStack.push(3);
intStack.push(5);
for(int n=0; n<3; n++)
System.out.println(intStack.pop()); // intStack 스택에 있는 3개의 문자열 팝
}
}
stck = new Object [10];
제네릭 매개변수로 객체를 생성하거나 배열을 생성할 수 없으므로 Object 배열을 생성하여 실제 타입의 객체를 요소로 삽입한다.
stck = new T [10];
는 오류;
처음에 클래스 할당해 줄 때 meta data가 생기는데(?) T는 무슨 타입인지 모르기 때문에 안 된다.
return (T)stck[tos]; /// 타입 매개변수 타입으로 캐스팅
삽입을 할 땐 String 타입이든, Int 타입이든 Object 배열에 들어가게 된다.
그러므로 꺼내올 때는 이 Object 배열을 타입 매개변수의 타입으로 강제 캐스팅하여 리턴해야 한다.
728x90
'Java' 카테고리의 다른 글
| [Java] 제네릭 클래스 예제 (20-2) (0) | 2023.09.07 |
|---|---|
| [Java] 제네릭 클래스 예제 (20-1) (0) | 2023.09.07 |
| [Java] 컬렉션과 제네릭 예제 (Vector,ArrayList,HashMap) (0) | 2023.09.02 |
| [Java] (interface 익명 구현 객체) (19-3) (0) | 2023.09.01 |
| [Java] (interface 익명 구현 객체) (19-2) (0) | 2023.08.31 |