1. 지네릭스란?
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.
객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.
- 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류를 줄여준다는 뜻이다.
2. 지네릭 클래스의 선언
지네릭 타입은 클래스와 메서드에 선언할 수 있다.
// Box 클래스 정의
class Box {
Object item;
void setItem(Object item) {this.item = item;}
Object getItem() {return item;}
}
// Box 클래스를 지네릭 클래스로 변경
class Box<T> { // 지네릭 타입 T를 선언
T item;
void setItem(T item) {this.item = item;}
T getItem() {return item;}
}
타입 변수는 T(type), E(element), K(key), V(value)과 같은 기호를 사용할 수 있다. 이들은 기호의 종류만 다를 뿐 '임의의 참조형 타입'을 의미한다는 것은 모두 같다.
Box<String> b = new Box<String>(); // 타입 T 대신, 실제 타입을 지정
b.setItem(new Object()); // 에러. String 이외의 타입은 지정 불가
b.setItem("ABC"); // OK. String 타입이므로 가능
String item = (String) b.getItem(); // 형변환 필요 없음
지네릭스 클래스가 된 Box클래스 객체를 생성할 때에는 위와 같이 참조변수와 생성자에 타입 T대신에 사용될 실제 타입을 지정해주어야 한다.
주의
Box b = new Box(); // OK. T는 Object로 간주됨
b.setItem("ABC"); // 경고. unchecked or unsafe operation
b.setItem(new Object()); // 경고. unchecked or unsafe operation
지네릭이 도입되기 이전의 코드와 호환을 위해, 지네릭 클래스인데도 예전의 방식으로 객체를 생성하는 것이 허용된다.
다만 지네릭 타입을 지정하지 않아서 안전하지 않다는 경고가 발생한다.
Box<Object> b = new Box<Object>();
b.setItem("ABC"); // 경고 발생 안함
b.setItem(new Object()); // 경고 발생 안함
타입 변수 T에 Object 타입을 지정하면, 타입을 지정하지 않은 것이 아니라 알고 적은 것이므로 경고가 발생하지 않는다.
지네릭스의 제한
class Box<T> {
static T item; // 에러
static int compare(T t1, T t2) {...} // 에러
...
}
모든 객체에 동일하게 동작해야하는 static 멤버에 타입 변수 T를 사용할 수 없다. T는 인스턴스 변수로 간주되기 때문이다. static 멤버는 인스턴스 변수를 참조할 수 없다.
class Box<T> {
T[] itemArr; // OK. T타입의 배열을 위한 참조변수
...
T[] toArray() {
T[] tempArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
...
return tmpArr;
}
...
}
또한 지네릭 타입의 배열을 생성하는 것도 허용되지 않는다.
지네릭 배열 타입의 참조변수를 선언하는 것은 가능하지만, new T[10] 과 같이 배열을 생성하는 것은 안된다는 뜻이다.
지네릭 배열을 생성할 수 없는 것은 new 연산자 때문인데, 이 연산자는 컴파일 시점에 타입 T가 뭔지 정확히 알아야 한다.
new와 마찬가지로 instanceof 연산자도 T를 피연산자로 사용할 수 없다.
출처 : 자바의 정석 3판
'~2023.02 > Java' 카테고리의 다른 글
객체지향 프로그래밍 정리 (0) | 2022.03.19 |
---|---|
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 설계하기 (0) | 2021.12.30 |
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 만들기 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 배열 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 조건문과 반복문 (0) | 2021.12.29 |