본문 바로가기
java/개념

제네릭 만들기

by unhyepnhj 2024. 6. 10.

제네릭 클래스 작성

- 기존의 클래스 작성 방법과 유사하게 작성

- 클래스 이름 다음 <와 > 사이에 일반화된 타입 매개변수 추가

public class MyClass<T>{
	T val;	//T 타입 변수 val
    void set(T a){
    	val = a;
    }
    T get(){
    	return val;
    }
}

 

제네릭 클래스에 대한 레퍼런스 변수 선언

- 타입 매개변수에 구체적인 타입 작성

MyClass<String> s;	//<T>를 String으로 구체화
List<Integer> li;	//<E>를 Integer로 구체화
Vector<String> vs;	//<E>를 String으로 구체화

 

제네릭 객체 생성: 구체화(specialization)

- 제네릭 타입 클래스에 구체적인 타입을 대입하여 객체 생성

- 컴파일러에 의해 이루어짐

- 제네릭 구체화에 기본 타입 사용 불가

MyClass<String> s = new MyClass<String>();
s.set("hello");
System.out.println(s.get());	//"hello" 출력

MyClass<Integer> n = new MyClass<Integer>();
n.set(5);
System.out.println(n.get());	//5 출력
public class MyClass<String>{	//컴파일러에 의해 String으로 구체화된 MyClass<String>
	String val;	//String 타입의 변수 val
    void set(String a){
    	val = a;
    }
    String get(){
    	return val;
    }
}

 

타입 매개변수

- 제네릭 클래스 내에서 제네릭 타입 객체의 생성이 허용되지 않음(타입 매개변수 타입의 객체 생성 x)

public class MyVector<E>{
	E create(){
    	E a = new E();	//MyVector<E>의 타입 매개변수가 E이므로 E타입 객체 생성x, 컴파일 오류
        return a;
    }
}

- 컴파일러가 MyVector<E> 클래스의 new E() 라인을 컴파일할 때 E의 구체적인 타입을 알 수 없어 호출된 생성자 결정 불가

- 객체 생성 시 어떤 크기의 메모리를 할당해야 할지 알 수 없음


예제 7-9 제네릭 클래스로 스택 자료 구조를 선언하고 String과 Integer 스택을 각각 사용하는 코드

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 MyStack {
	public static void main(String[] args) {
		GenericStack<String> stringStack=new GenericStack<>();
		stringStack.push("Seoul");
		stringStack.push("Busan");
		stringStack.push("LA");
		
		GenericStack<Integer> intStack=new GenericStack<>();
		intStack.push(1);
		intStack.push(3);
		intStack.push(5);
		
		for(int i=0; i<3; i++) {
			System.out.println(stringStack.pop());
		}
		
		for(int i=0; i<3; i++) {
			System.out.println(intStack.pop());
		}
	}
}

 

line 9와 line 23

제네릭 클래스에서 제네릭 타입의 객체를 생성할 수 없고, 이와 마찬가지로 배열도 생성할 수 없으므로 Object 배열로 생성

stck=new T[10];	//이렇게 썼으면 컴파일 오류
return (T)stck[tos];

- 배열을 Object[] 배열로 선언하였으므로 강제 캐스팅하여 리턴해야 함 

'java > 개념' 카테고리의 다른 글

입출력 스트림  (0) 2024.06.19
제네릭과 배열  (0) 2024.06.10
LinkedList<E> 클래스  (0) 2024.06.10
HashMap<K, V> 클래스  (0) 2024.06.09
Iterator<E> 인터페이스  (0) 2024.06.09