제네릭스, 에너테이션, 열거형
제네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크(compile-time type check)를 해주는 기능이다. 객체의 타입을 컴파일시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.
■ 제네릭스의 장점
1. 타입 안정성을 제공한다.
2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.
- 간단히 말하면 다룰 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 줄여준다는 이야기다
◇ 제네릭 클래스의 선언
제네릭 타입은 클래스와 메서드에 선언할 수 있다. [ 제네릭 클래스 ]
45 lines (35 sloc) 1.45 KB
■ 제네릭스의 용어
class Box<T> { }
Box<T> 제네릭 클래스, 'T의 Box' 또는 'T Box' 라고 읽는다.
T 타입변수, 또는 타입 매개변수. (T는 타입 문자)
Box 원시 타입 ( raw type )
타입문자 T는 제네릭 클래스 Box<T>의 타입변수 또는 타입 매개변수라고 하는데, 메서드의 매개변수와 유사한 면이 있기 때문이다.
대입된 타입(매개변수화된 타입, parameterized type)
Box<String> b = new Box<String>();
제네릭 타입 호출
위와 같이 타입 매개변수에 타입을 지정하는 것을 '제네릭 타입 호출' 이라고 하고, 지정된 타입 'String'을 '매개변수화 된 타입(parameterized type)' 이라고 한다. ( 대입된 타입 )
예를 들어, Box<String> 과 Box<Integer>는 제네릭 클래스 Box<T>에 서로 다른 타입을 대입하여 호출한것, 이 둘이 별개의 클래스를 의미하는 것은 아니다.
■ 제네릭스의 제한
모든 객체에 대해 동일하게 동작해야 하는 static 멤버에 타입 변수 T를 사용 할 수 없다.
T는 인스턴스 변수로 간주되기 때문이다.
static멤버는 인스턴스 변수를 참조할 수 없다.
class Box<T>{
static T item; //에러
static int compare(T t1, T t2){ } // 에러
static멤버는 타입 변수에 지정된 타입, 즉 대입된 타입의 종류에 관계없이 동일한 것이어야 하기 때문이다. 즉, 'Box<Apple>.item'과 'Box<Grape>.item'이 다른 것이어서는 안된다는 뜻이다.
제네릭 타입의 배열을 생성하는것도 허용되지 않는다.
제네릭 배열 타입의 참조변수를 선언하는 것은 가능하지만, 'new T[10]' 과 같이 배열을 생성하는 것은 안된다는 뜻이다.
class Box<T>{
T[] itemArr; //OK, T타입의 배열을 위한 참조변수
T[] toArray() {
T[] tmpArr = new T[itemArr.length]; // 에러, 제네릭 배열 생성불가
return tmpArr;
제네릭 배열을 생성할 수 없는 것은 new 연산자 때문인데, 이 연산자는 컴파일 시점에 타입 T가 뭔지 정확히 알아야 한다. Box<T> 클래스를 컴파일 하는 시점에서는 T가 어떤 타입이 될지 전혀 알 수 없다.
댓글 없음:
댓글 쓰기