1. 지네릭스란?
지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.
⭐️ 지네릭스의 장점
1. 타입 안정성을 제공한다.
2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.
2. 지네릭 클래스의 선언
class Box<T> { // 지네릭 타입 T를 선언
T item;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
// 지네릭 클래스가 된 Box클래스의 객체를 생성할 때는 참조변수와 생성자에 타입 T대신에 사용될 실제 타입을 지정해주어야 한다.
Box a = new Box(); // 지네릭 타입을 지정하지 않아도 객체 생성 가능.
// 다만 지네릭 타입을 지정하지 않아서 안전하지 않다는 경고가 발생함
Box<String> b = new Box<String>(); // 타입 T 대신, 실제 타입을 지정
b.setItem(new Object()); // 에러. String이외의 타입은 지정불가
b.setItem("ABC"); // String타입이므로 가능
String item = b.getItem(); // 형변환이 필요없음
- 지네릭 타입은 클래스와 메서드에 선언할 수 있다.
- Box<T> : 지네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽는다.
- T : 타입 변수 또는 타입 매개변수. (T는 타입 문자, 'Type'의 첫 글자에서 따온 것이다.)
타입 변수는 T가 아닌 다른 것을 사용해도 된다.
ArrayList<E>의 경우, 타입 변수 E는 'Element(요소)'의 첫글자를 따서 사용
Map<K, V>의 경우, K는 'Key', V는 'Value'를 의미한다.
상황에 맞게 의미있는 문자를 선택해서 사용하는 것이 좋음
- Box : 원시 타입 (raw type)
▶ 지네릭 타입 호출 : 타입 매개변수에 타입을 지정하는 것
▶ 매개변수화된 타입(parameterized type) : 지정된 타입을 의미
* 지네릭스의 제한
▶ 타입 변수 T는 인스턴스 변수로 간주되기 때문에 static 멤버에 타입 변수 T를 사용할 수 없다.
- static 멤버는 타입 변수에 지정된 타입, 즉 대입된 타입의 종류에 관계없이 동일한 것이어야 함
▶ 지네릭 타입의 배열 생성은 허용되지 않는다. (지네릭 배열 타입의 참조변수를 선언하는 것은 가능)
- new연산자, instanceof 연산자는 컴파일 시점에 타입 T가 뭔지 정확히 알아야 하는데 지네릭 클래스를 컴파일하는 시점에서 T가 어떤 타입이 될지 알 수 없기 때문
class Box<T> {
static T item; // 에러
static int compare(T t1, T t2) {...} // 에러
T[] itemArr; // OK. T타입의 배열을 위한 참조변수
T[] toArray() {
T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
...
return tmpArr;
}
}
'프로그래밍 > JAVA' 카테고리의 다른 글
[ JAVA ] 지네릭스(Generics) - ③ (0) | 2023.02.07 |
---|---|
[ JAVA ] 지네릭스(Generics) - ② (0) | 2023.02.06 |
[ JAVA ] Arrays (0) | 2023.01.08 |
[ JAVA ] Iterator, ListIterator, Enumeration (0) | 2023.01.08 |
[ JAVA ] Queue(큐) (0) | 2023.01.08 |