개발자 미니민의 개발스터디

[JAVA] 자바 - 제네릭 클래스/인터페이스 & 제네릭 배열 (generics)

by mini_min

[JAVA]
자바 - 제네릭 (generics) 이란

 

✔️ 제네릭(generics)이란?

인스턴스를 생성할 때 사용할 데이터 타입을 결정하는 것

데이터 형에 따른 메소드나 멤버 변수 구현 필요 없음!

⭕ 서로 다른 자료형으로 처리할 수 있다.

⭐ 객체 타입을 컴파일 할 때 체크해줘서 오류 예방도 좋고 객체 타입의 안전성도 좋다.

 

 

🏷️ 제네릭의 장점

- 강제 캐스팅을 줄여서 성능 저하를 예방한다.

- 컴파일할 때 타입 오류 체크 가능

- 반복적인 코드를 줄일 수 있어서, 재사용성 증가한다!

 

 

 

✔️ 제네릭 클래스/인터페이스

타입 파라미터 1개 이상 갖는 제네릭 타입의 클래스나 인터페이스

2개 이상의 타입 파라미터를 가질 수 있고 콤마로 구분한다.

 

 

◾ 타입 파라미터란?

 

💡 제네릭 클래스의 객체 생성은?
클래스명<타입> 레퍼런스변수 = new 클래스명<타입>();
클래스명<타입> 레퍼런스변수 = new 클래스명<>();

 

 

class Test3<T> {
	private T value;

	public T getValue() {
		return value;
	}
	public void setValue(T value) {
		this.value = value;
	}
}


Test3<String> t = new Test3<>();
t.setValue("서울");
String s = t.getValue();	//캐스팅을 하지 않는다.
💡 인스턴스를 생성하면서 String이라는 객체 타입을 설정해서, getValue(); 메소드에서 캐스팅 필요 없이 바로 입력이 가능하다. 

객체 타입 명시 안하면 : Object 로 처리하여 경고!!

 

 

 

2개 이상의 타입 파라미터 가질 때

class Test4<T, U> {
	private T t;
	private U u;
	
	public void set(T t, U u) {
		this.t = t;
		this.u = u;
	}
	
	public void disp() {
		System.out.println("T : " + t.getClass().getName() + ", " + t);
		System.out.println("U : " + u.getClass().getName() + ", " + u);
	}
}


public static void main(String[] args) {
	Test4<String, Integer> t = new Test4<>();
    
    t.set("서울", 950);
    t.disp;
	}
}

 

 

 

◾ 제네릭 클래스 필드에 '배열'이 있을 때

class Test5<E> {
	private E[] data;
	private int count;
	@SuppressWarnings("unchecked")	//경고 무시하는 주문
	public Test5() {
		//제네릭 배열 메모리 할당 
		//data = new E[10]; //컴오류. 배열로 메모리 할당이 불가/오브젝트로만 가능
		
		data = (E[])new Object[10]; //컴오류. //다운 캐스팅 해야함
	}
💡 제네릭 클래스에 메모리를 할당하는 생성자를 만든다.
❌ 제네릭 클래스에서 배열 메모리는 오브젝트로 할당 가능하며, 이후 다운 캐스팅 해줘야한다.

 

//배열 값 추가 메소드
	public void append(E e) {
		if(count >= data.length) { //data.length=10
			throw new ArrayIndexOutOfBoundsException("10개까지만 가능합니다.");
		}
		data[count++] = e;
	}
💡배열 참조값이 배열의 길이를 넘어가면, throw 키워드를 사용해서 예외를 던진다. 

 

Test5<String> t = new Test5<>();
//스트링으로 타입 설정

t.append("A");
t.append("B");
t.append("C");
//배열에 값 추가

//제네릭 배열은 반드시 캐스팅이 필요하다.
	Object []ss = t.get();
	for(int i=0; i<t.getCount(); i++) {
		String s = (String)ss[i];
		System.out.println(s);
		}
💡 제네릭 배열반드시 캐스팅이 필요하다.
 Object 배열에서 다운 캐스팅한 것처럼, Object []ss 배열을 String(객체 타입)에 맞춰 다운 캐스팅해야한다.

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기