본문 바로가기
java/개념

제네릭과 배열

by unhyepnhj 2024. 6. 10.

제네릭에서 배열의 제한

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