Generic in java, what is the raw type?
Generic in Java
Generic이란 단어의 의미를 찾아보면 '포괄적인/추상적인'이란 뜻을 마주하게 됩니다.
Generic programming이 Java에 들어오게 된건 J2SE 5.0 (2004년도) 부터입니다.
Generic Programming은 단어의 의미와 같이 '추상적인'형태로 표현을 하는 프로그래밍 기법입니다.
자바에서는 이를 위해 제네릭 타입과 메소드를 제공하며 C++의 그것과 유사한점이 있지만 차이점도 많이 가지고 있습니다.
제네릭 프로그래밍을 씀으로써 얻어지는 장점(C++ 템플릿과 비교하여)은,
컴파일 시 타입체킹이 가능하다.
하나의 컴파일 된 코드를 생성한다.
컴파일된 라이브러리만 존재하면 동작이 가능하다.
세가지로 이야기를 할 수 있습니다.
제네릭 클래스, 인터페이스, 메소드는 < > 를 이용해서 표현합니다.
class GenericTest<T>
{
}
위와 같이 <T>로 표현하는 T는 다른 형식으로 변환이 가능한 포멀 파라미터 타입 (Formal Parameter Type)이라고 부릅니다.
위와 같이 정의 된 제네릭 클래스를 생성해서 사용할 수 있으며 실제로 제네릭타입의 GenericTest클래스를 사용할때에는
GeneriTest<Integer> 등 원하는 타입을 넣어서 만들 수 있습니다.
이 때 실제적으로 호출할 때 T안에 들어가는 타입을 Actual Type Argument라고 부릅니다.
안드로이드에서 가끔 generic type이라는 lint를 볼 수 있는데, 이 때 말해지는 generic type은 "제네릭 클래스에서 타입파라미터를 사용하지 않는 것을 rawType"이라고 합니다.
Java document에서는 Raw Types에 대한 정의를
* generic type으로 선언되어 있는데, actual type parameter가 없이 선언이 되어있을 경우
public class MyType<E> {
class Inner { }
static class Nested { }
public static void main(String[] args) {
MyType mt; // warning: MyType is a raw type
MyType.Inner inn; // warning: MyType.Inner is a raw type
MyType.Nested nest; // no warning: not parameterized type
MyType<Object> mt1; // no warning: type parameter given
MyType<?> mt2; // no warning: type parameter given (wildcard OK!)
}
}
위와 같이 generic class인 MyType에서
MyType mt 와 MyType.Inner 는 Actual type parameter가 없기 떄문에 rawType의 경고가 뜨게 됩니다.
하지만 generic안에서 static으로 선언되어 있는 변수는 MyType.Neested로 접근을 해도 경고가 뜨지 않습니다.
-> static 변수는 rawType이 아닌 이유는, static을 선언한 것들은 class를 load할 때 이미 메모리에 올라가있습니다. instance를 생성하는 generic Type이 아니라 이미 메모리에 올라가 있기 때문에, rawType이 아니게 됩니다.