옛글/프로그래밍이야기

Generic in java, what is the raw type?

ShakeJ 2013. 10. 18. 11:34
반응형


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이 아니게 됩니다.


 

반응형