mojo's Blog
Generic class, method 본문
Generic class : 기존의 클래스 작성 방법과 유사한데, 클래스 이름 다음에 일반화된 타입(generic type)의 매개변수를 <와 > 사이에 추가한다는 차이가 있다.
ex) public class MyClass<T> { ... }
- Create Generic Object - Specialization
제네릭 클래스에 구체적인 타입을 대입하여 구체적인 객체를 생성하는 과정을 Specialization 이라 부르며, 이 과정은 자바 Compiler에 의해 이루어진다.
- Type Parameter
제네릭 클래스 내에서 제네릭 타입을 가진 객체의 생성은 허용되지 않는다.
ex)
public class MyVector<E>{
E create(){
E a = new E();
return a;
}
}
제네릭 클래스 내에서 제네릭 타입의 객체를 생성할 수 없는 것과 같은 이유로 배열도 생성할 수 없으므로 Object의 배열로 생성한다.
ex) stck = new T[100]; <= Compile Error
stck = new Object[100]; <= Ok
- Generic and Array
제네릭에서는 배열에 대한 제한을 두고 있다. 제네릭 클래스 또는 인터페이스 타입의 배열은 선언할 수 없다.
ex) GStack<Integer>[] gs = new GStack<Integer>[10]; <= Compile Error
그러나 제네릭 타입의 배열 선언은 허용된다.
ex) T[] a;
Generic의 장점
- 동적으로 타입이 결정되지 않고 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능
- 런타임 타입 충돌 문제 방지
- 개발 시 타입 캐스팅 절차 불필요
- ClassCastException 방지
import java.util.*;
class GStack<T>{
int tos;
Object[] stack;
public GStack() {
tos=0;
stack=new Object[10];
}
public void push(T item) {
if(tos==10) return;
stack[tos++]=item;
}
public T pop() {
if(tos==0) return null;
return (T)stack[--tos];
}
public <T>GStack<T> reverse(){
GStack<T> s = new GStack<T>();
while(true) {
if(tos==0) break;
T tmp;
tmp = (T) stack[--tos];
s.push(tmp);
}
return s;
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
GStack<String> stringStack=new GStack<String>();
stringStack.push("seoul");
stringStack.push("busan");
stringStack.push("LA");
for(int i=0;i<3;i++) System.out.println(stringStack.pop());
GStack<Integer> intStack=new GStack<Integer>();
intStack.push(1);
intStack.push(3);
intStack.push(5);
intStack = intStack.reverse();
for(int i=0;i<3;i++) System.out.println(intStack.pop());
scanner.close();
}
}
'Java' 카테고리의 다른 글
명품 JAVA Programming 제 7장 실습문제 8번 (0) | 2021.07.22 |
---|---|
명품 JAVA Programming 제 7장 Open Challenge (0) | 2021.07.22 |
vector와 HashMap, Collections 클래스의 활용 (0) | 2021.07.20 |
명품 JAVA Programming 제 6장 Open Challenge (0) | 2021.07.20 |
Math 클래스 메소드 활용 (0) | 2021.07.20 |
Comments