mojo's Blog

Generic class, method 본문

Java

Generic class, method

_mojo_ 2021. 7. 20. 01:49

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의 장점

  1. 동적으로 타입이 결정되지 않고 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능
  2. 런타임 타입 충돌 문제 방지
  3. 개발 시 타입 캐스팅 절차 불필요
  4. 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();
	}

}

 

Comments