[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(객체 타입)에 맞춰 다운 캐스팅해야한다.
'Java' 카테고리의 다른 글
[JAVA] 자바 - Vector<E> 클래스 (0) | 2022.07.29 |
---|---|
[JAVA] 자바 - 제네릭 상속 관계 (ex. Number - Integer) (0) | 2022.07.28 |
[JAVA] 자바 - ArrayList (배열을 리스트로 변환/리스트를 배열로 변환) (0) | 2022.07.28 |
[JAVA] 자바 - 컬렉션(Collection) 개념과 List 인터페이스 (0) | 2022.07.28 |
[JAVA] 자바 - 예외 처리(Exception) & 예외 넘기기(throws) ⭐⭐ (0) | 2022.07.27 |
블로그의 정보
개발자 미니민의 개발로그
mini_min